40require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
45require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
58 public $element =
'supplier_proposal';
63 public $table_element =
'supplier_proposal';
68 public $table_element_line =
'supplier_proposaldet';
73 public $fk_element =
'fk_supplier_proposal';
78 public $picto =
'supplier_proposal';
84 public $restrictiononfksoc = 1;
100 public $ref_supplier;
115 public $delivery_date;
126 public $date_creation;
137 public $date_validation;
140 public $user_author_id;
160 public $cond_reglement_code;
161 public $cond_reglement_doc;
163 public $mode_reglement_code;
168 public $mode_reglement;
170 public $extraparams = array();
171 public $lines = array();
174 public $labelStatus = array();
175 public $labelStatusShort = array();
184 public $fk_multicurrency;
186 public $multicurrency_code;
187 public $multicurrency_tx;
188 public $multicurrency_total_ht;
189 public $multicurrency_total_tva;
190 public $multicurrency_total_ttc;
226 public function __construct($db, $socid = 0, $supplier_proposalid = 0)
228 global $conf, $langs;
232 $this->ismultientitymanaged = 1;
233 $this->socid = $socid;
234 $this->
id = $supplier_proposalid;
249 public function add_product($idproduct, $qty, $remise_percent = 0)
252 global $conf, $mysoc;
258 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
259 if ($idproduct > 0) {
260 $prod =
new Product($this->db);
261 $prod->fetch($idproduct);
263 $productdesc = $prod->description;
267 if (empty($tva_tx)) {
270 $localtax1_tx =
get_localtax($tva_tx, 1, $mysoc, $this->thirdparty, $tva_npr);
271 $localtax2_tx =
get_localtax($tva_tx, 2, $mysoc, $this->thirdparty, $tva_npr);
274 if ($conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
275 $price = $prod->multiprices[$this->thirdparty->price_level];
282 $line->fk_product = $idproduct;
283 $line->desc = $productdesc;
286 $line->remise_percent = $remise_percent;
287 $line->tva_tx = $tva_tx;
289 $this->lines[] = $line;
307 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
308 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
313 $result = $remise->fetch($idremise);
316 if ($remise->fk_facture) {
317 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
318 $this->db->rollback();
323 $supplier_proposalligne->fk_supplier_proposal = $this->id;
324 $supplier_proposalligne->fk_remise_except = $remise->id;
325 $supplier_proposalligne->desc = $remise->description;
326 $supplier_proposalligne->tva_tx = $remise->tva_tx;
327 $supplier_proposalligne->subprice = -$remise->amount_ht;
328 $supplier_proposalligne->fk_product = 0;
329 $supplier_proposalligne->qty = 1;
330 $supplier_proposalligne->remise_percent = 0;
331 $supplier_proposalligne->rang = -1;
332 $supplier_proposalligne->info_bits = 2;
334 $supplier_proposalligne->total_ht = -$remise->amount_ht;
335 $supplier_proposalligne->total_tva = -$remise->amount_tva;
336 $supplier_proposalligne->total_ttc = -$remise->amount_ttc;
338 $result = $supplier_proposalligne->insert();
345 $this->db->rollback();
349 $this->error = $supplier_proposalligne->error;
350 $this->db->rollback();
354 $this->db->rollback();
396 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 = [], $ref_supplier =
'', $fk_unit = 0, $origin =
'', $origin_id = 0, $pu_ht_devise = 0, $date_start = 0, $date_end = 0)
398 global $mysoc, $conf, $langs;
400 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");
401 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
404 if (empty($remise_percent)) {
410 if (empty($info_bits)) {
416 if (empty($fk_parent_line) || $fk_parent_line < 0) {
423 $remise_percent =
price2num($remise_percent);
427 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
433 if ($price_base_type ==
'HT') {
444 if ($this->
statut == self::STATUS_DRAFT) {
447 if ($fk_product > 0) {
450 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_fournprice=".$fk_fournprice.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
452 if ($productsupplier->fetch($fk_product) > 0) {
453 $product_type = $productsupplier->type;
454 $label = $productsupplier->label;
455 $fk_prod_fourn_price = $fk_fournprice;
460 $result = $productsupplier->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', $this->socid);
462 $pu = $productsupplier->fourn_pu;
463 $ref_supplier = $productsupplier->ref_supplier;
465 if ($remise_percent == 0 && $productsupplier->remise_percent != 0) {
466 $remise_percent = $productsupplier->remise_percent;
470 $langs->load(
"errors");
471 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
472 $this->db->rollback();
473 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
479 $langs->load(
"errors");
480 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
481 $this->db->rollback();
482 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
486 $this->error = $productsupplier->error;
487 $this->errors = $productsupplier->errors;
488 $this->db->rollback();
489 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
493 $this->error = $productsupplier->error;
494 $this->errors = $productsupplier->errors;
495 $this->db->rollback();
500 $product_type = $type;
513 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
514 $vat_src_code = $reg[1];
515 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
518 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
522 $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);
523 $total_ht = $tabprice[0];
524 $total_tva = $tabprice[1];
525 $total_ttc = $tabprice[2];
526 $total_localtax1 = $tabprice[9];
527 $total_localtax2 = $tabprice[10];
528 $pu = $pu_ht = $tabprice[3];
531 $multicurrency_total_ht = $tabprice[16];
532 $multicurrency_total_tva = $tabprice[17];
533 $multicurrency_total_ttc = $tabprice[18];
534 $pu_ht_devise = $tabprice[19];
538 if ($ranktouse == -1) {
539 $rangmax = $this->
line_max($fk_parent_line);
540 $ranktouse = $rangmax + 1;
547 if ($remise_percent > 0) {
548 $remise = round(($pu * (
float) $remise_percent / 100), 2);
555 $this->line->fk_supplier_proposal = $this->id;
556 $this->line->label = $label;
557 $this->line->desc = $desc;
558 $this->line->qty = $qty;
560 $this->line->vat_src_code = $vat_src_code;
561 $this->line->tva_tx = $txtva;
562 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
563 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
564 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
565 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
566 $this->line->fk_product = $fk_product;
567 $this->line->remise_percent = $remise_percent;
568 $this->line->subprice = $pu_ht;
569 $this->line->rang = $ranktouse;
570 $this->line->info_bits = $info_bits;
571 $this->line->total_ht = $total_ht;
572 $this->line->total_tva = $total_tva;
573 $this->line->total_localtax1 = $total_localtax1;
574 $this->line->total_localtax2 = $total_localtax2;
575 $this->line->total_ttc = $total_ttc;
576 $this->line->product_type = $type;
577 $this->line->special_code = $special_code;
578 $this->line->fk_parent_line = $fk_parent_line;
579 $this->line->fk_unit = $fk_unit;
580 $this->line->origin = $origin;
581 $this->line->origin_id = $origin_id;
582 $this->line->ref_fourn = $this->db->escape($ref_supplier);
583 $this->line->date_start = $date_start;
584 $this->line->date_end = $date_end;
587 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
589 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
591 $productFournisseur->find_min_price_product_fournisseur($fk_product);
592 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
594 $this->line->fk_fournprice = ($fk_fournprice > 0 ? $fk_fournprice : 0);
596 $this->line->pa_ht = $pa_ht;
600 $this->line->fk_multicurrency = $this->fk_multicurrency;
601 $this->line->multicurrency_code = $this->multicurrency_code;
602 $this->line->multicurrency_subprice = $pu_ht_devise;
603 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
604 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
605 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
608 if (empty($qty) && empty($special_code)) {
609 $this->line->special_code = 3;
612 if (is_array($array_options) && count($array_options) > 0) {
613 $this->line->array_options = $array_options;
616 $result = $this->line->insert();
619 if (!empty($fk_parent_line)) {
621 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
622 $linecount = count($this->lines);
623 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
629 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
632 return $this->line->id;
634 $this->db->rollback();
638 $this->error = $this->line->error;
639 $this->errors = $this->line->errors;
640 $this->db->rollback();
644 $this->error =
'BadStatusOfObjectToAddLine';
676 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 = [], $ref_supplier =
'', $fk_unit = 0, $pu_ht_devise = 0)
678 global $conf, $user, $langs, $mysoc;
680 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
681 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
684 $remise_percent =
price2num($remise_percent);
687 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
693 if (empty($qty) && empty($special_code)) {
696 if (!empty($qty) && $special_code == 3) {
713 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
714 $vat_src_code = $reg[1];
715 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
718 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
722 $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);
723 $total_ht = $tabprice[0];
724 $total_tva = $tabprice[1];
725 $total_ttc = $tabprice[2];
726 $total_localtax1 = $tabprice[9];
727 $total_localtax2 = $tabprice[10];
728 $pu_ht = $tabprice[3];
729 $pu_tva = $tabprice[4];
730 $pu_ttc = $tabprice[5];
733 $multicurrency_total_ht = $tabprice[16];
734 $multicurrency_total_tva = $tabprice[17];
735 $multicurrency_total_ttc = $tabprice[18];
736 $pu_ht_devise = $tabprice[19];
739 if ($price_base_type ==
'TTC') {
745 $line->fetch($rowid);
746 $line->fetch_optionals();
748 $fk_product = $line->fk_product;
751 $staticline = clone $line;
753 $line->oldline = $staticline;
755 $this->line->context = $this->context;
758 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
759 $rangmax = $this->
line_max($fk_parent_line);
760 $this->line->rang = $rangmax + 1;
763 $this->line->id = $rowid;
764 $this->line->label = $label;
765 $this->line->desc = $desc;
766 $this->line->qty = $qty;
767 $this->line->product_type = $type;
769 $this->line->vat_src_code = $vat_src_code;
770 $this->line->tva_tx = $txtva;
771 $this->line->localtax1_tx = $txlocaltax1;
772 $this->line->localtax2_tx = $txlocaltax2;
773 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
774 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
775 $this->line->remise_percent = $remise_percent;
776 $this->line->subprice = $pu;
777 $this->line->info_bits = $info_bits;
778 $this->line->total_ht = $total_ht;
779 $this->line->total_tva = $total_tva;
780 $this->line->total_localtax1 = $total_localtax1;
781 $this->line->total_localtax2 = $total_localtax2;
782 $this->line->total_ttc = $total_ttc;
783 $this->line->special_code = $special_code;
784 $this->line->fk_parent_line = $fk_parent_line;
785 $this->line->skip_update_total = $skip_update_total;
786 $this->line->ref_fourn = $ref_supplier;
787 $this->line->fk_unit = $fk_unit;
790 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
792 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
794 $productFournisseur->find_min_price_product_fournisseur($fk_product);
795 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
797 $this->line->fk_fournprice = $fk_fournprice;
799 $this->line->pa_ht = $pa_ht;
801 if (is_array($array_options) && count($array_options) > 0) {
803 foreach ($array_options as $key => $value) {
804 $this->line->array_options[$key] = $array_options[$key];
809 $this->line->multicurrency_subprice = $pu_ht_devise;
810 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
811 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
812 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
814 $result = $this->line->update();
817 if (!empty($fk_parent_line)) {
826 $this->error = $this->db->error();
827 $this->db->rollback();
831 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
851 $line->fetch($lineid);
853 if ($line->delete($user) > 0) {
874 public function create($user, $notrigger = 0)
876 global $langs, $conf, $mysoc, $hookmanager;
886 $this->error =
"Failed to fetch company";
887 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
890 if (!empty($this->
ref)) {
893 $this->error =
'ErrorRefAlreadyExists';
894 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
895 $this->db->rollback();
901 $delivery_date = $this->delivery_date;
904 if (!empty($this->multicurrency_code)) {
907 if (empty($this->fk_multicurrency)) {
908 $this->multicurrency_code = $conf->currency;
909 $this->fk_multicurrency = 0;
910 $this->multicurrency_tx = 1;
916 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"supplier_proposal (";
919 $sql .=
", total_tva";
920 $sql .=
", total_ttc";
923 $sql .=
", fk_user_author";
924 $sql .=
", note_private";
925 $sql .=
", note_public";
926 $sql .=
", model_pdf";
927 $sql .=
", fk_cond_reglement";
928 $sql .=
", fk_mode_reglement";
929 $sql .=
", fk_account";
930 $sql .=
", date_livraison";
931 $sql .=
", fk_shipping_method";
932 $sql .=
", fk_projet";
934 $sql .=
", fk_multicurrency";
935 $sql .=
", multicurrency_code";
936 $sql .=
", multicurrency_tx";
939 $sql .= ((int) $this->socid);
943 $sql .=
", '".$this->db->idate($now).
"'";
944 $sql .=
", '(PROV)'";
945 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
946 $sql .=
", '".$this->db->escape($this->note_private).
"'";
947 $sql .=
", '".$this->db->escape($this->note_public).
"'";
948 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
949 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
950 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
951 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
952 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
953 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
954 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
955 $sql .=
", ".((int) $conf->entity);
956 $sql .=
", ".((int) $this->fk_multicurrency);
957 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
958 $sql .=
", ".((float) $this->multicurrency_tx);
961 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
962 $resql = $this->db->query($sql);
964 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
967 $this->
ref =
'(PROV'.$this->id.
')';
968 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
970 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
971 $resql = $this->db->query($sql);
976 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
977 $this->linked_objects = $this->linkedObjectsIds;
981 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
982 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
983 if (is_array($tmp_origin_id)) {
984 foreach ($tmp_origin_id as $origin_id) {
1000 $num = count($this->lines);
1002 for ($i = 0; $i < $num; $i++) {
1004 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1005 $fk_parent_line = 0;
1009 $this->lines[$i]->desc,
1010 $this->lines[$i]->subprice,
1011 $this->lines[$i]->qty,
1012 $this->lines[$i]->tva_tx,
1013 $this->lines[$i]->localtax1_tx,
1014 $this->lines[$i]->localtax2_tx,
1015 $this->lines[$i]->fk_product,
1016 $this->lines[$i]->remise_percent,
1020 $this->lines[$i]->product_type,
1021 $this->lines[$i]->rang,
1022 $this->lines[$i]->special_code,
1024 $this->lines[$i]->fk_fournprice,
1025 $this->lines[$i]->pa_ht,
1026 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1027 $this->lines[$i]->array_options,
1028 $this->lines[$i]->ref_fourn,
1029 $this->lines[$i]->fk_unit,
1030 'supplier_proposal',
1031 $this->lines[$i]->rowid
1036 $this->error = $this->db->error;
1041 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1042 $fk_parent_line = $result;
1061 if (!$error && !$notrigger) {
1063 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1070 $this->error = $this->db->lasterror();
1075 $this->error = $this->db->lasterror();
1080 $this->db->commit();
1081 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1084 $this->db->rollback();
1088 $this->error = $this->db->lasterror();
1089 $this->db->rollback();
1103 global $conf, $hookmanager;
1111 foreach ($this->lines as $line) {
1112 $line->fetch_optionals();
1116 $objFrom = clone $this;
1118 $objsoc =
new Societe($this->db);
1121 if (!empty($fromid) && $fromid != $this->socid) {
1122 if ($objsoc->fetch($fromid) > 0) {
1123 $this->socid = $objsoc->id;
1124 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1125 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1126 unset($this->fk_project);
1131 $objsoc->fetch($this->socid);
1137 if (!
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON') || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
".php")) {
1138 $this->error =
'ErrorSetupNotComplete';
1143 $this->user_author_id = $user->id;
1144 $this->user_validation_id = 0;
1148 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
'.php';
1150 $modSupplierProposal =
new $obj();
1151 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1154 $this->context[
'createfromclone'] =
'createfromclone';
1155 $result = $this->
create($user);
1162 if (is_object($hookmanager)) {
1163 $parameters = array(
'objFrom' => $objFrom);
1165 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1173 unset($this->context[
'createfromclone']);
1177 $this->db->commit();
1180 $this->db->rollback();
1192 public function fetch($rowid, $ref =
'')
1196 $sql =
"SELECT p.rowid, p.entity, p.ref, p.fk_soc as socid";
1197 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1198 $sql .=
", p.datec";
1199 $sql .=
", p.date_valid as datev";
1200 $sql .=
", p.date_livraison as delivery_date";
1201 $sql .=
", p.model_pdf, p.extraparams";
1202 $sql .=
", p.note_private, p.note_public";
1203 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1204 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1205 $sql .=
", p.fk_cond_reglement";
1206 $sql .=
", p.fk_mode_reglement";
1207 $sql .=
', p.fk_account';
1208 $sql .=
", p.fk_shipping_method";
1209 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1210 $sql .=
", c.label as statut_label";
1211 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1212 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1213 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1214 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1215 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1216 $sql .=
" WHERE p.fk_statut = c.id";
1217 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1219 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1221 $sql .=
" AND p.rowid = ".((int) $rowid);
1224 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1225 $resql = $this->db->query($sql);
1227 if ($this->db->num_rows($resql)) {
1228 $obj = $this->db->fetch_object($resql);
1230 $this->
id = $obj->rowid;
1231 $this->entity = $obj->entity;
1233 $this->
ref = $obj->ref;
1234 $this->total_ht = $obj->total_ht;
1235 $this->total_tva = $obj->total_tva;
1236 $this->total_localtax1 = $obj->localtax1;
1237 $this->total_localtax2 = $obj->localtax2;
1238 $this->total_ttc = $obj->total_ttc;
1239 $this->socid = $obj->socid;
1240 $this->fk_project = $obj->fk_project;
1241 $this->model_pdf = $obj->model_pdf;
1242 $this->note = $obj->note_private;
1243 $this->note_private = $obj->note_private;
1244 $this->note_public = $obj->note_public;
1245 $this->
statut = (int) $obj->fk_statut;
1246 $this->
status = (int) $obj->fk_statut;
1247 $this->datec = $this->db->jdate($obj->datec);
1248 $this->datev = $this->db->jdate($obj->datev);
1249 $this->date_creation = $this->db->jdate($obj->datec);
1250 $this->date = $this->date_creation;
1251 $this->date_validation = $this->db->jdate($obj->datev);
1252 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1253 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1255 $this->mode_reglement_id = $obj->fk_mode_reglement;
1256 $this->mode_reglement_code = $obj->mode_reglement_code;
1257 $this->mode_reglement = $obj->mode_reglement;
1258 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1259 $this->cond_reglement_id = $obj->fk_cond_reglement;
1260 $this->cond_reglement_code = $obj->cond_reglement_code;
1261 $this->cond_reglement = $obj->cond_reglement;
1262 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1264 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1266 $this->user_author_id = $obj->fk_user_author;
1267 $this->user_validation_id = $obj->fk_user_valid;
1268 $this->user_closing_id = $obj->fk_user_cloture;
1271 $this->fk_multicurrency = $obj->fk_multicurrency;
1272 $this->multicurrency_code = $obj->multicurrency_code;
1273 $this->multicurrency_tx = $obj->multicurrency_tx;
1274 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1275 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1276 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1282 $this->db->free($resql);
1284 $this->lines = array();
1287 $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,";
1288 $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,";
1289 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1290 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1291 $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';
1292 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1293 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1294 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1295 $sql .=
" ORDER by d.rang";
1297 $result = $this->db->query($sql);
1299 $num = $this->db->num_rows($result);
1303 $objp = $this->db->fetch_object($result);
1307 $line->rowid = $objp->rowid;
1308 $line->id = $objp->rowid;
1309 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1310 $line->fk_parent_line = $objp->fk_parent_line;
1311 $line->product_type = $objp->product_type;
1312 $line->label = $objp->custom_label;
1313 $line->desc = $objp->description;
1314 $line->qty = $objp->qty;
1315 $line->tva_tx = $objp->tva_tx;
1316 $line->localtax1_tx = $objp->localtax1_tx;
1317 $line->localtax2_tx = $objp->localtax2_tx;
1318 $line->subprice = $objp->subprice;
1319 $line->fk_remise_except = $objp->fk_remise_except;
1320 $line->remise_percent = $objp->remise_percent;
1322 $line->info_bits = $objp->info_bits;
1323 $line->total_ht = $objp->total_ht;
1324 $line->total_tva = $objp->total_tva;
1325 $line->total_localtax1 = $objp->total_localtax1;
1326 $line->total_localtax2 = $objp->total_localtax2;
1327 $line->total_ttc = $objp->total_ttc;
1328 $line->fk_fournprice = $objp->fk_fournprice;
1329 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1330 $line->pa_ht = $marginInfos[0];
1331 $line->marge_tx = $marginInfos[1];
1332 $line->marque_tx = $marginInfos[2];
1333 $line->special_code = $objp->special_code;
1334 $line->rang = $objp->rang;
1336 $line->fk_product = $objp->fk_product;
1338 $line->ref = $objp->product_ref;
1339 $line->product_ref = $objp->product_ref;
1340 $line->libelle = $objp->product_label;
1341 $line->product_label = $objp->product_label;
1342 $line->product_desc = $objp->product_desc;
1343 $line->fk_product_type = $objp->fk_product_type;
1345 $line->ref_fourn = $objp->ref_produit_fourn;
1348 $line->fk_multicurrency = $objp->fk_multicurrency;
1349 $line->multicurrency_code = $objp->multicurrency_code;
1350 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1351 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1352 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1353 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1354 $line->fk_unit = $objp->fk_unit;
1356 $this->lines[$i] = $line;
1360 $this->db->free($result);
1362 $this->error = $this->db->error();
1373 $this->error =
"Record Not Found";
1376 $this->error = $this->db->error();
1388 public function valid($user, $notrigger = 0)
1390 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1392 global $conf, $langs;
1397 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'creer'))
1398 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'validate_advance'))) {
1402 $soc =
new Societe($this->db);
1403 $result = $soc->fetch($this->socid);
1410 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1417 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1418 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1419 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1420 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1422 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1423 $resql = $this->db->query($sql);
1430 if (!$error && !$notrigger) {
1432 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1440 $this->oldref = $this->ref;
1443 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1445 $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).
"'";
1446 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1447 $resql = $this->db->query($sql);
1450 $this->error = $this->db->lasterror();
1452 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'supplier_proposal/".$this->db->escape($this->newref).
"'";
1453 $sql .=
" WHERE filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1454 $resql = $this->db->query($sql);
1457 $this->error = $this->db->lasterror();
1463 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1464 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1465 if (!$error && file_exists($dirsource)) {
1466 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1467 if (@rename($dirsource, $dirdest)) {
1470 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1471 foreach ($listoffiles as $fileentry) {
1472 $dirsource = $fileentry[
'name'];
1473 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1474 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1475 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1476 @rename($dirsource, $dirdest);
1485 $this->user_validation_id = $user->id;
1486 $this->datev = $now;
1487 $this->date_validation = $now;
1489 $this->db->commit();
1492 $this->db->rollback();
1496 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1525 if ($user->hasRight(
'supplier_proposal',
'creer')) {
1526 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1527 $sql .=
" SET date_livraison = ".($delivery_date !=
'' ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1528 $sql .=
" WHERE rowid = ".((int) $this->
id);
1530 if ($this->db->query($sql)) {
1531 $this->delivery_date = $delivery_date;
1534 $this->error = $this->db->error();
1535 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1623 global $langs, $conf;
1628 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1629 $sql .=
" SET fk_statut = ".((int) $this->
statut).
",";
1630 if (!empty($note)) {
1631 $sql .=
" note_private = '".$this->db->escape($note).
"',";
1633 $sql .=
" date_cloture = NULL, fk_user_cloture = NULL";
1634 $sql .=
" WHERE rowid = ".((int) $this->
id);
1638 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1639 $resql = $this->db->query($sql);
1642 $this->errors[] =
"Error ".$this->db->lasterror();
1647 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1657 if (!empty($this->errors)) {
1658 foreach ($this->errors as $errmsg) {
1659 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1660 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1663 $this->db->rollback();
1666 $this->db->commit();
1682 global $langs, $conf;
1692 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1693 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape($note).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".$user->id;
1694 $sql .=
" WHERE rowid = ".((int) $this->
id);
1696 $resql = $this->db->query($sql);
1698 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1699 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1702 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1703 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1710 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1715 $outputlangs = $langs;
1717 $outputlangs =
new Translate(
"", $conf);
1718 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1719 $outputlangs->setDefaultLang($newlang);
1722 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1733 $this->db->commit();
1736 $this->db->rollback();
1740 $this->error = $this->db->lasterror();
1741 $this->errors[] = $this->db->lasterror();
1742 $this->db->rollback();
1757 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1758 foreach ($this->lines as $product) {
1759 if ($product->subprice <= 0) {
1764 $multicurrency_tx = 1;
1765 $fk_multicurrency = 0;
1767 if (empty($this->thirdparty)) {
1771 $ref_fourn = $product->ref_fourn;
1772 if (empty($ref_fourn)) {
1773 $ref_fourn = $product->ref_supplier;
1775 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1778 $productsupplier->id = $product->fk_product;
1780 $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,
'',
'',
'');
1797 $unitPrice =
price2num($product->subprice,
'MU');
1799 $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);
1801 $resql = $this->db->query($sql);
1803 $this->error = $this->db->error();
1804 $this->db->rollback();
1823 $unitPrice =
price2num($product->subprice,
'MU');
1828 "'".$this->db->idate($now).
"'",
1829 $product->fk_product,
1830 $this->thirdparty->id,
1831 "'".$product->ref_fourn.
"'",
1838 if (isModEnabled(
"multicurrency")) {
1839 if (!empty($product->multicurrency_code)) {
1840 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1842 $multicurrency->fetch(0, $product->multicurrency_code);
1843 if (!empty($multicurrency->id)) {
1844 $values[] = $multicurrency->id;
1845 $values[] =
"'".$product->multicurrency_code.
"'";
1846 $values[] = $product->multicurrency_subprice;
1847 $values[] = $product->multicurrency_total_ht;
1848 $values[] = $multicurrency->rate->rate;
1850 for ($i = 0; $i < 5; $i++) {
1857 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1858 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1859 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1860 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1862 $sql .=
') VALUES ('.implode(
',', $values).
')';
1864 $resql = $this->db->query($sql);
1866 $this->error = $this->db->error();
1867 $this->db->rollback();
1883 global $conf, $langs;
1887 if ($this->
statut == self::STATUS_DRAFT) {
1888 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1892 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1893 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1894 $sql .=
" WHERE rowid = ".((int) $this->
id);
1896 if ($this->db->query($sql)) {
1898 $this->oldcopy = clone $this;
1903 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1912 $this->db->commit();
1915 $this->db->rollback();
1938 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1946 if (!$user->hasRight(
'societe',
'client',
'voir')) {
1947 $search_sale = $user->id;
1950 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
1951 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
1952 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
1953 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
1954 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
1955 $sql .=
" AND p.fk_soc = s.rowid";
1956 $sql .=
" AND p.fk_statut = c.id";
1958 $sql .=
" AND s.rowid = ".((int) $socid);
1961 $sql .=
" AND p.fk_statut = 0";
1963 if ($notcurrentuser > 0) {
1964 $sql .=
" AND p.fk_user_author <> ".((int) $user->id);
1967 if ($search_sale && $search_sale !=
'-1') {
1968 if ($search_sale == -2) {
1969 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
1970 } elseif ($search_sale > 0) {
1971 $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).
")";
1974 $sql .= $this->db->order($sortfield, $sortorder);
1975 $sql .= $this->db->plimit($limit, $offset);
1977 $result = $this->db->query($sql);
1979 $num = $this->db->num_rows($result);
1983 $obj = $this->db->fetch_object($result);
1985 if ($shortlist == 1) {
1986 $ga[$obj->supplier_proposalid] = $obj->ref;
1987 } elseif ($shortlist == 2) {
1988 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
1990 $ga[$i][
'id'] = $obj->supplier_proposalid;
1991 $ga[$i][
'ref'] = $obj->ref;
1992 $ga[$i][
'name'] = $obj->name;
2012 public function delete($user, $notrigger = 0)
2014 global $conf, $langs;
2015 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2023 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2031 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2032 $ef = $main.
"_extrafields";
2033 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2034 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2035 if ($this->db->query($sql)) {
2036 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2037 if ($this->db->query($sqlef) && $this->db->query($sql)) {
2051 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2052 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2053 $file = $dir.
"/".$ref.
".pdf";
2054 if (file_exists($file)) {
2058 $this->error =
'ErrorFailToDeleteFile';
2059 $this->errors = array(
'ErrorFailToDeleteFile');
2060 $this->db->rollback();
2064 if (file_exists($dir)) {
2067 $this->error =
'ErrorFailToDeleteDir';
2068 $this->errors = array(
'ErrorFailToDeleteDir');
2069 $this->db->rollback();
2082 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2087 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2088 $this->db->commit();
2091 $this->error = $this->db->lasterror();
2092 $this->db->rollback();
2096 $this->error = $this->db->lasterror();
2097 $this->db->rollback();
2101 $this->error = $this->db->lasterror();
2102 $this->db->rollback();
2106 $this->db->rollback();
2119 $sql =
"SELECT c.rowid, ";
2120 $sql .=
" c.datec as date_creation, c.date_valid as date_validation, c.date_cloture as date_closure,";
2121 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2122 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2123 $sql .=
" WHERE c.rowid = ".((int) $id);
2125 $result = $this->db->query($sql);
2128 if ($this->db->num_rows($result)) {
2129 $obj = $this->db->fetch_object($result);
2131 $this->
id = $obj->rowid;
2133 $this->date_creation = $this->db->jdate($obj->date_creation);
2134 $this->date_validation = $this->db->jdate($obj->date_validation);
2135 $this->date_cloture = $this->db->jdate($obj->date_closure);
2137 $this->user_creation_id = $obj->fk_user_author;
2138 $this->user_validation_id = $obj->fk_user_valid;
2139 $this->user_closing_id = $obj->fk_user_cloture;
2141 $this->db->free($result);
2172 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2174 $langs->load(
"supplier_proposal");
2175 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2176 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2177 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2178 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2179 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2180 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2181 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2182 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2183 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2184 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2188 if ($status == self::STATUS_DRAFT) {
2189 $statusnew =
'status0';
2190 } elseif ($status == self::STATUS_VALIDATED) {
2191 $statusnew =
'status1';
2192 } elseif ($status == self::STATUS_SIGNED) {
2193 $statusnew =
'status4';
2194 } elseif ($status == self::STATUS_NOTSIGNED) {
2195 $statusnew =
'status9';
2196 } elseif ($status == self::STATUS_CLOSE) {
2197 $statusnew =
'status6';
2200 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2215 global $conf, $user, $langs;
2221 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2222 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2223 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2224 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2225 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2228 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2229 if ($mode ==
'opened') {
2230 $sql .=
" AND p.fk_statut = 1";
2232 if ($mode ==
'signed') {
2233 $sql .=
" AND p.fk_statut = 2";
2236 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2239 $resql = $this->db->query($sql);
2241 $label = $labelShort =
'';
2243 if ($mode ==
'opened') {
2244 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2246 $label = $langs->trans(
"SupplierProposalsToClose");
2247 $labelShort = $langs->trans(
"ToAcceptRefuse");
2249 if ($mode ==
'signed') {
2250 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2252 $label = $langs->trans(
"SupplierProposalsToProcess");
2253 $labelShort = $langs->trans(
"ToClose");
2257 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2258 $response->label = $label;
2259 $response->labelShort = $labelShort;
2260 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2264 while ($obj = $this->db->fetch_object($resql)) {
2265 $response->nbtodo++;
2266 if ($mode ==
'opened') {
2267 $datelimit = $this->db->jdate($obj->datefin);
2268 if ($datelimit < ($now - $delay_warning)) {
2269 $response->nbtodolate++;
2277 $this->error = $this->db->lasterror();
2292 global $user, $langs, $conf;
2297 $sql =
"SELECT rowid";
2298 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2299 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2300 $sql .= $this->db->plimit(100);
2302 $resql = $this->db->query($sql);
2304 $num_prods = $this->db->num_rows($resql);
2306 while ($i < $num_prods) {
2308 $row = $this->db->fetch_row($resql);
2309 $prodids[$i] = $row[0];
2315 $this->
ref =
'SPECIMEN';
2316 $this->specimen = 1;
2318 $this->date = time();
2319 $this->cond_reglement_id = 1;
2320 $this->cond_reglement_code =
'RECEP';
2321 $this->mode_reglement_id = 7;
2322 $this->mode_reglement_code =
'CHQ';
2323 $this->note_public =
'This is a comment (public)';
2324 $this->note_private =
'This is a comment (private)';
2328 while ($xnbp < $nbp) {
2330 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2332 $line->subprice = 100;
2333 $line->tva_tx = 19.6;
2334 $line->localtax1_tx = 0;
2335 $line->localtax2_tx = 0;
2337 $line->total_ht = 50;
2338 $line->total_ttc = 59.8;
2339 $line->total_tva = 9.8;
2340 $line->remise_percent = 50;
2342 $line->total_ht = 100;
2343 $line->total_ttc = 119.6;
2344 $line->total_tva = 19.6;
2345 $line->remise_percent = 00;
2348 if ($num_prods > 0) {
2349 $prodid = mt_rand(1, $num_prods);
2350 $line->fk_product = $prodids[$prodid];
2353 $this->lines[$xnbp] = $line;
2355 $this->total_ht += $line->total_ht;
2356 $this->total_tva += $line->total_tva;
2357 $this->total_ttc += $line->total_ttc;
2372 global $conf, $user;
2374 $this->nb = array();
2377 $sql =
"SELECT count(p.rowid) as nb";
2378 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2379 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2380 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2381 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2382 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2385 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2387 $resql = $this->db->query($sql);
2390 while ($obj = $this->db->fetch_object($resql)) {
2391 $this->nb[
"supplier_proposals"] = $obj->nb;
2393 $this->db->free($resql);
2397 $this->error = $this->db->lasterror();
2412 global $conf, $db, $langs;
2413 $langs->load(
"supplier_proposal");
2422 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2423 foreach ($dirmodels as $reldir) {
2424 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2427 $mybool = ((bool) @include_once $dir.$file) || $mybool;
2435 $obj =
new $classname();
2437 $numref = $obj->getNextValue($soc, $this);
2439 if ($numref !=
"") {
2442 $this->error = $obj->error;
2446 $langs->load(
"errors");
2447 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2461 global $conf, $langs, $menumanager;
2463 $langs->load(
'supplier_proposal');
2466 return [
'optimize' => $langs->trans(
"ShowSupplierProposal")];
2469 $option = $params[
'option'] ??
'';
2472 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2473 if (isset($this->
status)) {
2474 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
2476 if (!empty($this->
ref)) {
2477 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2479 if (!empty($this->ref_fourn)) {
2480 $datas[
'ref_supplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2482 if (!empty($this->total_ht)) {
2483 $datas[
'amount_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2485 if (!empty($this->total_tva)) {
2486 $datas[
'amount_vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2488 if (!empty($this->total_ttc)) {
2489 $datas[
'amount_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2506 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2508 global $langs, $conf, $user, $hookmanager;
2510 if (!empty($conf->dol_no_mouse_hover)) {
2518 'objecttype' => $this->element,
2519 'option' => $option,
2521 $classfortooltip =
'classfortooltip';
2524 $classfortooltip =
'classforajaxtooltip';
2525 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2531 if ($option ==
'') {
2532 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2534 if ($option ==
'document') {
2535 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2538 if ($option !==
'nolink') {
2540 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2541 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2542 $add_save_lastsearch_values = 1;
2544 if ($add_save_lastsearch_values) {
2545 $url .=
'&save_lastsearch_values=1';
2550 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
2552 $label = $langs->trans(
"ShowSupplierProposal");
2553 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2555 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
2556 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2559 $linkstart =
'<a href="'.$url.
'"';
2560 $linkstart .= $linkclose.
'>';
2563 $result .= $linkstart;
2565 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
2567 if ($withpicto != 2) {
2568 $result .= $this->ref;
2570 $result .= $linkend;
2572 if ($addlinktonotes) {
2573 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2576 $result .=
' <span class="note inline-block">';
2577 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2582 $result .=
'</span>';
2586 $hookmanager->initHooks(array($this->element .
'dao'));
2587 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
2588 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2590 $result = $hookmanager->resPrint;
2592 $result .= $hookmanager->resPrint;
2606 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2607 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2608 $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,';
2609 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2610 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2611 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2612 $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';
2613 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2614 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2615 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2616 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2618 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2619 $resql = $this->db->query($sql);
2621 $num = $this->db->num_rows($resql);
2625 $obj = $this->db->fetch_object($resql);
2628 $this->lines[$i]->id = $obj->rowid;
2629 $this->lines[$i]->rowid = $obj->rowid;
2630 $this->lines[$i]->label = $obj->custom_label;
2631 $this->lines[$i]->description = $obj->description;
2632 $this->lines[$i]->fk_product = $obj->fk_product;
2633 $this->lines[$i]->ref = $obj->ref;
2634 $this->lines[$i]->product_label = $obj->product_label;
2635 $this->lines[$i]->product_desc = $obj->product_desc;
2636 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2637 $this->lines[$i]->product_type = $obj->product_type;
2638 $this->lines[$i]->qty = $obj->qty;
2639 $this->lines[$i]->subprice = $obj->subprice;
2640 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2641 $this->lines[$i]->remise_percent = $obj->remise_percent;
2642 $this->lines[$i]->tva_tx = $obj->tva_tx;
2643 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2644 $this->lines[$i]->info_bits = $obj->info_bits;
2645 $this->lines[$i]->total_ht = $obj->total_ht;
2646 $this->lines[$i]->total_tva = $obj->total_tva;
2647 $this->lines[$i]->total_ttc = $obj->total_ttc;
2648 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2649 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2650 $this->lines[$i]->pa_ht = $marginInfos[0];
2651 $this->lines[$i]->marge_tx = $marginInfos[1];
2652 $this->lines[$i]->marque_tx = $marginInfos[2];
2653 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2654 $this->lines[$i]->special_code = $obj->special_code;
2655 $this->lines[$i]->rang = $obj->rang;
2657 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2658 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2661 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2662 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2663 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2664 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2665 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2666 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2667 $this->lines[$i]->fk_unit = $obj->fk_unit;
2671 $this->db->free($resql);
2675 $this->error = $this->db->error();
2691 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2693 global $conf, $langs;
2695 $langs->load(
"supplier_proposal");
2696 $outputlangs->load(
"products");
2701 if ($this->model_pdf) {
2702 $modele = $this->model_pdf;
2708 $modelpath =
"core/modules/supplier_proposal/doc/";
2710 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2742 'supplier_proposaldet'
2760 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2762 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2763 $return .=
'<div class="info-box info-box-sm">';
2764 $return .=
'<span class="info-box-icon bg-infobox-action">';
2767 $return .=
'</span>';
2768 $return .=
'<div class="info-box-content">';
2769 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
2770 if ($selected >= 0) {
2771 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2773 if (property_exists($this,
'socid')) {
2774 $return .=
'<span class="info-box-ref"> | '.$this->socid.
'</span>';
2776 if (property_exists($this,
'delivery_date')) {
2777 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"DateEnd").
'</span> : <span class="info-box-label">'.
dol_print_date($this->delivery_date).
'</span>';
2779 if (property_exists($this,
'total_ttc')) {
2780 $return .=
'<br><span class="opacitymedium" >'.$langs->trans(
"AmountHT").
' : </span><span class="info-box-label amount">'.
price($this->total_ttc).
'</span>';
2782 if (method_exists($this,
'getLibStatut')) {
2783 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2785 $return .=
'</div>';
2786 $return .=
'</div>';
2787 $return .=
'</div>';
2811 public $element =
'supplier_proposaldet';
2816 public $table_element =
'supplier_proposaldet';
2838 public $fk_supplier_proposal;
2843 public $fk_parent_line;
2869 public $vat_src_code;
2876 public $remise_percent;
2881 public $fk_remise_except;
2888 public $fk_fournprice;
2897 public $special_code;
2902 public $info_bits = 0;
2924 public $product_ref;
2936 public $product_label;
2948 public $product_desc;
2950 public $localtax1_tx;
2951 public $localtax2_tx;
2952 public $localtax1_type;
2953 public $localtax2_type;
2954 public $total_localtax1;
2955 public $total_localtax2;
2957 public $skip_update_total;
2960 public $ref_supplier;
2966 public $fk_multicurrency;
2968 public $multicurrency_code;
2969 public $multicurrency_subprice;
2970 public $multicurrency_total_ht;
2971 public $multicurrency_total_tva;
2972 public $multicurrency_total_ttc;
2992 $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,';
2993 $sql .=
' pd.date_start, pd.date_end,';
2994 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
2995 $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,';
2996 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
2997 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
2998 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
2999 $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';
3000 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
3001 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
3002 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
3004 $result = $this->db->query($sql);
3006 if ($objp = $this->db->fetch_object($result)) {
3007 $this->
id = $objp->rowid;
3008 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
3009 $this->fk_parent_line = $objp->fk_parent_line;
3010 $this->label = $objp->custom_label;
3011 $this->desc = $objp->description;
3012 $this->qty = $objp->qty;
3013 $this->subprice = $objp->subprice;
3014 $this->tva_tx = $objp->tva_tx;
3015 $this->remise_percent = $objp->remise_percent;
3016 $this->fk_remise_except = $objp->fk_remise_except;
3017 $this->fk_product = $objp->fk_product;
3018 $this->info_bits = $objp->info_bits;
3019 $this->date_start = $this->db->jdate($objp->date_start);
3020 $this->date_end = $this->db->jdate($objp->date_end);
3022 $this->total_ht = $objp->total_ht;
3023 $this->total_tva = $objp->total_tva;
3024 $this->total_ttc = $objp->total_ttc;
3026 $this->fk_fournprice = $objp->fk_fournprice;
3028 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
3029 $this->pa_ht = $marginInfos[0];
3030 $this->marge_tx = $marginInfos[1];
3031 $this->marque_tx = $marginInfos[2];
3033 $this->special_code = $objp->special_code;
3034 $this->product_type = $objp->product_type;
3035 $this->rang = $objp->rang;
3037 $this->
ref = $objp->product_ref;
3038 $this->product_ref = $objp->product_ref;
3039 $this->libelle = $objp->product_label;
3040 $this->product_label = $objp->product_label;
3041 $this->product_desc = $objp->product_desc;
3043 $this->ref_fourn = $objp->ref_produit_fourn;
3046 $this->fk_multicurrency = $objp->fk_multicurrency;
3047 $this->multicurrency_code = $objp->multicurrency_code;
3048 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3049 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3050 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3051 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3052 $this->fk_unit = $objp->fk_unit;
3054 $this->db->free($result);
3072 global $conf, $langs, $user;
3076 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3079 if (empty($this->tva_tx)) {
3082 if (empty($this->vat_src_code)) {
3083 $this->vat_src_code =
'';
3085 if (empty($this->localtax1_tx)) {
3086 $this->localtax1_tx = 0;
3088 if (empty($this->localtax2_tx)) {
3089 $this->localtax2_tx = 0;
3091 if (empty($this->localtax1_type)) {
3092 $this->localtax1_type = 0;
3094 if (empty($this->localtax2_type)) {
3095 $this->localtax2_type = 0;
3097 if (empty($this->total_localtax1)) {
3098 $this->total_localtax1 = 0;
3100 if (empty($this->total_localtax2)) {
3101 $this->total_localtax2 = 0;
3103 if (empty($this->rang)) {
3106 if (empty($this->remise_percent)) {
3107 $this->remise_percent = 0;
3109 if (empty($this->info_bits)) {
3110 $this->info_bits = 0;
3112 if (empty($this->special_code)) {
3113 $this->special_code = 0;
3115 if (empty($this->fk_parent_line)) {
3116 $this->fk_parent_line = 0;
3118 if (empty($this->fk_fournprice)) {
3119 $this->fk_fournprice = 0;
3121 if (empty($this->fk_unit)) {
3124 if (empty($this->subprice)) {
3125 $this->subprice = 0;
3128 if (empty($this->pa_ht)) {
3133 if ($this->pa_ht == 0) {
3134 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3138 $this->pa_ht = $result;
3143 if ($this->product_type < 0) {
3150 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3151 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3152 $sql .=
' date_start, date_end,';
3153 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3154 $sql .=
' subprice, remise_percent, ';
3155 $sql .=
' info_bits, ';
3156 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3157 $sql .=
' ref_fourn,';
3158 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3159 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3160 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3161 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3162 $sql .=
" '".$this->db->escape($this->desc).
"',";
3163 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3164 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3165 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3166 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3167 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3168 $sql .=
" ".price2num($this->qty,
'MS').
",";
3169 $sql .=
" ".price2num($this->tva_tx).
",";
3170 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3171 $sql .=
" ".price2num($this->localtax1_tx).
",";
3172 $sql .=
" ".price2num($this->localtax2_tx).
",";
3173 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3174 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3175 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3176 $sql .=
" ".((float) $this->remise_percent).
",";
3177 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3178 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3179 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3180 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3181 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3182 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3183 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3184 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3185 $sql .=
' '.((int) $this->special_code).
',';
3186 $sql .=
' '.((int) $this->rang).
',';
3187 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3188 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3189 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3190 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3191 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3192 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3193 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3194 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3197 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3198 $resql = $this->db->query($sql);
3200 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3209 if (!$error && !$notrigger) {
3211 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3213 $this->db->rollback();
3219 $this->db->commit();
3222 $this->error = $this->db->error().
" sql=".$sql;
3223 $this->db->rollback();
3234 public function delete($user)
3240 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet";
3241 $sql .=
" WHERE rowid = ".((int) $this->
id);
3243 if ($this->db->query($sql)) {
3249 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3254 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3256 $this->db->rollback();
3261 $this->db->commit();
3265 $this->error = $this->db->error().
" sql=".$sql;
3266 $this->db->rollback();
3279 global $conf, $langs, $user;
3284 if (empty($this->tva_tx)) {
3287 if (empty($this->localtax1_tx)) {
3288 $this->localtax1_tx = 0;
3290 if (empty($this->localtax2_tx)) {
3291 $this->localtax2_tx = 0;
3293 if (empty($this->total_localtax1)) {
3294 $this->total_localtax1 = 0;
3296 if (empty($this->total_localtax2)) {
3297 $this->total_localtax2 = 0;
3299 if (empty($this->localtax1_type)) {
3300 $this->localtax1_type = 0;
3302 if (empty($this->localtax2_type)) {
3303 $this->localtax2_type = 0;
3305 if (empty($this->marque_tx)) {
3306 $this->marque_tx = 0;
3308 if (empty($this->marge_tx)) {
3309 $this->marge_tx = 0;
3311 if (empty($this->remise_percent)) {
3312 $this->remise_percent = 0;
3314 if (empty($this->info_bits)) {
3315 $this->info_bits = 0;
3317 if (empty($this->special_code)) {
3318 $this->special_code = 0;
3320 if (empty($this->fk_parent_line)) {
3321 $this->fk_parent_line = 0;
3323 if (empty($this->fk_fournprice)) {
3324 $this->fk_fournprice = 0;
3326 if (empty($this->fk_unit)) {
3329 if (empty($this->subprice)) {
3330 $this->subprice = 0;
3333 if (empty($this->pa_ht)) {
3338 if ($this->pa_ht == 0) {
3339 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3343 $this->pa_ht = $result;
3350 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3351 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3352 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3353 $sql .=
" , product_type=".((int) $this->product_type);
3354 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3355 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3356 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3357 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3358 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3359 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3360 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3361 $sql .=
" , qty='".price2num($this->qty).
"'";
3362 $sql .=
" , subprice=".price2num($this->subprice);
3363 $sql .=
" , remise_percent=".price2num($this->remise_percent);
3364 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3365 if (empty($this->skip_update_total)) {
3366 $sql .=
" , total_ht=".price2num($this->total_ht);
3367 $sql .=
" , total_tva=".price2num($this->total_tva);
3368 $sql .=
" , total_ttc=".price2num($this->total_ttc);
3369 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
3370 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
3372 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3373 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3374 $sql .=
" , special_code=".((int) $this->special_code);
3375 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3376 if (!empty($this->rang)) {
3377 $sql .=
", rang=".((int) $this->rang);
3379 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3380 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3383 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3384 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3385 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3386 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3388 $sql .=
" WHERE rowid = ".((int) $this->
id);
3390 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3391 $resql = $this->db->query($sql);
3400 if (!$error && !$notrigger) {
3402 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3404 $this->db->rollback();
3410 $this->db->commit();
3413 $this->error = $this->db->error();
3414 $this->db->rollback();
3432 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3433 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3434 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3435 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3436 $sql .=
" WHERE rowid = ".((int) $this->
id);
3438 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3440 $resql = $this->db->query($sql);
3442 $this->db->commit();
3445 $this->error = $this->db->error();
3446 $this->db->rollback();
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
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.
update_price($exclspec=0, $roundingadjust='auto', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
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 if an object id or ref exists If you don't need or want to instantiate the object and just need...
updateRangOfLine($rowid, $rang)
Update position of line (rang)
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)
Update ProductFournisseur.
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=[], $ref_supplier='', $fk_unit=0, $pu_ht_devise=0)
Update a proposal line.
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.
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=[], $ref_supplier='', $fk_unit=0, $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 parameters sont deja cense e...
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.
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.
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.
__construct($db, $socid=0, $supplier_proposalid=0)
Constructor.
LibStatut($status, $mode=1)
Return label of a status (draft, validated, ...)
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.
reopen($user, $statut, $note='', $notrigger=0)
Set an overall discount on the proposal.
loadStateBoard()
Load indicator this->nb of global stats widget.
deleteLine($lineid)
Delete detail line.
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 Constructor.
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($utf8_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.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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_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_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
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...
getMarginInfos($pv_ht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $pa_ht)
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.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut