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;
114 public $ref_supplier;
130 public $delivery_date;
149 public $user_author_id;
175 public $cond_reglement_code;
179 public $cond_reglement_doc;
184 public $mode_reglement_code;
189 public $mode_reglement;
194 public $extraparams = array();
195 public $lines = array();
201 public $labelStatus = array();
202 public $labelStatusShort = array();
217 public $fk_multicurrency;
222 public $multicurrency_code;
226 public $multicurrency_tx;
230 public $multicurrency_total_ht;
234 public $multicurrency_total_tva;
238 public $multicurrency_total_ttc;
274 public function __construct($db, $socid = 0, $supplier_proposalid = 0)
276 global
$conf, $langs;
280 $this->ismultientitymanaged = 1;
281 $this->socid = $socid;
282 $this->
id = $supplier_proposalid;
297 public function add_product($idproduct, $qty, $remise_percent = 0)
300 global
$conf, $mysoc;
306 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
307 if ($idproduct > 0) {
308 $prod =
new Product($this->db);
309 $prod->fetch($idproduct);
311 $productdesc = $prod->description;
315 if (empty($tva_tx)) {
318 $localtax1_tx =
get_localtax($tva_tx, 1, $mysoc, $this->thirdparty, $tva_npr);
319 $localtax2_tx =
get_localtax($tva_tx, 2, $mysoc, $this->thirdparty, $tva_npr);
322 if (
$conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
323 $price = $prod->multiprices[$this->thirdparty->price_level];
325 $price = $prod->price;
330 $line->fk_product = $idproduct;
331 $line->desc = $productdesc;
333 $line->subprice = $price;
334 $line->remise_percent = $remise_percent;
335 $line->tva_tx = $tva_tx;
337 $this->lines[] = $line;
355 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
356 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
361 $result = $remise->fetch($idremise);
364 if ($remise->fk_facture) {
365 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
366 $this->db->rollback();
371 $supplier_proposalligne->fk_supplier_proposal = $this->id;
372 $supplier_proposalligne->fk_remise_except = $remise->id;
373 $supplier_proposalligne->desc = $remise->description;
374 $supplier_proposalligne->tva_tx = $remise->tva_tx;
375 $supplier_proposalligne->subprice = -(float) $remise->amount_ht;
376 $supplier_proposalligne->fk_product = 0;
377 $supplier_proposalligne->qty = 1;
378 $supplier_proposalligne->remise_percent = 0;
379 $supplier_proposalligne->rang = -1;
380 $supplier_proposalligne->info_bits = 2;
382 $supplier_proposalligne->total_ht = -(float) $remise->amount_ht;
383 $supplier_proposalligne->total_tva = -(float) $remise->amount_tva;
384 $supplier_proposalligne->total_ttc = -(float) $remise->amount_ttc;
386 $result = $supplier_proposalligne->insert();
393 $this->db->rollback();
397 $this->error = $supplier_proposalligne->error;
398 $this->db->rollback();
402 $this->db->rollback();
444 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)
446 global $mysoc,
$conf, $langs;
448 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");
449 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
452 if (empty($remise_percent)) {
458 if (empty($info_bits)) {
464 if (empty($fk_parent_line) || $fk_parent_line < 0) {
471 $remise_percent =
price2num($remise_percent);
475 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
481 if ($price_base_type ==
'HT') {
492 if ($this->statut == self::STATUS_DRAFT) {
495 if ($fk_product > 0) {
496 if (
getDolGlobalInt(
'SUPPLIER_PROPOSAL_WITH_PREDEFINED_PRICES_ONLY') == 1) {
498 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_fournprice=".$fk_fournprice.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
500 if ($productsupplier->fetch($fk_product) > 0) {
501 $product_type = $productsupplier->type;
502 $label = $productsupplier->label;
503 $fk_prod_fourn_price = $fk_fournprice;
508 $result = $productsupplier->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', $this->socid);
510 $pu = $productsupplier->fourn_pu;
511 $ref_supplier = $productsupplier->ref_supplier;
513 if ($remise_percent == 0 && $productsupplier->remise_percent != 0) {
514 $remise_percent = $productsupplier->remise_percent;
518 $langs->load(
"errors");
519 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
520 $this->db->rollback();
521 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
527 $langs->load(
"errors");
528 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
529 $this->db->rollback();
530 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
534 $this->error = $productsupplier->error;
535 $this->errors = $productsupplier->errors;
536 $this->db->rollback();
537 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
541 $this->error = $productsupplier->error;
542 $this->errors = $productsupplier->errors;
543 $this->db->rollback();
548 $product_type = $type;
561 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
562 $vat_src_code = $reg[1];
563 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
566 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
570 $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);
571 $total_ht = $tabprice[0];
572 $total_tva = $tabprice[1];
573 $total_ttc = $tabprice[2];
574 $total_localtax1 = $tabprice[9];
575 $total_localtax2 = $tabprice[10];
576 $pu = $pu_ht = $tabprice[3];
579 $multicurrency_total_ht = $tabprice[16];
580 $multicurrency_total_tva = $tabprice[17];
581 $multicurrency_total_ttc = $tabprice[18];
582 $pu_ht_devise = $tabprice[19];
586 if ($ranktouse == -1) {
587 $rangmax = $this->
line_max($fk_parent_line);
588 $ranktouse = $rangmax + 1;
595 if ($remise_percent > 0) {
596 $remise = round(((
float) $pu * (
float) $remise_percent / 100), 2);
597 $price = (float) $pu - $remise;
603 $this->line->fk_supplier_proposal = $this->id;
604 $this->line->label = $label;
605 $this->line->desc = $desc;
606 $this->line->qty = $qty;
608 $this->line->vat_src_code = $vat_src_code;
609 $this->line->tva_tx = $txtva;
610 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
611 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
612 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
613 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
614 $this->line->fk_product = $fk_product;
615 $this->line->remise_percent = $remise_percent;
616 $this->line->subprice = (float) $pu_ht;
617 $this->line->rang = $ranktouse;
618 $this->line->info_bits = $info_bits;
619 $this->line->total_ht = (float) $total_ht;
620 $this->line->total_tva = (float) $total_tva;
621 $this->line->total_localtax1 = (float) $total_localtax1;
622 $this->line->total_localtax2 = (float) $total_localtax2;
623 $this->line->total_ttc = (float) $total_ttc;
624 $this->line->product_type = $type;
625 $this->line->special_code = $special_code;
626 $this->line->fk_parent_line = $fk_parent_line;
627 $this->line->fk_unit = $fk_unit;
628 $this->line->origin = $origin;
629 $this->line->origin_id = $origin_id;
630 $this->line->ref_fourn = $this->db->escape($ref_supplier);
631 $this->line->date_start = $date_start;
632 $this->line->date_end = $date_end;
635 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
637 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
639 $productFournisseur->find_min_price_product_fournisseur($fk_product);
640 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
642 $this->line->fk_fournprice = ($fk_fournprice > 0 ? $fk_fournprice : 0);
644 $this->line->pa_ht = $pa_ht;
648 $this->line->fk_multicurrency = $this->fk_multicurrency;
649 $this->line->multicurrency_code = $this->multicurrency_code;
650 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
651 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
652 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
653 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
656 if (empty($qty) && empty($special_code)) {
657 $this->line->special_code = 3;
660 if (is_array($array_options) && count($array_options) > 0) {
661 $this->line->array_options = $array_options;
664 $result = $this->line->insert();
667 if (!empty($fk_parent_line)) {
669 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
670 $linecount = count($this->lines);
671 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
677 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
680 return $this->line->id;
682 $this->db->rollback();
686 $this->error = $this->line->error;
687 $this->errors = $this->line->errors;
688 $this->db->rollback();
692 $this->error =
'BadStatusOfObjectToAddLine';
724 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)
726 global
$conf, $user, $langs, $mysoc;
728 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
729 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
732 $remise_percent =
price2num($remise_percent);
735 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
741 if (empty($qty) && empty($special_code)) {
744 if (!empty($qty) && $special_code == 3) {
761 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
762 $vat_src_code = $reg[1];
763 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
766 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
770 $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);
771 $total_ht = $tabprice[0];
772 $total_tva = $tabprice[1];
773 $total_ttc = $tabprice[2];
774 $total_localtax1 = $tabprice[9];
775 $total_localtax2 = $tabprice[10];
776 $pu_ht = $tabprice[3];
777 $pu_tva = $tabprice[4];
778 $pu_ttc = $tabprice[5];
781 $multicurrency_total_ht = $tabprice[16];
782 $multicurrency_total_tva = $tabprice[17];
783 $multicurrency_total_ttc = $tabprice[18];
784 $pu_ht_devise = $tabprice[19];
787 if ($price_base_type ==
'TTC') {
793 $line->fetch($rowid);
794 $line->fetch_optionals();
796 $fk_product = $line->fk_product;
799 $staticline = clone $line;
801 $line->oldline = $staticline;
803 $this->line->context = $this->context;
806 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
807 $rangmax = $this->
line_max($fk_parent_line);
808 $this->line->rang = $rangmax + 1;
811 $this->line->id = $rowid;
812 $this->line->label = $label;
813 $this->line->desc = $desc;
814 $this->line->qty = $qty;
815 $this->line->product_type = $type;
817 $this->line->vat_src_code = $vat_src_code;
818 $this->line->tva_tx = $txtva;
819 $this->line->localtax1_tx = $txlocaltax1;
820 $this->line->localtax2_tx = $txlocaltax2;
821 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
822 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
823 $this->line->remise_percent = $remise_percent;
824 $this->line->subprice = (float) $pu;
825 $this->line->info_bits = $info_bits;
826 $this->line->total_ht = (float) $total_ht;
827 $this->line->total_tva = (float) $total_tva;
828 $this->line->total_localtax1 = (float) $total_localtax1;
829 $this->line->total_localtax2 = (float) $total_localtax2;
830 $this->line->total_ttc = (float) $total_ttc;
831 $this->line->special_code = $special_code;
832 $this->line->fk_parent_line = $fk_parent_line;
833 $this->line->skip_update_total = $skip_update_total;
834 $this->line->ref_fourn = $ref_supplier;
835 $this->line->fk_unit = $fk_unit;
838 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
840 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
842 $productFournisseur->find_min_price_product_fournisseur($fk_product);
843 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
845 $this->line->fk_fournprice = $fk_fournprice;
847 $this->line->pa_ht = $pa_ht;
849 if (is_array($array_options) && count($array_options) > 0) {
851 foreach ($array_options as $key => $value) {
852 $this->line->array_options[$key] = $array_options[$key];
857 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
858 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
859 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
860 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
862 $result = $this->line->update();
865 if (!empty($fk_parent_line)) {
874 $this->error = $this->db->error();
875 $this->db->rollback();
879 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
895 if ($this->statut == 0) {
899 $line->fetch($lineid);
901 if ($line->delete($user) > 0) {
922 public function create($user, $notrigger = 0)
924 global $langs,
$conf, $mysoc, $hookmanager;
934 $this->error =
"Failed to fetch company";
935 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
938 if (!empty($this->
ref)) {
941 $this->error =
'ErrorRefAlreadyExists';
942 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
943 $this->db->rollback();
949 $delivery_date = $this->delivery_date;
952 if (!empty($this->multicurrency_code)) {
955 if (empty($this->fk_multicurrency)) {
956 $this->multicurrency_code =
$conf->currency;
957 $this->fk_multicurrency = 0;
958 $this->multicurrency_tx = 1;
964 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"supplier_proposal (";
967 $sql .=
", total_tva";
968 $sql .=
", total_ttc";
971 $sql .=
", fk_user_author";
972 $sql .=
", note_private";
973 $sql .=
", note_public";
974 $sql .=
", model_pdf";
975 $sql .=
", fk_cond_reglement";
976 $sql .=
", fk_mode_reglement";
977 $sql .=
", fk_account";
978 $sql .=
", date_livraison";
979 $sql .=
", fk_shipping_method";
980 $sql .=
", fk_projet";
982 $sql .=
", fk_multicurrency";
983 $sql .=
", multicurrency_code";
984 $sql .=
", multicurrency_tx";
987 $sql .= ((int) $this->socid);
991 $sql .=
", '".$this->db->idate($now).
"'";
992 $sql .=
", '(PROV)'";
993 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
994 $sql .=
", '".$this->db->escape($this->note_private).
"'";
995 $sql .=
", '".$this->db->escape($this->note_public).
"'";
996 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
997 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
998 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
999 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1000 $sql .=
", ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1001 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1002 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
1003 $sql .=
", ".((int)
$conf->entity);
1004 $sql .=
", ".((int) $this->fk_multicurrency);
1005 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1006 $sql .=
", ".((float) $this->multicurrency_tx);
1009 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1010 $resql = $this->db->query($sql);
1012 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
1015 $this->
ref =
'(PROV'.$this->id.
')';
1016 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
1018 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1019 $resql = $this->db->query($sql);
1024 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1025 $this->linked_objects = $this->linkedObjectsIds;
1029 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1030 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1031 if (is_array($tmp_origin_id)) {
1032 foreach ($tmp_origin_id as $origin_id) {
1047 $fk_parent_line = 0;
1048 $num = count($this->lines);
1050 for ($i = 0; $i < $num; $i++) {
1052 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1053 $fk_parent_line = 0;
1057 $this->lines[$i]->desc,
1058 $this->lines[$i]->subprice,
1059 $this->lines[$i]->qty,
1060 $this->lines[$i]->tva_tx,
1061 $this->lines[$i]->localtax1_tx,
1062 $this->lines[$i]->localtax2_tx,
1063 $this->lines[$i]->fk_product,
1064 $this->lines[$i]->remise_percent,
1068 $this->lines[$i]->product_type,
1069 $this->lines[$i]->rang,
1070 $this->lines[$i]->special_code,
1072 $this->lines[$i]->fk_fournprice,
1073 $this->lines[$i]->pa_ht,
1074 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1075 $this->lines[$i]->array_options,
1076 $this->lines[$i]->ref_fourn,
1077 $this->lines[$i]->fk_unit,
1078 'supplier_proposal',
1079 $this->lines[$i]->rowid
1084 $this->error = $this->db->error;
1089 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1090 $fk_parent_line = $result;
1109 if (!$error && !$notrigger) {
1111 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1118 $this->error = $this->db->lasterror();
1123 $this->error = $this->db->lasterror();
1128 $this->db->commit();
1129 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1132 $this->db->rollback();
1136 $this->error = $this->db->lasterror();
1137 $this->db->rollback();
1151 global
$conf, $hookmanager;
1159 foreach ($this->lines as $line) {
1160 $line->fetch_optionals();
1164 $objFrom = clone $this;
1166 $objsoc =
new Societe($this->db);
1169 if (!empty($fromid) && $fromid != $this->socid) {
1170 if ($objsoc->fetch($fromid) > 0) {
1171 $this->socid = $objsoc->id;
1172 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1173 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1174 unset($this->fk_project);
1179 $objsoc->fetch($this->socid);
1185 if (!
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON') || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
".php")) {
1186 $this->error =
'ErrorSetupNotComplete';
1191 $this->user_author_id = $user->id;
1192 $this->user_validation_id = 0;
1196 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
'.php';
1198 $modSupplierProposal =
new $obj();
1199 '@phan-var-force ModeleNumRefSupplierProposal $modSupplierProposal';
1200 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1203 $this->context[
'createfromclone'] =
'createfromclone';
1204 $result = $this->
create($user);
1211 if (is_object($hookmanager)) {
1212 $parameters = array(
'objFrom' => $objFrom);
1214 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1222 unset($this->context[
'createfromclone']);
1226 $this->db->commit();
1229 $this->db->rollback();
1241 public function fetch($rowid, $ref =
'')
1245 $sql =
"SELECT p.rowid, p.entity, p.ref, p.fk_soc as socid";
1246 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1247 $sql .=
", p.datec";
1248 $sql .=
", p.date_valid as datev";
1249 $sql .=
", p.date_livraison as delivery_date";
1250 $sql .=
", p.model_pdf, p.extraparams";
1251 $sql .=
", p.note_private, p.note_public";
1252 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1253 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1254 $sql .=
", p.fk_cond_reglement";
1255 $sql .=
", p.fk_mode_reglement";
1256 $sql .=
', p.fk_account';
1257 $sql .=
", p.fk_shipping_method";
1258 $sql .=
", p.last_main_doc";
1259 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1260 $sql .=
", c.label as statut_label";
1261 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1262 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1263 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1264 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1265 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1266 $sql .=
" WHERE p.fk_statut = c.id";
1267 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1269 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1271 $sql .=
" AND p.rowid = ".((int) $rowid);
1274 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1275 $resql = $this->db->query($sql);
1277 if ($this->db->num_rows($resql)) {
1278 $obj = $this->db->fetch_object($resql);
1280 $this->
id = $obj->rowid;
1281 $this->entity = $obj->entity;
1283 $this->
ref = $obj->ref;
1284 $this->total_ht = $obj->total_ht;
1285 $this->total_tva = $obj->total_tva;
1286 $this->total_localtax1 = $obj->localtax1;
1287 $this->total_localtax2 = $obj->localtax2;
1288 $this->total_ttc = $obj->total_ttc;
1289 $this->socid = $obj->socid;
1290 $this->fk_project = $obj->fk_project;
1291 $this->model_pdf = $obj->model_pdf;
1292 $this->note = $obj->note_private;
1293 $this->note_private = $obj->note_private;
1294 $this->note_public = $obj->note_public;
1295 $this->statut = (int) $obj->fk_statut;
1296 $this->
status = (int) $obj->fk_statut;
1297 $this->datec = $this->db->jdate($obj->datec);
1298 $this->datev = $this->db->jdate($obj->datev);
1299 $this->date_creation = $this->db->jdate($obj->datec);
1300 $this->date = $this->date_creation;
1301 $this->date_validation = $this->db->jdate($obj->datev);
1302 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1303 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1305 $this->last_main_doc = $obj->last_main_doc;
1306 $this->mode_reglement_id = $obj->fk_mode_reglement;
1307 $this->mode_reglement_code = $obj->mode_reglement_code;
1308 $this->mode_reglement = $obj->mode_reglement;
1309 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1310 $this->cond_reglement_id = $obj->fk_cond_reglement;
1311 $this->cond_reglement_code = $obj->cond_reglement_code;
1312 $this->cond_reglement = $obj->cond_reglement;
1313 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1315 $this->extraparams = (array) (!empty($obj->extraparams) ? json_decode($obj->extraparams,
true) : array());
1317 $this->user_author_id = $obj->fk_user_author;
1318 $this->user_validation_id = $obj->fk_user_valid;
1319 $this->user_closing_id = $obj->fk_user_cloture;
1322 $this->fk_multicurrency = $obj->fk_multicurrency;
1323 $this->multicurrency_code = $obj->multicurrency_code;
1324 $this->multicurrency_tx = $obj->multicurrency_tx;
1325 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1326 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1327 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1333 $this->db->free($resql);
1335 $this->lines = array();
1338 $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,";
1339 $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,";
1340 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1341 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1342 $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';
1343 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1344 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1345 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1346 $sql .=
" ORDER by d.rang";
1348 $result = $this->db->query($sql);
1350 $num = $this->db->num_rows($result);
1354 $objp = $this->db->fetch_object($result);
1358 $line->rowid = $objp->rowid;
1359 $line->id = $objp->rowid;
1360 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1361 $line->fk_parent_line = $objp->fk_parent_line;
1362 $line->product_type = $objp->product_type;
1363 $line->label = $objp->custom_label;
1364 $line->desc = $objp->description;
1365 $line->qty = $objp->qty;
1366 $line->tva_tx = $objp->tva_tx;
1367 $line->localtax1_tx = $objp->localtax1_tx;
1368 $line->localtax2_tx = $objp->localtax2_tx;
1369 $line->subprice = $objp->subprice;
1370 $line->fk_remise_except = $objp->fk_remise_except;
1371 $line->remise_percent = $objp->remise_percent;
1373 $line->info_bits = $objp->info_bits;
1374 $line->total_ht = $objp->total_ht;
1375 $line->total_tva = $objp->total_tva;
1376 $line->total_localtax1 = $objp->total_localtax1;
1377 $line->total_localtax2 = $objp->total_localtax2;
1378 $line->total_ttc = $objp->total_ttc;
1379 $line->fk_fournprice = $objp->fk_fournprice;
1380 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1381 $line->pa_ht = $marginInfos[0];
1382 $line->marge_tx = $marginInfos[1];
1383 $line->marque_tx = $marginInfos[2];
1384 $line->special_code = $objp->special_code;
1385 $line->rang = $objp->rang;
1387 $line->fk_product = $objp->fk_product;
1389 $line->ref = $objp->product_ref;
1390 $line->product_ref = $objp->product_ref;
1391 $line->libelle = $objp->product_label;
1392 $line->product_label = $objp->product_label;
1393 $line->product_desc = $objp->product_desc;
1394 $line->fk_product_type = $objp->fk_product_type;
1396 $line->ref_fourn = $objp->ref_produit_fourn;
1399 $line->fk_multicurrency = $objp->fk_multicurrency;
1400 $line->multicurrency_code = $objp->multicurrency_code;
1401 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1402 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1403 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1404 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1405 $line->fk_unit = $objp->fk_unit;
1407 $this->lines[$i] = $line;
1411 $this->db->free($result);
1413 $this->error = $this->db->error();
1424 $this->error =
"Record Not Found";
1427 $this->error = $this->db->error();
1439 public function valid($user, $notrigger = 0)
1441 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1443 global
$conf, $langs;
1448 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'creer'))
1449 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'validate_advance'))) {
1453 $soc =
new Societe($this->db);
1454 $result = $soc->fetch($this->socid);
1461 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1468 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1469 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1470 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1471 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1473 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1474 $resql = $this->db->query($sql);
1481 if (!$error && !$notrigger) {
1483 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1491 $this->oldref = $this->ref;
1494 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1496 $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).
"'";
1497 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1498 $resql = $this->db->query($sql);
1501 $this->error = $this->db->lasterror();
1503 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'supplier_proposal/".$this->db->escape($this->newref).
"'";
1504 $sql .=
" WHERE filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1505 $resql = $this->db->query($sql);
1508 $this->error = $this->db->lasterror();
1514 $dirsource =
$conf->supplier_proposal->dir_output.
'/'.$oldref;
1515 $dirdest =
$conf->supplier_proposal->dir_output.
'/'.$newref;
1516 if (!$error && file_exists($dirsource)) {
1517 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1518 if (@rename($dirsource, $dirdest)) {
1521 $listoffiles =
dol_dir_list(
$conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1522 foreach ($listoffiles as $fileentry) {
1523 $dirsource = $fileentry[
'name'];
1524 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1525 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1526 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1527 @rename($dirsource, $dirdest);
1536 $this->user_validation_id = $user->id;
1537 $this->datev = $now;
1538 $this->date_validation = $now;
1540 $this->db->commit();
1543 $this->db->rollback();
1547 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1576 if ($user->hasRight(
'supplier_proposal',
'creer')) {
1577 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1578 $sql .=
" SET date_livraison = ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1579 $sql .=
" WHERE rowid = ".((int) $this->
id);
1581 if ($this->db->query($sql)) {
1582 $this->delivery_date = $delivery_date;
1585 $this->error = $this->db->error();
1586 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1672 public function reopen($user, $statut, $note =
'', $notrigger = 0)
1674 global $langs,
$conf;
1676 $this->statut = $statut;
1679 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1680 $sql .=
" SET fk_statut = ".((int) $this->statut).
",";
1681 if (!empty($note)) {
1682 $sql .=
" note_private = '".$this->db->escape($note).
"',";
1684 $sql .=
" date_cloture = NULL, fk_user_cloture = NULL";
1685 $sql .=
" WHERE rowid = ".((int) $this->
id);
1689 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1690 $resql = $this->db->query($sql);
1693 $this->errors[] =
"Error ".$this->db->lasterror();
1698 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1708 if (!empty($this->errors)) {
1709 foreach ($this->errors as $errmsg) {
1710 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1711 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1714 $this->db->rollback();
1717 $this->db->commit();
1733 global $langs,
$conf;
1737 $this->statut = $status;
1743 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1744 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape($note).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".$user->id;
1745 $sql .=
" WHERE rowid = ".((int) $this->
id);
1747 $resql = $this->db->query($sql);
1749 $modelpdf =
$conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ?
$conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1750 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1753 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1754 $modelpdf =
$conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ?
$conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1761 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1766 $outputlangs = $langs;
1769 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1770 $outputlangs->setDefaultLang($newlang);
1773 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1784 $this->db->commit();
1787 $this->db->rollback();
1791 $this->error = $this->db->lasterror();
1792 $this->errors[] = $this->db->lasterror();
1793 $this->db->rollback();
1808 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1809 foreach ($this->lines as $product) {
1810 if ($product->subprice <= 0) {
1815 $multicurrency_tx = 1;
1816 $fk_multicurrency = 0;
1818 if (empty($this->thirdparty)) {
1822 $ref_fourn = $product->ref_fourn;
1823 if (empty($ref_fourn)) {
1824 $ref_fourn = $product->ref_supplier;
1826 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1829 $productsupplier->id = $product->fk_product;
1831 $productsupplier->update_buyprice($product->qty, $product->total_ht, $user,
'HT', $this->thirdparty, 0, $ref_fourn, $product->tva_tx, 0, 0, 0, $product->info_bits, 0,
'', array(),
'', $product->multicurrency_total_ht,
'HT', $multicurrency_tx, $product->multicurrency_code,
'',
'', 0);
1847 $price =
price2num($product->subprice * $product->qty,
'MU');
1848 $unitPrice =
price2num($product->subprice,
'MU');
1850 $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);
1852 $resql = $this->db->query($sql);
1854 $this->error = $this->db->error();
1855 $this->db->rollback();
1872 $price =
price2num($product->subprice * $product->qty,
'MU');
1874 $unitPrice =
price2num($product->subprice,
'MU');
1879 "'".$this->db->idate($now).
"'",
1880 $product->fk_product,
1881 $this->thirdparty->id,
1882 "'".$product->ref_fourn.
"'",
1889 if (isModEnabled(
"multicurrency")) {
1890 if (!empty($product->multicurrency_code)) {
1891 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1893 $multicurrency->fetch(0, $product->multicurrency_code);
1894 if (!empty($multicurrency->id)) {
1895 $values[] = $multicurrency->id;
1896 $values[] =
"'".$product->multicurrency_code.
"'";
1897 $values[] = $product->multicurrency_subprice;
1898 $values[] = $product->multicurrency_total_ht;
1899 $values[] = $multicurrency->rate->rate;
1901 for ($i = 0; $i < 5; $i++) {
1908 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1909 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1910 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1911 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1913 $sql .=
') VALUES ('.implode(
',', $values).
')';
1915 $resql = $this->db->query($sql);
1917 $this->error = $this->db->error();
1918 $this->db->rollback();
1934 global
$conf, $langs;
1938 if ($this->statut == self::STATUS_DRAFT) {
1939 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1943 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1944 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1945 $sql .=
" WHERE rowid = ".((int) $this->
id);
1947 if ($this->db->query($sql)) {
1949 $this->oldcopy = clone $this;
1954 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1963 $this->db->commit();
1966 $this->db->rollback();
1989 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1997 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
1998 $search_sale = $user->id;
2001 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2002 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
2003 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
2004 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
2005 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
2006 $sql .=
" AND p.fk_soc = s.rowid";
2007 $sql .=
" AND p.fk_statut = c.id";
2009 $sql .=
" AND s.rowid = ".((int) $socid);
2012 $sql .=
" AND p.fk_statut = 0";
2014 if ($notcurrentuser > 0) {
2015 $sql .=
" AND p.fk_user_author <> ".((int) $user->id);
2018 if ($search_sale && $search_sale !=
'-1') {
2019 if ($search_sale == -2) {
2020 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
2021 } elseif ($search_sale > 0) {
2022 $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).
")";
2025 $sql .= $this->db->order($sortfield, $sortorder);
2026 $sql .= $this->db->plimit($limit, $offset);
2028 $result = $this->db->query($sql);
2030 $num = $this->db->num_rows($result);
2034 $obj = $this->db->fetch_object($result);
2036 if ($shortlist == 1) {
2037 $ga[$obj->supplier_proposalid] = $obj->ref;
2038 } elseif ($shortlist == 2) {
2039 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
2041 $ga[$i][
'id'] = $obj->supplier_proposalid;
2042 $ga[$i][
'ref'] = $obj->ref;
2043 $ga[$i][
'name'] = $obj->name;
2063 public function delete($user, $notrigger = 0)
2065 global
$conf, $langs;
2066 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2074 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2082 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2083 $ef = $main.
"_extrafields";
2084 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2085 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2086 if ($this->db->query($sql)) {
2087 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2088 if ($this->db->query($sqlef) && $this->db->query($sql)) {
2102 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2103 $dir =
$conf->supplier_proposal->dir_output.
"/".$ref;
2104 $file = $dir.
"/".$ref.
".pdf";
2105 if (file_exists($file)) {
2109 $this->error =
'ErrorFailToDeleteFile';
2110 $this->errors = array(
'ErrorFailToDeleteFile');
2111 $this->db->rollback();
2115 if (file_exists($dir)) {
2118 $this->error =
'ErrorFailToDeleteDir';
2119 $this->errors = array(
'ErrorFailToDeleteDir');
2120 $this->db->rollback();
2133 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2138 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2139 $this->db->commit();
2142 $this->error = $this->db->lasterror();
2143 $this->db->rollback();
2147 $this->error = $this->db->lasterror();
2148 $this->db->rollback();
2152 $this->error = $this->db->lasterror();
2153 $this->db->rollback();
2157 $this->db->rollback();
2170 $sql =
"SELECT c.rowid, ";
2171 $sql .=
" c.datec as date_creation, c.date_valid as date_validation, c.date_cloture as date_closure,";
2172 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2173 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2174 $sql .=
" WHERE c.rowid = ".((int) $id);
2176 $result = $this->db->query($sql);
2179 if ($this->db->num_rows($result)) {
2180 $obj = $this->db->fetch_object($result);
2182 $this->
id = $obj->rowid;
2184 $this->date_creation = $this->db->jdate($obj->date_creation);
2185 $this->date_validation = $this->db->jdate($obj->date_validation);
2186 $this->date_cloture = $this->db->jdate($obj->date_closure);
2188 $this->user_creation_id = $obj->fk_user_author;
2189 $this->user_validation_id = $obj->fk_user_valid;
2190 $this->user_closing_id = $obj->fk_user_cloture;
2192 $this->db->free($result);
2207 return $this->
LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
2223 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2225 $langs->load(
"supplier_proposal");
2226 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2227 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2228 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2229 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2230 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2231 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2232 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2233 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2234 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2235 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2239 if ($status == self::STATUS_DRAFT) {
2240 $statusnew =
'status0';
2241 } elseif ($status == self::STATUS_VALIDATED) {
2242 $statusnew =
'status1';
2243 } elseif ($status == self::STATUS_SIGNED) {
2244 $statusnew =
'status4';
2245 } elseif ($status == self::STATUS_NOTSIGNED) {
2246 $statusnew =
'status9';
2247 } elseif ($status == self::STATUS_CLOSE) {
2248 $statusnew =
'status6';
2251 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2266 global
$conf, $langs;
2272 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2273 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2274 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2275 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2276 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2279 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2280 if ($mode ==
'opened') {
2281 $sql .=
" AND p.fk_statut = 1";
2283 if ($mode ==
'signed') {
2284 $sql .=
" AND p.fk_statut = 2";
2287 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2290 $resql = $this->db->query($sql);
2292 $label = $labelShort =
'';
2295 if ($mode ==
'opened') {
2296 $delay_warning = !empty(
$conf->supplier_proposal->cloture->warning_delay) ?
$conf->supplier_proposal->cloture->warning_delay : 0;
2298 $label = $langs->trans(
"SupplierProposalsToClose");
2299 $labelShort = $langs->trans(
"ToAcceptRefuse");
2301 if ($mode ==
'signed') {
2302 $delay_warning = !empty(
$conf->supplier_proposal->facturation->warning_delay) ?
$conf->supplier_proposal->facturation->warning_delay : 0;
2304 $label = $langs->trans(
"SupplierProposalsToProcess");
2305 $labelShort = $langs->trans(
"ToClose");
2309 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2310 $response->label = $label;
2311 $response->labelShort = $labelShort;
2312 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2316 while ($obj = $this->db->fetch_object($resql)) {
2317 $response->nbtodo++;
2318 if ($mode ==
'opened') {
2319 $datelimit = $this->db->jdate($obj->datefin);
2320 if ($datelimit < ($now - $delay_warning)) {
2321 $response->nbtodolate++;
2329 $this->error = $this->db->lasterror();
2344 global $user, $langs,
$conf;
2349 $sql =
"SELECT rowid";
2350 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2351 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2352 $sql .= $this->db->plimit(100);
2354 $resql = $this->db->query($sql);
2356 $num_prods = $this->db->num_rows($resql);
2358 while ($i < $num_prods) {
2360 $row = $this->db->fetch_row($resql);
2361 $prodids[$i] = $row[0];
2367 $this->
ref =
'SPECIMEN';
2368 $this->specimen = 1;
2370 $this->date = time();
2371 $this->cond_reglement_id = 1;
2372 $this->cond_reglement_code =
'RECEP';
2373 $this->mode_reglement_id = 7;
2374 $this->mode_reglement_code =
'CHQ';
2375 $this->note_public =
'This is a comment (public)';
2376 $this->note_private =
'This is a comment (private)';
2380 while ($xnbp < $nbp) {
2382 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2384 $line->subprice = 100;
2385 $line->tva_tx = 19.6;
2386 $line->localtax1_tx = 0;
2387 $line->localtax2_tx = 0;
2389 $line->total_ht = 50;
2390 $line->total_ttc = 59.8;
2391 $line->total_tva = 9.8;
2392 $line->remise_percent = 50;
2394 $line->total_ht = 100;
2395 $line->total_ttc = 119.6;
2396 $line->total_tva = 19.6;
2397 $line->remise_percent = 00;
2400 if ($num_prods > 0) {
2401 $prodid = mt_rand(1, $num_prods);
2402 $line->fk_product = $prodids[$prodid];
2405 $this->lines[$xnbp] = $line;
2407 $this->total_ht += $line->total_ht;
2408 $this->total_tva += $line->total_tva;
2409 $this->total_ttc += $line->total_ttc;
2424 global
$conf, $user;
2426 $this->nb = array();
2429 $sql =
"SELECT count(p.rowid) as nb";
2430 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2431 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2432 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2433 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2434 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2437 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2439 $resql = $this->db->query($sql);
2442 while ($obj = $this->db->fetch_object($resql)) {
2443 $this->nb[
"supplier_proposals"] = $obj->nb;
2445 $this->db->free($resql);
2449 $this->error = $this->db->lasterror();
2464 global
$conf, $db, $langs;
2465 $langs->load(
"supplier_proposal");
2474 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
2475 foreach ($dirmodels as $reldir) {
2476 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2479 $mybool = ((bool) @include_once $dir.$file) || $mybool;
2487 $obj =
new $classname();
2488 '@phan-var-force ModeleNumRefSupplierProposal $obj';
2490 $numref = $obj->getNextValue($soc, $this);
2492 if ($numref !=
"") {
2495 $this->error = $obj->error;
2499 $langs->load(
"errors");
2500 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2513 global
$conf, $langs, $menumanager;
2515 $langs->load(
'supplier_proposal');
2518 return [
'optimize' => $langs->trans(
"ShowSupplierProposal")];
2521 $option = $params[
'option'] ??
'';
2524 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2525 if (isset($this->
status)) {
2526 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
2528 if (!empty($this->
ref)) {
2529 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2531 if (!empty($this->ref_fourn)) {
2532 $datas[
'ref_supplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2534 if (!empty($this->total_ht)) {
2535 $datas[
'amount_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
$conf->currency);
2537 if (!empty($this->total_tva)) {
2538 $datas[
'amount_vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
$conf->currency);
2540 if (!empty($this->total_ttc)) {
2541 $datas[
'amount_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency);
2558 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2560 global $langs,
$conf, $user, $hookmanager;
2562 if (!empty(
$conf->dol_no_mouse_hover)) {
2570 'objecttype' => $this->element,
2571 'option' => $option,
2573 $classfortooltip =
'classfortooltip';
2576 $classfortooltip =
'classforajaxtooltip';
2577 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2583 if ($option ==
'') {
2584 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2586 if ($option ==
'document') {
2587 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2590 if ($option !==
'nolink') {
2592 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2593 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2594 $add_save_lastsearch_values = 1;
2596 if ($add_save_lastsearch_values) {
2597 $url .=
'&save_lastsearch_values=1';
2602 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
2604 $label = $langs->trans(
"ShowSupplierProposal");
2605 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
2607 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
2608 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2611 $linkstart =
'<a href="'.$url.
'"';
2612 $linkstart .= $linkclose.
'>';
2615 $result .= $linkstart;
2617 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
2619 if ($withpicto != 2) {
2620 $result .= $this->ref;
2622 $result .= $linkend;
2624 if ($addlinktonotes) {
2625 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2628 $result .=
' <span class="note inline-block">';
2629 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2634 $result .=
'</span>';
2638 $hookmanager->initHooks(array($this->element .
'dao'));
2639 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
2640 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2642 $result = $hookmanager->resPrint;
2644 $result .= $hookmanager->resPrint;
2658 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2659 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2660 $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,';
2661 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2662 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2663 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2664 $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';
2665 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2666 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2667 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2668 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2670 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2671 $resql = $this->db->query($sql);
2673 $num = $this->db->num_rows($resql);
2677 $obj = $this->db->fetch_object($resql);
2680 $this->lines[$i]->id = $obj->rowid;
2681 $this->lines[$i]->rowid = $obj->rowid;
2682 $this->lines[$i]->label = $obj->custom_label;
2683 $this->lines[$i]->description = $obj->description;
2684 $this->lines[$i]->fk_product = $obj->fk_product;
2685 $this->lines[$i]->ref = $obj->ref;
2686 $this->lines[$i]->product_label = $obj->product_label;
2687 $this->lines[$i]->product_desc = $obj->product_desc;
2688 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2689 $this->lines[$i]->product_type = $obj->product_type;
2690 $this->lines[$i]->qty = $obj->qty;
2691 $this->lines[$i]->subprice = $obj->subprice;
2692 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2693 $this->lines[$i]->remise_percent = $obj->remise_percent;
2694 $this->lines[$i]->tva_tx = $obj->tva_tx;
2695 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2696 $this->lines[$i]->info_bits = $obj->info_bits;
2697 $this->lines[$i]->total_ht = $obj->total_ht;
2698 $this->lines[$i]->total_tva = $obj->total_tva;
2699 $this->lines[$i]->total_ttc = $obj->total_ttc;
2700 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2701 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2702 $this->lines[$i]->pa_ht = $marginInfos[0];
2703 $this->lines[$i]->marge_tx = $marginInfos[1];
2704 $this->lines[$i]->marque_tx = $marginInfos[2];
2705 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2706 $this->lines[$i]->special_code = $obj->special_code;
2707 $this->lines[$i]->rang = $obj->rang;
2709 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2710 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2713 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2714 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2715 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2716 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2717 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2718 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2719 $this->lines[$i]->fk_unit = $obj->fk_unit;
2723 $this->db->free($resql);
2727 $this->error = $this->db->error();
2743 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2745 global
$conf, $langs;
2747 $langs->load(
"supplier_proposal");
2748 $outputlangs->load(
"products");
2753 if ($this->model_pdf) {
2754 $modele = $this->model_pdf;
2760 $modelpath =
"core/modules/supplier_proposal/doc/";
2762 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2794 'supplier_proposaldet'
2812 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2814 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2815 $return .=
'<div class="info-box info-box-sm">';
2816 $return .=
'<span class="info-box-icon bg-infobox-action">';
2819 $return .=
'</span>';
2820 $return .=
'<div class="info-box-content">';
2821 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
2822 if ($selected >= 0) {
2823 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2825 if (property_exists($this,
'socid')) {
2826 $return .=
'<span class="info-box-ref"> | '.$this->socid.
'</span>';
2828 if (property_exists($this,
'delivery_date')) {
2829 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"DateEnd").
'</span> : <span class="info-box-label">'.
dol_print_date($this->delivery_date).
'</span>';
2831 if (property_exists($this,
'total_ttc')) {
2832 $return .=
'<br><span class="opacitymedium" >'.$langs->trans(
"AmountHT").
' : </span><span class="info-box-label amount">'.
price($this->total_ttc).
'</span>';
2834 if (method_exists($this,
'getLibStatut')) {
2835 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2837 $return .=
'</div>';
2838 $return .=
'</div>';
2839 $return .=
'</div>';
2863 public $element =
'supplier_proposaldet';
2868 public $table_element =
'supplier_proposaldet';
2893 public $fk_supplier_proposal;
2898 public $fk_parent_line;
2915 public $fk_product_type;
2934 public $vat_src_code;
2944 public $remise_percent;
2949 public $fk_remise_except;
2959 public $fk_fournprice;
2977 public $special_code;
2985 public $info_bits = 0;
3023 public $product_ref;
3036 public $product_label;
3048 public $product_desc;
3053 public $localtax1_tx;
3057 public $localtax2_tx;
3061 public $localtax1_type;
3065 public $localtax2_type;
3069 public $total_localtax1;
3073 public $total_localtax2;
3078 public $skip_update_total;
3087 public $ref_supplier;
3093 public $fk_multicurrency;
3098 public $multicurrency_code;
3102 public $multicurrency_subprice;
3106 public $multicurrency_total_ht;
3110 public $multicurrency_total_tva;
3114 public $multicurrency_total_ttc;
3134 $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,';
3135 $sql .=
' pd.date_start, pd.date_end,';
3136 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
3137 $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,';
3138 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
3139 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
3140 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
3141 $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';
3142 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
3143 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
3144 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
3146 $result = $this->db->query($sql);
3148 if ($objp = $this->db->fetch_object($result)) {
3149 $this->
id = $objp->rowid;
3150 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
3151 $this->fk_parent_line = $objp->fk_parent_line;
3152 $this->label = $objp->custom_label;
3153 $this->desc = $objp->description;
3154 $this->qty = $objp->qty;
3155 $this->subprice = $objp->subprice;
3156 $this->tva_tx = $objp->tva_tx;
3157 $this->remise_percent = $objp->remise_percent;
3158 $this->fk_remise_except = $objp->fk_remise_except;
3159 $this->fk_product = $objp->fk_product;
3160 $this->info_bits = $objp->info_bits;
3161 $this->date_start = $this->db->jdate($objp->date_start);
3162 $this->date_end = $this->db->jdate($objp->date_end);
3164 $this->total_ht = $objp->total_ht;
3165 $this->total_tva = $objp->total_tva;
3166 $this->total_ttc = $objp->total_ttc;
3168 $this->fk_fournprice = $objp->fk_fournprice;
3170 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
3171 $this->pa_ht = $marginInfos[0];
3172 $this->marge_tx = $marginInfos[1];
3173 $this->marque_tx = $marginInfos[2];
3175 $this->special_code = $objp->special_code;
3176 $this->product_type = $objp->product_type;
3177 $this->rang = $objp->rang;
3179 $this->
ref = $objp->product_ref;
3180 $this->product_ref = $objp->product_ref;
3181 $this->libelle = $objp->product_label;
3182 $this->product_label = $objp->product_label;
3183 $this->product_desc = $objp->product_desc;
3185 $this->ref_fourn = $objp->ref_produit_fourn;
3188 $this->fk_multicurrency = $objp->fk_multicurrency;
3189 $this->multicurrency_code = $objp->multicurrency_code;
3190 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3191 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3192 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3193 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3194 $this->fk_unit = $objp->fk_unit;
3196 $this->db->free($result);
3214 global
$conf, $langs, $user;
3218 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3221 if (empty($this->tva_tx)) {
3224 if (empty($this->vat_src_code)) {
3225 $this->vat_src_code =
'';
3227 if (empty($this->localtax1_tx)) {
3228 $this->localtax1_tx = 0;
3230 if (empty($this->localtax2_tx)) {
3231 $this->localtax2_tx = 0;
3233 if (empty($this->localtax1_type)) {
3234 $this->localtax1_type =
'';
3236 if (empty($this->localtax2_type)) {
3237 $this->localtax2_type =
'';
3239 if (empty($this->total_localtax1)) {
3240 $this->total_localtax1 = 0;
3242 if (empty($this->total_localtax2)) {
3243 $this->total_localtax2 = 0;
3245 if (empty($this->rang)) {
3248 if (empty($this->remise_percent)) {
3249 $this->remise_percent = 0;
3251 if (empty($this->info_bits)) {
3252 $this->info_bits = 0;
3254 if (empty($this->special_code)) {
3255 $this->special_code = 0;
3257 if (empty($this->fk_parent_line)) {
3258 $this->fk_parent_line = 0;
3260 if (empty($this->fk_fournprice)) {
3261 $this->fk_fournprice = 0;
3263 if (empty($this->fk_unit)) {
3266 if (empty($this->subprice)) {
3267 $this->subprice = 0;
3270 if (empty($this->pa_ht)) {
3275 if ($this->pa_ht == 0) {
3276 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3280 $this->pa_ht = $result;
3285 if ($this->product_type < 0) {
3292 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3293 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3294 $sql .=
' date_start, date_end,';
3295 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3296 $sql .=
' subprice, remise_percent, ';
3297 $sql .=
' info_bits, ';
3298 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3299 $sql .=
' ref_fourn,';
3300 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3301 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3302 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3303 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3304 $sql .=
" '".$this->db->escape($this->desc).
"',";
3305 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3306 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3307 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3308 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3309 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3310 $sql .=
" ".price2num($this->qty,
'MS').
",";
3311 $sql .=
" ".price2num($this->tva_tx).
",";
3312 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3313 $sql .=
" ".price2num($this->localtax1_tx).
",";
3314 $sql .=
" ".price2num($this->localtax2_tx).
",";
3315 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3316 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3317 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3318 $sql .=
" ".((float) $this->remise_percent).
",";
3319 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3320 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3321 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3322 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3323 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3324 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3325 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3326 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3327 $sql .=
' '.((int) $this->special_code).
',';
3328 $sql .=
' '.((int) $this->rang).
',';
3329 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3330 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3331 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3332 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3333 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3334 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3335 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3336 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3339 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3340 $resql = $this->db->query($sql);
3342 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3351 if (!$error && !$notrigger) {
3353 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3355 $this->db->rollback();
3361 $this->db->commit();
3364 $this->error = $this->db->error().
" sql=".$sql;
3365 $this->db->rollback();
3376 public function delete($user)
3382 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet";
3383 $sql .=
" WHERE rowid = ".((int) $this->
id);
3385 if ($this->db->query($sql)) {
3391 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3396 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3398 $this->db->rollback();
3403 $this->db->commit();
3407 $this->error = $this->db->error().
" sql=".$sql;
3408 $this->db->rollback();
3421 global
$conf, $langs, $user;
3426 if (empty($this->tva_tx)) {
3429 if (empty($this->localtax1_tx)) {
3430 $this->localtax1_tx = 0;
3432 if (empty($this->localtax2_tx)) {
3433 $this->localtax2_tx = 0;
3435 if (empty($this->total_localtax1)) {
3436 $this->total_localtax1 = 0;
3438 if (empty($this->total_localtax2)) {
3439 $this->total_localtax2 = 0;
3441 if (empty($this->localtax1_type)) {
3442 $this->localtax1_type =
'';
3444 if (empty($this->localtax2_type)) {
3445 $this->localtax2_type =
'';
3447 if (empty($this->marque_tx)) {
3448 $this->marque_tx = 0;
3450 if (empty($this->marge_tx)) {
3451 $this->marge_tx = 0;
3453 if (empty($this->remise_percent)) {
3454 $this->remise_percent = 0;
3456 if (empty($this->info_bits)) {
3457 $this->info_bits = 0;
3459 if (empty($this->special_code)) {
3460 $this->special_code = 0;
3462 if (empty($this->fk_parent_line)) {
3463 $this->fk_parent_line = 0;
3465 if (empty($this->fk_fournprice)) {
3466 $this->fk_fournprice = 0;
3468 if (empty($this->fk_unit)) {
3471 if (empty($this->subprice)) {
3472 $this->subprice = 0;
3475 if (empty($this->pa_ht)) {
3480 if ($this->pa_ht == 0) {
3481 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3485 $this->pa_ht = $result;
3492 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3493 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3494 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3495 $sql .=
" , product_type=".((int) $this->product_type);
3496 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3497 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3498 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3499 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3500 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3501 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3502 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3503 $sql .=
" , qty='".price2num($this->qty).
"'";
3504 $sql .=
" , subprice=".price2num($this->subprice);
3505 $sql .=
" , remise_percent=".price2num($this->remise_percent);
3506 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3507 if (empty($this->skip_update_total)) {
3508 $sql .=
" , total_ht=".price2num($this->total_ht);
3509 $sql .=
" , total_tva=".price2num($this->total_tva);
3510 $sql .=
" , total_ttc=".price2num($this->total_ttc);
3511 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
3512 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
3514 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3515 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3516 $sql .=
" , special_code=".((int) $this->special_code);
3517 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3518 if (!empty($this->rang)) {
3519 $sql .=
", rang=".((int) $this->rang);
3521 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3522 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3525 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3526 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3527 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3528 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3530 $sql .=
" WHERE rowid = ".((int) $this->
id);
3532 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3533 $resql = $this->db->query($sql);
3542 if (!$error && !$notrigger) {
3544 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3546 $this->db->rollback();
3552 $this->db->commit();
3555 $this->error = $this->db->error();
3556 $this->db->rollback();
3574 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3575 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3576 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3577 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3578 $sql .=
" WHERE rowid = ".((int) $this->
id);
3580 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3582 $resql = $this->db->query($sql);
3584 $this->db->commit();
3587 $this->error = $this->db->error();
3588 $this->db->rollback();
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 clickable link of object (with eventually picto)
getKanbanView($option='', $arraydata=null)
Return clickable 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.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
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_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
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_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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 '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_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)
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
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_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a 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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
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.