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) {
264 $prod =
new Product($this->db);
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 ($productsupplier->fetch($fk_product) > 0) {
457 $product_type = $productsupplier->type;
458 $label = $productsupplier->label;
459 $fk_prod_fourn_price = $fk_fournprice;
463 $result = $productsupplier->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
465 $pu = $productsupplier->fourn_pu;
466 $ref_supplier = $productsupplier->ref_supplier;
468 if ($remise_percent == 0 && $productsupplier->remise_percent != 0) {
469 $remise_percent = $productsupplier->remise_percent;
473 $langs->load(
"errors");
474 $this->error =
"Ref ".$productsupplier->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 ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
484 $this->db->rollback();
485 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
489 $this->error = $productsupplier->error;
490 $this->errors = $productsupplier->errors;
491 $this->db->rollback();
492 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
496 $this->error = $productsupplier->error;
497 $this->errors = $productsupplier->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 (
isModEnabled(
"multicurrency") && $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 (
isModEnabled(
"multicurrency") && $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);
971 $resql = $this->db->query(
$sql);
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);
980 $resql = $this->db->query(
$sql);
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;
1127 $objsoc =
new Societe($this->db);
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_author_id = $user->id;
1154 $this->user_valid = 0;
1155 $this->user_valid_id = 0;
1159 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/".$conf->global->SUPPLIER_PROPOSAL_ADDON.
'.php';
1160 $obj = $conf->global->SUPPLIER_PROPOSAL_ADDON;
1161 $modSupplierProposal =
new $obj;
1162 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1165 $this->context[
'createfromclone'] =
'createfromclone';
1166 $result = $this->
create($user);
1173 if (is_object($hookmanager)) {
1174 $parameters = array(
'objFrom'=>$objFrom);
1176 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1184 unset($this->context[
'createfromclone']);
1188 $this->db->commit();
1191 $this->db->rollback();
1203 public function fetch($rowid, $ref =
'')
1207 $sql =
"SELECT p.rowid, p.entity, p.ref, p.remise, p.remise_percent, p.remise_absolue, p.fk_soc";
1208 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1209 $sql .=
", p.datec";
1210 $sql .=
", p.date_valid as datev";
1211 $sql .=
", p.date_livraison as delivery_date";
1212 $sql .=
", p.model_pdf, p.extraparams";
1213 $sql .=
", p.note_private, p.note_public";
1214 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1215 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1216 $sql .=
", p.fk_cond_reglement";
1217 $sql .=
", p.fk_mode_reglement";
1218 $sql .=
', p.fk_account';
1219 $sql .=
", p.fk_shipping_method";
1220 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1221 $sql .=
", c.label as statut_label";
1222 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1223 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1224 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1225 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1226 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1227 $sql .=
" WHERE p.fk_statut = c.id";
1228 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1230 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1232 $sql .=
" AND p.rowid = ".((int) $rowid);
1235 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1236 $resql = $this->db->query(
$sql);
1238 if ($this->db->num_rows($resql)) {
1239 $obj = $this->db->fetch_object($resql);
1241 $this->
id = $obj->rowid;
1242 $this->entity = $obj->entity;
1244 $this->
ref = $obj->ref;
1245 $this->remise = $obj->remise;
1246 $this->remise_percent = $obj->remise_percent;
1247 $this->remise_absolue = $obj->remise_absolue;
1248 $this->total_ht = $obj->total_ht;
1249 $this->total_tva = $obj->total_tva;
1250 $this->total_localtax1 = $obj->localtax1;
1251 $this->total_localtax2 = $obj->localtax2;
1252 $this->total_ttc = $obj->total_ttc;
1253 $this->socid = $obj->fk_soc;
1254 $this->fk_project = $obj->fk_project;
1255 $this->model_pdf = $obj->model_pdf;
1256 $this->modelpdf = $obj->model_pdf;
1257 $this->note = $obj->note_private;
1258 $this->note_private = $obj->note_private;
1259 $this->note_public = $obj->note_public;
1260 $this->statut = (int) $obj->fk_statut;
1261 $this->status = (
int) $obj->fk_statut;
1262 $this->statut_libelle = $obj->statut_label;
1263 $this->datec = $this->db->jdate($obj->datec);
1264 $this->datev = $this->db->jdate($obj->datev);
1265 $this->date_creation = $this->db->jdate($obj->datec);
1266 $this->date = $this->date_creation;
1267 $this->date_validation = $this->db->jdate($obj->datev);
1268 $this->date_livraison = $this->db->jdate($obj->delivery_date);
1269 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1270 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1272 $this->mode_reglement_id = $obj->fk_mode_reglement;
1273 $this->mode_reglement_code = $obj->mode_reglement_code;
1274 $this->mode_reglement = $obj->mode_reglement;
1275 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1276 $this->cond_reglement_id = $obj->fk_cond_reglement;
1277 $this->cond_reglement_code = $obj->cond_reglement_code;
1278 $this->cond_reglement = $obj->cond_reglement;
1279 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1281 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1283 $this->user_author_id = $obj->fk_user_author;
1284 $this->user_valid_id = $obj->fk_user_valid;
1285 $this->user_close_id = $obj->fk_user_cloture;
1288 $this->fk_multicurrency = $obj->fk_multicurrency;
1289 $this->multicurrency_code = $obj->multicurrency_code;
1290 $this->multicurrency_tx = $obj->multicurrency_tx;
1291 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1292 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1293 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1295 if ($obj->fk_statut == 0) {
1296 $this->brouillon = 1;
1303 $this->db->free($resql);
1305 $this->lines = array();
1308 $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,";
1309 $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,";
1310 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1311 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1312 $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';
1313 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1314 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1315 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1316 $sql .=
" ORDER by d.rang";
1318 $result = $this->db->query(
$sql);
1320 $num = $this->db->num_rows($result);
1324 $objp = $this->db->fetch_object($result);
1328 $line->rowid = $objp->rowid;
1329 $line->id = $objp->rowid;
1330 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1331 $line->fk_parent_line = $objp->fk_parent_line;
1332 $line->product_type = $objp->product_type;
1333 $line->label = $objp->custom_label;
1334 $line->desc = $objp->description;
1335 $line->qty = $objp->qty;
1336 $line->tva_tx = $objp->tva_tx;
1337 $line->localtax1_tx = $objp->localtax1_tx;
1338 $line->localtax2_tx = $objp->localtax2_tx;
1339 $line->subprice = $objp->subprice;
1340 $line->fk_remise_except = $objp->fk_remise_except;
1341 $line->remise_percent = $objp->remise_percent;
1343 $line->info_bits = $objp->info_bits;
1344 $line->total_ht = $objp->total_ht;
1345 $line->total_tva = $objp->total_tva;
1346 $line->total_localtax1 = $objp->total_localtax1;
1347 $line->total_localtax2 = $objp->total_localtax2;
1348 $line->total_ttc = $objp->total_ttc;
1349 $line->fk_fournprice = $objp->fk_fournprice;
1350 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1351 $line->pa_ht = $marginInfos[0];
1352 $line->marge_tx = $marginInfos[1];
1353 $line->marque_tx = $marginInfos[2];
1354 $line->special_code = $objp->special_code;
1355 $line->rang = $objp->rang;
1357 $line->fk_product = $objp->fk_product;
1359 $line->ref = $objp->product_ref;
1360 $line->product_ref = $objp->product_ref;
1361 $line->libelle = $objp->product_label;
1362 $line->product_label = $objp->product_label;
1363 $line->product_desc = $objp->product_desc;
1364 $line->fk_product_type = $objp->fk_product_type;
1366 $line->ref_fourn = $objp->ref_produit_fourn;
1369 $line->fk_multicurrency = $objp->fk_multicurrency;
1370 $line->multicurrency_code = $objp->multicurrency_code;
1371 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1372 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1373 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1374 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1375 $line->fk_unit = $objp->fk_unit;
1377 $this->lines[$i] = $line;
1381 $this->db->free($result);
1383 $this->error = $this->db->error();
1394 $this->error =
"Record Not Found";
1397 $this->error = $this->db->error();
1409 public function valid($user, $notrigger = 0)
1411 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1413 global $conf, $langs;
1418 if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->creer))
1419 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->validate_advance))) {
1423 $soc =
new Societe($this->db);
1424 $result = $soc->fetch($this->socid);
1431 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1438 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1439 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1440 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1441 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1443 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1444 $resql = $this->db->query(
$sql);
1451 if (!$error && !$notrigger) {
1453 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1461 $this->oldref = $this->ref;
1464 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1466 $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).
"'";
1467 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1468 $resql = $this->db->query(
$sql);
1470 $error++; $this->error = $this->db->lasterror();
1476 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1477 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1478 if (!$error && file_exists($dirsource)) {
1479 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1480 if (@rename($dirsource, $dirdest)) {
1483 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1484 foreach ($listoffiles as $fileentry) {
1485 $dirsource = $fileentry[
'name'];
1486 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1487 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1488 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1489 @rename($dirsource, $dirdest);
1496 $this->brouillon = 0;
1498 $this->user_valid_id = $user->id;
1499 $this->datev = $now;
1501 $this->db->commit();
1504 $this->db->rollback();
1508 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1537 if (!empty($user->rights->supplier_proposal->creer)) {
1538 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1539 $sql .=
" SET date_livraison = ".($delivery_date !=
'' ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1540 $sql .=
" WHERE rowid = ".((int) $this->
id);
1542 if ($this->db->query(
$sql)) {
1543 $this->date_livraison = $delivery_date;
1544 $this->delivery_date = $delivery_date;
1547 $this->error = $this->db->error();
1548 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1566 $remise = trim($remise) ?trim($remise) : 0;
1568 if (!empty($user->rights->supplier_proposal->creer)) {
1571 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal SET remise_percent = ".((
float) $remise);
1572 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1574 if ($this->db->query(
$sql)) {
1575 $this->remise_percent = ((
float) $remise);
1579 $this->error = $this->db->error();
1598 if (empty($remise)) {
1604 if (!empty($user->rights->supplier_proposal->creer)) {
1605 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1606 $sql .=
" SET remise_absolue = ".((float) $remise);
1607 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1609 if ($this->db->query(
$sql)) {
1610 $this->remise_absolue = $remise;
1614 $this->error = $this->db->error();
1634 global $langs, $conf;
1636 $this->statut = $statut;
1639 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1640 $sql .=
" SET fk_statut = ".((int) $this->statut).
",";
1641 if (!empty(
$note)) {
1642 $sql .=
" note_private = '".$this->db->escape(
$note).
"',";
1644 $sql .=
" date_cloture=NULL, fk_user_cloture=NULL";
1645 $sql .=
" WHERE rowid = ".((int) $this->
id);
1649 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1650 $resql = $this->db->query(
$sql);
1652 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1657 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1667 if (!empty($this->errors)) {
1668 foreach ($this->errors as $errmsg) {
1669 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1670 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1673 $this->db->rollback();
1676 $this->db->commit();
1692 global $langs, $conf;
1696 $this->statut = $status;
1702 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1703 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape(
$note).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".$user->id;
1704 $sql .=
" WHERE rowid = ".((int) $this->
id);
1706 $resql = $this->db->query(
$sql);
1708 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1709 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1712 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1713 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1715 if (!empty($conf->global->SUPPLIER_PROPOSAL_UPDATE_PRICE_ON_SUPPlIER_PROPOSAL)) {
1720 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1723 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1725 $outputlangs = $langs;
1727 $outputlangs =
new Translate(
"", $conf);
1728 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1729 $outputlangs->setDefaultLang($newlang);
1732 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1743 $this->db->commit();
1746 $this->db->rollback();
1750 $this->error = $this->db->lasterror();
1751 $this->errors[] = $this->db->lasterror();
1752 $this->db->rollback();
1767 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1768 foreach ($this->lines as $product) {
1769 if ($product->subprice <= 0) {
1774 $multicurrency_tx = 1;
1775 $fk_multicurrency = 0;
1777 if (empty($this->thirdparty)) {
1781 $ref_fourn = $product->ref_fourn;
1782 if (empty($ref_fourn)) {
1783 $ref_fourn = $product->ref_supplier;
1785 if (
isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1788 $productsupplier->id = $product->fk_product;
1790 $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,
'',
'',
'');
1807 $unitPrice =
price2num($product->subprice,
'MU');
1809 $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);
1811 $resql = $this->db->query(
$sql);
1813 $this->error = $this->db->error();
1814 $this->db->rollback();
1833 $unitPrice =
price2num($product->subprice,
'MU');
1838 "'".$this->db->idate($now).
"'",
1839 $product->fk_product,
1840 $this->thirdparty->id,
1841 "'".$product->ref_fourn.
"'",
1849 if (!empty($product->multicurrency_code)) {
1850 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1852 $multicurrency->fetch(0, $product->multicurrency_code);
1853 if (!empty($multicurrency->id)) {
1854 $values[] = $multicurrency->id;
1855 $values[] =
"'".$product->multicurrency_code.
"'";
1856 $values[] = $product->multicurrency_subprice;
1857 $values[] = $product->multicurrency_total_ht;
1858 $values[] = $multicurrency->rate->rate;
1860 for ($i = 0; $i < 5; $i++) {
1867 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1868 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1869 if (
isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1870 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1872 $sql .=
') VALUES ('.implode(
',', $values).
')';
1874 $resql = $this->db->query(
$sql);
1876 $this->error = $this->db->error();
1877 $this->db->rollback();
1893 global $conf, $langs;
1897 if ($this->statut == self::STATUS_DRAFT) {
1898 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1902 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1903 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1904 $sql .=
" WHERE rowid = ".((int) $this->
id);
1906 if ($this->db->query(
$sql)) {
1908 $this->oldcopy = clone $this;
1913 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1921 $this->brouillon = 1;
1922 $this->db->commit();
1925 $this->db->rollback();
1948 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1951 global $conf, $user;
1955 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
1956 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
1957 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
1958 if (empty($user->rights->societe->client->voir) && !$socid) {
1959 $sql .=
", sc.fk_soc, sc.fk_user";
1961 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
1962 if (empty($user->rights->societe->client->voir) && !$socid) {
1963 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
1965 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
1966 $sql .=
" AND p.fk_soc = s.rowid";
1967 $sql .=
" AND p.fk_statut = c.id";
1968 if (empty($user->rights->societe->client->voir) && !$socid) {
1969 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
1972 $sql .=
" AND s.rowid = ".((int) $socid);
1975 $sql .=
" AND p.fk_statut = 0";
1977 if ($notcurrentuser > 0) {
1978 $sql .=
" AND p.fk_user_author <> ".$user->id;
1980 $sql .= $this->db->order($sortfield, $sortorder);
1981 $sql .= $this->db->plimit($limit, $offset);
1983 $result = $this->db->query(
$sql);
1985 $num = $this->db->num_rows($result);
1989 $obj = $this->db->fetch_object($result);
1991 if ($shortlist == 1) {
1992 $ga[$obj->supplier_proposalid] = $obj->ref;
1993 } elseif ($shortlist == 2) {
1994 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
1996 $ga[$i][
'id'] = $obj->supplier_proposalid;
1997 $ga[$i][
'ref'] = $obj->ref;
1998 $ga[$i][
'name'] = $obj->name;
2018 public function delete($user, $notrigger = 0)
2020 global $conf, $langs;
2021 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2029 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2037 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2038 $ef = $main.
"_extrafields";
2039 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2040 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2041 if ($this->db->query(
$sql)) {
2042 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2043 if ($this->db->query($sqlef) && $this->db->query(
$sql)) {
2056 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2057 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2058 $file = $dir.
"/".$ref.
".pdf";
2059 if (file_exists($file)) {
2063 $this->error =
'ErrorFailToDeleteFile';
2064 $this->errors = array(
'ErrorFailToDeleteFile');
2065 $this->db->rollback();
2069 if (file_exists($dir)) {
2072 $this->error =
'ErrorFailToDeleteDir';
2073 $this->errors = array(
'ErrorFailToDeleteDir');
2074 $this->db->rollback();
2087 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2092 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2093 $this->db->commit();
2096 $this->error = $this->db->lasterror();
2097 $this->db->rollback();
2101 $this->error = $this->db->lasterror();
2102 $this->db->rollback();
2106 $this->error = $this->db->lasterror();
2107 $this->db->rollback();
2111 $this->db->rollback();
2124 $sql =
"SELECT c.rowid, ";
2125 $sql .=
" c.datec, c.date_valid as datev, c.date_cloture as dateo,";
2126 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2127 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2128 $sql .=
" WHERE c.rowid = ".((int) $id);
2130 $result = $this->db->query(
$sql);
2133 if ($this->db->num_rows($result)) {
2134 $obj = $this->db->fetch_object($result);
2136 $this->
id = $obj->rowid;
2138 $this->date_creation = $this->db->jdate($obj->datec);
2139 $this->date_validation = $this->db->jdate($obj->datev);
2140 $this->date_cloture = $this->db->jdate($obj->dateo);
2142 $cuser =
new User($this->db);
2143 $cuser->fetch($obj->fk_user_author);
2144 $this->user_creation = $cuser;
2146 if ($obj->fk_user_valid) {
2147 $vuser =
new User($this->db);
2148 $vuser->fetch($obj->fk_user_valid);
2149 $this->user_validation = $vuser;
2152 if ($obj->fk_user_cloture) {
2153 $cluser =
new User($this->db);
2154 $cluser->fetch($obj->fk_user_cloture);
2155 $this->user_cloture = $cluser;
2158 $this->db->free($result);
2173 return $this->
LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
2189 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2191 $langs->load(
"supplier_proposal");
2192 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2193 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2194 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2195 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2196 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2197 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2198 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2199 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2200 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2201 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2205 if ($status == self::STATUS_DRAFT) {
2206 $statusnew =
'status0';
2207 } elseif ($status == self::STATUS_VALIDATED) {
2208 $statusnew =
'status1';
2209 } elseif ($status == self::STATUS_SIGNED) {
2210 $statusnew =
'status4';
2211 } elseif ($status == self::STATUS_NOTSIGNED) {
2212 $statusnew =
'status9';
2213 } elseif ($status == self::STATUS_CLOSE) {
2214 $statusnew =
'status6';
2217 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2232 global $conf, $user, $langs;
2236 $this->nbtodo = $this->nbtodolate = 0;
2239 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2240 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2241 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2242 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2243 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2246 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2247 if ($mode ==
'opened') {
2248 $sql .=
" AND p.fk_statut = 1";
2250 if ($mode ==
'signed') {
2251 $sql .=
" AND p.fk_statut = 2";
2254 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2257 $resql = $this->db->query(
$sql);
2259 $label = $labelShort =
'';
2261 if ($mode ==
'opened') {
2262 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2264 $label = $langs->trans(
"SupplierProposalsToClose");
2265 $labelShort = $langs->trans(
"ToAcceptRefuse");
2267 if ($mode ==
'signed') {
2268 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2270 $label = $langs->trans(
"SupplierProposalsToProcess");
2271 $labelShort = $langs->trans(
"ToClose");
2275 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2276 $response->label = $label;
2277 $response->labelShort = $labelShort;
2278 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2282 while ($obj = $this->db->fetch_object($resql)) {
2283 $response->nbtodo++;
2284 if ($mode ==
'opened') {
2285 $datelimit = $this->db->jdate($obj->datefin);
2286 if ($datelimit < ($now - $delay_warning)) {
2287 $response->nbtodolate++;
2295 $this->error = $this->db->lasterror();
2310 global $user, $langs, $conf;
2315 $sql =
"SELECT rowid";
2316 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2317 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2318 $sql .= $this->db->plimit(100);
2320 $resql = $this->db->query(
$sql);
2322 $num_prods = $this->db->num_rows($resql);
2324 while ($i < $num_prods) {
2326 $row = $this->db->fetch_row($resql);
2327 $prodids[$i] = $row[0];
2333 $this->
ref =
'SPECIMEN';
2334 $this->specimen = 1;
2336 $this->date = time();
2337 $this->cond_reglement_id = 1;
2338 $this->cond_reglement_code =
'RECEP';
2339 $this->mode_reglement_id = 7;
2340 $this->mode_reglement_code =
'CHQ';
2341 $this->note_public =
'This is a comment (public)';
2342 $this->note_private =
'This is a comment (private)';
2346 while ($xnbp < $nbp) {
2348 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2350 $line->subprice = 100;
2351 $line->tva_tx = 19.6;
2352 $line->localtax1_tx = 0;
2353 $line->localtax2_tx = 0;
2355 $line->total_ht = 50;
2356 $line->total_ttc = 59.8;
2357 $line->total_tva = 9.8;
2358 $line->remise_percent = 50;
2360 $line->total_ht = 100;
2361 $line->total_ttc = 119.6;
2362 $line->total_tva = 19.6;
2363 $line->remise_percent = 00;
2366 if ($num_prods > 0) {
2367 $prodid = mt_rand(1, $num_prods);
2368 $line->fk_product = $prodids[$prodid];
2371 $this->lines[$xnbp] = $line;
2373 $this->total_ht += $line->total_ht;
2374 $this->total_tva += $line->total_tva;
2375 $this->total_ttc += $line->total_ttc;
2390 global $conf, $user;
2392 $this->nb = array();
2395 $sql =
"SELECT count(p.rowid) as nb";
2396 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2397 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2398 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2399 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2400 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2403 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2405 $resql = $this->db->query(
$sql);
2408 while ($obj = $this->db->fetch_object($resql)) {
2409 $this->nb[
"supplier_proposals"] = $obj->nb;
2411 $this->db->free($resql);
2415 $this->error = $this->db->lasterror();
2430 global $conf, $db, $langs;
2431 $langs->load(
"supplier_proposal");
2433 if (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON)) {
2436 $file = $conf->global->SUPPLIER_PROPOSAL_ADDON.
".php";
2437 $classname = $conf->global->SUPPLIER_PROPOSAL_ADDON;
2440 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2441 foreach ($dirmodels as $reldir) {
2442 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2445 $mybool |= @include_once $dir.$file;
2453 $obj =
new $classname();
2455 $numref = $obj->getNextValue($soc, $this);
2457 if ($numref !=
"") {
2460 $this->error = $obj->error;
2464 $langs->load(
"errors");
2465 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2479 global $conf, $langs, $menumanager;
2481 $langs->load(
'supplier_proposal');
2483 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2484 return [
'optimize' => $langs->trans(
"ShowSupplierProposal")];
2487 $option = $params[
'option'] ??
'';
2490 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2491 if (isset($this->status)) {
2492 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
2494 if (!empty($this->
ref)) {
2495 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2497 if (!empty($this->ref_fourn)) {
2498 $datas[
'ref_supplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2500 if (!empty($this->total_ht)) {
2501 $datas[
'amount_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2503 if (!empty($this->total_tva)) {
2504 $datas[
'amount_vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2506 if (!empty($this->total_ttc)) {
2507 $datas[
'amount_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2524 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2526 global $langs, $conf, $user, $hookmanager;
2528 if (!empty($conf->dol_no_mouse_hover)) {
2536 'objecttype' => $this->element,
2537 'option' => $option,
2539 $classfortooltip =
'classfortooltip';
2542 $classfortooltip =
'classforajaxtooltip';
2543 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2549 if ($option ==
'') {
2550 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2552 if ($option ==
'document') {
2553 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2556 if ($option !==
'nolink') {
2558 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2559 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2560 $add_save_lastsearch_values = 1;
2562 if ($add_save_lastsearch_values) {
2563 $url .=
'&save_lastsearch_values=1';
2568 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
2569 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2570 $label = $langs->trans(
"ShowSupplierProposal");
2571 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2573 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
2574 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2577 $linkstart =
'<a href="'.$url.
'"';
2578 $linkstart .= $linkclose.
'>';
2581 $result .= $linkstart;
2583 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') : $dataparams.
' class="'.(($withpicto != 2) ?
'paddingright ' :
'').$classfortooltip.
'"'), 0, 0, $notooltip ? 0 : 1);
2585 if ($withpicto != 2) {
2586 $result .= $this->ref;
2588 $result .= $linkend;
2590 if ($addlinktonotes) {
2591 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2594 $result .=
' <span class="note inline-block">';
2595 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2600 $result .=
'</span>';
2604 $hookmanager->initHooks(array($this->element .
'dao'));
2605 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2606 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2608 $result = $hookmanager->resPrint;
2610 $result .= $hookmanager->resPrint;
2624 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2625 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2626 $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,';
2627 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2628 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2629 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2630 $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';
2631 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2632 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2633 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2634 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2636 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2637 $resql = $this->db->query(
$sql);
2639 $num = $this->db->num_rows($resql);
2643 $obj = $this->db->fetch_object($resql);
2646 $this->lines[$i]->id = $obj->rowid;
2647 $this->lines[$i]->rowid = $obj->rowid;
2648 $this->lines[$i]->label = $obj->custom_label;
2649 $this->lines[$i]->description = $obj->description;
2650 $this->lines[$i]->fk_product = $obj->fk_product;
2651 $this->lines[$i]->ref = $obj->ref;
2652 $this->lines[$i]->product_label = $obj->product_label;
2653 $this->lines[$i]->product_desc = $obj->product_desc;
2654 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2655 $this->lines[$i]->product_type = $obj->product_type;
2656 $this->lines[$i]->qty = $obj->qty;
2657 $this->lines[$i]->subprice = $obj->subprice;
2658 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2659 $this->lines[$i]->remise_percent = $obj->remise_percent;
2660 $this->lines[$i]->tva_tx = $obj->tva_tx;
2661 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2662 $this->lines[$i]->info_bits = $obj->info_bits;
2663 $this->lines[$i]->total_ht = $obj->total_ht;
2664 $this->lines[$i]->total_tva = $obj->total_tva;
2665 $this->lines[$i]->total_ttc = $obj->total_ttc;
2666 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2667 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2668 $this->lines[$i]->pa_ht = $marginInfos[0];
2669 $this->lines[$i]->marge_tx = $marginInfos[1];
2670 $this->lines[$i]->marque_tx = $marginInfos[2];
2671 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2672 $this->lines[$i]->special_code = $obj->special_code;
2673 $this->lines[$i]->rang = $obj->rang;
2675 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2676 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2679 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2680 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2681 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2682 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2683 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2684 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2685 $this->lines[$i]->fk_unit = $obj->fk_unit;
2689 $this->db->free($resql);
2693 $this->error = $this->db->error();
2709 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2711 global $conf, $langs;
2713 $langs->load(
"supplier_proposal");
2714 $outputlangs->load(
"products");
2719 if ($this->model_pdf) {
2720 $modele = $this->model_pdf;
2721 } elseif (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON_PDF)) {
2722 $modele = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF;
2726 $modelpath =
"core/modules/supplier_proposal/doc/";
2728 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2760 'supplier_proposaldet'
2778 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2780 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2781 $return .=
'<div class="info-box info-box-sm">';
2782 $return .=
'<span class="info-box-icon bg-infobox-action">';
2785 $return .=
'</span>';
2786 $return .=
'<div class="info-box-content">';
2787 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
2788 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2789 if (property_exists($this,
'socid')) {
2790 $return .=
'<span class="info-box-ref"> | '.$this->socid.
'</span>';
2792 if (property_exists($this,
'delivery_date')) {
2793 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"DateEnd").
'</span> : <span class="info-box-label">'.
dol_print_date($this->delivery_date).
'</span>';
2795 if (property_exists($this,
'total_ttc')) {
2796 $return .=
'<br><span class="opacitymedium" >'.$langs->trans(
"AmountHT").
' : </span><span class="info-box-label amount">'.
price($this->total_ttc).
'</span>';
2798 if (method_exists($this,
'getLibStatut')) {
2799 $return .=
'<br><div class="info-box-status margintoponly">'.$this->getLibStatut(3).
'</div>';
2801 $return .=
'</div>';
2802 $return .=
'</div>';
2803 $return .=
'</div>';
2827 public $element =
'supplier_proposaldet';
2832 public $table_element =
'supplier_proposaldet';
2844 public $fk_supplier_proposal;
2849 public $fk_parent_line;
2872 public $vat_src_code;
2875 public $remise_percent;
2880 public $fk_remise_except;
2887 public $fk_fournprice;
2893 public $special_code;
2898 public $info_bits = 0;
2920 public $product_ref;
2932 public $product_label;
2938 public $product_desc;
2940 public $localtax1_tx;
2941 public $localtax2_tx;
2942 public $localtax1_type;
2943 public $localtax2_type;
2944 public $total_localtax1;
2945 public $total_localtax2;
2947 public $skip_update_total;
2950 public $ref_supplier;
2956 public $fk_multicurrency;
2958 public $multicurrency_code;
2959 public $multicurrency_subprice;
2960 public $multicurrency_total_ht;
2961 public $multicurrency_total_tva;
2962 public $multicurrency_total_ttc;
2982 $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,';
2983 $sql .=
' pd.date_start, pd.date_end,';
2984 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
2985 $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,';
2986 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
2987 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
2988 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
2989 $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';
2990 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
2991 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
2992 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
2994 $result = $this->db->query(
$sql);
2996 $objp = $this->db->fetch_object($result);
2998 $this->
id = $objp->rowid;
2999 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
3000 $this->fk_parent_line = $objp->fk_parent_line;
3001 $this->label = $objp->custom_label;
3002 $this->desc = $objp->description;
3003 $this->qty = $objp->qty;
3004 $this->subprice = $objp->subprice;
3005 $this->tva_tx = $objp->tva_tx;
3006 $this->remise_percent = $objp->remise_percent;
3007 $this->fk_remise_except = $objp->fk_remise_except;
3008 $this->fk_product = $objp->fk_product;
3009 $this->info_bits = $objp->info_bits;
3010 $this->date_start = $this->db->jdate($objp->date_start);
3011 $this->date_end = $this->db->jdate($objp->date_end);
3013 $this->total_ht = $objp->total_ht;
3014 $this->total_tva = $objp->total_tva;
3015 $this->total_ttc = $objp->total_ttc;
3017 $this->fk_fournprice = $objp->fk_fournprice;
3019 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
3020 $this->pa_ht = $marginInfos[0];
3021 $this->marge_tx = $marginInfos[1];
3022 $this->marque_tx = $marginInfos[2];
3024 $this->special_code = $objp->special_code;
3025 $this->product_type = $objp->product_type;
3026 $this->rang = $objp->rang;
3028 $this->
ref = $objp->product_ref;
3029 $this->product_ref = $objp->product_ref;
3030 $this->libelle = $objp->product_label;
3031 $this->product_label = $objp->product_label;
3032 $this->product_desc = $objp->product_desc;
3034 $this->ref_fourn = $objp->ref_produit_fourn;
3037 $this->fk_multicurrency = $objp->fk_multicurrency;
3038 $this->multicurrency_code = $objp->multicurrency_code;
3039 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3040 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3041 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3042 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3043 $this->fk_unit = $objp->fk_unit;
3045 $this->db->free($result);
3061 global $conf, $langs, $user;
3065 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3068 if (empty($this->tva_tx)) {
3071 if (empty($this->vat_src_code)) {
3072 $this->vat_src_code =
'';
3074 if (empty($this->localtax1_tx)) {
3075 $this->localtax1_tx = 0;
3077 if (empty($this->localtax2_tx)) {
3078 $this->localtax2_tx = 0;
3080 if (empty($this->localtax1_type)) {
3081 $this->localtax1_type = 0;
3083 if (empty($this->localtax2_type)) {
3084 $this->localtax2_type = 0;
3086 if (empty($this->total_localtax1)) {
3087 $this->total_localtax1 = 0;
3089 if (empty($this->total_localtax2)) {
3090 $this->total_localtax2 = 0;
3092 if (empty($this->rang)) {
3095 if (empty($this->remise_percent)) {
3096 $this->remise_percent = 0;
3098 if (empty($this->info_bits)) {
3099 $this->info_bits = 0;
3101 if (empty($this->special_code)) {
3102 $this->special_code = 0;
3104 if (empty($this->fk_parent_line)) {
3105 $this->fk_parent_line = 0;
3107 if (empty($this->fk_fournprice)) {
3108 $this->fk_fournprice = 0;
3110 if (empty($this->fk_unit)) {
3113 if (empty($this->subprice)) {
3114 $this->subprice = 0;
3117 if (empty($this->pa_ht)) {
3122 if ($this->pa_ht == 0) {
3123 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3127 $this->pa_ht = $result;
3132 if ($this->product_type < 0) {
3139 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3140 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3141 $sql .=
' date_start, date_end,';
3142 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3143 $sql .=
' subprice, remise_percent, ';
3144 $sql .=
' info_bits, ';
3145 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3146 $sql .=
' ref_fourn,';
3147 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3148 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3149 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3150 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3151 $sql .=
" '".$this->db->escape($this->desc).
"',";
3152 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3153 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3154 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3155 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3156 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3157 $sql .=
" ".price2num($this->qty,
'MS').
",";
3158 $sql .=
" ".price2num($this->tva_tx).
",";
3159 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3160 $sql .=
" ".price2num($this->localtax1_tx).
",";
3161 $sql .=
" ".price2num($this->localtax2_tx).
",";
3162 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3163 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3164 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3165 $sql .=
" ".((float) $this->remise_percent).
",";
3166 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3167 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3168 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3169 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3170 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3171 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3172 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3173 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3174 $sql .=
' '.((int) $this->special_code).
',';
3175 $sql .=
' '.((int) $this->rang).
',';
3176 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3177 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3178 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3179 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3180 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3181 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3182 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3183 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3186 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3187 $resql = $this->db->query(
$sql);
3189 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3198 if (!$error && !$notrigger) {
3200 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3202 $this->db->rollback();
3208 $this->db->commit();
3211 $this->error = $this->db->error().
" sql=".
$sql;
3212 $this->db->rollback();
3222 public function delete()
3224 global $conf, $langs, $user;
3229 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE rowid = ".((int) $this->
id);
3230 dol_syslog(
"SupplierProposalLine::delete", LOG_DEBUG);
3231 if ($this->db->query(
$sql)) {
3237 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3242 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3244 $this->db->rollback();
3249 $this->db->commit();
3253 $this->error = $this->db->error().
" sql=".
$sql;
3254 $this->db->rollback();
3267 global $conf, $langs, $user;
3272 if (empty($this->tva_tx)) {
3275 if (empty($this->localtax1_tx)) {
3276 $this->localtax1_tx = 0;
3278 if (empty($this->localtax2_tx)) {
3279 $this->localtax2_tx = 0;
3281 if (empty($this->total_localtax1)) {
3282 $this->total_localtax1 = 0;
3284 if (empty($this->total_localtax2)) {
3285 $this->total_localtax2 = 0;
3287 if (empty($this->localtax1_type)) {
3288 $this->localtax1_type = 0;
3290 if (empty($this->localtax2_type)) {
3291 $this->localtax2_type = 0;
3293 if (empty($this->marque_tx)) {
3294 $this->marque_tx = 0;
3296 if (empty($this->marge_tx)) {
3297 $this->marge_tx = 0;
3299 if (empty($this->remise_percent)) {
3300 $this->remise_percent = 0;
3302 if (empty($this->info_bits)) {
3303 $this->info_bits = 0;
3305 if (empty($this->special_code)) {
3306 $this->special_code = 0;
3308 if (empty($this->fk_parent_line)) {
3309 $this->fk_parent_line = 0;
3311 if (empty($this->fk_fournprice)) {
3312 $this->fk_fournprice = 0;
3314 if (empty($this->fk_unit)) {
3317 if (empty($this->subprice)) {
3318 $this->subprice = 0;
3321 if (empty($this->pa_ht)) {
3326 if ($this->pa_ht == 0) {
3327 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3331 $this->pa_ht = $result;
3338 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3339 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3340 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3341 $sql .=
" , product_type=".((int) $this->product_type);
3342 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3343 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3344 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3345 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3346 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3347 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3348 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3349 $sql .=
" , qty='".price2num($this->qty).
"'";
3350 $sql .=
" , subprice=".price2num($this->subprice);
3351 $sql .=
" , remise_percent=".price2num($this->remise_percent);
3352 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3353 if (empty($this->skip_update_total)) {
3354 $sql .=
" , total_ht=".price2num($this->total_ht);
3355 $sql .=
" , total_tva=".price2num($this->total_tva);
3356 $sql .=
" , total_ttc=".price2num($this->total_ttc);
3357 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
3358 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
3360 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3361 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3362 if (strlen($this->special_code)) {
3363 $sql .=
" , special_code=".((int) $this->special_code);
3365 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3366 if (!empty($this->rang)) {
3367 $sql .=
", rang=".((int) $this->rang);
3369 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3370 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3373 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3374 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3375 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3376 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3378 $sql .=
" WHERE rowid = ".((int) $this->
id);
3380 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3381 $resql = $this->db->query(
$sql);
3390 if (!$error && !$notrigger) {
3392 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3394 $this->db->rollback();
3400 $this->db->commit();
3403 $this->error = $this->db->error();
3404 $this->db->rollback();
3422 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3423 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3424 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3425 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3426 $sql .=
" WHERE rowid = ".((int) $this->
id);
3428 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3430 $resql = $this->db->query(
$sql);
3432 $this->db->commit();
3435 $this->error = $this->db->error();
3436 $this->db->rollback();