39 require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
40 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
41 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
42 require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
43 require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
44 require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
45 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
57 public $element =
'supplier_proposal';
62 public $table_element =
'supplier_proposal';
67 public $table_element_line =
'supplier_proposaldet';
72 public $fk_element =
'fk_supplier_proposal';
77 public $picto =
'supplier_proposal';
83 public $ismultientitymanaged = 1;
89 public $restrictiononfksoc = 1;
105 public $ref_supplier;
117 public $date_livraison;
122 public $delivery_date;
133 public $date_creation;
144 public $date_validation;
147 public $user_author_id;
148 public $user_valid_id;
149 public $user_close_id;
169 public $cond_reglement_code;
170 public $mode_reglement_code;
172 public $remise_percent = 0;
173 public $remise_absolue = 0;
175 public $extraparams = array();
176 public $lines = array();
179 public $labelStatus = array();
180 public $labelStatusShort = array();
189 public $fk_multicurrency;
191 public $multicurrency_code;
192 public $multicurrency_tx;
193 public $multicurrency_total_ht;
194 public $multicurrency_total_tva;
195 public $multicurrency_total_ttc;
231 public function __construct($db, $socid =
"", $supplier_proposalid = 0)
233 global $conf, $langs;
237 $this->socid = $socid;
238 $this->
id = $supplier_proposalid;
253 public function add_product($idproduct, $qty, $remise_percent = 0)
256 global $conf, $mysoc;
262 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
263 if ($idproduct > 0) {
265 $prod->fetch($idproduct);
267 $productdesc = $prod->description;
271 if (empty($tva_tx)) {
274 $localtax1_tx =
get_localtax($tva_tx, 1, $mysoc, $this->thirdparty, $tva_npr);
275 $localtax2_tx =
get_localtax($tva_tx, 2, $mysoc, $this->thirdparty, $tva_npr);
278 if ($conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
279 $price = $prod->multiprices[$this->thirdparty->price_level];
286 $line->fk_product = $idproduct;
287 $line->desc = $productdesc;
290 $line->remise_percent = $remise_percent;
291 $line->tva_tx = $tva_tx;
293 $this->lines[] = $line;
311 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
312 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
317 $result = $remise->fetch($idremise);
320 if ($remise->fk_facture) {
321 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
322 $this->
db->rollback();
327 $supplier_proposalligne->fk_supplier_proposal = $this->id;
328 $supplier_proposalligne->fk_remise_except = $remise->id;
329 $supplier_proposalligne->desc = $remise->description;
330 $supplier_proposalligne->tva_tx = $remise->tva_tx;
331 $supplier_proposalligne->subprice = -$remise->amount_ht;
332 $supplier_proposalligne->fk_product = 0;
333 $supplier_proposalligne->qty = 1;
334 $supplier_proposalligne->remise_percent = 0;
335 $supplier_proposalligne->rang = -1;
336 $supplier_proposalligne->info_bits = 2;
338 $supplier_proposalligne->total_ht = -$remise->amount_ht;
339 $supplier_proposalligne->total_tva = -$remise->amount_tva;
340 $supplier_proposalligne->total_ttc = -$remise->amount_ttc;
342 $result = $supplier_proposalligne->insert();
349 $this->
db->rollback();
353 $this->error = $supplier_proposalligne->error;
354 $this->
db->rollback();
358 $this->
db->rollback();
400 public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type =
'HT', $pu_ttc = 0, $info_bits = 0, $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice = 0, $pa_ht = 0, $label =
'', $array_options = 0, $ref_supplier =
'', $fk_unit =
'', $origin =
'', $origin_id = 0, $pu_ht_devise = 0, $date_start = 0, $date_end = 0)
402 global $mysoc, $conf, $langs;
404 dol_syslog(get_class($this).
"::addline supplier_proposalid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_except=$remise_percent, price_base_type=$price_base_type, pu_ttc=$pu_ttc, info_bits=$info_bits, type=$type");
405 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
408 if (empty($remise_percent)) {
414 if (empty($info_bits)) {
420 if (empty($fk_parent_line) || $fk_parent_line < 0) {
427 $remise_percent =
price2num($remise_percent);
431 if (!preg_match(
'/\((.*)\)/', $txtva)) {
437 if ($price_base_type ==
'HT') {
448 if ($this->statut == self::STATUS_DRAFT) {
451 if ($fk_product > 0) {
452 if (!empty($conf->global->SUPPLIER_PROPOSAL_WITH_PREDEFINED_PRICES_ONLY)) {
454 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_fournprice=".$fk_fournprice.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
456 if ($productsupplier->fetch($fk_product) > 0) {
457 $product_type = $productsupplier->type;
458 $label = $productsupplier->label;
459 $fk_prod_fourn_price = $fk_fournprice;
463 $result = $productsupplier->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
465 $pu = $productsupplier->fourn_pu;
466 $ref_supplier = $productsupplier->ref_supplier;
468 if ($remise_percent == 0 && $productsupplier->remise_percent != 0) {
469 $remise_percent = $productsupplier->remise_percent;
473 $langs->load(
"errors");
474 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
475 $this->
db->rollback();
476 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
482 $langs->load(
"errors");
483 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
484 $this->
db->rollback();
485 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
489 $this->error = $productsupplier->error;
490 $this->errors = $productsupplier->errors;
491 $this->
db->rollback();
492 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
496 $this->error = $productsupplier->error;
497 $this->errors = $productsupplier->errors;
498 $this->
db->rollback();
503 $product_type = $type;
516 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
517 $vat_src_code = $reg[1];
518 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
521 if (
isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
525 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
526 $total_ht = $tabprice[0];
527 $total_tva = $tabprice[1];
528 $total_ttc = $tabprice[2];
529 $total_localtax1 = $tabprice[9];
530 $total_localtax2 = $tabprice[10];
531 $pu = $pu_ht = $tabprice[3];
534 $multicurrency_total_ht = $tabprice[16];
535 $multicurrency_total_tva = $tabprice[17];
536 $multicurrency_total_ttc = $tabprice[18];
537 $pu_ht_devise = $tabprice[19];
541 if ($ranktouse == -1) {
542 $rangmax = $this->
line_max($fk_parent_line);
543 $ranktouse = $rangmax + 1;
550 if ($remise_percent > 0) {
551 $remise = round(($pu * $remise_percent / 100), 2);
558 $this->line->fk_supplier_proposal = $this->id;
559 $this->line->label = $label;
560 $this->line->desc = $desc;
561 $this->line->qty = $qty;
563 $this->line->vat_src_code = $vat_src_code;
564 $this->line->tva_tx = $txtva;
565 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
566 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
567 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
568 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
569 $this->line->fk_product = $fk_product;
570 $this->line->remise_percent = $remise_percent;
571 $this->line->subprice = $pu_ht;
572 $this->line->rang = $ranktouse;
573 $this->line->info_bits = $info_bits;
574 $this->line->total_ht = $total_ht;
575 $this->line->total_tva = $total_tva;
576 $this->line->total_localtax1 = $total_localtax1;
577 $this->line->total_localtax2 = $total_localtax2;
578 $this->line->total_ttc = $total_ttc;
579 $this->line->product_type = $type;
580 $this->line->special_code = $special_code;
581 $this->line->fk_parent_line = $fk_parent_line;
582 $this->line->fk_unit = $fk_unit;
583 $this->line->origin = $origin;
584 $this->line->origin_id = $origin_id;
585 $this->line->ref_fourn = $this->
db->escape($ref_supplier);
586 $this->line->date_start = $date_start;
587 $this->line->date_end = $date_end;
590 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
592 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
594 $productFournisseur->find_min_price_product_fournisseur($fk_product);
595 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
597 $this->line->fk_fournprice = ($fk_fournprice > 0 ? $fk_fournprice : 0);
599 $this->line->pa_ht = $pa_ht;
603 $this->line->fk_multicurrency = $this->fk_multicurrency;
604 $this->line->multicurrency_code = $this->multicurrency_code;
605 $this->line->multicurrency_subprice = $pu_ht_devise;
606 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
607 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
608 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
611 if (empty($qty) && empty($special_code)) {
612 $this->line->special_code = 3;
615 if (is_array($array_options) && count($array_options) > 0) {
616 $this->line->array_options = $array_options;
619 $result = $this->line->insert();
622 if (!empty($fk_parent_line)) {
624 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
625 $linecount = count($this->lines);
626 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
632 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
635 return $this->line->id;
637 $this->error = $this->error();
638 $this->errors = $this->errors();
639 $this->
db->rollback();
643 $this->error = $this->line->error;
644 $this->errors = $this->line->errors;
645 $this->
db->rollback();
649 $this->error =
'BadStatusOfObjectToAddLine';
681 public function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $desc =
'', $price_base_type =
'HT', $info_bits = 0, $special_code = 0, $fk_parent_line = 0, $skip_update_total = 0, $fk_fournprice = 0, $pa_ht = 0, $label =
'', $type = 0, $array_options = 0, $ref_supplier =
'', $fk_unit =
'', $pu_ht_devise = 0)
683 global $conf, $user, $langs, $mysoc;
685 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
686 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
689 $remise_percent =
price2num($remise_percent);
692 if (!preg_match(
'/\((.*)\)/', $txtva)) {
698 if (empty($qty) && empty($special_code)) {
701 if (!empty($qty) && $special_code == 3) {
705 if ($this->statut == 0) {
718 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
719 $vat_src_code = $reg[1];
720 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
723 if (
isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
727 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
728 $total_ht = $tabprice[0];
729 $total_tva = $tabprice[1];
730 $total_ttc = $tabprice[2];
731 $total_localtax1 = $tabprice[9];
732 $total_localtax2 = $tabprice[10];
733 $pu_ht = $tabprice[3];
734 $pu_tva = $tabprice[4];
735 $pu_ttc = $tabprice[5];
738 $multicurrency_total_ht = $tabprice[16];
739 $multicurrency_total_tva = $tabprice[17];
740 $multicurrency_total_ttc = $tabprice[18];
741 $pu_ht_devise = $tabprice[19];
744 if ($price_base_type ==
'TTC') {
750 $line->fetch($rowid);
751 $line->fetch_optionals();
754 $staticline = clone $line;
756 $line->oldline = $staticline;
758 $this->line->context = $this->context;
761 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
762 $rangmax = $this->
line_max($fk_parent_line);
763 $this->line->rang = $rangmax + 1;
766 $this->line->id = $rowid;
767 $this->line->label = $label;
768 $this->line->desc = $desc;
769 $this->line->qty = $qty;
770 $this->line->product_type = $type;
772 $this->line->vat_src_code = $vat_src_code;
773 $this->line->tva_tx = $txtva;
774 $this->line->localtax1_tx = $txlocaltax1;
775 $this->line->localtax2_tx = $txlocaltax2;
776 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
777 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
778 $this->line->remise_percent = $remise_percent;
779 $this->line->subprice = $pu;
780 $this->line->info_bits = $info_bits;
781 $this->line->total_ht = $total_ht;
782 $this->line->total_tva = $total_tva;
783 $this->line->total_localtax1 = $total_localtax1;
784 $this->line->total_localtax2 = $total_localtax2;
785 $this->line->total_ttc = $total_ttc;
786 $this->line->special_code = $special_code;
787 $this->line->fk_parent_line = $fk_parent_line;
788 $this->line->skip_update_total = $skip_update_total;
789 $this->line->ref_fourn = $ref_supplier;
790 $this->line->fk_unit = $fk_unit;
793 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
795 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
797 $productFournisseur->find_min_price_product_fournisseur($fk_product);
798 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
800 $this->line->fk_fournprice = $fk_fournprice;
802 $this->line->pa_ht = $pa_ht;
804 if (is_array($array_options) && count($array_options) > 0) {
806 foreach ($array_options as $key => $value) {
807 $this->line->array_options[$key] = $array_options[$key];
812 $this->line->multicurrency_subprice = $pu_ht_devise;
813 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
814 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
815 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
817 $result = $this->line->update();
820 if (!empty($fk_parent_line)) {
826 $this->fk_supplier_proposal = $this->id;
831 $this->error = $this->
db->error();
832 $this->
db->rollback();
836 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
850 if ($this->statut == 0) {
854 $line->fetch($lineid);
856 if ($line->delete() > 0) {
877 public function create($user, $notrigger = 0)
879 global $langs, $conf, $mysoc, $hookmanager;
889 $this->error =
"Failed to fetch company";
890 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
893 if (!empty($this->
ref)) {
896 $this->error =
'ErrorRefAlreadyExists';
897 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
898 $this->
db->rollback();
904 $delivery_date = empty($this->delivery_date) ? $this->date_livraison : $this->delivery_date;
907 if (!empty($this->multicurrency_code)) {
910 if (empty($this->fk_multicurrency)) {
911 $this->multicurrency_code = $conf->currency;
912 $this->fk_multicurrency = 0;
913 $this->multicurrency_tx = 1;
919 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"supplier_proposal (";
923 $sql .=
", remise_percent";
924 $sql .=
", remise_absolue";
925 $sql .=
", total_tva";
926 $sql .=
", total_ttc";
929 $sql .=
", fk_user_author";
930 $sql .=
", note_private";
931 $sql .=
", note_public";
932 $sql .=
", model_pdf";
933 $sql .=
", fk_cond_reglement";
934 $sql .=
", fk_mode_reglement";
935 $sql .=
", fk_account";
936 $sql .=
", date_livraison";
937 $sql .=
", fk_shipping_method";
938 $sql .=
", fk_projet";
940 $sql .=
", fk_multicurrency";
941 $sql .=
", multicurrency_code";
942 $sql .=
", multicurrency_tx";
945 $sql .= ((int) $this->socid);
947 $sql .=
", ".((double) $this->remise);
948 $sql .=
", ".($this->remise_percent ? ((double) $this->remise_percent) :
'null');
949 $sql .=
", ".($this->remise_absolue ? ((double) $this->remise_absolue) :
'null');
952 $sql .=
", '".$this->db->idate($now).
"'";
953 $sql .=
", '(PROV)'";
954 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
955 $sql .=
", '".$this->db->escape($this->note_private).
"'";
956 $sql .=
", '".$this->db->escape($this->note_public).
"'";
957 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
958 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
959 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
960 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
961 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
962 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
963 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
964 $sql .=
", ".((int) $conf->entity);
965 $sql .=
", ".((int) $this->fk_multicurrency);
966 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
967 $sql .=
", ".((double) $this->multicurrency_tx);
970 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
973 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
976 $this->
ref =
'(PROV'.$this->id.
')';
977 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->
db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
979 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
985 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
986 $this->linked_objects = $this->linkedObjectsIds;
990 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
991 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
992 if (is_array($tmp_origin_id)) {
993 foreach ($tmp_origin_id as $origin_id) {
1008 $fk_parent_line = 0;
1009 $num = count($this->lines);
1011 for ($i = 0; $i < $num; $i++) {
1013 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1014 $fk_parent_line = 0;
1018 $this->lines[$i]->desc,
1019 $this->lines[$i]->subprice,
1020 $this->lines[$i]->qty,
1021 $this->lines[$i]->tva_tx,
1022 $this->lines[$i]->localtax1_tx,
1023 $this->lines[$i]->localtax2_tx,
1024 $this->lines[$i]->fk_product,
1025 $this->lines[$i]->remise_percent,
1029 $this->lines[$i]->product_type,
1030 $this->lines[$i]->rang,
1031 $this->lines[$i]->special_code,
1033 $this->lines[$i]->fk_fournprice,
1034 $this->lines[$i]->pa_ht,
1035 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1036 $this->lines[$i]->array_options,
1037 $this->lines[$i]->ref_fourn,
1038 $this->lines[$i]->fk_unit,
1039 'supplier_proposal',
1040 $this->lines[$i]->
rowid
1045 $this->error = $this->
db->error;
1050 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1051 $fk_parent_line = $result;
1070 if (!$error && !$notrigger) {
1072 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1079 $this->error = $this->
db->lasterror();
1084 $this->error = $this->
db->lasterror();
1089 $this->
db->commit();
1090 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1093 $this->
db->rollback();
1097 $this->error = $this->
db->lasterror();
1098 $this->
db->rollback();
1112 global $conf, $hookmanager;
1120 foreach ($this->lines as $line) {
1121 $line->fetch_optionals();
1125 $objFrom = clone $this;
1130 if (!empty($fromid) && $fromid != $this->socid) {
1131 if ($objsoc->fetch($fromid) > 0) {
1132 $this->socid = $objsoc->id;
1133 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1134 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1135 $this->fk_project =
'';
1140 $objsoc->fetch($this->socid);
1146 if (empty($conf->global->SUPPLIER_PROPOSAL_ADDON) || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/".$conf->global->SUPPLIER_PROPOSAL_ADDON.
".php")) {
1147 $this->error =
'ErrorSetupNotComplete';
1152 $this->user_author = $user->id;
1153 $this->user_author_id = $user->id;
1154 $this->user_valid = 0;
1155 $this->user_valid_id = 0;
1159 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/".$conf->global->SUPPLIER_PROPOSAL_ADDON.
'.php';
1160 $obj = $conf->global->SUPPLIER_PROPOSAL_ADDON;
1161 $modSupplierProposal =
new $obj;
1162 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1165 $this->context[
'createfromclone'] =
'createfromclone';
1166 $result = $this->
create($user);
1173 if (is_object($hookmanager)) {
1174 $parameters = array(
'objFrom'=>$objFrom);
1176 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1178 $this->errors += $hookmanager->errors;
1179 $this->error = $hookmanager->error;
1185 unset($this->context[
'createfromclone']);
1189 $this->
db->commit();
1192 $this->
db->rollback();
1204 public function fetch($rowid, $ref =
'')
1208 $sql =
"SELECT p.rowid, p.entity, p.ref, p.remise, p.remise_percent, p.remise_absolue, p.fk_soc";
1209 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1210 $sql .=
", p.datec";
1211 $sql .=
", p.date_valid as datev";
1212 $sql .=
", p.date_livraison as delivery_date";
1213 $sql .=
", p.model_pdf, p.extraparams";
1214 $sql .=
", p.note_private, p.note_public";
1215 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1216 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1217 $sql .=
", p.fk_cond_reglement";
1218 $sql .=
", p.fk_mode_reglement";
1219 $sql .=
', p.fk_account';
1220 $sql .=
", p.fk_shipping_method";
1221 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1222 $sql .=
", c.label as statut_label";
1223 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1224 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1225 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1226 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1227 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1228 $sql .=
" WHERE p.fk_statut = c.id";
1229 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1231 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1233 $sql .=
" AND p.rowid = ".((int) $rowid);
1236 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1240 $obj = $this->
db->fetch_object(
$resql);
1242 $this->
id = $obj->rowid;
1243 $this->entity = $obj->entity;
1245 $this->
ref = $obj->ref;
1246 $this->remise = $obj->remise;
1247 $this->remise_percent = $obj->remise_percent;
1248 $this->remise_absolue = $obj->remise_absolue;
1249 $this->total_ht = $obj->total_ht;
1250 $this->total_tva = $obj->total_tva;
1251 $this->total_localtax1 = $obj->localtax1;
1252 $this->total_localtax2 = $obj->localtax2;
1253 $this->total_ttc = $obj->total_ttc;
1254 $this->socid = $obj->fk_soc;
1255 $this->fk_project = $obj->fk_project;
1256 $this->model_pdf = $obj->model_pdf;
1257 $this->modelpdf = $obj->model_pdf;
1258 $this->note = $obj->note_private;
1259 $this->note_private = $obj->note_private;
1260 $this->note_public = $obj->note_public;
1261 $this->statut = (int) $obj->fk_statut;
1262 $this->status = (
int) $obj->fk_statut;
1263 $this->statut_libelle = $obj->statut_label;
1264 $this->datec = $this->
db->jdate($obj->datec);
1265 $this->datev = $this->
db->jdate($obj->datev);
1266 $this->date_creation = $this->
db->jdate($obj->datec);
1267 $this->date = $this->date_creation;
1268 $this->date_validation = $this->
db->jdate($obj->datev);
1269 $this->date_livraison = $this->
db->jdate($obj->delivery_date);
1270 $this->delivery_date = $this->
db->jdate($obj->delivery_date);
1271 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1273 $this->mode_reglement_id = $obj->fk_mode_reglement;
1274 $this->mode_reglement_code = $obj->mode_reglement_code;
1275 $this->mode_reglement = $obj->mode_reglement;
1276 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1277 $this->cond_reglement_id = $obj->fk_cond_reglement;
1278 $this->cond_reglement_code = $obj->cond_reglement_code;
1279 $this->cond_reglement = $obj->cond_reglement;
1280 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1282 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1284 $this->user_author_id = $obj->fk_user_author;
1285 $this->user_valid_id = $obj->fk_user_valid;
1286 $this->user_close_id = $obj->fk_user_cloture;
1289 $this->fk_multicurrency = $obj->fk_multicurrency;
1290 $this->multicurrency_code = $obj->multicurrency_code;
1291 $this->multicurrency_tx = $obj->multicurrency_tx;
1292 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1293 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1294 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1296 if ($obj->fk_statut == 0) {
1297 $this->brouillon = 1;
1306 $this->lines = array();
1309 $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,";
1310 $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,";
1311 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1312 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1313 $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';
1314 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1315 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1316 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1317 $sql .=
" ORDER by d.rang";
1319 $result = $this->
db->query($sql);
1321 $num = $this->
db->num_rows($result);
1325 $objp = $this->
db->fetch_object($result);
1329 $line->rowid = $objp->rowid;
1330 $line->id = $objp->rowid;
1331 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1332 $line->fk_parent_line = $objp->fk_parent_line;
1333 $line->product_type = $objp->product_type;
1334 $line->label = $objp->custom_label;
1335 $line->desc = $objp->description;
1336 $line->qty = $objp->qty;
1337 $line->tva_tx = $objp->tva_tx;
1338 $line->localtax1_tx = $objp->localtax1_tx;
1339 $line->localtax2_tx = $objp->localtax2_tx;
1340 $line->subprice = $objp->subprice;
1341 $line->fk_remise_except = $objp->fk_remise_except;
1342 $line->remise_percent = $objp->remise_percent;
1344 $line->info_bits = $objp->info_bits;
1345 $line->total_ht = $objp->total_ht;
1346 $line->total_tva = $objp->total_tva;
1347 $line->total_localtax1 = $objp->total_localtax1;
1348 $line->total_localtax2 = $objp->total_localtax2;
1349 $line->total_ttc = $objp->total_ttc;
1350 $line->fk_fournprice = $objp->fk_fournprice;
1351 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1352 $line->pa_ht = $marginInfos[0];
1353 $line->marge_tx = $marginInfos[1];
1354 $line->marque_tx = $marginInfos[2];
1355 $line->special_code = $objp->special_code;
1356 $line->rang = $objp->rang;
1358 $line->fk_product = $objp->fk_product;
1360 $line->ref = $objp->product_ref;
1361 $line->product_ref = $objp->product_ref;
1362 $line->libelle = $objp->product_label;
1363 $line->product_label = $objp->product_label;
1364 $line->product_desc = $objp->product_desc;
1365 $line->fk_product_type = $objp->fk_product_type;
1367 $line->ref_fourn = $objp->ref_produit_fourn;
1370 $line->fk_multicurrency = $objp->fk_multicurrency;
1371 $line->multicurrency_code = $objp->multicurrency_code;
1372 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1373 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1374 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1375 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1376 $line->fk_unit = $objp->fk_unit;
1378 $this->lines[$i] = $line;
1382 $this->
db->free($result);
1384 $this->error = $this->
db->error();
1395 $this->error =
"Record Not Found";
1398 $this->error = $this->
db->error();
1410 public function valid($user, $notrigger = 0)
1412 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1414 global $conf, $langs;
1419 if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->creer))
1420 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->validate_advance))) {
1425 $result = $soc->fetch($this->socid);
1432 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1439 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1440 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1441 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1442 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1444 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1452 if (!$error && !$notrigger) {
1454 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1462 $this->oldref = $this->ref;
1465 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1467 $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).
"'";
1468 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->
db->escape($this->
ref).
"' and entity = ".$conf->entity;
1471 $error++; $this->error = $this->
db->lasterror();
1477 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1478 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1479 if (!$error && file_exists($dirsource)) {
1480 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1481 if (@rename($dirsource, $dirdest)) {
1484 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1485 foreach ($listoffiles as $fileentry) {
1486 $dirsource = $fileentry[
'name'];
1487 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1488 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1489 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1490 @rename($dirsource, $dirdest);
1497 $this->brouillon = 0;
1499 $this->user_valid_id = $user->id;
1500 $this->datev = $now;
1502 $this->
db->commit();
1505 $this->
db->rollback();
1509 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1538 if (!empty($user->rights->supplier_proposal->creer)) {
1539 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1540 $sql .=
" SET date_livraison = ".($delivery_date !=
'' ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1541 $sql .=
" WHERE rowid = ".((int) $this->
id);
1543 if ($this->
db->query($sql)) {
1544 $this->date_livraison = $delivery_date;
1545 $this->delivery_date = $delivery_date;
1548 $this->error = $this->
db->error();
1549 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1567 $remise = trim($remise) ?trim($remise) : 0;
1569 if (!empty($user->rights->supplier_proposal->creer)) {
1572 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal SET remise_percent = ".((
float) $remise);
1573 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1575 if ($this->
db->query($sql)) {
1576 $this->remise_percent = ((
float) $remise);
1580 $this->error = $this->
db->error();
1599 if (empty($remise)) {
1605 if (!empty($user->rights->supplier_proposal->creer)) {
1606 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1607 $sql .=
" SET remise_absolue = ".((float) $remise);
1608 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1610 if ($this->
db->query($sql)) {
1611 $this->remise_absolue = $remise;
1615 $this->error = $this->
db->error();
1635 global $langs, $conf;
1637 $this->statut = $statut;
1640 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1641 $sql .=
" SET fk_statut = ".((int) $this->statut).
",";
1642 if (!empty(
$note)) {
1643 $sql .=
" note_private = '".$this->db->escape(
$note).
"',";
1645 $sql .=
" date_cloture=NULL, fk_user_cloture=NULL";
1646 $sql .=
" WHERE rowid = ".((int) $this->
id);
1650 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1653 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1658 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1668 if (!empty($this->errors)) {
1669 foreach ($this->errors as $errmsg) {
1670 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1671 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1674 $this->
db->rollback();
1677 $this->
db->commit();
1693 global $langs, $conf;
1697 $this->statut = $status;
1703 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1704 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->
db->escape(
$note).
"', date_cloture='".$this->
db->idate($now).
"', fk_user_cloture=".$user->id;
1705 $sql .=
" WHERE rowid = ".((int) $this->
id);
1709 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1710 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1713 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1714 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1716 if (!empty($conf->global->SUPPLIER_PROPOSAL_UPDATE_PRICE_ON_SUPPlIER_PROPOSAL)) {
1721 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1724 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1726 $outputlangs = $langs;
1728 $outputlangs =
new Translate(
"", $conf);
1729 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1730 $outputlangs->setDefaultLang($newlang);
1733 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1744 $this->
db->commit();
1747 $this->
db->rollback();
1751 $this->error = $this->
db->lasterror();
1752 $this->errors[] = $this->
db->lasterror();
1753 $this->
db->rollback();
1768 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1769 foreach ($this->lines as $product) {
1770 if ($product->subprice <= 0) {
1775 $multicurrency_tx = 1;
1776 $fk_multicurrency = 0;
1778 if (empty($this->thirdparty)) {
1782 $ref_fourn = $product->ref_fourn;
1783 if (empty($ref_fourn)) {
1784 $ref_fourn = $product->ref_supplier;
1786 if (
isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1789 $productsupplier->id = $product->fk_product;
1791 $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,
'',
'',
'');
1808 $unitPrice =
price2num($product->subprice,
'MU');
1810 $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);
1814 $this->error = $this->
db->error();
1815 $this->
db->rollback();
1834 $unitPrice =
price2num($product->subprice,
'MU');
1839 "'".$this->
db->idate($now).
"'",
1840 $product->fk_product,
1841 $this->thirdparty->id,
1842 "'".$product->ref_fourn.
"'",
1850 if (!empty($product->multicurrency_code)) {
1851 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1853 $multicurrency->fetch(0, $product->multicurrency_code);
1854 if (!empty($multicurrency->id)) {
1855 $values[] = $multicurrency->id;
1856 $values[] =
"'".$product->multicurrency_code.
"'";
1857 $values[] = $product->multicurrency_subprice;
1858 $values[] = $product->multicurrency_total_ht;
1859 $values[] = $multicurrency->rate->rate;
1861 for ($i = 0; $i < 5; $i++) {
1868 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1869 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1870 if (
isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1871 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1873 $sql .=
') VALUES ('.implode(
',', $values).
')';
1877 $this->error = $this->
db->error();
1878 $this->
db->rollback();
1894 global $conf, $langs;
1898 if ($this->statut == self::STATUS_DRAFT) {
1899 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1903 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1904 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1905 $sql .=
" WHERE rowid = ".((int) $this->
id);
1907 if ($this->
db->query($sql)) {
1909 $this->oldcopy = clone $this;
1914 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1922 $this->brouillon = 1;
1923 $this->
db->commit();
1926 $this->
db->rollback();
1949 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1952 global $conf, $user;
1956 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
1957 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
1958 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
1959 if (empty($user->rights->societe->client->voir) && !$socid) {
1960 $sql .=
", sc.fk_soc, sc.fk_user";
1962 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
1963 if (empty($user->rights->societe->client->voir) && !$socid) {
1964 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
1966 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
1967 $sql .=
" AND p.fk_soc = s.rowid";
1968 $sql .=
" AND p.fk_statut = c.id";
1969 if (empty($user->rights->societe->client->voir) && !$socid) {
1970 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
1973 $sql .=
" AND s.rowid = ".((int) $socid);
1976 $sql .=
" AND p.fk_statut = 0";
1978 if ($notcurrentuser > 0) {
1979 $sql .=
" AND p.fk_user_author <> ".$user->id;
1981 $sql .= $this->
db->order($sortfield, $sortorder);
1982 $sql .= $this->
db->plimit($limit, $offset);
1984 $result = $this->
db->query($sql);
1986 $num = $this->
db->num_rows($result);
1990 $obj = $this->
db->fetch_object($result);
1992 if ($shortlist == 1) {
1993 $ga[$obj->supplier_proposalid] = $obj->ref;
1994 } elseif ($shortlist == 2) {
1995 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
1997 $ga[$i][
'id'] = $obj->supplier_proposalid;
1998 $ga[$i][
'ref'] = $obj->ref;
1999 $ga[$i][
'name'] = $obj->name;
2019 public function delete($user, $notrigger = 0)
2021 global $conf, $langs;
2022 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2030 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2038 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2039 $ef = $main.
"_extrafields";
2040 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2041 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2042 if ($this->
db->query($sql)) {
2043 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2044 if ($this->
db->query($sqlef) && $this->
db->query($sql)) {
2057 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2058 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2059 $file = $dir.
"/".$ref.
".pdf";
2060 if (file_exists($file)) {
2064 $this->error =
'ErrorFailToDeleteFile';
2065 $this->errors = array(
'ErrorFailToDeleteFile');
2066 $this->
db->rollback();
2070 if (file_exists($dir)) {
2073 $this->error =
'ErrorFailToDeleteDir';
2074 $this->errors = array(
'ErrorFailToDeleteDir');
2075 $this->
db->rollback();
2088 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2093 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2094 $this->
db->commit();
2097 $this->error = $this->
db->lasterror();
2098 $this->
db->rollback();
2102 $this->error = $this->
db->lasterror();
2103 $this->
db->rollback();
2107 $this->error = $this->
db->lasterror();
2108 $this->
db->rollback();
2112 $this->
db->rollback();
2125 $sql =
"SELECT c.rowid, ";
2126 $sql .=
" c.datec, c.date_valid as datev, c.date_cloture as dateo,";
2127 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2128 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2129 $sql .=
" WHERE c.rowid = ".((int) $id);
2131 $result = $this->
db->query($sql);
2134 if ($this->
db->num_rows($result)) {
2135 $obj = $this->
db->fetch_object($result);
2137 $this->
id = $obj->rowid;
2139 $this->date_creation = $this->
db->jdate($obj->datec);
2140 $this->date_validation = $this->
db->jdate($obj->datev);
2141 $this->date_cloture = $this->
db->jdate($obj->dateo);
2143 $cuser =
new User($this->
db);
2144 $cuser->fetch($obj->fk_user_author);
2145 $this->user_creation = $cuser;
2147 if ($obj->fk_user_valid) {
2148 $vuser =
new User($this->
db);
2149 $vuser->fetch($obj->fk_user_valid);
2150 $this->user_validation = $vuser;
2153 if ($obj->fk_user_cloture) {
2154 $cluser =
new User($this->
db);
2155 $cluser->fetch($obj->fk_user_cloture);
2156 $this->user_cloture = $cluser;
2159 $this->
db->free($result);
2174 return $this->
LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
2190 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2192 $langs->load(
"supplier_proposal");
2193 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2194 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2195 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2196 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2197 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2198 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2199 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2200 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2201 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2202 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2206 if ($status == self::STATUS_DRAFT) {
2207 $statusnew =
'status0';
2208 } elseif ($status == self::STATUS_VALIDATED) {
2209 $statusnew =
'status1';
2210 } elseif ($status == self::STATUS_SIGNED) {
2211 $statusnew =
'status4';
2212 } elseif ($status == self::STATUS_NOTSIGNED) {
2213 $statusnew =
'status9';
2214 } elseif ($status == self::STATUS_CLOSE) {
2215 $statusnew =
'status6';
2218 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2233 global $conf, $user, $langs;
2237 $this->nbtodo = $this->nbtodolate = 0;
2240 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2241 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2242 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2243 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2244 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2247 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2248 if ($mode ==
'opened') {
2249 $sql .=
" AND p.fk_statut = 1";
2251 if ($mode ==
'signed') {
2252 $sql .=
" AND p.fk_statut = 2";
2255 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2260 $label = $labelShort =
'';
2262 if ($mode ==
'opened') {
2263 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2265 $label = $langs->trans(
"SupplierProposalsToClose");
2266 $labelShort = $langs->trans(
"ToAcceptRefuse");
2268 if ($mode ==
'signed') {
2269 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2271 $label = $langs->trans(
"SupplierProposalsToProcess");
2272 $labelShort = $langs->trans(
"ToClose");
2276 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2277 $response->label = $label;
2278 $response->labelShort = $labelShort;
2279 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2283 while ($obj = $this->
db->fetch_object(
$resql)) {
2284 $response->nbtodo++;
2285 if ($mode ==
'opened') {
2286 $datelimit = $this->
db->jdate($obj->datefin);
2287 if ($datelimit < ($now - $delay_warning)) {
2288 $response->nbtodolate++;
2296 $this->error = $this->
db->lasterror();
2311 global $user, $langs, $conf;
2316 $sql =
"SELECT rowid";
2317 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2318 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2319 $sql .= $this->
db->plimit(100);
2323 $num_prods = $this->
db->num_rows(
$resql);
2325 while ($i < $num_prods) {
2327 $row = $this->
db->fetch_row(
$resql);
2328 $prodids[$i] = $row[0];
2334 $this->
ref =
'SPECIMEN';
2335 $this->specimen = 1;
2337 $this->date = time();
2338 $this->cond_reglement_id = 1;
2339 $this->cond_reglement_code =
'RECEP';
2340 $this->mode_reglement_id = 7;
2341 $this->mode_reglement_code =
'CHQ';
2342 $this->note_public =
'This is a comment (public)';
2343 $this->note_private =
'This is a comment (private)';
2347 while ($xnbp < $nbp) {
2349 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2351 $line->subprice = 100;
2352 $line->tva_tx = 19.6;
2353 $line->localtax1_tx = 0;
2354 $line->localtax2_tx = 0;
2356 $line->total_ht = 50;
2357 $line->total_ttc = 59.8;
2358 $line->total_tva = 9.8;
2359 $line->remise_percent = 50;
2361 $line->total_ht = 100;
2362 $line->total_ttc = 119.6;
2363 $line->total_tva = 19.6;
2364 $line->remise_percent = 00;
2367 if ($num_prods > 0) {
2368 $prodid = mt_rand(1, $num_prods);
2369 $line->fk_product = $prodids[$prodid];
2372 $this->lines[$xnbp] = $line;
2374 $this->total_ht += $line->total_ht;
2375 $this->total_tva += $line->total_tva;
2376 $this->total_ttc += $line->total_ttc;
2391 global $conf, $user;
2393 $this->nb = array();
2396 $sql =
"SELECT count(p.rowid) as nb";
2397 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2398 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2399 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2400 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2401 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2404 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2409 while ($obj = $this->
db->fetch_object(
$resql)) {
2410 $this->nb[
"supplier_proposals"] = $obj->nb;
2416 $this->error = $this->
db->lasterror();
2431 global $conf, $db, $langs;
2432 $langs->load(
"supplier_proposal");
2434 if (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON)) {
2437 $file = $conf->global->SUPPLIER_PROPOSAL_ADDON.
".php";
2438 $classname = $conf->global->SUPPLIER_PROPOSAL_ADDON;
2441 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2442 foreach ($dirmodels as $reldir) {
2443 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2446 $mybool |= @include_once $dir.$file;
2454 $obj =
new $classname();
2456 $numref = $obj->getNextValue($soc, $this);
2458 if ($numref !=
"") {
2461 $this->error = $obj->error;
2465 $langs->load(
"errors");
2466 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2482 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2484 global $langs, $conf, $user, $hookmanager;
2486 if (!empty($conf->dol_no_mouse_hover)) {
2493 $label =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2494 if (isset($this->status)) {
2495 $label .=
' '.$this->getLibStatut(5);
2497 if (!empty($this->
ref)) {
2498 $label .=
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2500 if (!empty($this->ref_fourn)) {
2501 $label .=
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2503 if (!empty($this->total_ht)) {
2504 $label .=
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2506 if (!empty($this->total_tva)) {
2507 $label .=
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2509 if (!empty($this->total_ttc)) {
2510 $label .=
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2513 if ($option ==
'') {
2514 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2516 if ($option ==
'document') {
2517 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2520 if ($option !==
'nolink') {
2522 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2523 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2524 $add_save_lastsearch_values = 1;
2526 if ($add_save_lastsearch_values) {
2527 $url .=
'&save_lastsearch_values=1';
2532 if (empty($notooltip) && $user->rights->propal->lire) {
2533 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2534 $label = $langs->trans(
"ShowSupplierProposal");
2535 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2537 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
2538 $linkclose .=
' class="classfortooltip"';
2541 $linkstart =
'<a href="'.$url.
'"';
2542 $linkstart .= $linkclose.
'>';
2545 $result .= $linkstart;
2547 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
2549 if ($withpicto != 2) {
2550 $result .= $this->ref;
2552 $result .= $linkend;
2554 if ($addlinktonotes) {
2555 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2558 $result .=
' <span class="note inline-block">';
2559 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2564 $result .=
'</span>';
2568 $hookmanager->initHooks(array($this->element .
'dao'));
2569 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2570 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2572 $result = $hookmanager->resPrint;
2574 $result .= $hookmanager->resPrint;
2588 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2589 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2590 $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,';
2591 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2592 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2593 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2594 $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';
2595 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2596 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2597 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2598 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2600 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2603 $num = $this->
db->num_rows(
$resql);
2607 $obj = $this->
db->fetch_object(
$resql);
2610 $this->lines[$i]->id = $obj->rowid;
2611 $this->lines[$i]->rowid = $obj->rowid;
2612 $this->lines[$i]->label = $obj->custom_label;
2613 $this->lines[$i]->description = $obj->description;
2614 $this->lines[$i]->fk_product = $obj->fk_product;
2615 $this->lines[$i]->ref = $obj->ref;
2616 $this->lines[$i]->product_label = $obj->product_label;
2617 $this->lines[$i]->product_desc = $obj->product_desc;
2618 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2619 $this->lines[$i]->product_type = $obj->product_type;
2620 $this->lines[$i]->qty = $obj->qty;
2621 $this->lines[$i]->subprice = $obj->subprice;
2622 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2623 $this->lines[$i]->remise_percent = $obj->remise_percent;
2624 $this->lines[$i]->tva_tx = $obj->tva_tx;
2625 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2626 $this->lines[$i]->info_bits = $obj->info_bits;
2627 $this->lines[$i]->total_ht = $obj->total_ht;
2628 $this->lines[$i]->total_tva = $obj->total_tva;
2629 $this->lines[$i]->total_ttc = $obj->total_ttc;
2630 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2631 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2632 $this->lines[$i]->pa_ht = $marginInfos[0];
2633 $this->lines[$i]->marge_tx = $marginInfos[1];
2634 $this->lines[$i]->marque_tx = $marginInfos[2];
2635 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2636 $this->lines[$i]->special_code = $obj->special_code;
2637 $this->lines[$i]->rang = $obj->rang;
2639 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2640 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2643 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2644 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2645 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2646 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2647 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2648 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2649 $this->lines[$i]->fk_unit = $obj->fk_unit;
2657 $this->error = $this->
db->error();
2673 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2675 global $conf, $langs;
2677 $langs->load(
"supplier_proposal");
2678 $outputlangs->load(
"products");
2683 if ($this->model_pdf) {
2684 $modele = $this->model_pdf;
2685 } elseif (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON_PDF)) {
2686 $modele = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF;
2690 $modelpath =
"core/modules/supplier_proposal/doc/";
2692 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2724 'supplier_proposaldet'
2750 public $element =
'supplier_proposaldet';
2755 public $table_element =
'supplier_proposaldet';
2767 public $fk_supplier_proposal;
2772 public $fk_parent_line;
2795 public $vat_src_code;
2798 public $remise_percent;
2803 public $fk_remise_except;
2810 public $fk_fournprice;
2816 public $special_code;
2821 public $info_bits = 0;
2843 public $product_ref;
2855 public $product_label;
2861 public $product_desc;
2863 public $localtax1_tx;
2864 public $localtax2_tx;
2865 public $localtax1_type;
2866 public $localtax2_type;
2867 public $total_localtax1;
2868 public $total_localtax2;
2870 public $skip_update_total;
2873 public $ref_supplier;
2879 public $fk_multicurrency;
2881 public $multicurrency_code;
2882 public $multicurrency_subprice;
2883 public $multicurrency_total_ht;
2884 public $multicurrency_total_tva;
2885 public $multicurrency_total_ttc;
2905 $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,';
2906 $sql .=
' pd.date_start, pd.date_end,';
2907 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
2908 $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,';
2909 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
2910 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
2911 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
2912 $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';
2913 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
2914 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
2915 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
2917 $result = $this->
db->query($sql);
2919 $objp = $this->
db->fetch_object($result);
2921 $this->
id = $objp->rowid;
2922 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
2923 $this->fk_parent_line = $objp->fk_parent_line;
2924 $this->label = $objp->custom_label;
2925 $this->desc = $objp->description;
2926 $this->qty = $objp->qty;
2927 $this->subprice = $objp->subprice;
2928 $this->tva_tx = $objp->tva_tx;
2929 $this->remise_percent = $objp->remise_percent;
2930 $this->fk_remise_except = $objp->fk_remise_except;
2931 $this->fk_product = $objp->fk_product;
2932 $this->info_bits = $objp->info_bits;
2933 $this->date_start = $this->
db->jdate($objp->date_start);
2934 $this->date_end = $this->
db->jdate($objp->date_end);
2936 $this->total_ht = $objp->total_ht;
2937 $this->total_tva = $objp->total_tva;
2938 $this->total_ttc = $objp->total_ttc;
2940 $this->fk_fournprice = $objp->fk_fournprice;
2942 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
2943 $this->pa_ht = $marginInfos[0];
2944 $this->marge_tx = $marginInfos[1];
2945 $this->marque_tx = $marginInfos[2];
2947 $this->special_code = $objp->special_code;
2948 $this->product_type = $objp->product_type;
2949 $this->rang = $objp->rang;
2951 $this->
ref = $objp->product_ref;
2952 $this->product_ref = $objp->product_ref;
2953 $this->libelle = $objp->product_label;
2954 $this->product_label = $objp->product_label;
2955 $this->product_desc = $objp->product_desc;
2957 $this->ref_fourn = $objp->ref_produit_fourn;
2960 $this->fk_multicurrency = $objp->fk_multicurrency;
2961 $this->multicurrency_code = $objp->multicurrency_code;
2962 $this->multicurrency_subprice = $objp->multicurrency_subprice;
2963 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
2964 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
2965 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2966 $this->fk_unit = $objp->fk_unit;
2968 $this->
db->free($result);
2984 global $conf, $langs, $user;
2988 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
2991 if (empty($this->tva_tx)) {
2994 if (empty($this->vat_src_code)) {
2995 $this->vat_src_code =
'';
2997 if (empty($this->localtax1_tx)) {
2998 $this->localtax1_tx = 0;
3000 if (empty($this->localtax2_tx)) {
3001 $this->localtax2_tx = 0;
3003 if (empty($this->localtax1_type)) {
3004 $this->localtax1_type = 0;
3006 if (empty($this->localtax2_type)) {
3007 $this->localtax2_type = 0;
3009 if (empty($this->total_localtax1)) {
3010 $this->total_localtax1 = 0;
3012 if (empty($this->total_localtax2)) {
3013 $this->total_localtax2 = 0;
3015 if (empty($this->rang)) {
3018 if (empty($this->remise_percent)) {
3019 $this->remise_percent = 0;
3021 if (empty($this->info_bits)) {
3022 $this->info_bits = 0;
3024 if (empty($this->special_code)) {
3025 $this->special_code = 0;
3027 if (empty($this->fk_parent_line)) {
3028 $this->fk_parent_line = 0;
3030 if (empty($this->fk_fournprice)) {
3031 $this->fk_fournprice = 0;
3033 if (empty($this->fk_unit)) {
3036 if (empty($this->subprice)) {
3037 $this->subprice = 0;
3040 if (empty($this->pa_ht)) {
3045 if ($this->pa_ht == 0) {
3046 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3050 $this->pa_ht = $result;
3055 if ($this->product_type < 0) {
3062 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3063 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3064 $sql .=
' date_start, date_end,';
3065 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3066 $sql .=
' subprice, remise_percent, ';
3067 $sql .=
' info_bits, ';
3068 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3069 $sql .=
' ref_fourn,';
3070 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3071 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3072 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3073 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3074 $sql .=
" '".$this->db->escape($this->desc).
"',";
3075 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3076 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3077 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3078 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3079 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3080 $sql .=
" ".price2num($this->qty,
'MS').
",";
3081 $sql .=
" ".price2num($this->tva_tx).
",";
3082 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3083 $sql .=
" ".price2num($this->localtax1_tx).
",";
3084 $sql .=
" ".price2num($this->localtax2_tx).
",";
3085 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3086 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3087 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3088 $sql .=
" ".((float) $this->remise_percent).
",";
3089 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3090 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3091 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3092 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3093 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3094 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3095 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3096 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3097 $sql .=
' '.((int) $this->special_code).
',';
3098 $sql .=
' '.((int) $this->rang).
',';
3099 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3100 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3101 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3102 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3103 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3104 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3105 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3106 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3109 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3112 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3121 if (!$error && !$notrigger) {
3123 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3125 $this->
db->rollback();
3131 $this->
db->commit();
3134 $this->error = $this->
db->error().
" sql=".$sql;
3135 $this->
db->rollback();
3145 public function delete()
3147 global $conf, $langs, $user;
3152 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE rowid = ".((int) $this->
id);
3153 dol_syslog(
"SupplierProposalLine::delete", LOG_DEBUG);
3154 if ($this->
db->query($sql)) {
3160 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3165 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3167 $this->
db->rollback();
3172 $this->
db->commit();
3176 $this->error = $this->
db->error().
" sql=".$sql;
3177 $this->
db->rollback();
3190 global $conf, $langs, $user;
3195 if (empty($this->tva_tx)) {
3198 if (empty($this->localtax1_tx)) {
3199 $this->localtax1_tx = 0;
3201 if (empty($this->localtax2_tx)) {
3202 $this->localtax2_tx = 0;
3204 if (empty($this->total_localtax1)) {
3205 $this->total_localtax1 = 0;
3207 if (empty($this->total_localtax2)) {
3208 $this->total_localtax2 = 0;
3210 if (empty($this->localtax1_type)) {
3211 $this->localtax1_type = 0;
3213 if (empty($this->localtax2_type)) {
3214 $this->localtax2_type = 0;
3216 if (empty($this->marque_tx)) {
3217 $this->marque_tx = 0;
3219 if (empty($this->marge_tx)) {
3220 $this->marge_tx = 0;
3222 if (empty($this->remise_percent)) {
3223 $this->remise_percent = 0;
3225 if (empty($this->info_bits)) {
3226 $this->info_bits = 0;
3228 if (empty($this->special_code)) {
3229 $this->special_code = 0;
3231 if (empty($this->fk_parent_line)) {
3232 $this->fk_parent_line = 0;
3234 if (empty($this->fk_fournprice)) {
3235 $this->fk_fournprice = 0;
3237 if (empty($this->fk_unit)) {
3240 if (empty($this->subprice)) {
3241 $this->subprice = 0;
3244 if (empty($this->pa_ht)) {
3249 if ($this->pa_ht == 0) {
3250 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3254 $this->pa_ht = $result;
3261 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3262 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3263 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3264 $sql .=
" , product_type=".((int) $this->product_type);
3265 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3266 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3267 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3268 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3269 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3270 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3271 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3272 $sql .=
" , qty='".price2num($this->qty).
"'";
3273 $sql .=
" , subprice=".price2num($this->subprice).
"";
3274 $sql .=
" , remise_percent=".price2num($this->remise_percent).
"";
3275 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3276 if (empty($this->skip_update_total)) {
3277 $sql .=
" , total_ht=".price2num($this->total_ht).
"";
3278 $sql .=
" , total_tva=".price2num($this->total_tva).
"";
3279 $sql .=
" , total_ttc=".price2num($this->total_ttc).
"";
3280 $sql .=
" , total_localtax1=".price2num($this->total_localtax1).
"";
3281 $sql .=
" , total_localtax2=".price2num($this->total_localtax2).
"";
3283 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3284 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3285 if (strlen($this->special_code)) {
3286 $sql .=
" , special_code=".((int) $this->special_code);
3288 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3289 if (!empty($this->rang)) {
3290 $sql .=
", rang=".((int) $this->rang);
3292 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3293 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3296 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice).
"";
3297 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht).
"";
3298 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva).
"";
3299 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc).
"";
3301 $sql .=
" WHERE rowid = ".((int) $this->
id);
3303 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3313 if (!$error && !$notrigger) {
3315 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3317 $this->
db->rollback();
3323 $this->
db->commit();
3326 $this->error = $this->
db->error();
3327 $this->
db->rollback();
3345 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3346 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3347 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3348 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3349 $sql .=
" WHERE rowid = ".((int) $this->
id);
3351 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3355 $this->
db->commit();
3358 $this->error = $this->
db->error();
3359 $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.
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.
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check an object id/ref exists If you don't need/want to instantiate object and just need to know if o...
updateRangOfLine($rowid, $rang)
Update position of line (rang)
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='', $f_user=null, $notrigger=0)
Delete all links between an object $this.
update_price($exclspec=0, $roundingadjust='none', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceProduct(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
static commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage absolute discounts.
Class to manage Dolibarr database access.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage price ask supplier.
updatePriceFournisseur($idProductFournPrice, $product, $user)
Upate ProductFournisseur.
cloture($user, $status, $note)
Close the askprice.
set_remise_percent($user, $remise)
Set an overall discount on the proposal.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
deleteline($lineid)
Delete detail line.
info($id)
Object SupplierProposal Information.
create($user, $notrigger=0)
Create commercial proposal into database this->ref can be set or empty.
insert_discount($idremise)
Adding line of fixed discount in the proposal in DB.
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $desc='', $price_base_type='HT', $info_bits=0, $special_code=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=0, $pa_ht=0, $label='', $type=0, $array_options=0, $ref_supplier='', $fk_unit='', $pu_ht_devise=0)
Update a proposal line.
getNextNumRef($soc)
Returns the reference to the following non used Proposal used depending on the active numbering modul...
fetch($rowid, $ref='')
Load a proposal from database and its ligne array.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
createFromClone(User $user, $fromid=0)
Load an object from its id and create a new one in database.
initAsSpecimen()
Initialise an instance with random values.
const STATUS_NOTSIGNED
Not signed quote, canceled.
addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='', $array_options=0, $ref_supplier='', $fk_unit='', $origin='', $origin_id=0, $pu_ht_devise=0, $date_start=0, $date_end=0)
Add a proposal line into database (linked to product/service or not) Les parametres sont deja cense e...
const STATUS_DRAFT
Draft status.
liste_array($shortlist=0, $draft=0, $notcurrentuser=0, $socid=0, $limit=0, $offset=0, $sortfield='p.datec', $sortorder='DESC')
Return list of askprice (eventually filtered on user) into an array.
setDeliveryDate($user, $delivery_date)
Set delivery date.
LibStatut($status, $mode=1)
Return label of a status (draft, validated, ...)
__construct($db, $socid="", $supplier_proposalid=0)
Constructor.
updateOrCreatePriceFournisseur($user)
Add or update supplier price according to result of proposal.
load_state_board()
Load indicator this->nb of global stats widget.
reopen($user, $statut, $note='', $notrigger=0)
Reopen the commercial proposal.
const STATUS_VALIDATED
Validated status.
createPriceFournisseur($product, $user)
Create ProductFournisseur.
getLibStatut($mode=0)
Return label of status of proposal (draft, validated, ...)
set_remise_absolue($user, $remise)
Set an absolute overall discount on the proposal.
static replaceThirdparty(DoliDB $db, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
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)
valid($user, $notrigger=0)
Set status to validated.
const STATUS_CLOSE
Billed or closed/processed quote.
getLinesArray()
Retrieve an array of supplier proposal lines.
setDraft($user)
Set draft status.
Class to manage supplier_proposal lines.
fetch($rowid)
Retrieve the propal line object.
insert($notrigger=0)
Insert object line propal in database.
update_total()
Update DB line fields total_xxx Used by migration.
update($notrigger=0)
Update propal line object into DB.
__construct($db)
Class line Contructor.
Class to manage translations.
Class to manage Dolibarr users.
trait CommonIncoterm
Superclass for incoterm classes.
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
print *****$script_file(".$version.") pid c cd cd cd description as p label as s rowid
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0)
Returns text escaped for inclusion in HTML alt or title tags, or into values of HTML input fields.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Fonction qui renvoie si tva doit etre tva percue recuperable.
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.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
isModEnabled($module)
Is Dolibarr module enabled.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
getMarginInfos($pvht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $paht)
Return an array with margins information of a line.
div float
Buy price without taxes.
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.
$conf db
API class for accounts.