39require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
44require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
45require_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;
120 public $delivery_date;
131 public $date_creation;
142 public $date_validation;
145 public $user_author_id;
165 public $cond_reglement_code;
166 public $cond_reglement_doc;
168 public $mode_reglement_code;
173 public $mode_reglement;
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) {
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->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->db->rollback();
641 $this->error = $this->line->error;
642 $this->errors = $this->line->errors;
643 $this->db->rollback();
647 $this->error =
'BadStatusOfObjectToAddLine';
679 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)
681 global $conf, $user, $langs, $mysoc;
683 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
684 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
687 $remise_percent =
price2num($remise_percent);
690 if (!preg_match(
'/\((.*)\)/', $txtva)) {
696 if (empty($qty) && empty($special_code)) {
699 if (!empty($qty) && $special_code == 3) {
716 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
717 $vat_src_code = $reg[1];
718 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
721 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
725 $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);
726 $total_ht = $tabprice[0];
727 $total_tva = $tabprice[1];
728 $total_ttc = $tabprice[2];
729 $total_localtax1 = $tabprice[9];
730 $total_localtax2 = $tabprice[10];
731 $pu_ht = $tabprice[3];
732 $pu_tva = $tabprice[4];
733 $pu_ttc = $tabprice[5];
736 $multicurrency_total_ht = $tabprice[16];
737 $multicurrency_total_tva = $tabprice[17];
738 $multicurrency_total_ttc = $tabprice[18];
739 $pu_ht_devise = $tabprice[19];
742 if ($price_base_type ==
'TTC') {
748 $line->fetch($rowid);
749 $line->fetch_optionals();
751 $fk_product = $line->fk_product;
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)) {
829 $this->error = $this->db->error();
830 $this->db->rollback();
834 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
854 $line->fetch($lineid);
856 if ($line->delete($user) > 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 = $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 (";
922 $sql .=
", total_tva";
923 $sql .=
", total_ttc";
926 $sql .=
", fk_user_author";
927 $sql .=
", note_private";
928 $sql .=
", note_public";
929 $sql .=
", model_pdf";
930 $sql .=
", fk_cond_reglement";
931 $sql .=
", fk_mode_reglement";
932 $sql .=
", fk_account";
933 $sql .=
", date_livraison";
934 $sql .=
", fk_shipping_method";
935 $sql .=
", fk_projet";
937 $sql .=
", fk_multicurrency";
938 $sql .=
", multicurrency_code";
939 $sql .=
", multicurrency_tx";
942 $sql .= ((int) $this->socid);
946 $sql .=
", '".$this->db->idate($now).
"'";
947 $sql .=
", '(PROV)'";
948 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
949 $sql .=
", '".$this->db->escape($this->note_private).
"'";
950 $sql .=
", '".$this->db->escape($this->note_public).
"'";
951 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
952 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
953 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
954 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
955 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
956 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
957 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
958 $sql .=
", ".((int) $conf->entity);
959 $sql .=
", ".((int) $this->fk_multicurrency);
960 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
961 $sql .=
", ".((float) $this->multicurrency_tx);
964 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
965 $resql = $this->db->query($sql);
967 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
970 $this->
ref =
'(PROV'.$this->id.
')';
971 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
973 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
974 $resql = $this->db->query($sql);
979 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
980 $this->linked_objects = $this->linkedObjectsIds;
984 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
985 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
986 if (is_array($tmp_origin_id)) {
987 foreach ($tmp_origin_id as $origin_id) {
1002 $fk_parent_line = 0;
1003 $num = count($this->lines);
1005 for ($i = 0; $i < $num; $i++) {
1007 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1008 $fk_parent_line = 0;
1012 $this->lines[$i]->desc,
1013 $this->lines[$i]->subprice,
1014 $this->lines[$i]->qty,
1015 $this->lines[$i]->tva_tx,
1016 $this->lines[$i]->localtax1_tx,
1017 $this->lines[$i]->localtax2_tx,
1018 $this->lines[$i]->fk_product,
1019 $this->lines[$i]->remise_percent,
1023 $this->lines[$i]->product_type,
1024 $this->lines[$i]->rang,
1025 $this->lines[$i]->special_code,
1027 $this->lines[$i]->fk_fournprice,
1028 $this->lines[$i]->pa_ht,
1029 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1030 $this->lines[$i]->array_options,
1031 $this->lines[$i]->ref_fourn,
1032 $this->lines[$i]->fk_unit,
1033 'supplier_proposal',
1034 $this->lines[$i]->rowid
1039 $this->error = $this->db->error;
1044 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1045 $fk_parent_line = $result;
1064 if (!$error && !$notrigger) {
1066 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1073 $this->error = $this->db->lasterror();
1078 $this->error = $this->db->lasterror();
1083 $this->db->commit();
1084 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1087 $this->db->rollback();
1091 $this->error = $this->db->lasterror();
1092 $this->db->rollback();
1106 global $conf, $hookmanager;
1114 foreach ($this->lines as $line) {
1115 $line->fetch_optionals();
1119 $objFrom = clone $this;
1121 $objsoc =
new Societe($this->db);
1124 if (!empty($fromid) && $fromid != $this->socid) {
1125 if ($objsoc->fetch($fromid) > 0) {
1126 $this->socid = $objsoc->id;
1127 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1128 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1129 $this->fk_project =
'';
1134 $objsoc->fetch($this->socid);
1140 if (!
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON') || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
".php")) {
1141 $this->error =
'ErrorSetupNotComplete';
1146 $this->user_author_id = $user->id;
1147 $this->user_validation_id = 0;
1151 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
'.php';
1152 $obj = $conf->global->SUPPLIER_PROPOSAL_ADDON;
1153 $modSupplierProposal =
new $obj();
1154 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1157 $this->context[
'createfromclone'] =
'createfromclone';
1158 $result = $this->
create($user);
1165 if (is_object($hookmanager)) {
1166 $parameters = array(
'objFrom'=>$objFrom);
1168 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1176 unset($this->context[
'createfromclone']);
1180 $this->db->commit();
1183 $this->db->rollback();
1195 public function fetch($rowid, $ref =
'')
1199 $sql =
"SELECT p.rowid, p.entity, p.ref, p.fk_soc as socid";
1200 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1201 $sql .=
", p.datec";
1202 $sql .=
", p.date_valid as datev";
1203 $sql .=
", p.date_livraison as delivery_date";
1204 $sql .=
", p.model_pdf, p.extraparams";
1205 $sql .=
", p.note_private, p.note_public";
1206 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1207 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1208 $sql .=
", p.fk_cond_reglement";
1209 $sql .=
", p.fk_mode_reglement";
1210 $sql .=
', p.fk_account';
1211 $sql .=
", p.fk_shipping_method";
1212 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1213 $sql .=
", c.label as statut_label";
1214 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1215 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1216 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1217 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1218 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1219 $sql .=
" WHERE p.fk_statut = c.id";
1220 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1222 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1224 $sql .=
" AND p.rowid = ".((int) $rowid);
1227 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1228 $resql = $this->db->query($sql);
1230 if ($this->db->num_rows($resql)) {
1231 $obj = $this->db->fetch_object($resql);
1233 $this->
id = $obj->rowid;
1234 $this->entity = $obj->entity;
1236 $this->
ref = $obj->ref;
1237 $this->total_ht = $obj->total_ht;
1238 $this->total_tva = $obj->total_tva;
1239 $this->total_localtax1 = $obj->localtax1;
1240 $this->total_localtax2 = $obj->localtax2;
1241 $this->total_ttc = $obj->total_ttc;
1242 $this->socid = $obj->socid;
1243 $this->fk_project = $obj->fk_project;
1244 $this->model_pdf = $obj->model_pdf;
1245 $this->note = $obj->note_private;
1246 $this->note_private = $obj->note_private;
1247 $this->note_public = $obj->note_public;
1248 $this->
statut = (int) $obj->fk_statut;
1249 $this->
status = (int) $obj->fk_statut;
1250 $this->datec = $this->db->jdate($obj->datec);
1251 $this->datev = $this->db->jdate($obj->datev);
1252 $this->date_creation = $this->db->jdate($obj->datec);
1253 $this->date = $this->date_creation;
1254 $this->date_validation = $this->db->jdate($obj->datev);
1255 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1256 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1258 $this->mode_reglement_id = $obj->fk_mode_reglement;
1259 $this->mode_reglement_code = $obj->mode_reglement_code;
1260 $this->mode_reglement = $obj->mode_reglement;
1261 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1262 $this->cond_reglement_id = $obj->fk_cond_reglement;
1263 $this->cond_reglement_code = $obj->cond_reglement_code;
1264 $this->cond_reglement = $obj->cond_reglement;
1265 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1267 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1269 $this->user_author_id = $obj->fk_user_author;
1270 $this->user_validation_id = $obj->fk_user_valid;
1271 $this->user_closing_id = $obj->fk_user_cloture;
1274 $this->fk_multicurrency = $obj->fk_multicurrency;
1275 $this->multicurrency_code = $obj->multicurrency_code;
1276 $this->multicurrency_tx = $obj->multicurrency_tx;
1277 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1278 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1279 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1285 $this->db->free($resql);
1287 $this->lines = array();
1290 $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,";
1291 $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,";
1292 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1293 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1294 $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';
1295 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1296 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1297 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1298 $sql .=
" ORDER by d.rang";
1300 $result = $this->db->query($sql);
1302 $num = $this->db->num_rows($result);
1306 $objp = $this->db->fetch_object($result);
1310 $line->rowid = $objp->rowid;
1311 $line->id = $objp->rowid;
1312 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1313 $line->fk_parent_line = $objp->fk_parent_line;
1314 $line->product_type = $objp->product_type;
1315 $line->label = $objp->custom_label;
1316 $line->desc = $objp->description;
1317 $line->qty = $objp->qty;
1318 $line->tva_tx = $objp->tva_tx;
1319 $line->localtax1_tx = $objp->localtax1_tx;
1320 $line->localtax2_tx = $objp->localtax2_tx;
1321 $line->subprice = $objp->subprice;
1322 $line->fk_remise_except = $objp->fk_remise_except;
1323 $line->remise_percent = $objp->remise_percent;
1325 $line->info_bits = $objp->info_bits;
1326 $line->total_ht = $objp->total_ht;
1327 $line->total_tva = $objp->total_tva;
1328 $line->total_localtax1 = $objp->total_localtax1;
1329 $line->total_localtax2 = $objp->total_localtax2;
1330 $line->total_ttc = $objp->total_ttc;
1331 $line->fk_fournprice = $objp->fk_fournprice;
1332 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1333 $line->pa_ht = $marginInfos[0];
1334 $line->marge_tx = $marginInfos[1];
1335 $line->marque_tx = $marginInfos[2];
1336 $line->special_code = $objp->special_code;
1337 $line->rang = $objp->rang;
1339 $line->fk_product = $objp->fk_product;
1341 $line->ref = $objp->product_ref;
1342 $line->product_ref = $objp->product_ref;
1343 $line->libelle = $objp->product_label;
1344 $line->product_label = $objp->product_label;
1345 $line->product_desc = $objp->product_desc;
1346 $line->fk_product_type = $objp->fk_product_type;
1348 $line->ref_fourn = $objp->ref_produit_fourn;
1351 $line->fk_multicurrency = $objp->fk_multicurrency;
1352 $line->multicurrency_code = $objp->multicurrency_code;
1353 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1354 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1355 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1356 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1357 $line->fk_unit = $objp->fk_unit;
1359 $this->lines[$i] = $line;
1363 $this->db->free($result);
1365 $this->error = $this->db->error();
1376 $this->error =
"Record Not Found";
1379 $this->error = $this->db->error();
1391 public function valid($user, $notrigger = 0)
1393 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1395 global $conf, $langs;
1400 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'creer'))
1401 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'validate_advance'))) {
1405 $soc =
new Societe($this->db);
1406 $result = $soc->fetch($this->socid);
1413 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1420 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1421 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1422 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1423 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1425 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1426 $resql = $this->db->query($sql);
1433 if (!$error && !$notrigger) {
1435 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1443 $this->oldref = $this->ref;
1446 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1448 $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).
"'";
1449 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1450 $resql = $this->db->query($sql);
1453 $this->error = $this->db->lasterror();
1455 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'supplier_proposal/".$this->db->escape($this->newref).
"'";
1456 $sql .=
" WHERE filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1457 $resql = $this->db->query($sql);
1460 $this->error = $this->db->lasterror();
1466 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1467 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1468 if (!$error && file_exists($dirsource)) {
1469 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1470 if (@rename($dirsource, $dirdest)) {
1473 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1474 foreach ($listoffiles as $fileentry) {
1475 $dirsource = $fileentry[
'name'];
1476 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1477 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1478 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1479 @rename($dirsource, $dirdest);
1488 $this->user_validation_id = $user->id;
1489 $this->datev = $now;
1490 $this->date_validation = $now;
1492 $this->db->commit();
1495 $this->db->rollback();
1499 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1528 if ($user->hasRight(
'supplier_proposal',
'creer')) {
1529 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1530 $sql .=
" SET date_livraison = ".($delivery_date !=
'' ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1531 $sql .=
" WHERE rowid = ".((int) $this->
id);
1533 if ($this->db->query($sql)) {
1534 $this->delivery_date = $delivery_date;
1537 $this->error = $this->db->error();
1538 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1626 global $langs, $conf;
1631 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1632 $sql .=
" SET fk_statut = ".((int) $this->
statut).
",";
1633 if (!empty(
$note)) {
1634 $sql .=
" note_private = '".$this->db->escape(
$note).
"',";
1636 $sql .=
" date_cloture = NULL, fk_user_cloture = NULL";
1637 $sql .=
" WHERE rowid = ".((int) $this->
id);
1641 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1642 $resql = $this->db->query($sql);
1645 $this->errors[] =
"Error ".$this->db->lasterror();
1650 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1660 if (!empty($this->errors)) {
1661 foreach ($this->errors as $errmsg) {
1662 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1663 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1666 $this->db->rollback();
1669 $this->db->commit();
1685 global $langs, $conf;
1695 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1696 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape(
$note).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".$user->id;
1697 $sql .=
" WHERE rowid = ".((int) $this->
id);
1699 $resql = $this->db->query($sql);
1701 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1702 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1705 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1706 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1713 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1718 $outputlangs = $langs;
1720 $outputlangs =
new Translate(
"", $conf);
1721 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1722 $outputlangs->setDefaultLang($newlang);
1725 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1736 $this->db->commit();
1739 $this->db->rollback();
1743 $this->error = $this->db->lasterror();
1744 $this->errors[] = $this->db->lasterror();
1745 $this->db->rollback();
1760 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1761 foreach ($this->lines as $product) {
1762 if ($product->subprice <= 0) {
1767 $multicurrency_tx = 1;
1768 $fk_multicurrency = 0;
1770 if (empty($this->thirdparty)) {
1774 $ref_fourn = $product->ref_fourn;
1775 if (empty($ref_fourn)) {
1776 $ref_fourn = $product->ref_supplier;
1778 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1781 $productsupplier->id = $product->fk_product;
1783 $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,
'',
'',
'');
1800 $unitPrice =
price2num($product->subprice,
'MU');
1802 $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);
1804 $resql = $this->db->query($sql);
1806 $this->error = $this->db->error();
1807 $this->db->rollback();
1826 $unitPrice =
price2num($product->subprice,
'MU');
1831 "'".$this->db->idate($now).
"'",
1832 $product->fk_product,
1833 $this->thirdparty->id,
1834 "'".$product->ref_fourn.
"'",
1841 if (isModEnabled(
"multicurrency")) {
1842 if (!empty($product->multicurrency_code)) {
1843 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1845 $multicurrency->fetch(0, $product->multicurrency_code);
1846 if (!empty($multicurrency->id)) {
1847 $values[] = $multicurrency->id;
1848 $values[] =
"'".$product->multicurrency_code.
"'";
1849 $values[] = $product->multicurrency_subprice;
1850 $values[] = $product->multicurrency_total_ht;
1851 $values[] = $multicurrency->rate->rate;
1853 for ($i = 0; $i < 5; $i++) {
1860 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1861 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1862 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1863 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1865 $sql .=
') VALUES ('.implode(
',', $values).
')';
1867 $resql = $this->db->query($sql);
1869 $this->error = $this->db->error();
1870 $this->db->rollback();
1886 global $conf, $langs;
1890 if ($this->
statut == self::STATUS_DRAFT) {
1891 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1895 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1896 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1897 $sql .=
" WHERE rowid = ".((int) $this->
id);
1899 if ($this->db->query($sql)) {
1901 $this->oldcopy = clone $this;
1906 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1915 $this->db->commit();
1918 $this->db->rollback();
1941 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1949 if (!$user->hasRight(
'societe',
'client',
'voir')) {
1950 $search_sale = $user->id;
1953 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
1954 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
1955 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
1956 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
1957 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
1958 $sql .=
" AND p.fk_soc = s.rowid";
1959 $sql .=
" AND p.fk_statut = c.id";
1961 $sql .=
" AND s.rowid = ".((int) $socid);
1964 $sql .=
" AND p.fk_statut = 0";
1966 if ($notcurrentuser > 0) {
1967 $sql .=
" AND p.fk_user_author <> ".((int) $user->id);
1970 if ($search_sale && $search_sale !=
'-1') {
1971 if ($search_sale == -2) {
1972 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
1973 } elseif ($search_sale > 0) {
1974 $sql .=
" AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc AND sc.fk_user = ".((int) $search_sale).
")";
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)) {
2054 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2055 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2056 $file = $dir.
"/".$ref.
".pdf";
2057 if (file_exists($file)) {
2061 $this->error =
'ErrorFailToDeleteFile';
2062 $this->errors = array(
'ErrorFailToDeleteFile');
2063 $this->db->rollback();
2067 if (file_exists($dir)) {
2070 $this->error =
'ErrorFailToDeleteDir';
2071 $this->errors = array(
'ErrorFailToDeleteDir');
2072 $this->db->rollback();
2085 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2090 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2091 $this->db->commit();
2094 $this->error = $this->db->lasterror();
2095 $this->db->rollback();
2099 $this->error = $this->db->lasterror();
2100 $this->db->rollback();
2104 $this->error = $this->db->lasterror();
2105 $this->db->rollback();
2109 $this->db->rollback();
2122 $sql =
"SELECT c.rowid, ";
2123 $sql .=
" c.datec, c.date_valid as datev, c.date_cloture as dateo,";
2124 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2125 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2126 $sql .=
" WHERE c.rowid = ".((int) $id);
2128 $result = $this->db->query($sql);
2131 if ($this->db->num_rows($result)) {
2132 $obj = $this->db->fetch_object($result);
2134 $this->
id = $obj->rowid;
2136 $this->date_creation = $this->db->jdate($obj->datec);
2137 $this->date_validation = $this->db->jdate($obj->datev);
2138 $this->date_cloture = $this->db->jdate($obj->dateo);
2140 $this->user_creation_id = $obj->fk_user_author;
2141 $this->user_validation_id = $obj->fk_user_valid;
2142 $this->user_closing_id = $obj->fk_user_cloture;
2144 $this->db->free($result);
2175 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2177 $langs->load(
"supplier_proposal");
2178 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2179 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2180 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2181 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2182 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2183 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2184 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2185 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2186 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2187 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2191 if ($status == self::STATUS_DRAFT) {
2192 $statusnew =
'status0';
2193 } elseif ($status == self::STATUS_VALIDATED) {
2194 $statusnew =
'status1';
2195 } elseif ($status == self::STATUS_SIGNED) {
2196 $statusnew =
'status4';
2197 } elseif ($status == self::STATUS_NOTSIGNED) {
2198 $statusnew =
'status9';
2199 } elseif ($status == self::STATUS_CLOSE) {
2200 $statusnew =
'status6';
2203 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2218 global $conf, $user, $langs;
2224 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2225 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2226 if (!$user->hasRight(
'societe',
'client',
'voir') && !$user->socid) {
2227 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2228 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2231 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2232 if ($mode ==
'opened') {
2233 $sql .=
" AND p.fk_statut = 1";
2235 if ($mode ==
'signed') {
2236 $sql .=
" AND p.fk_statut = 2";
2239 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2242 $resql = $this->db->query($sql);
2244 $label = $labelShort =
'';
2246 if ($mode ==
'opened') {
2247 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2249 $label = $langs->trans(
"SupplierProposalsToClose");
2250 $labelShort = $langs->trans(
"ToAcceptRefuse");
2252 if ($mode ==
'signed') {
2253 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2255 $label = $langs->trans(
"SupplierProposalsToProcess");
2256 $labelShort = $langs->trans(
"ToClose");
2260 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2261 $response->label = $label;
2262 $response->labelShort = $labelShort;
2263 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2267 while ($obj = $this->db->fetch_object($resql)) {
2268 $response->nbtodo++;
2269 if ($mode ==
'opened') {
2270 $datelimit = $this->db->jdate($obj->datefin);
2271 if ($datelimit < ($now - $delay_warning)) {
2272 $response->nbtodolate++;
2280 $this->error = $this->db->lasterror();
2295 global $user, $langs, $conf;
2300 $sql =
"SELECT rowid";
2301 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2302 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2303 $sql .= $this->db->plimit(100);
2305 $resql = $this->db->query($sql);
2307 $num_prods = $this->db->num_rows($resql);
2309 while ($i < $num_prods) {
2311 $row = $this->db->fetch_row($resql);
2312 $prodids[$i] = $row[0];
2318 $this->
ref =
'SPECIMEN';
2319 $this->specimen = 1;
2321 $this->date = time();
2322 $this->cond_reglement_id = 1;
2323 $this->cond_reglement_code =
'RECEP';
2324 $this->mode_reglement_id = 7;
2325 $this->mode_reglement_code =
'CHQ';
2326 $this->note_public =
'This is a comment (public)';
2327 $this->note_private =
'This is a comment (private)';
2331 while ($xnbp < $nbp) {
2333 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2335 $line->subprice = 100;
2336 $line->tva_tx = 19.6;
2337 $line->localtax1_tx = 0;
2338 $line->localtax2_tx = 0;
2340 $line->total_ht = 50;
2341 $line->total_ttc = 59.8;
2342 $line->total_tva = 9.8;
2343 $line->remise_percent = 50;
2345 $line->total_ht = 100;
2346 $line->total_ttc = 119.6;
2347 $line->total_tva = 19.6;
2348 $line->remise_percent = 00;
2351 if ($num_prods > 0) {
2352 $prodid = mt_rand(1, $num_prods);
2353 $line->fk_product = $prodids[$prodid];
2356 $this->lines[$xnbp] = $line;
2358 $this->total_ht += $line->total_ht;
2359 $this->total_tva += $line->total_tva;
2360 $this->total_ttc += $line->total_ttc;
2375 global $conf, $user;
2377 $this->nb = array();
2380 $sql =
"SELECT count(p.rowid) as nb";
2381 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2382 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2383 if (!$user->hasRight(
'societe',
'client',
'voir') && !$user->socid) {
2384 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2385 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2388 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2390 $resql = $this->db->query($sql);
2393 while ($obj = $this->db->fetch_object($resql)) {
2394 $this->nb[
"supplier_proposals"] = $obj->nb;
2396 $this->db->free($resql);
2400 $this->error = $this->db->lasterror();
2415 global $conf, $db, $langs;
2416 $langs->load(
"supplier_proposal");
2422 $classname = $conf->global->SUPPLIER_PROPOSAL_ADDON;
2425 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2426 foreach ($dirmodels as $reldir) {
2427 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2430 $mybool |= @include_once $dir.$file;
2438 $obj =
new $classname();
2440 $numref = $obj->getNextValue($soc, $this);
2442 if ($numref !=
"") {
2445 $this->error = $obj->error;
2449 $langs->load(
"errors");
2450 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2464 global $conf, $langs, $menumanager;
2466 $langs->load(
'supplier_proposal');
2469 return [
'optimize' => $langs->trans(
"ShowSupplierProposal")];
2472 $option = $params[
'option'] ??
'';
2475 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2476 if (isset($this->
status)) {
2477 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
2479 if (!empty($this->
ref)) {
2480 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2482 if (!empty($this->ref_fourn)) {
2483 $datas[
'ref_supplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2485 if (!empty($this->total_ht)) {
2486 $datas[
'amount_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2488 if (!empty($this->total_tva)) {
2489 $datas[
'amount_vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2491 if (!empty($this->total_ttc)) {
2492 $datas[
'amount_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2509 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2511 global $langs, $conf, $user, $hookmanager;
2513 if (!empty($conf->dol_no_mouse_hover)) {
2521 'objecttype' => $this->element,
2522 'option' => $option,
2524 $classfortooltip =
'classfortooltip';
2527 $classfortooltip =
'classforajaxtooltip';
2528 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2534 if ($option ==
'') {
2535 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2537 if ($option ==
'document') {
2538 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2541 if ($option !==
'nolink') {
2543 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2544 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2545 $add_save_lastsearch_values = 1;
2547 if ($add_save_lastsearch_values) {
2548 $url .=
'&save_lastsearch_values=1';
2553 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
2555 $label = $langs->trans(
"ShowSupplierProposal");
2556 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2558 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
2559 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2562 $linkstart =
'<a href="'.$url.
'"';
2563 $linkstart .= $linkclose.
'>';
2566 $result .= $linkstart;
2568 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
2570 if ($withpicto != 2) {
2571 $result .= $this->ref;
2573 $result .= $linkend;
2575 if ($addlinktonotes) {
2576 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2579 $result .=
' <span class="note inline-block">';
2580 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2585 $result .=
'</span>';
2589 $hookmanager->initHooks(array($this->element .
'dao'));
2590 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2591 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2593 $result = $hookmanager->resPrint;
2595 $result .= $hookmanager->resPrint;
2609 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2610 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2611 $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,';
2612 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2613 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2614 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2615 $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';
2616 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2617 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2618 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2619 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2621 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2622 $resql = $this->db->query($sql);
2624 $num = $this->db->num_rows($resql);
2628 $obj = $this->db->fetch_object($resql);
2631 $this->lines[$i]->id = $obj->rowid;
2632 $this->lines[$i]->rowid = $obj->rowid;
2633 $this->lines[$i]->label = $obj->custom_label;
2634 $this->lines[$i]->description = $obj->description;
2635 $this->lines[$i]->fk_product = $obj->fk_product;
2636 $this->lines[$i]->ref = $obj->ref;
2637 $this->lines[$i]->product_label = $obj->product_label;
2638 $this->lines[$i]->product_desc = $obj->product_desc;
2639 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2640 $this->lines[$i]->product_type = $obj->product_type;
2641 $this->lines[$i]->qty = $obj->qty;
2642 $this->lines[$i]->subprice = $obj->subprice;
2643 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2644 $this->lines[$i]->remise_percent = $obj->remise_percent;
2645 $this->lines[$i]->tva_tx = $obj->tva_tx;
2646 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2647 $this->lines[$i]->info_bits = $obj->info_bits;
2648 $this->lines[$i]->total_ht = $obj->total_ht;
2649 $this->lines[$i]->total_tva = $obj->total_tva;
2650 $this->lines[$i]->total_ttc = $obj->total_ttc;
2651 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2652 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2653 $this->lines[$i]->pa_ht = $marginInfos[0];
2654 $this->lines[$i]->marge_tx = $marginInfos[1];
2655 $this->lines[$i]->marque_tx = $marginInfos[2];
2656 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2657 $this->lines[$i]->special_code = $obj->special_code;
2658 $this->lines[$i]->rang = $obj->rang;
2660 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2661 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2664 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2665 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2666 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2667 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2668 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2669 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2670 $this->lines[$i]->fk_unit = $obj->fk_unit;
2674 $this->db->free($resql);
2678 $this->error = $this->db->error();
2694 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2696 global $conf, $langs;
2698 $langs->load(
"supplier_proposal");
2699 $outputlangs->load(
"products");
2704 if ($this->model_pdf) {
2705 $modele = $this->model_pdf;
2707 $modele = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF;
2711 $modelpath =
"core/modules/supplier_proposal/doc/";
2713 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2745 'supplier_proposaldet'
2763 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2765 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2766 $return .=
'<div class="info-box info-box-sm">';
2767 $return .=
'<span class="info-box-icon bg-infobox-action">';
2770 $return .=
'</span>';
2771 $return .=
'<div class="info-box-content">';
2772 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
2773 if ($selected >= 0) {
2774 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2776 if (property_exists($this,
'socid')) {
2777 $return .=
'<span class="info-box-ref"> | '.$this->socid.
'</span>';
2779 if (property_exists($this,
'delivery_date')) {
2780 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"DateEnd").
'</span> : <span class="info-box-label">'.
dol_print_date($this->delivery_date).
'</span>';
2782 if (property_exists($this,
'total_ttc')) {
2783 $return .=
'<br><span class="opacitymedium" >'.$langs->trans(
"AmountHT").
' : </span><span class="info-box-label amount">'.
price($this->total_ttc).
'</span>';
2785 if (method_exists($this,
'getLibStatut')) {
2786 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2788 $return .=
'</div>';
2789 $return .=
'</div>';
2790 $return .=
'</div>';
2814 public $element =
'supplier_proposaldet';
2819 public $table_element =
'supplier_proposaldet';
2831 public $fk_supplier_proposal;
2836 public $fk_parent_line;
2859 public $vat_src_code;
2862 public $remise_percent;
2867 public $fk_remise_except;
2874 public $fk_fournprice;
2880 public $special_code;
2885 public $info_bits = 0;
2907 public $product_ref;
2919 public $product_label;
2931 public $product_desc;
2933 public $localtax1_tx;
2934 public $localtax2_tx;
2935 public $localtax1_type;
2936 public $localtax2_type;
2937 public $total_localtax1;
2938 public $total_localtax2;
2940 public $skip_update_total;
2943 public $ref_supplier;
2949 public $fk_multicurrency;
2951 public $multicurrency_code;
2952 public $multicurrency_subprice;
2953 public $multicurrency_total_ht;
2954 public $multicurrency_total_tva;
2955 public $multicurrency_total_ttc;
2975 $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,';
2976 $sql .=
' pd.date_start, pd.date_end,';
2977 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
2978 $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,';
2979 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
2980 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
2981 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
2982 $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';
2983 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
2984 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
2985 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
2987 $result = $this->db->query($sql);
2989 $objp = $this->db->fetch_object($result);
2991 $this->
id = $objp->rowid;
2992 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
2993 $this->fk_parent_line = $objp->fk_parent_line;
2994 $this->label = $objp->custom_label;
2995 $this->desc = $objp->description;
2996 $this->qty = $objp->qty;
2997 $this->subprice = $objp->subprice;
2998 $this->tva_tx = $objp->tva_tx;
2999 $this->remise_percent = $objp->remise_percent;
3000 $this->fk_remise_except = $objp->fk_remise_except;
3001 $this->fk_product = $objp->fk_product;
3002 $this->info_bits = $objp->info_bits;
3003 $this->date_start = $this->db->jdate($objp->date_start);
3004 $this->date_end = $this->db->jdate($objp->date_end);
3006 $this->total_ht = $objp->total_ht;
3007 $this->total_tva = $objp->total_tva;
3008 $this->total_ttc = $objp->total_ttc;
3010 $this->fk_fournprice = $objp->fk_fournprice;
3012 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
3013 $this->pa_ht = $marginInfos[0];
3014 $this->marge_tx = $marginInfos[1];
3015 $this->marque_tx = $marginInfos[2];
3017 $this->special_code = $objp->special_code;
3018 $this->product_type = $objp->product_type;
3019 $this->rang = $objp->rang;
3021 $this->
ref = $objp->product_ref;
3022 $this->product_ref = $objp->product_ref;
3023 $this->libelle = $objp->product_label;
3024 $this->product_label = $objp->product_label;
3025 $this->product_desc = $objp->product_desc;
3027 $this->ref_fourn = $objp->ref_produit_fourn;
3030 $this->fk_multicurrency = $objp->fk_multicurrency;
3031 $this->multicurrency_code = $objp->multicurrency_code;
3032 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3033 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3034 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3035 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3036 $this->fk_unit = $objp->fk_unit;
3038 $this->db->free($result);
3054 global $conf, $langs, $user;
3058 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3061 if (empty($this->tva_tx)) {
3064 if (empty($this->vat_src_code)) {
3065 $this->vat_src_code =
'';
3067 if (empty($this->localtax1_tx)) {
3068 $this->localtax1_tx = 0;
3070 if (empty($this->localtax2_tx)) {
3071 $this->localtax2_tx = 0;
3073 if (empty($this->localtax1_type)) {
3074 $this->localtax1_type = 0;
3076 if (empty($this->localtax2_type)) {
3077 $this->localtax2_type = 0;
3079 if (empty($this->total_localtax1)) {
3080 $this->total_localtax1 = 0;
3082 if (empty($this->total_localtax2)) {
3083 $this->total_localtax2 = 0;
3085 if (empty($this->rang)) {
3088 if (empty($this->remise_percent)) {
3089 $this->remise_percent = 0;
3091 if (empty($this->info_bits)) {
3092 $this->info_bits = 0;
3094 if (empty($this->special_code)) {
3095 $this->special_code = 0;
3097 if (empty($this->fk_parent_line)) {
3098 $this->fk_parent_line = 0;
3100 if (empty($this->fk_fournprice)) {
3101 $this->fk_fournprice = 0;
3103 if (empty($this->fk_unit)) {
3106 if (empty($this->subprice)) {
3107 $this->subprice = 0;
3110 if (empty($this->pa_ht)) {
3115 if ($this->pa_ht == 0) {
3116 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3120 $this->pa_ht = $result;
3125 if ($this->product_type < 0) {
3132 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3133 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3134 $sql .=
' date_start, date_end,';
3135 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3136 $sql .=
' subprice, remise_percent, ';
3137 $sql .=
' info_bits, ';
3138 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3139 $sql .=
' ref_fourn,';
3140 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3141 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3142 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3143 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3144 $sql .=
" '".$this->db->escape($this->desc).
"',";
3145 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3146 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3147 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3148 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3149 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3150 $sql .=
" ".price2num($this->qty,
'MS').
",";
3151 $sql .=
" ".price2num($this->tva_tx).
",";
3152 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3153 $sql .=
" ".price2num($this->localtax1_tx).
",";
3154 $sql .=
" ".price2num($this->localtax2_tx).
",";
3155 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3156 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3157 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3158 $sql .=
" ".((float) $this->remise_percent).
",";
3159 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3160 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3161 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3162 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3163 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3164 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3165 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3166 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3167 $sql .=
' '.((int) $this->special_code).
',';
3168 $sql .=
' '.((int) $this->rang).
',';
3169 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3170 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3171 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3172 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3173 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3174 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3175 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3176 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3179 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3180 $resql = $this->db->query($sql);
3182 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3191 if (!$error && !$notrigger) {
3193 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3195 $this->db->rollback();
3201 $this->db->commit();
3204 $this->error = $this->db->error().
" sql=".$sql;
3205 $this->db->rollback();
3216 public function delete($user)
3222 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet";
3223 $sql .=
" WHERE rowid = ".((int) $this->
id);
3225 if ($this->db->query($sql)) {
3231 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3236 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3238 $this->db->rollback();
3243 $this->db->commit();
3247 $this->error = $this->db->error().
" sql=".$sql;
3248 $this->db->rollback();
3261 global $conf, $langs, $user;
3266 if (empty($this->tva_tx)) {
3269 if (empty($this->localtax1_tx)) {
3270 $this->localtax1_tx = 0;
3272 if (empty($this->localtax2_tx)) {
3273 $this->localtax2_tx = 0;
3275 if (empty($this->total_localtax1)) {
3276 $this->total_localtax1 = 0;
3278 if (empty($this->total_localtax2)) {
3279 $this->total_localtax2 = 0;
3281 if (empty($this->localtax1_type)) {
3282 $this->localtax1_type = 0;
3284 if (empty($this->localtax2_type)) {
3285 $this->localtax2_type = 0;
3287 if (empty($this->marque_tx)) {
3288 $this->marque_tx = 0;
3290 if (empty($this->marge_tx)) {
3291 $this->marge_tx = 0;
3293 if (empty($this->remise_percent)) {
3294 $this->remise_percent = 0;
3296 if (empty($this->info_bits)) {
3297 $this->info_bits = 0;
3299 if (empty($this->special_code)) {
3300 $this->special_code = 0;
3302 if (empty($this->fk_parent_line)) {
3303 $this->fk_parent_line = 0;
3305 if (empty($this->fk_fournprice)) {
3306 $this->fk_fournprice = 0;
3308 if (empty($this->fk_unit)) {
3311 if (empty($this->subprice)) {
3312 $this->subprice = 0;
3315 if (empty($this->pa_ht)) {
3320 if ($this->pa_ht == 0) {
3321 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3325 $this->pa_ht = $result;
3332 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3333 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3334 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3335 $sql .=
" , product_type=".((int) $this->product_type);
3336 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3337 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3338 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3339 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3340 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3341 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3342 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3343 $sql .=
" , qty='".price2num($this->qty).
"'";
3344 $sql .=
" , subprice=".price2num($this->subprice);
3345 $sql .=
" , remise_percent=".price2num($this->remise_percent);
3346 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3347 if (empty($this->skip_update_total)) {
3348 $sql .=
" , total_ht=".price2num($this->total_ht);
3349 $sql .=
" , total_tva=".price2num($this->total_tva);
3350 $sql .=
" , total_ttc=".price2num($this->total_ttc);
3351 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
3352 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
3354 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3355 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3356 if (strlen($this->special_code)) {
3357 $sql .=
" , special_code=".((int) $this->special_code);
3359 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3360 if (!empty($this->rang)) {
3361 $sql .=
", rang=".((int) $this->rang);
3363 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3364 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3367 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3368 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3369 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3370 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3372 $sql .=
" WHERE rowid = ".((int) $this->
id);
3374 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3375 $resql = $this->db->query($sql);
3384 if (!$error && !$notrigger) {
3386 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3388 $this->db->rollback();
3394 $this->db->commit();
3397 $this->error = $this->db->error();
3398 $this->db->rollback();
3416 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3417 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3418 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3419 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3420 $sql .=
" WHERE rowid = ".((int) $this->
id);
3422 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3424 $resql = $this->db->query($sql);
3426 $this->db->commit();
3429 $this->error = $this->db->error();
3430 $this->db->rollback();
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteEcmFiles($mode=0)
Delete related files of object in database.
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
defineBuyPrice($unitPrice=0.0, $discountPercent=0.0, $fk_product=0)
Get buy price to use for margin calculation.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setErrorsFromObject($object)
setErrorsFromObject
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check an object id/ref exists If you don't need/want to instantiate object and just need to know if o...
updateRangOfLine($rowid, $rang)
Update position of line (rang)
update_price($exclspec=0, $roundingadjust='none', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage absolute discounts.
Class to manage Dolibarr database access.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage price ask supplier.
updatePriceFournisseur($idProductFournPrice, $product, $user)
Upate ProductFournisseur.
cloture($user, $status, $note)
Close the askprice.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
deleteline($lineid)
Delete detail line.
info($id)
Object SupplierProposal Information.
create($user, $notrigger=0)
Create commercial proposal into database this->ref can be set or empty.
insert_discount($idremise)
Adding line of fixed discount in the proposal in DB.
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
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)
Update a proposal line.
getNextNumRef($soc)
Returns the reference to the following non used Proposal used depending on the active numbering modul...
fetch($rowid, $ref='')
Load a proposal from database and its ligne array.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
createFromClone(User $user, $fromid=0)
Load an object from its id and create a new one in database.
initAsSpecimen()
Initialise an instance with random values.
const STATUS_NOTSIGNED
Not signed quote, canceled.
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)
Add a proposal line into database (linked to product/service or not) Les parametres sont deja cense e...
const STATUS_DRAFT
Draft status.
liste_array($shortlist=0, $draft=0, $notcurrentuser=0, $socid=0, $limit=0, $offset=0, $sortfield='p.datec', $sortorder='DESC')
Return list of askprice (eventually filtered on user) into an array.
setDeliveryDate($user, $delivery_date)
Set delivery date.
LibStatut($status, $mode=1)
Return label of a status (draft, validated, ...)
__construct($db, $socid="", $supplier_proposalid=0)
Constructor.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
updateOrCreatePriceFournisseur($user)
Add or update supplier price according to result of proposal.
load_state_board()
Load indicator this->nb of global stats widget.
reopen($user, $statut, $note='', $notrigger=0)
Set an overall discount on the proposal.
const STATUS_VALIDATED
Validated status.
createPriceFournisseur($product, $user)
Create ProductFournisseur.
getLibStatut($mode=0)
Return label of status of proposal (draft, validated, ...)
add_product($idproduct, $qty, $remise_percent=0)
Add line into array ->lines.
set_date_livraison($user, $delivery_date)
Set delivery date.
const STATUS_SIGNED
Signed quote.
getNomUrl($withpicto=0, $option='', $get_params='', $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0)
Return clicable link of object (with eventually picto)
getKanbanView($option='', $arraydata=null)
Return clicable link of object (with eventually picto)
getTooltipContentArray($params)
getTooltipContentArray
valid($user, $notrigger=0)
Set status to validated.
const STATUS_CLOSE
Billed or closed/processed quote.
getLinesArray()
Retrieve an array of supplier proposal lines.
setDraft($user)
Set draft status.
Class to manage supplier_proposal lines.
fetch($rowid)
Retrieve the propal line object.
insert($notrigger=0)
Insert object line propal in database.
update_total()
Update DB line fields total_xxx Used by migration.
update($notrigger=0)
Update propal line object into DB.
__construct($db)
Class line Contructor.
Class to manage translations.
Class to manage Dolibarr users.
trait CommonIncoterm
Superclass for incoterm classes.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e e e e e statut
getMarginInfos($pvht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $paht)
Return an array with margins information of a line.
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller='', $localtaxes_array='', $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.