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 $class_element_line =
'SupplierProposalLine';
77 public $fk_element =
'fk_supplier_proposal';
82 public $picto =
'supplier_proposal';
88 public $restrictiononfksoc = 1;
104 public $ref_supplier;
120 public $delivery_date;
134 public $user_author_id;
154 public $cond_reglement_code;
155 public $cond_reglement_doc;
157 public $mode_reglement_code;
162 public $mode_reglement;
164 public $extraparams = array();
165 public $lines = array();
168 public $labelStatus = array();
169 public $labelStatusShort = array();
178 public $fk_multicurrency;
180 public $multicurrency_code;
181 public $multicurrency_tx;
182 public $multicurrency_total_ht;
183 public $multicurrency_total_tva;
184 public $multicurrency_total_ttc;
220 public function __construct($db, $socid = 0, $supplier_proposalid = 0)
222 global $conf, $langs;
226 $this->ismultientitymanaged = 1;
227 $this->socid = $socid;
228 $this->
id = $supplier_proposalid;
243 public function add_product($idproduct, $qty, $remise_percent = 0)
246 global $conf, $mysoc;
252 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
253 if ($idproduct > 0) {
254 $prod =
new Product($this->db);
255 $prod->fetch($idproduct);
257 $productdesc = $prod->description;
261 if (empty($tva_tx)) {
264 $localtax1_tx =
get_localtax($tva_tx, 1, $mysoc, $this->thirdparty, $tva_npr);
265 $localtax2_tx =
get_localtax($tva_tx, 2, $mysoc, $this->thirdparty, $tva_npr);
268 if ($conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
269 $price = $prod->multiprices[$this->thirdparty->price_level];
276 $line->fk_product = $idproduct;
277 $line->desc = $productdesc;
280 $line->remise_percent = $remise_percent;
281 $line->tva_tx = $tva_tx;
283 $this->lines[] = $line;
301 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
302 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
307 $result = $remise->fetch($idremise);
310 if ($remise->fk_facture) {
311 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
312 $this->db->rollback();
317 $supplier_proposalligne->fk_supplier_proposal = $this->id;
318 $supplier_proposalligne->fk_remise_except = $remise->id;
319 $supplier_proposalligne->desc = $remise->description;
320 $supplier_proposalligne->tva_tx = $remise->tva_tx;
321 $supplier_proposalligne->subprice = -$remise->amount_ht;
322 $supplier_proposalligne->fk_product = 0;
323 $supplier_proposalligne->qty = 1;
324 $supplier_proposalligne->remise_percent = 0;
325 $supplier_proposalligne->rang = -1;
326 $supplier_proposalligne->info_bits = 2;
328 $supplier_proposalligne->total_ht = -$remise->amount_ht;
329 $supplier_proposalligne->total_tva = -$remise->amount_tva;
330 $supplier_proposalligne->total_ttc = -$remise->amount_ttc;
332 $result = $supplier_proposalligne->insert();
339 $this->db->rollback();
343 $this->error = $supplier_proposalligne->error;
344 $this->db->rollback();
348 $this->db->rollback();
390 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)
392 global $mysoc, $conf, $langs;
394 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");
395 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
398 if (empty($remise_percent)) {
404 if (empty($info_bits)) {
410 if (empty($fk_parent_line) || $fk_parent_line < 0) {
417 $remise_percent =
price2num($remise_percent);
421 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
427 if ($price_base_type ==
'HT') {
438 if ($this->
statut == self::STATUS_DRAFT) {
441 if ($fk_product > 0) {
444 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_fournprice=".$fk_fournprice.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
446 if ($productsupplier->fetch($fk_product) > 0) {
447 $product_type = $productsupplier->type;
448 $label = $productsupplier->label;
449 $fk_prod_fourn_price = $fk_fournprice;
454 $result = $productsupplier->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', $this->socid);
456 $pu = $productsupplier->fourn_pu;
457 $ref_supplier = $productsupplier->ref_supplier;
459 if ($remise_percent == 0 && $productsupplier->remise_percent != 0) {
460 $remise_percent = $productsupplier->remise_percent;
464 $langs->load(
"errors");
465 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
466 $this->db->rollback();
467 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
473 $langs->load(
"errors");
474 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
475 $this->db->rollback();
476 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
480 $this->error = $productsupplier->error;
481 $this->errors = $productsupplier->errors;
482 $this->db->rollback();
483 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
487 $this->error = $productsupplier->error;
488 $this->errors = $productsupplier->errors;
489 $this->db->rollback();
494 $product_type = $type;
507 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
508 $vat_src_code = $reg[1];
509 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
512 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
516 $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);
517 $total_ht = $tabprice[0];
518 $total_tva = $tabprice[1];
519 $total_ttc = $tabprice[2];
520 $total_localtax1 = $tabprice[9];
521 $total_localtax2 = $tabprice[10];
522 $pu = $pu_ht = $tabprice[3];
525 $multicurrency_total_ht = $tabprice[16];
526 $multicurrency_total_tva = $tabprice[17];
527 $multicurrency_total_ttc = $tabprice[18];
528 $pu_ht_devise = $tabprice[19];
532 if ($ranktouse == -1) {
533 $rangmax = $this->
line_max($fk_parent_line);
534 $ranktouse = $rangmax + 1;
541 if ($remise_percent > 0) {
542 $remise = round(($pu * (
float) $remise_percent / 100), 2);
549 $this->line->fk_supplier_proposal = $this->id;
550 $this->line->label = $label;
551 $this->line->desc = $desc;
552 $this->line->qty = $qty;
554 $this->line->vat_src_code = $vat_src_code;
555 $this->line->tva_tx = $txtva;
556 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
557 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
558 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
559 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
560 $this->line->fk_product = $fk_product;
561 $this->line->remise_percent = $remise_percent;
562 $this->line->subprice = $pu_ht;
563 $this->line->rang = $ranktouse;
564 $this->line->info_bits = $info_bits;
565 $this->line->total_ht = $total_ht;
566 $this->line->total_tva = $total_tva;
567 $this->line->total_localtax1 = $total_localtax1;
568 $this->line->total_localtax2 = $total_localtax2;
569 $this->line->total_ttc = $total_ttc;
570 $this->line->product_type = $type;
571 $this->line->special_code = $special_code;
572 $this->line->fk_parent_line = $fk_parent_line;
573 $this->line->fk_unit = $fk_unit;
574 $this->line->origin = $origin;
575 $this->line->origin_id = $origin_id;
576 $this->line->ref_fourn = $this->db->escape($ref_supplier);
577 $this->line->date_start = $date_start;
578 $this->line->date_end = $date_end;
581 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
583 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
585 $productFournisseur->find_min_price_product_fournisseur($fk_product);
586 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
588 $this->line->fk_fournprice = ($fk_fournprice > 0 ? $fk_fournprice : 0);
590 $this->line->pa_ht = $pa_ht;
594 $this->line->fk_multicurrency = $this->fk_multicurrency;
595 $this->line->multicurrency_code = $this->multicurrency_code;
596 $this->line->multicurrency_subprice = $pu_ht_devise;
597 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
598 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
599 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
602 if (empty($qty) && empty($special_code)) {
603 $this->line->special_code = 3;
606 if (is_array($array_options) && count($array_options) > 0) {
607 $this->line->array_options = $array_options;
610 $result = $this->line->insert();
613 if (!empty($fk_parent_line)) {
615 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
616 $linecount = count($this->lines);
617 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
623 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
626 return $this->line->id;
628 $this->db->rollback();
632 $this->error = $this->line->error;
633 $this->errors = $this->line->errors;
634 $this->db->rollback();
638 $this->error =
'BadStatusOfObjectToAddLine';
670 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)
672 global $conf, $user, $langs, $mysoc;
674 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
675 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
678 $remise_percent =
price2num($remise_percent);
681 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
687 if (empty($qty) && empty($special_code)) {
690 if (!empty($qty) && $special_code == 3) {
707 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
708 $vat_src_code = $reg[1];
709 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
712 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
716 $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);
717 $total_ht = $tabprice[0];
718 $total_tva = $tabprice[1];
719 $total_ttc = $tabprice[2];
720 $total_localtax1 = $tabprice[9];
721 $total_localtax2 = $tabprice[10];
722 $pu_ht = $tabprice[3];
723 $pu_tva = $tabprice[4];
724 $pu_ttc = $tabprice[5];
727 $multicurrency_total_ht = $tabprice[16];
728 $multicurrency_total_tva = $tabprice[17];
729 $multicurrency_total_ttc = $tabprice[18];
730 $pu_ht_devise = $tabprice[19];
733 if ($price_base_type ==
'TTC') {
739 $line->fetch($rowid);
740 $line->fetch_optionals();
742 $fk_product = $line->fk_product;
745 $staticline = clone $line;
747 $line->oldline = $staticline;
749 $this->line->context = $this->context;
752 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
753 $rangmax = $this->
line_max($fk_parent_line);
754 $this->line->rang = $rangmax + 1;
757 $this->line->id = $rowid;
758 $this->line->label = $label;
759 $this->line->desc = $desc;
760 $this->line->qty = $qty;
761 $this->line->product_type = $type;
763 $this->line->vat_src_code = $vat_src_code;
764 $this->line->tva_tx = $txtva;
765 $this->line->localtax1_tx = $txlocaltax1;
766 $this->line->localtax2_tx = $txlocaltax2;
767 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
768 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
769 $this->line->remise_percent = $remise_percent;
770 $this->line->subprice = $pu;
771 $this->line->info_bits = $info_bits;
772 $this->line->total_ht = $total_ht;
773 $this->line->total_tva = $total_tva;
774 $this->line->total_localtax1 = $total_localtax1;
775 $this->line->total_localtax2 = $total_localtax2;
776 $this->line->total_ttc = $total_ttc;
777 $this->line->special_code = $special_code;
778 $this->line->fk_parent_line = $fk_parent_line;
779 $this->line->skip_update_total = $skip_update_total;
780 $this->line->ref_fourn = $ref_supplier;
781 $this->line->fk_unit = $fk_unit;
784 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
786 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
788 $productFournisseur->find_min_price_product_fournisseur($fk_product);
789 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
791 $this->line->fk_fournprice = $fk_fournprice;
793 $this->line->pa_ht = $pa_ht;
795 if (is_array($array_options) && count($array_options) > 0) {
797 foreach ($array_options as $key => $value) {
798 $this->line->array_options[$key] = $array_options[$key];
803 $this->line->multicurrency_subprice = $pu_ht_devise;
804 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
805 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
806 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
808 $result = $this->line->update();
811 if (!empty($fk_parent_line)) {
820 $this->error = $this->db->error();
821 $this->db->rollback();
825 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
845 $line->fetch($lineid);
847 if ($line->delete($user) > 0) {
868 public function create($user, $notrigger = 0)
870 global $langs, $conf, $mysoc, $hookmanager;
880 $this->error =
"Failed to fetch company";
881 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
884 if (!empty($this->
ref)) {
887 $this->error =
'ErrorRefAlreadyExists';
888 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
889 $this->db->rollback();
895 $delivery_date = $this->delivery_date;
898 if (!empty($this->multicurrency_code)) {
901 if (empty($this->fk_multicurrency)) {
902 $this->multicurrency_code = $conf->currency;
903 $this->fk_multicurrency = 0;
904 $this->multicurrency_tx = 1;
910 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"supplier_proposal (";
913 $sql .=
", total_tva";
914 $sql .=
", total_ttc";
917 $sql .=
", fk_user_author";
918 $sql .=
", note_private";
919 $sql .=
", note_public";
920 $sql .=
", model_pdf";
921 $sql .=
", fk_cond_reglement";
922 $sql .=
", fk_mode_reglement";
923 $sql .=
", fk_account";
924 $sql .=
", date_livraison";
925 $sql .=
", fk_shipping_method";
926 $sql .=
", fk_projet";
928 $sql .=
", fk_multicurrency";
929 $sql .=
", multicurrency_code";
930 $sql .=
", multicurrency_tx";
933 $sql .= ((int) $this->socid);
937 $sql .=
", '".$this->db->idate($now).
"'";
938 $sql .=
", '(PROV)'";
939 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
940 $sql .=
", '".$this->db->escape($this->note_private).
"'";
941 $sql .=
", '".$this->db->escape($this->note_public).
"'";
942 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
943 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
944 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
945 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
946 $sql .=
", ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
947 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
948 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
949 $sql .=
", ".((int) $conf->entity);
950 $sql .=
", ".((int) $this->fk_multicurrency);
951 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
952 $sql .=
", ".((float) $this->multicurrency_tx);
955 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
956 $resql = $this->db->query($sql);
958 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
961 $this->
ref =
'(PROV'.$this->id.
')';
962 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
964 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
965 $resql = $this->db->query($sql);
970 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
971 $this->linked_objects = $this->linkedObjectsIds;
975 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
976 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
977 if (is_array($tmp_origin_id)) {
978 foreach ($tmp_origin_id as $origin_id) {
994 $num = count($this->lines);
996 for ($i = 0; $i < $num; $i++) {
998 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1003 $this->lines[$i]->desc,
1004 $this->lines[$i]->subprice,
1005 $this->lines[$i]->qty,
1006 $this->lines[$i]->tva_tx,
1007 $this->lines[$i]->localtax1_tx,
1008 $this->lines[$i]->localtax2_tx,
1009 $this->lines[$i]->fk_product,
1010 $this->lines[$i]->remise_percent,
1014 $this->lines[$i]->product_type,
1015 $this->lines[$i]->rang,
1016 $this->lines[$i]->special_code,
1018 $this->lines[$i]->fk_fournprice,
1019 $this->lines[$i]->pa_ht,
1020 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1021 $this->lines[$i]->array_options,
1022 $this->lines[$i]->ref_fourn,
1023 $this->lines[$i]->fk_unit,
1024 'supplier_proposal',
1025 $this->lines[$i]->rowid
1030 $this->error = $this->db->error;
1035 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1036 $fk_parent_line = $result;
1055 if (!$error && !$notrigger) {
1057 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1064 $this->error = $this->db->lasterror();
1069 $this->error = $this->db->lasterror();
1074 $this->db->commit();
1075 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1078 $this->db->rollback();
1082 $this->error = $this->db->lasterror();
1083 $this->db->rollback();
1097 global $conf, $hookmanager;
1105 foreach ($this->lines as $line) {
1106 $line->fetch_optionals();
1110 $objFrom = clone $this;
1112 $objsoc =
new Societe($this->db);
1115 if (!empty($fromid) && $fromid != $this->socid) {
1116 if ($objsoc->fetch($fromid) > 0) {
1117 $this->socid = $objsoc->id;
1118 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1119 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1120 unset($this->fk_project);
1125 $objsoc->fetch($this->socid);
1131 if (!
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON') || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
".php")) {
1132 $this->error =
'ErrorSetupNotComplete';
1137 $this->user_author_id = $user->id;
1138 $this->user_validation_id = 0;
1142 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
'.php';
1144 $modSupplierProposal =
new $obj();
1145 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1148 $this->context[
'createfromclone'] =
'createfromclone';
1149 $result = $this->
create($user);
1156 if (is_object($hookmanager)) {
1157 $parameters = array(
'objFrom' => $objFrom);
1159 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1167 unset($this->context[
'createfromclone']);
1171 $this->db->commit();
1174 $this->db->rollback();
1186 public function fetch($rowid, $ref =
'')
1190 $sql =
"SELECT p.rowid, p.entity, p.ref, p.fk_soc as socid";
1191 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1192 $sql .=
", p.datec";
1193 $sql .=
", p.date_valid as datev";
1194 $sql .=
", p.date_livraison as delivery_date";
1195 $sql .=
", p.model_pdf, p.extraparams";
1196 $sql .=
", p.note_private, p.note_public";
1197 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1198 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1199 $sql .=
", p.fk_cond_reglement";
1200 $sql .=
", p.fk_mode_reglement";
1201 $sql .=
', p.fk_account';
1202 $sql .=
", p.fk_shipping_method";
1203 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1204 $sql .=
", c.label as statut_label";
1205 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1206 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1207 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1208 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1209 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1210 $sql .=
" WHERE p.fk_statut = c.id";
1211 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1213 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1215 $sql .=
" AND p.rowid = ".((int) $rowid);
1218 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1219 $resql = $this->db->query($sql);
1221 if ($this->db->num_rows($resql)) {
1222 $obj = $this->db->fetch_object($resql);
1224 $this->
id = $obj->rowid;
1225 $this->entity = $obj->entity;
1227 $this->
ref = $obj->ref;
1228 $this->total_ht = $obj->total_ht;
1229 $this->total_tva = $obj->total_tva;
1230 $this->total_localtax1 = $obj->localtax1;
1231 $this->total_localtax2 = $obj->localtax2;
1232 $this->total_ttc = $obj->total_ttc;
1233 $this->socid = $obj->socid;
1234 $this->fk_project = $obj->fk_project;
1235 $this->model_pdf = $obj->model_pdf;
1236 $this->note = $obj->note_private;
1237 $this->note_private = $obj->note_private;
1238 $this->note_public = $obj->note_public;
1239 $this->
statut = (int) $obj->fk_statut;
1240 $this->
status = (int) $obj->fk_statut;
1241 $this->datec = $this->db->jdate($obj->datec);
1242 $this->datev = $this->db->jdate($obj->datev);
1243 $this->date_creation = $this->db->jdate($obj->datec);
1244 $this->date = $this->date_creation;
1245 $this->date_validation = $this->db->jdate($obj->datev);
1246 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1247 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1249 $this->mode_reglement_id = $obj->fk_mode_reglement;
1250 $this->mode_reglement_code = $obj->mode_reglement_code;
1251 $this->mode_reglement = $obj->mode_reglement;
1252 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1253 $this->cond_reglement_id = $obj->fk_cond_reglement;
1254 $this->cond_reglement_code = $obj->cond_reglement_code;
1255 $this->cond_reglement = $obj->cond_reglement;
1256 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1258 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1260 $this->user_author_id = $obj->fk_user_author;
1261 $this->user_validation_id = $obj->fk_user_valid;
1262 $this->user_closing_id = $obj->fk_user_cloture;
1265 $this->fk_multicurrency = $obj->fk_multicurrency;
1266 $this->multicurrency_code = $obj->multicurrency_code;
1267 $this->multicurrency_tx = $obj->multicurrency_tx;
1268 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1269 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1270 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1276 $this->db->free($resql);
1278 $this->lines = array();
1281 $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,";
1282 $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,";
1283 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1284 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1285 $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';
1286 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1287 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1288 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1289 $sql .=
" ORDER by d.rang";
1291 $result = $this->db->query($sql);
1293 $num = $this->db->num_rows($result);
1297 $objp = $this->db->fetch_object($result);
1301 $line->rowid = $objp->rowid;
1302 $line->id = $objp->rowid;
1303 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1304 $line->fk_parent_line = $objp->fk_parent_line;
1305 $line->product_type = $objp->product_type;
1306 $line->label = $objp->custom_label;
1307 $line->desc = $objp->description;
1308 $line->qty = $objp->qty;
1309 $line->tva_tx = $objp->tva_tx;
1310 $line->localtax1_tx = $objp->localtax1_tx;
1311 $line->localtax2_tx = $objp->localtax2_tx;
1312 $line->subprice = $objp->subprice;
1313 $line->fk_remise_except = $objp->fk_remise_except;
1314 $line->remise_percent = $objp->remise_percent;
1316 $line->info_bits = $objp->info_bits;
1317 $line->total_ht = $objp->total_ht;
1318 $line->total_tva = $objp->total_tva;
1319 $line->total_localtax1 = $objp->total_localtax1;
1320 $line->total_localtax2 = $objp->total_localtax2;
1321 $line->total_ttc = $objp->total_ttc;
1322 $line->fk_fournprice = $objp->fk_fournprice;
1323 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1324 $line->pa_ht = $marginInfos[0];
1325 $line->marge_tx = $marginInfos[1];
1326 $line->marque_tx = $marginInfos[2];
1327 $line->special_code = $objp->special_code;
1328 $line->rang = $objp->rang;
1330 $line->fk_product = $objp->fk_product;
1332 $line->ref = $objp->product_ref;
1333 $line->product_ref = $objp->product_ref;
1334 $line->libelle = $objp->product_label;
1335 $line->product_label = $objp->product_label;
1336 $line->product_desc = $objp->product_desc;
1337 $line->fk_product_type = $objp->fk_product_type;
1339 $line->ref_fourn = $objp->ref_produit_fourn;
1342 $line->fk_multicurrency = $objp->fk_multicurrency;
1343 $line->multicurrency_code = $objp->multicurrency_code;
1344 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1345 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1346 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1347 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1348 $line->fk_unit = $objp->fk_unit;
1350 $this->lines[$i] = $line;
1354 $this->db->free($result);
1356 $this->error = $this->db->error();
1367 $this->error =
"Record Not Found";
1370 $this->error = $this->db->error();
1382 public function valid($user, $notrigger = 0)
1384 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1386 global $conf, $langs;
1391 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'creer'))
1392 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'validate_advance'))) {
1396 $soc =
new Societe($this->db);
1397 $result = $soc->fetch($this->socid);
1404 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1411 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1412 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1413 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1414 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1416 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1417 $resql = $this->db->query($sql);
1424 if (!$error && !$notrigger) {
1426 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1434 $this->oldref = $this->ref;
1437 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1439 $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).
"'";
1440 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1441 $resql = $this->db->query($sql);
1444 $this->error = $this->db->lasterror();
1446 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'supplier_proposal/".$this->db->escape($this->newref).
"'";
1447 $sql .=
" WHERE filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1448 $resql = $this->db->query($sql);
1451 $this->error = $this->db->lasterror();
1457 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1458 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1459 if (!$error && file_exists($dirsource)) {
1460 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1461 if (@rename($dirsource, $dirdest)) {
1464 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1465 foreach ($listoffiles as $fileentry) {
1466 $dirsource = $fileentry[
'name'];
1467 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1468 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1469 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1470 @rename($dirsource, $dirdest);
1479 $this->user_validation_id = $user->id;
1480 $this->datev = $now;
1481 $this->date_validation = $now;
1483 $this->db->commit();
1486 $this->db->rollback();
1490 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1519 if ($user->hasRight(
'supplier_proposal',
'creer')) {
1520 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1521 $sql .=
" SET date_livraison = ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1522 $sql .=
" WHERE rowid = ".((int) $this->
id);
1524 if ($this->db->query($sql)) {
1525 $this->delivery_date = $delivery_date;
1528 $this->error = $this->db->error();
1529 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1615 public function reopen($user, $statut, $note =
'', $notrigger = 0)
1617 global $langs, $conf;
1622 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1623 $sql .=
" SET fk_statut = ".((int) $this->
statut).
",";
1624 if (!empty($note)) {
1625 $sql .=
" note_private = '".$this->db->escape($note).
"',";
1627 $sql .=
" date_cloture = NULL, fk_user_cloture = NULL";
1628 $sql .=
" WHERE rowid = ".((int) $this->
id);
1632 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1633 $resql = $this->db->query($sql);
1636 $this->errors[] =
"Error ".$this->db->lasterror();
1641 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1651 if (!empty($this->errors)) {
1652 foreach ($this->errors as $errmsg) {
1653 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1654 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1657 $this->db->rollback();
1660 $this->db->commit();
1676 global $langs, $conf;
1686 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1687 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape($note).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".$user->id;
1688 $sql .=
" WHERE rowid = ".((int) $this->
id);
1690 $resql = $this->db->query($sql);
1692 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1693 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1696 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1697 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1704 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1709 $outputlangs = $langs;
1711 $outputlangs =
new Translate(
"", $conf);
1712 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1713 $outputlangs->setDefaultLang($newlang);
1716 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1727 $this->db->commit();
1730 $this->db->rollback();
1734 $this->error = $this->db->lasterror();
1735 $this->errors[] = $this->db->lasterror();
1736 $this->db->rollback();
1751 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1752 foreach ($this->lines as $product) {
1753 if ($product->subprice <= 0) {
1758 $multicurrency_tx = 1;
1759 $fk_multicurrency = 0;
1761 if (empty($this->thirdparty)) {
1765 $ref_fourn = $product->ref_fourn;
1766 if (empty($ref_fourn)) {
1767 $ref_fourn = $product->ref_supplier;
1769 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1772 $productsupplier->id = $product->fk_product;
1774 $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,
'',
'',
'');
1791 $unitPrice =
price2num($product->subprice,
'MU');
1793 $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);
1795 $resql = $this->db->query($sql);
1797 $this->error = $this->db->error();
1798 $this->db->rollback();
1817 $unitPrice =
price2num($product->subprice,
'MU');
1822 "'".$this->db->idate($now).
"'",
1823 $product->fk_product,
1824 $this->thirdparty->id,
1825 "'".$product->ref_fourn.
"'",
1832 if (isModEnabled(
"multicurrency")) {
1833 if (!empty($product->multicurrency_code)) {
1834 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1836 $multicurrency->fetch(0, $product->multicurrency_code);
1837 if (!empty($multicurrency->id)) {
1838 $values[] = $multicurrency->id;
1839 $values[] =
"'".$product->multicurrency_code.
"'";
1840 $values[] = $product->multicurrency_subprice;
1841 $values[] = $product->multicurrency_total_ht;
1842 $values[] = $multicurrency->rate->rate;
1844 for ($i = 0; $i < 5; $i++) {
1851 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1852 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1853 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1854 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1856 $sql .=
') VALUES ('.implode(
',', $values).
')';
1858 $resql = $this->db->query($sql);
1860 $this->error = $this->db->error();
1861 $this->db->rollback();
1877 global $conf, $langs;
1881 if ($this->
statut == self::STATUS_DRAFT) {
1882 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1886 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1887 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1888 $sql .=
" WHERE rowid = ".((int) $this->
id);
1890 if ($this->db->query($sql)) {
1892 $this->oldcopy = clone $this;
1897 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1906 $this->db->commit();
1909 $this->db->rollback();
1932 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1940 if (!$user->hasRight(
'societe',
'client',
'voir')) {
1941 $search_sale = $user->id;
1944 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
1945 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
1946 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
1947 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
1948 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
1949 $sql .=
" AND p.fk_soc = s.rowid";
1950 $sql .=
" AND p.fk_statut = c.id";
1952 $sql .=
" AND s.rowid = ".((int) $socid);
1955 $sql .=
" AND p.fk_statut = 0";
1957 if ($notcurrentuser > 0) {
1958 $sql .=
" AND p.fk_user_author <> ".((int) $user->id);
1961 if ($search_sale && $search_sale !=
'-1') {
1962 if ($search_sale == -2) {
1963 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
1964 } elseif ($search_sale > 0) {
1965 $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).
")";
1968 $sql .= $this->db->order($sortfield, $sortorder);
1969 $sql .= $this->db->plimit($limit, $offset);
1971 $result = $this->db->query($sql);
1973 $num = $this->db->num_rows($result);
1977 $obj = $this->db->fetch_object($result);
1979 if ($shortlist == 1) {
1980 $ga[$obj->supplier_proposalid] = $obj->ref;
1981 } elseif ($shortlist == 2) {
1982 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
1984 $ga[$i][
'id'] = $obj->supplier_proposalid;
1985 $ga[$i][
'ref'] = $obj->ref;
1986 $ga[$i][
'name'] = $obj->name;
2006 public function delete($user, $notrigger = 0)
2008 global $conf, $langs;
2009 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2017 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2025 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2026 $ef = $main.
"_extrafields";
2027 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2028 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2029 if ($this->db->query($sql)) {
2030 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2031 if ($this->db->query($sqlef) && $this->db->query($sql)) {
2045 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2046 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2047 $file = $dir.
"/".$ref.
".pdf";
2048 if (file_exists($file)) {
2052 $this->error =
'ErrorFailToDeleteFile';
2053 $this->errors = array(
'ErrorFailToDeleteFile');
2054 $this->db->rollback();
2058 if (file_exists($dir)) {
2061 $this->error =
'ErrorFailToDeleteDir';
2062 $this->errors = array(
'ErrorFailToDeleteDir');
2063 $this->db->rollback();
2076 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2081 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2082 $this->db->commit();
2085 $this->error = $this->db->lasterror();
2086 $this->db->rollback();
2090 $this->error = $this->db->lasterror();
2091 $this->db->rollback();
2095 $this->error = $this->db->lasterror();
2096 $this->db->rollback();
2100 $this->db->rollback();
2113 $sql =
"SELECT c.rowid, ";
2114 $sql .=
" c.datec as date_creation, c.date_valid as date_validation, c.date_cloture as date_closure,";
2115 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2116 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2117 $sql .=
" WHERE c.rowid = ".((int) $id);
2119 $result = $this->db->query($sql);
2122 if ($this->db->num_rows($result)) {
2123 $obj = $this->db->fetch_object($result);
2125 $this->
id = $obj->rowid;
2127 $this->date_creation = $this->db->jdate($obj->date_creation);
2128 $this->date_validation = $this->db->jdate($obj->date_validation);
2129 $this->date_cloture = $this->db->jdate($obj->date_closure);
2131 $this->user_creation_id = $obj->fk_user_author;
2132 $this->user_validation_id = $obj->fk_user_valid;
2133 $this->user_closing_id = $obj->fk_user_cloture;
2135 $this->db->free($result);
2166 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2168 $langs->load(
"supplier_proposal");
2169 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2170 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2171 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2172 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2173 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2174 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2175 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2176 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2177 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2178 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2182 if ($status == self::STATUS_DRAFT) {
2183 $statusnew =
'status0';
2184 } elseif ($status == self::STATUS_VALIDATED) {
2185 $statusnew =
'status1';
2186 } elseif ($status == self::STATUS_SIGNED) {
2187 $statusnew =
'status4';
2188 } elseif ($status == self::STATUS_NOTSIGNED) {
2189 $statusnew =
'status9';
2190 } elseif ($status == self::STATUS_CLOSE) {
2191 $statusnew =
'status6';
2194 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2209 global $conf, $user, $langs;
2215 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2216 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2217 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2218 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2219 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2222 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2223 if ($mode ==
'opened') {
2224 $sql .=
" AND p.fk_statut = 1";
2226 if ($mode ==
'signed') {
2227 $sql .=
" AND p.fk_statut = 2";
2230 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2233 $resql = $this->db->query($sql);
2235 $label = $labelShort =
'';
2237 if ($mode ==
'opened') {
2238 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2240 $label = $langs->trans(
"SupplierProposalsToClose");
2241 $labelShort = $langs->trans(
"ToAcceptRefuse");
2243 if ($mode ==
'signed') {
2244 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2246 $label = $langs->trans(
"SupplierProposalsToProcess");
2247 $labelShort = $langs->trans(
"ToClose");
2251 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2252 $response->label = $label;
2253 $response->labelShort = $labelShort;
2254 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2258 while ($obj = $this->db->fetch_object($resql)) {
2259 $response->nbtodo++;
2260 if ($mode ==
'opened') {
2261 $datelimit = $this->db->jdate($obj->datefin);
2262 if ($datelimit < ($now - $delay_warning)) {
2263 $response->nbtodolate++;
2271 $this->error = $this->db->lasterror();
2286 global $user, $langs, $conf;
2291 $sql =
"SELECT rowid";
2292 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2293 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2294 $sql .= $this->db->plimit(100);
2296 $resql = $this->db->query($sql);
2298 $num_prods = $this->db->num_rows($resql);
2300 while ($i < $num_prods) {
2302 $row = $this->db->fetch_row($resql);
2303 $prodids[$i] = $row[0];
2309 $this->
ref =
'SPECIMEN';
2310 $this->specimen = 1;
2312 $this->date = time();
2313 $this->cond_reglement_id = 1;
2314 $this->cond_reglement_code =
'RECEP';
2315 $this->mode_reglement_id = 7;
2316 $this->mode_reglement_code =
'CHQ';
2317 $this->note_public =
'This is a comment (public)';
2318 $this->note_private =
'This is a comment (private)';
2322 while ($xnbp < $nbp) {
2324 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2326 $line->subprice = 100;
2327 $line->tva_tx = 19.6;
2328 $line->localtax1_tx = 0;
2329 $line->localtax2_tx = 0;
2331 $line->total_ht = 50;
2332 $line->total_ttc = 59.8;
2333 $line->total_tva = 9.8;
2334 $line->remise_percent = 50;
2336 $line->total_ht = 100;
2337 $line->total_ttc = 119.6;
2338 $line->total_tva = 19.6;
2339 $line->remise_percent = 00;
2342 if ($num_prods > 0) {
2343 $prodid = mt_rand(1, $num_prods);
2344 $line->fk_product = $prodids[$prodid];
2347 $this->lines[$xnbp] = $line;
2349 $this->total_ht += $line->total_ht;
2350 $this->total_tva += $line->total_tva;
2351 $this->total_ttc += $line->total_ttc;
2366 global $conf, $user;
2368 $this->nb = array();
2371 $sql =
"SELECT count(p.rowid) as nb";
2372 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2373 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2374 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2375 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2376 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2379 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2381 $resql = $this->db->query($sql);
2384 while ($obj = $this->db->fetch_object($resql)) {
2385 $this->nb[
"supplier_proposals"] = $obj->nb;
2387 $this->db->free($resql);
2391 $this->error = $this->db->lasterror();
2406 global $conf, $db, $langs;
2407 $langs->load(
"supplier_proposal");
2416 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2417 foreach ($dirmodels as $reldir) {
2418 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2421 $mybool = ((bool) @include_once $dir.$file) || $mybool;
2429 $obj =
new $classname();
2431 $numref = $obj->getNextValue($soc, $this);
2433 if ($numref !=
"") {
2436 $this->error = $obj->error;
2440 $langs->load(
"errors");
2441 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2455 global $conf, $langs, $menumanager;
2457 $langs->load(
'supplier_proposal');
2460 return [
'optimize' => $langs->trans(
"ShowSupplierProposal")];
2463 $option = $params[
'option'] ??
'';
2466 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2467 if (isset($this->
status)) {
2468 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
2470 if (!empty($this->
ref)) {
2471 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2473 if (!empty($this->ref_fourn)) {
2474 $datas[
'ref_supplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2476 if (!empty($this->total_ht)) {
2477 $datas[
'amount_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2479 if (!empty($this->total_tva)) {
2480 $datas[
'amount_vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2482 if (!empty($this->total_ttc)) {
2483 $datas[
'amount_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2500 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2502 global $langs, $conf, $user, $hookmanager;
2504 if (!empty($conf->dol_no_mouse_hover)) {
2512 'objecttype' => $this->element,
2513 'option' => $option,
2515 $classfortooltip =
'classfortooltip';
2518 $classfortooltip =
'classforajaxtooltip';
2519 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2525 if ($option ==
'') {
2526 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2528 if ($option ==
'document') {
2529 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2532 if ($option !==
'nolink') {
2534 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2535 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2536 $add_save_lastsearch_values = 1;
2538 if ($add_save_lastsearch_values) {
2539 $url .=
'&save_lastsearch_values=1';
2544 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
2546 $label = $langs->trans(
"ShowSupplierProposal");
2547 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2549 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
2550 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2553 $linkstart =
'<a href="'.$url.
'"';
2554 $linkstart .= $linkclose.
'>';
2557 $result .= $linkstart;
2559 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
2561 if ($withpicto != 2) {
2562 $result .= $this->ref;
2564 $result .= $linkend;
2566 if ($addlinktonotes) {
2567 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2570 $result .=
' <span class="note inline-block">';
2571 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2576 $result .=
'</span>';
2580 $hookmanager->initHooks(array($this->element .
'dao'));
2581 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
2582 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2584 $result = $hookmanager->resPrint;
2586 $result .= $hookmanager->resPrint;
2600 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2601 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2602 $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,';
2603 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2604 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2605 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2606 $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';
2607 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2608 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2609 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2610 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2612 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2613 $resql = $this->db->query($sql);
2615 $num = $this->db->num_rows($resql);
2619 $obj = $this->db->fetch_object($resql);
2622 $this->lines[$i]->id = $obj->rowid;
2623 $this->lines[$i]->rowid = $obj->rowid;
2624 $this->lines[$i]->label = $obj->custom_label;
2625 $this->lines[$i]->description = $obj->description;
2626 $this->lines[$i]->fk_product = $obj->fk_product;
2627 $this->lines[$i]->ref = $obj->ref;
2628 $this->lines[$i]->product_label = $obj->product_label;
2629 $this->lines[$i]->product_desc = $obj->product_desc;
2630 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2631 $this->lines[$i]->product_type = $obj->product_type;
2632 $this->lines[$i]->qty = $obj->qty;
2633 $this->lines[$i]->subprice = $obj->subprice;
2634 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2635 $this->lines[$i]->remise_percent = $obj->remise_percent;
2636 $this->lines[$i]->tva_tx = $obj->tva_tx;
2637 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2638 $this->lines[$i]->info_bits = $obj->info_bits;
2639 $this->lines[$i]->total_ht = $obj->total_ht;
2640 $this->lines[$i]->total_tva = $obj->total_tva;
2641 $this->lines[$i]->total_ttc = $obj->total_ttc;
2642 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2643 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2644 $this->lines[$i]->pa_ht = $marginInfos[0];
2645 $this->lines[$i]->marge_tx = $marginInfos[1];
2646 $this->lines[$i]->marque_tx = $marginInfos[2];
2647 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2648 $this->lines[$i]->special_code = $obj->special_code;
2649 $this->lines[$i]->rang = $obj->rang;
2651 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2652 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2655 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2656 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2657 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2658 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2659 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2660 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2661 $this->lines[$i]->fk_unit = $obj->fk_unit;
2665 $this->db->free($resql);
2669 $this->error = $this->db->error();
2685 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2687 global $conf, $langs;
2689 $langs->load(
"supplier_proposal");
2690 $outputlangs->load(
"products");
2695 if ($this->model_pdf) {
2696 $modele = $this->model_pdf;
2702 $modelpath =
"core/modules/supplier_proposal/doc/";
2704 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2736 'supplier_proposaldet'
2754 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2756 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2757 $return .=
'<div class="info-box info-box-sm">';
2758 $return .=
'<span class="info-box-icon bg-infobox-action">';
2761 $return .=
'</span>';
2762 $return .=
'<div class="info-box-content">';
2763 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
2764 if ($selected >= 0) {
2765 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2767 if (property_exists($this,
'socid')) {
2768 $return .=
'<span class="info-box-ref"> | '.$this->socid.
'</span>';
2770 if (property_exists($this,
'delivery_date')) {
2771 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"DateEnd").
'</span> : <span class="info-box-label">'.
dol_print_date($this->delivery_date).
'</span>';
2773 if (property_exists($this,
'total_ttc')) {
2774 $return .=
'<br><span class="opacitymedium" >'.$langs->trans(
"AmountHT").
' : </span><span class="info-box-label amount">'.
price($this->total_ttc).
'</span>';
2776 if (method_exists($this,
'getLibStatut')) {
2777 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2779 $return .=
'</div>';
2780 $return .=
'</div>';
2781 $return .=
'</div>';
2805 public $element =
'supplier_proposaldet';
2810 public $table_element =
'supplier_proposaldet';
2832 public $fk_supplier_proposal;
2837 public $fk_parent_line;
2863 public $vat_src_code;
2870 public $remise_percent;
2875 public $fk_remise_except;
2882 public $fk_fournprice;
2891 public $special_code;
2896 public $info_bits = 0;
2918 public $product_ref;
2930 public $product_label;
2942 public $product_desc;
2944 public $localtax1_tx;
2945 public $localtax2_tx;
2946 public $localtax1_type;
2947 public $localtax2_type;
2948 public $total_localtax1;
2949 public $total_localtax2;
2951 public $skip_update_total;
2954 public $ref_supplier;
2960 public $fk_multicurrency;
2962 public $multicurrency_code;
2963 public $multicurrency_subprice;
2964 public $multicurrency_total_ht;
2965 public $multicurrency_total_tva;
2966 public $multicurrency_total_ttc;
2986 $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,';
2987 $sql .=
' pd.date_start, pd.date_end,';
2988 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
2989 $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,';
2990 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
2991 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
2992 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
2993 $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';
2994 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
2995 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
2996 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
2998 $result = $this->db->query($sql);
3000 $objp = $this->db->fetch_object($result);
3002 $this->
id = $objp->rowid;
3003 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
3004 $this->fk_parent_line = $objp->fk_parent_line;
3005 $this->label = $objp->custom_label;
3006 $this->desc = $objp->description;
3007 $this->qty = $objp->qty;
3008 $this->subprice = $objp->subprice;
3009 $this->tva_tx = $objp->tva_tx;
3010 $this->remise_percent = $objp->remise_percent;
3011 $this->fk_remise_except = $objp->fk_remise_except;
3012 $this->fk_product = $objp->fk_product;
3013 $this->info_bits = $objp->info_bits;
3014 $this->date_start = $this->db->jdate($objp->date_start);
3015 $this->date_end = $this->db->jdate($objp->date_end);
3017 $this->total_ht = $objp->total_ht;
3018 $this->total_tva = $objp->total_tva;
3019 $this->total_ttc = $objp->total_ttc;
3021 $this->fk_fournprice = $objp->fk_fournprice;
3023 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
3024 $this->pa_ht = $marginInfos[0];
3025 $this->marge_tx = $marginInfos[1];
3026 $this->marque_tx = $marginInfos[2];
3028 $this->special_code = $objp->special_code;
3029 $this->product_type = $objp->product_type;
3030 $this->rang = $objp->rang;
3032 $this->
ref = $objp->product_ref;
3033 $this->product_ref = $objp->product_ref;
3034 $this->libelle = $objp->product_label;
3035 $this->product_label = $objp->product_label;
3036 $this->product_desc = $objp->product_desc;
3038 $this->ref_fourn = $objp->ref_produit_fourn;
3041 $this->fk_multicurrency = $objp->fk_multicurrency;
3042 $this->multicurrency_code = $objp->multicurrency_code;
3043 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3044 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3045 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3046 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3047 $this->fk_unit = $objp->fk_unit;
3049 $this->db->free($result);
3065 global $conf, $langs, $user;
3069 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3072 if (empty($this->tva_tx)) {
3075 if (empty($this->vat_src_code)) {
3076 $this->vat_src_code =
'';
3078 if (empty($this->localtax1_tx)) {
3079 $this->localtax1_tx = 0;
3081 if (empty($this->localtax2_tx)) {
3082 $this->localtax2_tx = 0;
3084 if (empty($this->localtax1_type)) {
3085 $this->localtax1_type = 0;
3087 if (empty($this->localtax2_type)) {
3088 $this->localtax2_type = 0;
3090 if (empty($this->total_localtax1)) {
3091 $this->total_localtax1 = 0;
3093 if (empty($this->total_localtax2)) {
3094 $this->total_localtax2 = 0;
3096 if (empty($this->rang)) {
3099 if (empty($this->remise_percent)) {
3100 $this->remise_percent = 0;
3102 if (empty($this->info_bits)) {
3103 $this->info_bits = 0;
3105 if (empty($this->special_code)) {
3106 $this->special_code = 0;
3108 if (empty($this->fk_parent_line)) {
3109 $this->fk_parent_line = 0;
3111 if (empty($this->fk_fournprice)) {
3112 $this->fk_fournprice = 0;
3114 if (empty($this->fk_unit)) {
3117 if (empty($this->subprice)) {
3118 $this->subprice = 0;
3121 if (empty($this->pa_ht)) {
3126 if ($this->pa_ht == 0) {
3127 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3131 $this->pa_ht = $result;
3136 if ($this->product_type < 0) {
3143 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3144 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3145 $sql .=
' date_start, date_end,';
3146 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3147 $sql .=
' subprice, remise_percent, ';
3148 $sql .=
' info_bits, ';
3149 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3150 $sql .=
' ref_fourn,';
3151 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3152 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3153 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3154 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3155 $sql .=
" '".$this->db->escape($this->desc).
"',";
3156 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3157 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3158 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3159 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3160 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3161 $sql .=
" ".price2num($this->qty,
'MS').
",";
3162 $sql .=
" ".price2num($this->tva_tx).
",";
3163 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3164 $sql .=
" ".price2num($this->localtax1_tx).
",";
3165 $sql .=
" ".price2num($this->localtax2_tx).
",";
3166 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3167 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3168 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3169 $sql .=
" ".((float) $this->remise_percent).
",";
3170 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3171 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3172 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3173 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3174 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3175 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3176 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3177 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3178 $sql .=
' '.((int) $this->special_code).
',';
3179 $sql .=
' '.((int) $this->rang).
',';
3180 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3181 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3182 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3183 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3184 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3185 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3186 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3187 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3190 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3191 $resql = $this->db->query($sql);
3193 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3202 if (!$error && !$notrigger) {
3204 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3206 $this->db->rollback();
3212 $this->db->commit();
3215 $this->error = $this->db->error().
" sql=".$sql;
3216 $this->db->rollback();
3227 public function delete($user)
3233 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet";
3234 $sql .=
" WHERE rowid = ".((int) $this->
id);
3236 if ($this->db->query($sql)) {
3242 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3247 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3249 $this->db->rollback();
3254 $this->db->commit();
3258 $this->error = $this->db->error().
" sql=".$sql;
3259 $this->db->rollback();
3272 global $conf, $langs, $user;
3277 if (empty($this->tva_tx)) {
3280 if (empty($this->localtax1_tx)) {
3281 $this->localtax1_tx = 0;
3283 if (empty($this->localtax2_tx)) {
3284 $this->localtax2_tx = 0;
3286 if (empty($this->total_localtax1)) {
3287 $this->total_localtax1 = 0;
3289 if (empty($this->total_localtax2)) {
3290 $this->total_localtax2 = 0;
3292 if (empty($this->localtax1_type)) {
3293 $this->localtax1_type = 0;
3295 if (empty($this->localtax2_type)) {
3296 $this->localtax2_type = 0;
3298 if (empty($this->marque_tx)) {
3299 $this->marque_tx = 0;
3301 if (empty($this->marge_tx)) {
3302 $this->marge_tx = 0;
3304 if (empty($this->remise_percent)) {
3305 $this->remise_percent = 0;
3307 if (empty($this->info_bits)) {
3308 $this->info_bits = 0;
3310 if (empty($this->special_code)) {
3311 $this->special_code = 0;
3313 if (empty($this->fk_parent_line)) {
3314 $this->fk_parent_line = 0;
3316 if (empty($this->fk_fournprice)) {
3317 $this->fk_fournprice = 0;
3319 if (empty($this->fk_unit)) {
3322 if (empty($this->subprice)) {
3323 $this->subprice = 0;
3326 if (empty($this->pa_ht)) {
3331 if ($this->pa_ht == 0) {
3332 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3336 $this->pa_ht = $result;
3343 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3344 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3345 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3346 $sql .=
" , product_type=".((int) $this->product_type);
3347 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3348 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3349 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3350 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3351 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3352 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3353 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3354 $sql .=
" , qty='".price2num($this->qty).
"'";
3355 $sql .=
" , subprice=".price2num($this->subprice);
3356 $sql .=
" , remise_percent=".price2num($this->remise_percent);
3357 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3358 if (empty($this->skip_update_total)) {
3359 $sql .=
" , total_ht=".price2num($this->total_ht);
3360 $sql .=
" , total_tva=".price2num($this->total_tva);
3361 $sql .=
" , total_ttc=".price2num($this->total_ttc);
3362 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
3363 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
3365 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3366 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3367 $sql .=
" , special_code=".((int) $this->special_code);
3368 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3369 if (!empty($this->rang)) {
3370 $sql .=
", rang=".((int) $this->rang);
3372 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3373 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3376 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3377 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3378 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3379 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3381 $sql .=
" WHERE rowid = ".((int) $this->
id);
3383 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3384 $resql = $this->db->query($sql);
3393 if (!$error && !$notrigger) {
3395 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3397 $this->db->rollback();
3403 $this->db->commit();
3406 $this->error = $this->db->error();
3407 $this->db->rollback();
3425 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3426 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3427 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3428 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3429 $sql .=
" WHERE rowid = ".((int) $this->
id);
3431 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3433 $resql = $this->db->query($sql);
3435 $this->db->commit();
3438 $this->error = $this->db->error();
3439 $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