39 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
40 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
41 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
42 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
43 require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
44 require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
45 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
57 public $element =
'supplier_proposal';
62 public $table_element =
'supplier_proposal';
67 public $table_element_line =
'supplier_proposaldet';
72 public $fk_element =
'fk_supplier_proposal';
77 public $picto =
'supplier_proposal';
83 public $ismultientitymanaged = 1;
89 public $restrictiononfksoc = 1;
105 public $ref_supplier;
117 public $date_livraison;
122 public $delivery_date;
133 public $date_creation;
144 public $date_validation;
147 public $user_author_id;
148 public $user_valid_id;
149 public $user_close_id;
169 public $cond_reglement_code;
170 public $mode_reglement_code;
172 public $remise_percent = 0;
173 public $remise_absolue = 0;
175 public $extraparams = array();
176 public $lines = array();
179 public $labelStatus = array();
180 public $labelStatusShort = array();
189 public $fk_multicurrency;
191 public $multicurrency_code;
192 public $multicurrency_tx;
193 public $multicurrency_total_ht;
194 public $multicurrency_total_tva;
195 public $multicurrency_total_ttc;
231 public function __construct($db, $socid =
"", $supplier_proposalid = 0)
233 global $conf, $langs;
237 $this->socid = $socid;
238 $this->
id = $supplier_proposalid;
253 public function add_product($idproduct, $qty, $remise_percent = 0)
256 global $conf, $mysoc;
262 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
263 if ($idproduct > 0) {
265 $prod->fetch($idproduct);
267 $productdesc = $prod->description;
271 if (empty($tva_tx)) {
274 $localtax1_tx =
get_localtax($tva_tx, 1, $mysoc, $this->thirdparty, $tva_npr);
275 $localtax2_tx =
get_localtax($tva_tx, 2, $mysoc, $this->thirdparty, $tva_npr);
278 if ($conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
279 $price = $prod->multiprices[$this->thirdparty->price_level];
286 $line->fk_product = $idproduct;
287 $line->desc = $productdesc;
290 $line->remise_percent = $remise_percent;
291 $line->tva_tx = $tva_tx;
293 $this->lines[] = $line;
311 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
312 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
317 $result = $remise->fetch($idremise);
320 if ($remise->fk_facture) {
321 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
322 $this->
db->rollback();
327 $supplier_proposalligne->fk_supplier_proposal = $this->id;
328 $supplier_proposalligne->fk_remise_except = $remise->id;
329 $supplier_proposalligne->desc = $remise->description;
330 $supplier_proposalligne->tva_tx = $remise->tva_tx;
331 $supplier_proposalligne->subprice = -$remise->amount_ht;
332 $supplier_proposalligne->fk_product = 0;
333 $supplier_proposalligne->qty = 1;
334 $supplier_proposalligne->remise_percent = 0;
335 $supplier_proposalligne->rang = -1;
336 $supplier_proposalligne->info_bits = 2;
338 $supplier_proposalligne->total_ht = -$remise->amount_ht;
339 $supplier_proposalligne->total_tva = -$remise->amount_tva;
340 $supplier_proposalligne->total_ttc = -$remise->amount_ttc;
342 $result = $supplier_proposalligne->insert();
349 $this->
db->rollback();
353 $this->error = $supplier_proposalligne->error;
354 $this->
db->rollback();
358 $this->
db->rollback();
400 public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type =
'HT', $pu_ttc = 0, $info_bits = 0, $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice = 0, $pa_ht = 0, $label =
'', $array_options = 0, $ref_supplier =
'', $fk_unit =
'', $origin =
'', $origin_id = 0, $pu_ht_devise = 0, $date_start = 0, $date_end = 0)
402 global $mysoc, $conf, $langs;
404 dol_syslog(get_class($this).
"::addline supplier_proposalid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type");
405 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
408 if (empty($remise_percent)) {
414 if (empty($info_bits)) {
420 if (empty($fk_parent_line) || $fk_parent_line < 0) {
427 $remise_percent =
price2num($remise_percent);
431 if (!preg_match(
'/\((.*)\)/', $txtva)) {
437 if ($price_base_type ==
'HT') {
448 if ($this->statut == self::STATUS_DRAFT) {
451 if ($fk_product > 0) {
452 if (!empty($conf->global->SUPPLIER_PROPOSAL_WITH_PREDEFINED_PRICES_ONLY)) {
454 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_fournprice=".$fk_fournprice.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
456 if ($prod->fetch($fk_product) > 0) {
457 $product_type = $prod->type;
458 $label = $prod->label;
459 $fk_prod_fourn_price = $fk_fournprice;
463 $result = $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
465 $pu = $prod->fourn_pu;
466 $ref_supplier = $prod->ref_supplier;
468 if ($remise_percent == 0 && $prod->remise_percent != 0) {
469 $remise_percent = $prod->remise_percent;
473 $langs->load(
"errors");
474 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
475 $this->
db->rollback();
476 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
482 $langs->load(
"errors");
483 $this->error =
"Ref ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
484 $this->
db->rollback();
485 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
489 $this->error = $prod->error;
490 $this->errors = $prod->errors;
491 $this->
db->rollback();
492 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
496 $this->error = $prod->error;
497 $this->errors = $prod->errors;
498 $this->
db->rollback();
503 $product_type = $type;
516 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
517 $vat_src_code = $reg[1];
518 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
521 if (!empty($conf->multicurrency->enabled) && $pu_ht_devise > 0) {
525 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
526 $total_ht = $tabprice[0];
527 $total_tva = $tabprice[1];
528 $total_ttc = $tabprice[2];
529 $total_localtax1 = $tabprice[9];
530 $total_localtax2 = $tabprice[10];
531 $pu = $pu_ht = $tabprice[3];
534 $multicurrency_total_ht = $tabprice[16];
535 $multicurrency_total_tva = $tabprice[17];
536 $multicurrency_total_ttc = $tabprice[18];
537 $pu_ht_devise = $tabprice[19];
541 if ($ranktouse == -1) {
542 $rangmax = $this->
line_max($fk_parent_line);
543 $ranktouse = $rangmax + 1;
550 if ($remise_percent > 0) {
551 $remise = round(($pu * $remise_percent / 100), 2);
558 $this->line->fk_supplier_proposal = $this->id;
559 $this->line->label = $label;
560 $this->line->desc = $desc;
561 $this->line->qty = $qty;
563 $this->line->vat_src_code = $vat_src_code;
564 $this->line->tva_tx = $txtva;
565 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
566 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
567 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
568 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
569 $this->line->fk_product = $fk_product;
570 $this->line->remise_percent = $remise_percent;
571 $this->line->subprice = $pu_ht;
572 $this->line->rang = $ranktouse;
573 $this->line->info_bits = $info_bits;
574 $this->line->total_ht = $total_ht;
575 $this->line->total_tva = $total_tva;
576 $this->line->total_localtax1 = $total_localtax1;
577 $this->line->total_localtax2 = $total_localtax2;
578 $this->line->total_ttc = $total_ttc;
579 $this->line->product_type = $type;
580 $this->line->special_code = $special_code;
581 $this->line->fk_parent_line = $fk_parent_line;
582 $this->line->fk_unit = $fk_unit;
583 $this->line->origin = $origin;
584 $this->line->origin_id = $origin_id;
585 $this->line->ref_fourn = $this->
db->escape($ref_supplier);
586 $this->line->date_start = $date_start;
587 $this->line->date_end = $date_end;
590 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
592 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
594 $productFournisseur->find_min_price_product_fournisseur($fk_product);
595 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
597 $this->line->fk_fournprice = ($fk_fournprice > 0 ? $fk_fournprice : 0);
599 $this->line->pa_ht = $pa_ht;
603 $this->line->fk_multicurrency = $this->fk_multicurrency;
604 $this->line->multicurrency_code = $this->multicurrency_code;
605 $this->line->multicurrency_subprice = $pu_ht_devise;
606 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
607 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
608 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
611 if (empty($qty) && empty($special_code)) {
612 $this->line->special_code = 3;
615 if (is_array($array_options) && count($array_options) > 0) {
616 $this->line->array_options = $array_options;
619 $result = $this->line->insert();
622 if (!empty($fk_parent_line)) {
624 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
625 $linecount = count($this->lines);
626 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
632 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
635 return $this->line->id;
637 $this->error = $this->error();
638 $this->errors = $this->errors();
639 $this->
db->rollback();
643 $this->error = $this->line->error;
644 $this->errors = $this->line->errors;
645 $this->
db->rollback();
649 $this->error =
'BadStatusOfObjectToAddLine';
681 public function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $desc =
'', $price_base_type =
'HT', $info_bits = 0, $special_code = 0, $fk_parent_line = 0, $skip_update_total = 0, $fk_fournprice = 0, $pa_ht = 0, $label =
'', $type = 0, $array_options = 0, $ref_supplier =
'', $fk_unit =
'', $pu_ht_devise = 0)
683 global $conf, $user, $langs, $mysoc;
685 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
686 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
689 $remise_percent =
price2num($remise_percent);
692 if (!preg_match(
'/\((.*)\)/', $txtva)) {
698 if (empty($qty) && empty($special_code)) {
701 if (!empty($qty) && $special_code == 3) {
705 if ($this->statut == 0) {
718 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
719 $vat_src_code = $reg[1];
720 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
723 if (!empty($conf->multicurrency->enabled) && $pu_ht_devise > 0) {
727 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
728 $total_ht = $tabprice[0];
729 $total_tva = $tabprice[1];
730 $total_ttc = $tabprice[2];
731 $total_localtax1 = $tabprice[9];
732 $total_localtax2 = $tabprice[10];
733 $pu_ht = $tabprice[3];
734 $pu_tva = $tabprice[4];
735 $pu_ttc = $tabprice[5];
738 $multicurrency_total_ht = $tabprice[16];
739 $multicurrency_total_tva = $tabprice[17];
740 $multicurrency_total_ttc = $tabprice[18];
741 $pu_ht_devise = $tabprice[19];
744 if ($price_base_type ==
'TTC') {
750 $line->fetch($rowid);
751 $line->fetch_optionals();
754 $staticline = clone $line;
756 $line->oldline = $staticline;
758 $this->line->context = $this->context;
761 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
762 $rangmax = $this->
line_max($fk_parent_line);
763 $this->line->rang = $rangmax + 1;
766 $this->line->id = $rowid;
767 $this->line->label = $label;
768 $this->line->desc = $desc;
769 $this->line->qty = $qty;
770 $this->line->product_type = $type;
772 $this->line->vat_src_code = $vat_src_code;
773 $this->line->tva_tx = $txtva;
774 $this->line->localtax1_tx = $txlocaltax1;
775 $this->line->localtax2_tx = $txlocaltax2;
776 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
777 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
778 $this->line->remise_percent = $remise_percent;
779 $this->line->subprice = $pu;
780 $this->line->info_bits = $info_bits;
781 $this->line->total_ht = $total_ht;
782 $this->line->total_tva = $total_tva;
783 $this->line->total_localtax1 = $total_localtax1;
784 $this->line->total_localtax2 = $total_localtax2;
785 $this->line->total_ttc = $total_ttc;
786 $this->line->special_code = $special_code;
787 $this->line->fk_parent_line = $fk_parent_line;
788 $this->line->skip_update_total = $skip_update_total;
789 $this->line->ref_fourn = $ref_supplier;
790 $this->line->fk_unit = $fk_unit;
793 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
795 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
797 $productFournisseur->find_min_price_product_fournisseur($fk_product);
798 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
800 $this->line->fk_fournprice = $fk_fournprice;
802 $this->line->pa_ht = $pa_ht;
804 if (is_array($array_options) && count($array_options) > 0) {
806 foreach ($array_options as $key => $value) {
807 $this->line->array_options[$key] = $array_options[$key];
812 $this->line->multicurrency_subprice = $pu_ht_devise;
813 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
814 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
815 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
817 $result = $this->line->update();
820 if (!empty($fk_parent_line)) {
826 $this->fk_supplier_proposal = $this->id;
831 $this->error = $this->
db->error();
832 $this->
db->rollback();
836 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
850 if ($this->statut == 0) {
854 $line->fetch($lineid);
856 if ($line->delete() > 0) {
877 public function create($user, $notrigger = 0)
879 global $langs, $conf, $mysoc, $hookmanager;
889 $this->error =
"Failed to fetch company";
890 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
893 if (!empty($this->
ref)) {
896 $this->error =
'ErrorRefAlreadyExists';
897 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
898 $this->
db->rollback();
904 $delivery_date = empty($this->delivery_date) ? $this->date_livraison : $this->delivery_date;
907 if (!empty($this->multicurrency_code)) {
910 if (empty($this->fk_multicurrency)) {
911 $this->multicurrency_code = $conf->currency;
912 $this->fk_multicurrency = 0;
913 $this->multicurrency_tx = 1;
919 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"supplier_proposal (";
923 $sql .=
", remise_percent";
924 $sql .=
", remise_absolue";
925 $sql .=
", total_tva";
926 $sql .=
", total_ttc";
929 $sql .=
", fk_user_author";
930 $sql .=
", note_private";
931 $sql .=
", note_public";
932 $sql .=
", model_pdf";
933 $sql .=
", fk_cond_reglement";
934 $sql .=
", fk_mode_reglement";
935 $sql .=
", fk_account";
936 $sql .=
", date_livraison";
937 $sql .=
", fk_shipping_method";
938 $sql .=
", fk_projet";
940 $sql .=
", fk_multicurrency";
941 $sql .=
", multicurrency_code";
942 $sql .=
", multicurrency_tx";
945 $sql .= ((int) $this->socid);
947 $sql .=
", ".((double) $this->remise);
948 $sql .=
", ".($this->remise_percent ? ((double) $this->remise_percent) :
'null');
949 $sql .=
", ".($this->remise_absolue ? ((double) $this->remise_absolue) :
'null');
952 $sql .=
", '".$this->db->idate($now).
"'";
953 $sql .=
", '(PROV)'";
954 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
955 $sql .=
", '".$this->db->escape($this->note_private).
"'";
956 $sql .=
", '".$this->db->escape($this->note_public).
"'";
957 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
958 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
959 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
960 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
961 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
962 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
963 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
964 $sql .=
", ".((int) $conf->entity);
965 $sql .=
", ".((int) $this->fk_multicurrency);
966 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
967 $sql .=
", ".((double) $this->multicurrency_tx);
970 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
973 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
976 $this->
ref =
'(PROV'.$this->id.
')';
977 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->
db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
979 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
985 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
986 $this->linked_objects = $this->linkedObjectsIds;
990 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
991 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
992 if (is_array($tmp_origin_id)) {
993 foreach ($tmp_origin_id as $origin_id) {
1008 $fk_parent_line = 0;
1009 $num = count($this->lines);
1011 for ($i = 0; $i < $num; $i++) {
1013 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1014 $fk_parent_line = 0;
1018 $this->lines[$i]->desc,
1019 $this->lines[$i]->subprice,
1020 $this->lines[$i]->qty,
1021 $this->lines[$i]->tva_tx,
1022 $this->lines[$i]->localtax1_tx,
1023 $this->lines[$i]->localtax2_tx,
1024 $this->lines[$i]->fk_product,
1025 $this->lines[$i]->remise_percent,
1029 $this->lines[$i]->product_type,
1030 $this->lines[$i]->rang,
1031 $this->lines[$i]->special_code,
1033 $this->lines[$i]->fk_fournprice,
1034 $this->lines[$i]->pa_ht,
1035 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1036 $this->lines[$i]->array_options,
1037 $this->lines[$i]->ref_fourn,
1038 $this->lines[$i]->fk_unit,
1039 'supplier_proposal',
1040 $this->lines[$i]->
rowid
1045 $this->error = $this->
db->error;
1050 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1051 $fk_parent_line = $result;
1070 if (!$error && !$notrigger) {
1072 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1079 $this->error = $this->
db->lasterror();
1084 $this->error = $this->
db->lasterror();
1089 $this->
db->commit();
1090 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1093 $this->
db->rollback();
1097 $this->error = $this->
db->lasterror();
1098 $this->
db->rollback();
1112 global $conf, $hookmanager;
1120 foreach ($this->lines as $line) {
1121 $line->fetch_optionals();
1125 $objFrom = clone $this;
1130 if (!empty($fromid) && $fromid != $this->socid) {
1131 if ($objsoc->fetch($fromid) > 0) {
1132 $this->socid = $objsoc->id;
1133 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1134 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1135 $this->fk_project =
'';
1140 $objsoc->fetch($this->socid);
1146 if (empty($conf->global->SUPPLIER_PROPOSAL_ADDON) || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/".$conf->global->SUPPLIER_PROPOSAL_ADDON.
".php")) {
1147 $this->error =
'ErrorSetupNotComplete';
1152 $this->user_author = $user->id;
1153 $this->user_valid =
'';
1157 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/".$conf->global->SUPPLIER_PROPOSAL_ADDON.
'.php';
1158 $obj = $conf->global->SUPPLIER_PROPOSAL_ADDON;
1159 $modSupplierProposal =
new $obj;
1160 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1163 $this->context[
'createfromclone'] =
'createfromclone';
1164 $result = $this->
create($user);
1171 if (is_object($hookmanager)) {
1172 $parameters = array(
'objFrom'=>$objFrom);
1174 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1176 $this->errors += $hookmanager->errors;
1177 $this->error = $hookmanager->error;
1183 unset($this->context[
'createfromclone']);
1187 $this->
db->commit();
1190 $this->
db->rollback();
1202 public function fetch($rowid, $ref =
'')
1206 $sql =
"SELECT p.rowid, p.entity, p.ref, p.remise, p.remise_percent, p.remise_absolue, p.fk_soc";
1207 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1208 $sql .=
", p.datec";
1209 $sql .=
", p.date_valid as datev";
1210 $sql .=
", p.date_livraison as delivery_date";
1211 $sql .=
", p.model_pdf, p.extraparams";
1212 $sql .=
", p.note_private, p.note_public";
1213 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1214 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1215 $sql .=
", p.fk_cond_reglement";
1216 $sql .=
", p.fk_mode_reglement";
1217 $sql .=
', p.fk_account';
1218 $sql .=
", p.fk_shipping_method";
1219 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1220 $sql .=
", c.label as statut_label";
1221 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1222 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1223 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1224 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1225 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1226 $sql .=
" WHERE p.fk_statut = c.id";
1227 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1229 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1231 $sql .=
" AND p.rowid = ".((int) $rowid);
1234 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1238 $obj = $this->
db->fetch_object(
$resql);
1240 $this->
id = $obj->rowid;
1241 $this->entity = $obj->entity;
1243 $this->
ref = $obj->ref;
1244 $this->remise = $obj->remise;
1245 $this->remise_percent = $obj->remise_percent;
1246 $this->remise_absolue = $obj->remise_absolue;
1247 $this->total_ht = $obj->total_ht;
1248 $this->total_tva = $obj->total_tva;
1249 $this->total_localtax1 = $obj->localtax1;
1250 $this->total_localtax2 = $obj->localtax2;
1251 $this->total_ttc = $obj->total_ttc;
1252 $this->socid = $obj->fk_soc;
1253 $this->fk_project = $obj->fk_project;
1254 $this->model_pdf = $obj->model_pdf;
1255 $this->modelpdf = $obj->model_pdf;
1256 $this->note = $obj->note_private;
1257 $this->note_private = $obj->note_private;
1258 $this->note_public = $obj->note_public;
1259 $this->statut = (int) $obj->fk_statut;
1260 $this->statut_libelle = $obj->statut_label;
1261 $this->datec = $this->db->jdate($obj->datec);
1262 $this->datev = $this->
db->jdate($obj->datev);
1263 $this->date_creation = $this->
db->jdate($obj->datec);
1264 $this->date_validation = $this->
db->jdate($obj->datev);
1265 $this->date_livraison = $this->
db->jdate($obj->delivery_date);
1266 $this->delivery_date = $this->
db->jdate($obj->delivery_date);
1267 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1269 $this->mode_reglement_id = $obj->fk_mode_reglement;
1270 $this->mode_reglement_code = $obj->mode_reglement_code;
1271 $this->mode_reglement = $obj->mode_reglement;
1272 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1273 $this->cond_reglement_id = $obj->fk_cond_reglement;
1274 $this->cond_reglement_code = $obj->cond_reglement_code;
1275 $this->cond_reglement = $obj->cond_reglement;
1276 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1278 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1280 $this->user_author_id = $obj->fk_user_author;
1281 $this->user_valid_id = $obj->fk_user_valid;
1282 $this->user_close_id = $obj->fk_user_cloture;
1285 $this->fk_multicurrency = $obj->fk_multicurrency;
1286 $this->multicurrency_code = $obj->multicurrency_code;
1287 $this->multicurrency_tx = $obj->multicurrency_tx;
1288 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1289 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1290 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1292 if ($obj->fk_statut == 0) {
1293 $this->brouillon = 1;
1302 $this->lines = array();
1305 $sql =
"SELECT d.rowid, d.fk_supplier_proposal, d.fk_parent_line, d.label as custom_label, d.description, d.price, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.qty, d.fk_remise_except, d.remise_percent, d.subprice, d.fk_product,";
1306 $sql .=
" d.info_bits, d.total_ht, d.total_tva, d.total_localtax1, d.total_localtax2, d.total_ttc, d.fk_product_fournisseur_price as fk_fournprice, d.buy_price_ht as pa_ht, d.special_code, d.rang, d.product_type,";
1307 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1308 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1309 $sql .=
' d.fk_multicurrency, d.multicurrency_code, d.multicurrency_subprice, d.multicurrency_total_ht, d.multicurrency_total_tva, d.multicurrency_total_ttc, d.fk_unit';
1310 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1311 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1312 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1313 $sql .=
" ORDER by d.rang";
1315 $result = $this->
db->query($sql);
1317 $num = $this->
db->num_rows($result);
1321 $objp = $this->
db->fetch_object($result);
1325 $line->rowid = $objp->rowid;
1326 $line->id = $objp->rowid;
1327 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1328 $line->fk_parent_line = $objp->fk_parent_line;
1329 $line->product_type = $objp->product_type;
1330 $line->label = $objp->custom_label;
1331 $line->desc = $objp->description;
1332 $line->qty = $objp->qty;
1333 $line->tva_tx = $objp->tva_tx;
1334 $line->localtax1_tx = $objp->localtax1_tx;
1335 $line->localtax2_tx = $objp->localtax2_tx;
1336 $line->subprice = $objp->subprice;
1337 $line->fk_remise_except = $objp->fk_remise_except;
1338 $line->remise_percent = $objp->remise_percent;
1340 $line->info_bits = $objp->info_bits;
1341 $line->total_ht = $objp->total_ht;
1342 $line->total_tva = $objp->total_tva;
1343 $line->total_localtax1 = $objp->total_localtax1;
1344 $line->total_localtax2 = $objp->total_localtax2;
1345 $line->total_ttc = $objp->total_ttc;
1346 $line->fk_fournprice = $objp->fk_fournprice;
1347 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1348 $line->pa_ht = $marginInfos[0];
1349 $line->marge_tx = $marginInfos[1];
1350 $line->marque_tx = $marginInfos[2];
1351 $line->special_code = $objp->special_code;
1352 $line->rang = $objp->rang;
1354 $line->fk_product = $objp->fk_product;
1356 $line->ref = $objp->product_ref;
1357 $line->product_ref = $objp->product_ref;
1358 $line->libelle = $objp->product_label;
1359 $line->product_label = $objp->product_label;
1360 $line->product_desc = $objp->product_desc;
1361 $line->fk_product_type = $objp->fk_product_type;
1363 $line->ref_fourn = $objp->ref_produit_fourn;
1366 $line->fk_multicurrency = $objp->fk_multicurrency;
1367 $line->multicurrency_code = $objp->multicurrency_code;
1368 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1369 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1370 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1371 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1372 $line->fk_unit = $objp->fk_unit;
1374 $this->lines[$i] = $line;
1378 $this->
db->free($result);
1380 $this->error = $this->
db->error();
1391 $this->error =
"Record Not Found";
1394 $this->error = $this->
db->error();
1406 public function valid($user, $notrigger = 0)
1408 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1410 global $conf, $langs;
1415 if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->creer))
1416 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->validate_advance))) {
1421 $result = $soc->fetch($this->socid);
1428 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1435 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1436 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1437 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1438 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1440 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1448 if (!$error && !$notrigger) {
1450 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1458 $this->oldref = $this->ref;
1461 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1463 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->
db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'supplier_proposal/".$this->
db->escape($this->newref).
"'";
1464 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->
db->escape($this->
ref).
"' and entity = ".$conf->entity;
1467 $error++; $this->error = $this->
db->lasterror();
1473 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1474 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1475 if (!$error && file_exists($dirsource)) {
1476 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1477 if (@rename($dirsource, $dirdest)) {
1480 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1481 foreach ($listoffiles as $fileentry) {
1482 $dirsource = $fileentry[
'name'];
1483 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1484 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1485 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1486 @rename($dirsource, $dirdest);
1493 $this->brouillon = 0;
1495 $this->user_valid_id = $user->id;
1496 $this->datev = $now;
1498 $this->
db->commit();
1501 $this->
db->rollback();
1505 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1534 if (!empty($user->rights->supplier_proposal->creer)) {
1535 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1536 $sql .=
" SET date_livraison = ".($delivery_date !=
'' ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1537 $sql .=
" WHERE rowid = ".((int) $this->
id);
1539 if ($this->
db->query($sql)) {
1540 $this->date_livraison = $delivery_date;
1541 $this->delivery_date = $delivery_date;
1544 $this->error = $this->
db->error();
1545 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1563 $remise = trim($remise) ?trim($remise) : 0;
1565 if (!empty($user->rights->supplier_proposal->creer)) {
1568 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal SET remise_percent = ".((
float) $remise);
1569 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1571 if ($this->
db->query($sql)) {
1572 $this->remise_percent = ((
float) $remise);
1576 $this->error = $this->
db->error();
1595 if (empty($remise)) {
1601 if (!empty($user->rights->supplier_proposal->creer)) {
1602 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1603 $sql .=
" SET remise_absolue = ".((float) $remise);
1604 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1606 if ($this->
db->query($sql)) {
1607 $this->remise_absolue = $remise;
1611 $this->error = $this->
db->error();
1631 global $langs, $conf;
1633 $this->statut = $statut;
1636 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1637 $sql .=
" SET fk_statut = ".((int) $this->statut).
",";
1638 if (!empty(
$note)) {
1639 $sql .=
" note_private = '".$this->db->escape(
$note).
"',";
1641 $sql .=
" date_cloture=NULL, fk_user_cloture=NULL";
1642 $sql .=
" WHERE rowid = ".((int) $this->
id);
1646 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1649 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1654 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1664 if (!empty($this->errors)) {
1665 foreach ($this->errors as $errmsg) {
1666 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1667 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1670 $this->
db->rollback();
1673 $this->
db->commit();
1689 global $langs, $conf;
1693 $this->statut = $status;
1699 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1700 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->
db->escape(
$note).
"', date_cloture='".$this->
db->idate($now).
"', fk_user_cloture=".$user->id;
1701 $sql .=
" WHERE rowid = ".((int) $this->
id);
1705 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1706 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1709 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1710 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1712 if (!empty($conf->global->SUPPLIER_PROPOSAL_UPDATE_PRICE_ON_SUPPlIER_PROPOSAL)) {
1717 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1720 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1722 $outputlangs = $langs;
1723 if (!empty($conf->global->MAIN_MULTILANGS)) {
1724 $outputlangs =
new Translate(
"", $conf);
1725 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1726 $outputlangs->setDefaultLang($newlang);
1729 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1740 $this->
db->commit();
1743 $this->
db->rollback();
1747 $this->error = $this->
db->lasterror();
1748 $this->errors[] = $this->
db->lasterror();
1749 $this->
db->rollback();
1764 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1765 foreach ($this->lines as $product) {
1766 if ($product->subprice <= 0) {
1771 $multicurrency_tx = 1;
1772 $fk_multicurrency = 0;
1774 if (empty($this->thirdparty)) {
1778 $ref_fourn = $product->ref_fourn;
1779 if (empty($ref_fourn)) {
1780 $ref_fourn = $product->ref_supplier;
1782 if (!empty($conf->multicurrency->enabled) && !empty($product->multicurrency_code)) {
1785 $productsupplier->id = $product->fk_product;
1787 $productsupplier->update_buyprice($product->qty, $product->total_ht, $user,
'HT', $this->thirdparty,
'', $ref_fourn, $product->tva_tx, 0, 0, 0, $product->info_bits,
'',
'', array(),
'', $product->multicurrency_total_ht,
'HT', $multicurrency_tx, $product->multicurrency_code,
'',
'',
'');
1804 $unitPrice =
price2num($product->subprice,
'MU');
1806 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'product_fournisseur_price SET '.(!empty($product->ref_fourn) ?
'ref_fourn = "'.$this->db->escape($product->ref_fourn).
'", ' :
'').
' price ='.((
float)
$price).
', unitprice ='.((
float) $unitPrice).
' WHERE rowid = '.((
int) $idProductFournPrice);
1810 $this->error = $this->
db->error();
1811 $this->
db->rollback();
1830 $unitPrice =
price2num($product->subprice,
'MU');
1835 "'".$this->
db->idate($now).
"'",
1836 $product->fk_product,
1837 $this->thirdparty->id,
1838 "'".$product->ref_fourn.
"'",
1845 if (!empty($conf->multicurrency->enabled)) {
1846 if (!empty($product->multicurrency_code)) {
1847 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1849 $multicurrency->fetch(0, $product->multicurrency_code);
1850 if (!empty($multicurrency->id)) {
1851 $values[] = $multicurrency->id;
1852 $values[] =
"'".$product->multicurrency_code.
"'";
1853 $values[] = $product->multicurrency_subprice;
1854 $values[] = $product->multicurrency_total_ht;
1855 $values[] = $multicurrency->rate->rate;
1857 for ($i = 0; $i < 5; $i++) {
1864 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1865 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1866 if (!empty($conf->multicurrency->enabled) && !empty($product->multicurrency_code)) {
1867 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1869 $sql .=
') VALUES ('.implode(
',', $values).
')';
1873 $this->error = $this->
db->error();
1874 $this->
db->rollback();
1890 global $conf, $langs;
1894 if ($this->statut == self::STATUS_DRAFT) {
1895 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1899 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1900 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1901 $sql .=
" WHERE rowid = ".((int) $this->
id);
1903 if ($this->
db->query($sql)) {
1905 $this->oldcopy = clone $this;
1910 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1918 $this->brouillon = 1;
1919 $this->
db->commit();
1922 $this->
db->rollback();
1945 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1948 global $conf, $user;
1952 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
1953 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
1954 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
1955 if (empty($user->rights->societe->client->voir) && !$socid) {
1956 $sql .=
", sc.fk_soc, sc.fk_user";
1958 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
1959 if (empty($user->rights->societe->client->voir) && !$socid) {
1960 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
1962 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
1963 $sql .=
" AND p.fk_soc = s.rowid";
1964 $sql .=
" AND p.fk_statut = c.id";
1965 if (empty($user->rights->societe->client->voir) && !$socid) {
1966 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
1969 $sql .=
" AND s.rowid = ".((int) $socid);
1972 $sql .=
" AND p.fk_statut = 0";
1974 if ($notcurrentuser > 0) {
1975 $sql .=
" AND p.fk_user_author <> ".$user->id;
1977 $sql .= $this->
db->order($sortfield, $sortorder);
1978 $sql .= $this->
db->plimit($limit, $offset);
1980 $result = $this->
db->query($sql);
1982 $num = $this->
db->num_rows($result);
1986 $obj = $this->
db->fetch_object($result);
1988 if ($shortlist == 1) {
1989 $ga[$obj->supplier_proposalid] = $obj->ref;
1990 } elseif ($shortlist == 2) {
1991 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
1993 $ga[$i][
'id'] = $obj->supplier_proposalid;
1994 $ga[$i][
'ref'] = $obj->ref;
1995 $ga[$i][
'name'] = $obj->name;
2015 public function delete($user, $notrigger = 0)
2017 global $conf, $langs;
2018 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2026 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2034 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2035 $ef = $main.
"_extrafields";
2036 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2037 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2038 if ($this->
db->query($sql)) {
2039 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2040 if ($this->
db->query($sqlef) && $this->
db->query($sql)) {
2053 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2054 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2055 $file = $dir.
"/".$ref.
".pdf";
2056 if (file_exists($file)) {
2060 $this->error =
'ErrorFailToDeleteFile';
2061 $this->errors = array(
'ErrorFailToDeleteFile');
2062 $this->
db->rollback();
2066 if (file_exists($dir)) {
2069 $this->error =
'ErrorFailToDeleteDir';
2070 $this->errors = array(
'ErrorFailToDeleteDir');
2071 $this->
db->rollback();
2084 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2089 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2090 $this->
db->commit();
2093 $this->error = $this->
db->lasterror();
2094 $this->
db->rollback();
2098 $this->error = $this->
db->lasterror();
2099 $this->
db->rollback();
2103 $this->error = $this->
db->lasterror();
2104 $this->
db->rollback();
2108 $this->
db->rollback();
2121 $sql =
"SELECT c.rowid, ";
2122 $sql .=
" c.datec, c.date_valid as datev, c.date_cloture as dateo,";
2123 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2124 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2125 $sql .=
" WHERE c.rowid = ".((int) $id);
2127 $result = $this->
db->query($sql);
2130 if ($this->
db->num_rows($result)) {
2131 $obj = $this->
db->fetch_object($result);
2133 $this->
id = $obj->rowid;
2135 $this->date_creation = $this->
db->jdate($obj->datec);
2136 $this->date_validation = $this->
db->jdate($obj->datev);
2137 $this->date_cloture = $this->
db->jdate($obj->dateo);
2139 $cuser =
new User($this->
db);
2140 $cuser->fetch($obj->fk_user_author);
2141 $this->user_creation = $cuser;
2143 if ($obj->fk_user_valid) {
2144 $vuser =
new User($this->
db);
2145 $vuser->fetch($obj->fk_user_valid);
2146 $this->user_validation = $vuser;
2149 if ($obj->fk_user_cloture) {
2150 $cluser =
new User($this->
db);
2151 $cluser->fetch($obj->fk_user_cloture);
2152 $this->user_cloture = $cluser;
2155 $this->
db->free($result);
2170 return $this->
LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
2186 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2188 $langs->load(
"supplier_proposal");
2189 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2190 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2191 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2192 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2193 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2194 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2196 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2197 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2198 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2202 if ($status == self::STATUS_DRAFT) {
2203 $statusnew =
'status0';
2204 } elseif ($status == self::STATUS_VALIDATED) {
2205 $statusnew =
'status1';
2206 } elseif ($status == self::STATUS_SIGNED) {
2207 $statusnew =
'status4';
2208 } elseif ($status == self::STATUS_NOTSIGNED) {
2209 $statusnew =
'status9';
2210 } elseif ($status == self::STATUS_CLOSE) {
2211 $statusnew =
'status6';
2214 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2229 global $conf, $user, $langs;
2233 $this->nbtodo = $this->nbtodolate = 0;
2236 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2237 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2238 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2239 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2240 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2243 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2244 if ($mode ==
'opened') {
2245 $sql .=
" AND p.fk_statut = 1";
2247 if ($mode ==
'signed') {
2248 $sql .=
" AND p.fk_statut = 2";
2251 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2256 $label = $labelShort =
'';
2258 if ($mode ==
'opened') {
2259 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2261 $label = $langs->trans(
"SupplierProposalsToClose");
2262 $labelShort = $langs->trans(
"ToAcceptRefuse");
2264 if ($mode ==
'signed') {
2265 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2267 $label = $langs->trans(
"SupplierProposalsToProcess");
2268 $labelShort = $langs->trans(
"ToClose");
2272 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2273 $response->label = $label;
2274 $response->labelShort = $labelShort;
2275 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2279 while ($obj = $this->
db->fetch_object(
$resql)) {
2280 $response->nbtodo++;
2281 if ($mode ==
'opened') {
2282 $datelimit = $this->
db->jdate($obj->datefin);
2283 if ($datelimit < ($now - $delay_warning)) {
2284 $response->nbtodolate++;
2292 $this->error = $this->
db->lasterror();
2307 global $user, $langs, $conf;
2312 $sql =
"SELECT rowid";
2313 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2314 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2315 $sql .= $this->
db->plimit(100);
2319 $num_prods = $this->
db->num_rows(
$resql);
2321 while ($i < $num_prods) {
2323 $row = $this->
db->fetch_row(
$resql);
2324 $prodids[$i] = $row[0];
2330 $this->
ref =
'SPECIMEN';
2331 $this->specimen = 1;
2333 $this->date = time();
2334 $this->cond_reglement_id = 1;
2335 $this->cond_reglement_code =
'RECEP';
2336 $this->mode_reglement_id = 7;
2337 $this->mode_reglement_code =
'CHQ';
2338 $this->note_public =
'This is a comment (public)';
2339 $this->note_private =
'This is a comment (private)';
2343 while ($xnbp < $nbp) {
2345 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2347 $line->subprice = 100;
2348 $line->tva_tx = 19.6;
2349 $line->localtax1_tx = 0;
2350 $line->localtax2_tx = 0;
2352 $line->total_ht = 50;
2353 $line->total_ttc = 59.8;
2354 $line->total_tva = 9.8;
2355 $line->remise_percent = 50;
2357 $line->total_ht = 100;
2358 $line->total_ttc = 119.6;
2359 $line->total_tva = 19.6;
2360 $line->remise_percent = 00;
2363 if ($num_prods > 0) {
2364 $prodid = mt_rand(1, $num_prods);
2365 $line->fk_product = $prodids[$prodid];
2368 $this->lines[$xnbp] = $line;
2370 $this->total_ht += $line->total_ht;
2371 $this->total_tva += $line->total_tva;
2372 $this->total_ttc += $line->total_ttc;
2387 global $conf, $user;
2389 $this->nb = array();
2392 $sql =
"SELECT count(p.rowid) as nb";
2393 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2394 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2395 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2396 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2397 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2400 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2405 while ($obj = $this->
db->fetch_object(
$resql)) {
2406 $this->nb[
"supplier_proposals"] = $obj->nb;
2412 $this->error = $this->
db->lasterror();
2427 global $conf, $db, $langs;
2428 $langs->load(
"supplier_proposal");
2430 if (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON)) {
2433 $file = $conf->global->SUPPLIER_PROPOSAL_ADDON.
".php";
2434 $classname = $conf->global->SUPPLIER_PROPOSAL_ADDON;
2437 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2438 foreach ($dirmodels as $reldir) {
2439 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2442 $mybool |= @include_once $dir.$file;
2450 $obj =
new $classname();
2452 $numref = $obj->getNextValue($soc, $this);
2454 if ($numref !=
"") {
2457 $this->error = $obj->error;
2461 $langs->load(
"errors");
2462 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2478 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2480 global $langs, $conf, $user, $hookmanager;
2482 if (!empty($conf->dol_no_mouse_hover)) {
2489 $label =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2490 if (isset($this->status)) {
2491 $label .=
' '.$this->getLibStatut(5);
2493 if (!empty($this->
ref)) {
2494 $label .=
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2496 if (!empty($this->ref_fourn)) {
2497 $label .=
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2499 if (!empty($this->total_ht)) {
2500 $label .=
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2502 if (!empty($this->total_tva)) {
2503 $label .=
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2505 if (!empty($this->total_ttc)) {
2506 $label .=
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2509 if ($option ==
'') {
2510 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2512 if ($option ==
'document') {
2513 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2516 if ($option !==
'nolink') {
2518 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2519 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2520 $add_save_lastsearch_values = 1;
2522 if ($add_save_lastsearch_values) {
2523 $url .=
'&save_lastsearch_values=1';
2528 if (empty($notooltip) && $user->rights->propal->lire) {
2529 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2530 $label = $langs->trans(
"ShowSupplierProposal");
2531 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2533 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
2534 $linkclose .=
' class="classfortooltip"';
2537 $linkstart =
'<a href="'.$url.
'"';
2538 $linkstart .= $linkclose.
'>';
2541 $result .= $linkstart;
2543 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
2545 if ($withpicto != 2) {
2546 $result .= $this->ref;
2548 $result .= $linkend;
2550 if ($addlinktonotes) {
2551 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2554 $result .=
' <span class="note inline-block">';
2555 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2560 $result .=
'</span>';
2564 $hookmanager->initHooks(array($this->element .
'dao'));
2565 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2566 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2568 $result = $hookmanager->resPrint;
2570 $result .= $hookmanager->resPrint;
2584 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2585 $sql .=
' pt.qty, pt.tva_tx, pt.remise_percent, pt.subprice, pt.info_bits,';
2586 $sql .=
' pt.total_ht, pt.total_tva, pt.total_ttc, pt.fk_product_fournisseur_price as fk_fournprice, pt.buy_price_ht as pa_ht, pt.special_code, pt.localtax1_tx, pt.localtax2_tx,';
2587 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2588 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2589 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2590 $sql .=
' pt.fk_multicurrency, pt.multicurrency_code, pt.multicurrency_subprice, pt.multicurrency_total_ht, pt.multicurrency_total_tva, pt.multicurrency_total_ttc, pt.fk_unit';
2591 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2592 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2593 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2594 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2596 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2599 $num = $this->
db->num_rows(
$resql);
2603 $obj = $this->
db->fetch_object(
$resql);
2606 $this->lines[$i]->id = $obj->rowid;
2607 $this->lines[$i]->rowid = $obj->rowid;
2608 $this->lines[$i]->label = $obj->custom_label;
2609 $this->lines[$i]->description = $obj->description;
2610 $this->lines[$i]->fk_product = $obj->fk_product;
2611 $this->lines[$i]->ref = $obj->ref;
2612 $this->lines[$i]->product_label = $obj->product_label;
2613 $this->lines[$i]->product_desc = $obj->product_desc;
2614 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2615 $this->lines[$i]->product_type = $obj->product_type;
2616 $this->lines[$i]->qty = $obj->qty;
2617 $this->lines[$i]->subprice = $obj->subprice;
2618 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2619 $this->lines[$i]->remise_percent = $obj->remise_percent;
2620 $this->lines[$i]->tva_tx = $obj->tva_tx;
2621 $this->lines[$i]->info_bits = $obj->info_bits;
2622 $this->lines[$i]->total_ht = $obj->total_ht;
2623 $this->lines[$i]->total_tva = $obj->total_tva;
2624 $this->lines[$i]->total_ttc = $obj->total_ttc;
2625 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2626 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2627 $this->lines[$i]->pa_ht = $marginInfos[0];
2628 $this->lines[$i]->marge_tx = $marginInfos[1];
2629 $this->lines[$i]->marque_tx = $marginInfos[2];
2630 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2631 $this->lines[$i]->special_code = $obj->special_code;
2632 $this->lines[$i]->rang = $obj->rang;
2634 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2635 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2638 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2639 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2640 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2641 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2642 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2643 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2644 $this->lines[$i]->fk_unit = $obj->fk_unit;
2652 $this->error = $this->
db->error();
2668 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2670 global $conf, $langs;
2672 $langs->load(
"supplier_proposal");
2673 $outputlangs->load(
"products");
2678 if ($this->model_pdf) {
2679 $modele = $this->model_pdf;
2680 } elseif (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON_PDF)) {
2681 $modele = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF;
2685 $modelpath =
"core/modules/supplier_proposal/doc/";
2687 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2719 'supplier_proposaldet'
2745 public $element =
'supplier_proposaldet';
2750 public $table_element =
'supplier_proposaldet';
2762 public $fk_supplier_proposal;
2767 public $fk_parent_line;
2790 public $vat_src_code;
2793 public $remise_percent;
2798 public $fk_remise_except;
2805 public $fk_fournprice;
2811 public $special_code;
2816 public $info_bits = 0;
2838 public $product_ref;
2850 public $product_label;
2856 public $product_desc;
2858 public $localtax1_tx;
2859 public $localtax2_tx;
2860 public $localtax1_type;
2861 public $localtax2_type;
2862 public $total_localtax1;
2863 public $total_localtax2;
2865 public $skip_update_total;
2868 public $ref_supplier;
2874 public $fk_multicurrency;
2876 public $multicurrency_code;
2877 public $multicurrency_subprice;
2878 public $multicurrency_total_ht;
2879 public $multicurrency_total_tva;
2880 public $multicurrency_total_ttc;
2900 $sql =
'SELECT pd.rowid, pd.fk_supplier_proposal, pd.fk_parent_line, pd.fk_product, pd.label as custom_label, pd.description, pd.price, pd.qty, pd.tva_tx,';
2901 $sql .=
' pd.date_start, pd.date_end,';
2902 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
2903 $sql .=
' pd.info_bits, pd.total_ht, pd.total_tva, pd.total_ttc, pd.fk_product_fournisseur_price as fk_fournprice, pd.buy_price_ht as pa_ht, pd.special_code, pd.rang,';
2904 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
2905 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
2906 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
2907 $sql .=
' pd.fk_multicurrency, pd.multicurrency_code, pd.multicurrency_subprice, pd.multicurrency_total_ht, pd.multicurrency_total_tva, pd.multicurrency_total_ttc, pd.fk_unit';
2908 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
2909 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
2910 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
2912 $result = $this->
db->query($sql);
2914 $objp = $this->
db->fetch_object($result);
2916 $this->
id = $objp->rowid;
2917 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
2918 $this->fk_parent_line = $objp->fk_parent_line;
2919 $this->label = $objp->custom_label;
2920 $this->desc = $objp->description;
2921 $this->qty = $objp->qty;
2922 $this->subprice = $objp->subprice;
2923 $this->tva_tx = $objp->tva_tx;
2924 $this->remise_percent = $objp->remise_percent;
2925 $this->fk_remise_except = $objp->fk_remise_except;
2926 $this->fk_product = $objp->fk_product;
2927 $this->info_bits = $objp->info_bits;
2928 $this->date_start = $this->
db->jdate($objp->date_start);
2929 $this->date_end = $this->
db->jdate($objp->date_end);
2931 $this->total_ht = $objp->total_ht;
2932 $this->total_tva = $objp->total_tva;
2933 $this->total_ttc = $objp->total_ttc;
2935 $this->fk_fournprice = $objp->fk_fournprice;
2937 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
2938 $this->pa_ht = $marginInfos[0];
2939 $this->marge_tx = $marginInfos[1];
2940 $this->marque_tx = $marginInfos[2];
2942 $this->special_code = $objp->special_code;
2943 $this->product_type = $objp->product_type;
2944 $this->rang = $objp->rang;
2946 $this->
ref = $objp->product_ref;
2947 $this->product_ref = $objp->product_ref;
2948 $this->libelle = $objp->product_label;
2949 $this->product_label = $objp->product_label;
2950 $this->product_desc = $objp->product_desc;
2952 $this->ref_fourn = $objp->ref_produit_fourn;
2955 $this->fk_multicurrency = $objp->fk_multicurrency;
2956 $this->multicurrency_code = $objp->multicurrency_code;
2957 $this->multicurrency_subprice = $objp->multicurrency_subprice;
2958 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
2959 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
2960 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2961 $this->fk_unit = $objp->fk_unit;
2963 $this->
db->free($result);
2979 global $conf, $langs, $user;
2983 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
2986 if (empty($this->tva_tx)) {
2989 if (empty($this->localtax1_tx)) {
2990 $this->localtax1_tx = 0;
2992 if (empty($this->localtax2_tx)) {
2993 $this->localtax2_tx = 0;
2995 if (empty($this->localtax1_type)) {
2996 $this->localtax1_type = 0;
2998 if (empty($this->localtax2_type)) {
2999 $this->localtax2_type = 0;
3001 if (empty($this->total_localtax1)) {
3002 $this->total_localtax1 = 0;
3004 if (empty($this->total_localtax2)) {
3005 $this->total_localtax2 = 0;
3007 if (empty($this->rang)) {
3010 if (empty($this->remise_percent)) {
3011 $this->remise_percent = 0;
3013 if (empty($this->info_bits)) {
3014 $this->info_bits = 0;
3016 if (empty($this->special_code)) {
3017 $this->special_code = 0;
3019 if (empty($this->fk_parent_line)) {
3020 $this->fk_parent_line = 0;
3022 if (empty($this->fk_fournprice)) {
3023 $this->fk_fournprice = 0;
3025 if (empty($this->fk_unit)) {
3028 if (empty($this->subprice)) {
3029 $this->subprice = 0;
3032 if (empty($this->pa_ht)) {
3037 if ($this->pa_ht == 0) {
3038 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3042 $this->pa_ht = $result;
3047 if ($this->product_type < 0) {
3054 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3055 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3056 $sql .=
' date_start, date_end,';
3057 $sql .=
' fk_remise_except, qty, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3058 $sql .=
' subprice, remise_percent, ';
3059 $sql .=
' info_bits, ';
3060 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3061 $sql .=
' ref_fourn,';
3062 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3063 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3064 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->
db->escape($this->fk_parent_line)) :
"null").
",";
3065 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3066 $sql .=
" '".$this->db->escape($this->desc).
"',";
3067 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3068 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3069 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3070 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3071 $sql .=
" ".($this->fk_remise_except ? ((int) $this->
db->escape($this->fk_remise_except)) :
"null").
",";
3072 $sql .=
" ".price2num($this->qty,
'MS').
",";
3073 $sql .=
" ".price2num($this->tva_tx).
",";
3074 $sql .=
" ".price2num($this->localtax1_tx).
",";
3075 $sql .=
" ".price2num($this->localtax2_tx).
",";
3076 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3077 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3078 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3079 $sql .=
" ".((float) $this->remise_percent).
",";
3080 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3081 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3082 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3083 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3084 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3085 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3086 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3087 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3088 $sql .=
' '.((int) $this->special_code).
',';
3089 $sql .=
' '.((int) $this->rang).
',';
3090 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3091 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3092 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3093 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3094 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3095 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3096 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3097 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3100 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3103 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3112 if (!$error && !$notrigger) {
3114 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3116 $this->
db->rollback();
3122 $this->
db->commit();
3125 $this->error = $this->
db->error().
" sql=".$sql;
3126 $this->
db->rollback();
3136 public function delete()
3138 global $conf, $langs, $user;
3143 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE rowid = ".((int) $this->
id);
3144 dol_syslog(
"SupplierProposalLine::delete", LOG_DEBUG);
3145 if ($this->
db->query($sql)) {
3151 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3156 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3158 $this->
db->rollback();
3163 $this->
db->commit();
3167 $this->error = $this->
db->error().
" sql=".$sql;
3168 $this->
db->rollback();
3181 global $conf, $langs, $user;
3186 if (empty($this->tva_tx)) {
3189 if (empty($this->localtax1_tx)) {
3190 $this->localtax1_tx = 0;
3192 if (empty($this->localtax2_tx)) {
3193 $this->localtax2_tx = 0;
3195 if (empty($this->total_localtax1)) {
3196 $this->total_localtax1 = 0;
3198 if (empty($this->total_localtax2)) {
3199 $this->total_localtax2 = 0;
3201 if (empty($this->localtax1_type)) {
3202 $this->localtax1_type = 0;
3204 if (empty($this->localtax2_type)) {
3205 $this->localtax2_type = 0;
3207 if (empty($this->marque_tx)) {
3208 $this->marque_tx = 0;
3210 if (empty($this->marge_tx)) {
3211 $this->marge_tx = 0;
3213 if (empty($this->remise_percent)) {
3214 $this->remise_percent = 0;
3216 if (empty($this->info_bits)) {
3217 $this->info_bits = 0;
3219 if (empty($this->special_code)) {
3220 $this->special_code = 0;
3222 if (empty($this->fk_parent_line)) {
3223 $this->fk_parent_line = 0;
3225 if (empty($this->fk_fournprice)) {
3226 $this->fk_fournprice = 0;
3228 if (empty($this->fk_unit)) {
3231 if (empty($this->subprice)) {
3232 $this->subprice = 0;
3235 if (empty($this->pa_ht)) {
3240 if ($this->pa_ht == 0) {
3241 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3245 $this->pa_ht = $result;
3252 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3253 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3254 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3255 $sql .=
" , product_type=".((int) $this->product_type);
3256 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3257 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3258 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3259 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3260 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3261 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3262 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3263 $sql .=
" , qty='".price2num($this->qty).
"'";
3264 $sql .=
" , subprice=".price2num($this->subprice).
"";
3265 $sql .=
" , remise_percent=".price2num($this->remise_percent).
"";
3266 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3267 if (empty($this->skip_update_total)) {
3268 $sql .=
" , total_ht=".price2num($this->total_ht).
"";
3269 $sql .=
" , total_tva=".price2num($this->total_tva).
"";
3270 $sql .=
" , total_ttc=".price2num($this->total_ttc).
"";
3271 $sql .=
" , total_localtax1=".price2num($this->total_localtax1).
"";
3272 $sql .=
" , total_localtax2=".price2num($this->total_localtax2).
"";
3274 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3275 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3276 if (strlen($this->special_code)) {
3277 $sql .=
" , special_code=".((int) $this->special_code);
3279 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3280 if (!empty($this->rang)) {
3281 $sql .=
", rang=".((int) $this->rang);
3283 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3284 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3287 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice).
"";
3288 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht).
"";
3289 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva).
"";
3290 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc).
"";
3292 $sql .=
" WHERE rowid = ".((int) $this->
id);
3294 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3304 if (!$error && !$notrigger) {
3306 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3308 $this->
db->rollback();
3314 $this->
db->commit();
3317 $this->error = $this->
db->error();
3318 $this->
db->rollback();
3336 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3337 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3338 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3339 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3340 $sql .=
" WHERE rowid = ".((int) $this->
id);
3342 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3346 $this->
db->commit();
3349 $this->error = $this->
db->error();
3350 $this->
db->rollback();