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 ($prod->fetch($fk_product) > 0) {
457 $product_type = $prod->type;
458 $label = $prod->label;
459 $fk_prod_fourn_price = $fk_fournprice;
463 $result = $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', ($this->fk_soc ? $this->fk_soc : $this->socid));
465 $pu = $prod->fourn_pu;
466 $ref_supplier = $prod->ref_supplier;
468 if ($remise_percent == 0 && $prod->remise_percent != 0) {
469 $remise_percent = $prod->remise_percent;
473 $langs->load(
"errors");
474 $this->error =
"Ref ".$prod->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 ".$prod->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
484 $this->
db->rollback();
485 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
489 $this->error = $prod->error;
490 $this->errors = $prod->errors;
491 $this->
db->rollback();
492 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
496 $this->error = $prod->error;
497 $this->errors = $prod->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 (!empty($conf->multicurrency->enabled) && $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 (!empty($conf->multicurrency->enabled) && $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)) {
894 $result = self::isExistingObject($this->element, 0, $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_valid =
'';
1157 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/".$conf->global->SUPPLIER_PROPOSAL_ADDON.
'.php';
1158 $obj = $conf->global->SUPPLIER_PROPOSAL_ADDON;
1159 $modSupplierProposal =
new $obj;
1160 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1163 $this->context[
'createfromclone'] =
'createfromclone';
1164 $result = $this->
create($user);
1171 if (is_object($hookmanager)) {
1172 $parameters = array(
'objFrom'=>$objFrom);
1174 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1181 unset($this->context[
'createfromclone']);
1185 $this->
db->commit();
1188 $this->
db->rollback();
1200 public function fetch($rowid, $ref =
'')
1204 $sql =
"SELECT p.rowid, p.entity, p.ref, p.remise, p.remise_percent, p.remise_absolue, p.fk_soc";
1205 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1206 $sql .=
", p.datec";
1207 $sql .=
", p.date_valid as datev";
1208 $sql .=
", p.date_livraison as delivery_date";
1209 $sql .=
", p.model_pdf, p.extraparams";
1210 $sql .=
", p.note_private, p.note_public";
1211 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1212 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1213 $sql .=
", p.fk_cond_reglement";
1214 $sql .=
", p.fk_mode_reglement";
1215 $sql .=
', p.fk_account';
1216 $sql .=
", p.fk_shipping_method";
1217 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1218 $sql .=
", c.label as statut_label";
1219 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1220 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1221 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1222 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1223 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1224 $sql .=
" WHERE p.fk_statut = c.id";
1225 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1227 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1229 $sql .=
" AND p.rowid = ".((int) $rowid);
1232 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1236 $obj = $this->
db->fetch_object(
$resql);
1238 $this->
id = $obj->rowid;
1239 $this->entity = $obj->entity;
1241 $this->
ref = $obj->ref;
1242 $this->remise = $obj->remise;
1243 $this->remise_percent = $obj->remise_percent;
1244 $this->remise_absolue = $obj->remise_absolue;
1245 $this->total_ht = $obj->total_ht;
1246 $this->total_tva = $obj->total_tva;
1247 $this->total_localtax1 = $obj->localtax1;
1248 $this->total_localtax2 = $obj->localtax2;
1249 $this->total_ttc = $obj->total_ttc;
1250 $this->socid = $obj->fk_soc;
1251 $this->fk_project = $obj->fk_project;
1252 $this->model_pdf = $obj->model_pdf;
1253 $this->modelpdf = $obj->model_pdf;
1254 $this->note = $obj->note_private;
1255 $this->note_private = $obj->note_private;
1256 $this->note_public = $obj->note_public;
1257 $this->statut = (int) $obj->fk_statut;
1258 $this->statut_libelle = $obj->statut_label;
1259 $this->datec = $this->db->jdate($obj->datec);
1260 $this->datev = $this->
db->jdate($obj->datev);
1261 $this->date_creation = $this->
db->jdate($obj->datec);
1262 $this->date_validation = $this->
db->jdate($obj->datev);
1263 $this->date_livraison = $this->
db->jdate($obj->delivery_date);
1264 $this->delivery_date = $this->
db->jdate($obj->delivery_date);
1265 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method : null;
1267 $this->mode_reglement_id = $obj->fk_mode_reglement;
1268 $this->mode_reglement_code = $obj->mode_reglement_code;
1269 $this->mode_reglement = $obj->mode_reglement;
1270 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account : null;
1271 $this->cond_reglement_id = $obj->fk_cond_reglement;
1272 $this->cond_reglement_code = $obj->cond_reglement_code;
1273 $this->cond_reglement = $obj->cond_reglement;
1274 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1276 $this->extraparams = (array) json_decode($obj->extraparams,
true);
1278 $this->user_author_id = $obj->fk_user_author;
1279 $this->user_valid_id = $obj->fk_user_valid;
1280 $this->user_close_id = $obj->fk_user_cloture;
1283 $this->fk_multicurrency = $obj->fk_multicurrency;
1284 $this->multicurrency_code = $obj->multicurrency_code;
1285 $this->multicurrency_tx = $obj->multicurrency_tx;
1286 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1287 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1288 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1290 if ($obj->fk_statut == 0) {
1291 $this->brouillon = 1;
1300 $this->lines = array();
1303 $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,";
1304 $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,";
1305 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1306 $sql .=
' d.ref_fourn as ref_produit_fourn,';
1307 $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';
1308 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1309 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1310 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1311 $sql .=
" ORDER by d.rang";
1313 $result = $this->
db->query($sql);
1315 $num = $this->
db->num_rows($result);
1319 $objp = $this->
db->fetch_object($result);
1323 $line->rowid = $objp->rowid;
1324 $line->id = $objp->rowid;
1325 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1326 $line->fk_parent_line = $objp->fk_parent_line;
1327 $line->product_type = $objp->product_type;
1328 $line->label = $objp->custom_label;
1329 $line->desc = $objp->description;
1330 $line->qty = $objp->qty;
1331 $line->tva_tx = $objp->tva_tx;
1332 $line->localtax1_tx = $objp->localtax1_tx;
1333 $line->localtax2_tx = $objp->localtax2_tx;
1334 $line->subprice = $objp->subprice;
1335 $line->fk_remise_except = $objp->fk_remise_except;
1336 $line->remise_percent = $objp->remise_percent;
1338 $line->info_bits = $objp->info_bits;
1339 $line->total_ht = $objp->total_ht;
1340 $line->total_tva = $objp->total_tva;
1341 $line->total_localtax1 = $objp->total_localtax1;
1342 $line->total_localtax2 = $objp->total_localtax2;
1343 $line->total_ttc = $objp->total_ttc;
1344 $line->fk_fournprice = $objp->fk_fournprice;
1345 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1346 $line->pa_ht = $marginInfos[0];
1347 $line->marge_tx = $marginInfos[1];
1348 $line->marque_tx = $marginInfos[2];
1349 $line->special_code = $objp->special_code;
1350 $line->rang = $objp->rang;
1352 $line->fk_product = $objp->fk_product;
1354 $line->ref = $objp->product_ref;
1355 $line->product_ref = $objp->product_ref;
1356 $line->libelle = $objp->product_label;
1357 $line->product_label = $objp->product_label;
1358 $line->product_desc = $objp->product_desc;
1359 $line->fk_product_type = $objp->fk_product_type;
1361 $line->ref_fourn = $objp->ref_produit_fourn;
1364 $line->fk_multicurrency = $objp->fk_multicurrency;
1365 $line->multicurrency_code = $objp->multicurrency_code;
1366 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1367 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1368 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1369 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1370 $line->fk_unit = $objp->fk_unit;
1372 $this->lines[$i] = $line;
1376 $this->
db->free($result);
1378 $this->error = $this->
db->error();
1389 $this->error =
"Record Not Found";
1392 $this->error = $this->
db->error();
1404 public function valid($user, $notrigger = 0)
1406 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1408 global $conf, $langs;
1413 if ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->creer))
1414 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->supplier_proposal->validate_advance))) {
1419 $result = $soc->fetch($this->socid);
1426 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1433 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1434 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1435 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1436 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1438 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1446 if (!$error && !$notrigger) {
1448 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1456 $this->oldref = $this->ref;
1459 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1461 $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).
"'";
1462 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->
db->escape($this->
ref).
"' and entity = ".$conf->entity;
1465 $error++; $this->error = $this->
db->lasterror();
1471 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1472 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1473 if (!$error && file_exists($dirsource)) {
1474 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1475 if (@rename($dirsource, $dirdest)) {
1478 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1479 foreach ($listoffiles as $fileentry) {
1480 $dirsource = $fileentry[
'name'];
1481 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1482 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1483 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1484 @rename($dirsource, $dirdest);
1491 $this->brouillon = 0;
1493 $this->user_valid_id = $user->id;
1494 $this->datev = $now;
1496 $this->
db->commit();
1499 $this->
db->rollback();
1503 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1532 if (!empty($user->rights->supplier_proposal->creer)) {
1533 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1534 $sql .=
" SET date_livraison = ".($delivery_date !=
'' ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1535 $sql .=
" WHERE rowid = ".((int) $this->
id);
1537 if ($this->
db->query($sql)) {
1538 $this->date_livraison = $delivery_date;
1539 $this->delivery_date = $delivery_date;
1542 $this->error = $this->
db->error();
1543 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1561 $remise = trim($remise) ?trim($remise) : 0;
1563 if (!empty($user->rights->supplier_proposal->creer)) {
1566 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal SET remise_percent = ".((
float) $remise);
1567 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1569 if ($this->
db->query($sql)) {
1570 $this->remise_percent = ((
float) $remise);
1574 $this->error = $this->
db->error();
1593 if (empty($remise)) {
1599 if (!empty($user->rights->supplier_proposal->creer)) {
1600 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1601 $sql .=
" SET remise_absolue = ".((float) $remise);
1602 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1604 if ($this->
db->query($sql)) {
1605 $this->remise_absolue = $remise;
1609 $this->error = $this->
db->error();
1629 global $langs, $conf;
1631 $this->statut = $statut;
1634 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1635 $sql .=
" SET fk_statut = ".((int) $this->statut).
",";
1636 if (!empty(
$note)) {
1637 $sql .=
" note_private = '".$this->db->escape(
$note).
"',";
1639 $sql .=
" date_cloture=NULL, fk_user_cloture=NULL";
1640 $sql .=
" WHERE rowid = ".((int) $this->
id);
1644 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1647 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1652 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1662 if (!empty($this->errors)) {
1663 foreach ($this->errors as $errmsg) {
1664 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1665 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1668 $this->
db->rollback();
1671 $this->
db->commit();
1687 global $langs, $conf;
1691 $this->statut = $status;
1697 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1698 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->
db->escape(
$note).
"', date_cloture='".$this->
db->idate($now).
"', fk_user_cloture=".$user->id;
1699 $sql .=
" WHERE rowid = ".((int) $this->
id);
1703 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1704 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1707 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1708 $modelpdf = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL ? $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL : (empty($this->model_pdf) ?
'' : $this->model_pdf);
1710 if (!empty($conf->global->SUPPLIER_PROPOSAL_UPDATE_PRICE_ON_SUPPlIER_PROPOSAL)) {
1715 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1718 if (empty($conf->global->MAIN_DISABLE_PDF_AUTOUPDATE)) {
1720 $outputlangs = $langs;
1721 if (!empty($conf->global->MAIN_MULTILANGS)) {
1722 $outputlangs =
new Translate(
"", $conf);
1723 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1724 $outputlangs->setDefaultLang($newlang);
1727 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1738 $this->
db->commit();
1741 $this->
db->rollback();
1745 $this->error = $this->
db->lasterror();
1746 $this->errors[] = $this->
db->lasterror();
1747 $this->
db->rollback();
1762 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1763 foreach ($this->lines as $product) {
1764 if ($product->subprice <= 0) {
1769 $multicurrency_tx = 1;
1770 $fk_multicurrency = 0;
1772 if (empty($this->thirdparty)) {
1776 $ref_fourn = $product->ref_fourn;
1777 if (empty($ref_fourn)) {
1778 $ref_fourn = $product->ref_supplier;
1780 if (!empty($conf->multicurrency->enabled) && !empty($product->multicurrency_code)) {
1783 $productsupplier->id = $product->fk_product;
1785 $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,
'',
'',
'');
1802 $unitPrice =
price2num($product->subprice,
'MU');
1804 $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);
1808 $this->error = $this->
db->error();
1809 $this->
db->rollback();
1828 $unitPrice =
price2num($product->subprice,
'MU');
1833 "'".$this->
db->idate($now).
"'",
1834 $product->fk_product,
1835 $this->thirdparty->id,
1836 "'".$product->ref_fourn.
"'",
1843 if (!empty($conf->multicurrency->enabled)) {
1844 if (!empty($product->multicurrency_code)) {
1845 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1847 $multicurrency->fetch(0, $product->multicurrency_code);
1848 if (!empty($multicurrency->id)) {
1849 $values[] = $multicurrency->id;
1850 $values[] =
"'".$product->multicurrency_code.
"'";
1851 $values[] = $product->multicurrency_subprice;
1852 $values[] = $product->multicurrency_total_ht;
1853 $values[] = $multicurrency->rate->rate;
1855 for ($i = 0; $i < 5; $i++) {
1862 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1863 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1864 if (!empty($conf->multicurrency->enabled) && !empty($product->multicurrency_code)) {
1865 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1867 $sql .=
') VALUES ('.implode(
',', $values).
')';
1871 $this->error = $this->
db->error();
1872 $this->
db->rollback();
1888 global $conf, $langs;
1892 if ($this->statut == self::STATUS_DRAFT) {
1893 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1897 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1898 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1899 $sql .=
" WHERE rowid = ".((int) $this->
id);
1901 if ($this->
db->query($sql)) {
1903 $this->oldcopy = clone $this;
1908 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1915 $this->statut = self::STATUS_DRAFT;
1916 $this->brouillon = 1;
1917 $this->
db->commit();
1920 $this->
db->rollback();
1943 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
1946 global $conf, $user;
1950 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
1951 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
1952 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
1953 if (empty($user->rights->societe->client->voir) && !$socid) {
1954 $sql .=
", sc.fk_soc, sc.fk_user";
1956 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
1957 if (empty($user->rights->societe->client->voir) && !$socid) {
1958 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
1960 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
1961 $sql .=
" AND p.fk_soc = s.rowid";
1962 $sql .=
" AND p.fk_statut = c.id";
1963 if (empty($user->rights->societe->client->voir) && !$socid) {
1964 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
1967 $sql .=
" AND s.rowid = ".((int) $socid);
1970 $sql .=
" AND p.fk_statut = 0";
1972 if ($notcurrentuser > 0) {
1973 $sql .=
" AND p.fk_user_author <> ".$user->id;
1975 $sql .= $this->
db->order($sortfield, $sortorder);
1976 $sql .= $this->
db->plimit($limit, $offset);
1978 $result = $this->
db->query($sql);
1980 $num = $this->
db->num_rows($result);
1984 $obj = $this->
db->fetch_object($result);
1986 if ($shortlist == 1) {
1987 $ga[$obj->supplier_proposalid] = $obj->ref;
1988 } elseif ($shortlist == 2) {
1989 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
1991 $ga[$i][
'id'] = $obj->supplier_proposalid;
1992 $ga[$i][
'ref'] = $obj->ref;
1993 $ga[$i][
'name'] = $obj->name;
2013 public function delete($user, $notrigger = 0)
2015 global $conf, $langs;
2016 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2024 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2032 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2033 $ef = $main.
"_extrafields";
2034 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2035 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2036 if ($this->
db->query($sql)) {
2037 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2038 if ($this->
db->query($sqlef) && $this->
db->query($sql)) {
2051 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2052 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2053 $file = $dir.
"/".$ref.
".pdf";
2054 if (file_exists($file)) {
2058 $this->error =
'ErrorFailToDeleteFile';
2059 $this->errors = array(
'ErrorFailToDeleteFile');
2060 $this->
db->rollback();
2064 if (file_exists($dir)) {
2067 $this->error =
'ErrorFailToDeleteDir';
2068 $this->errors = array(
'ErrorFailToDeleteDir');
2069 $this->
db->rollback();
2082 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2087 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2088 $this->
db->commit();
2091 $this->error = $this->
db->lasterror();
2092 $this->
db->rollback();
2096 $this->error = $this->
db->lasterror();
2097 $this->
db->rollback();
2101 $this->error = $this->
db->lasterror();
2102 $this->
db->rollback();
2106 $this->
db->rollback();
2119 $sql =
"SELECT c.rowid, ";
2120 $sql .=
" c.datec, c.date_valid as datev, c.date_cloture as dateo,";
2121 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2122 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2123 $sql .=
" WHERE c.rowid = ".((int) $id);
2125 $result = $this->
db->query($sql);
2128 if ($this->
db->num_rows($result)) {
2129 $obj = $this->
db->fetch_object($result);
2131 $this->
id = $obj->rowid;
2133 $this->date_creation = $this->
db->jdate($obj->datec);
2134 $this->date_validation = $this->
db->jdate($obj->datev);
2135 $this->date_cloture = $this->
db->jdate($obj->dateo);
2137 $cuser =
new User($this->
db);
2138 $cuser->fetch($obj->fk_user_author);
2139 $this->user_creation = $cuser;
2141 if ($obj->fk_user_valid) {
2142 $vuser =
new User($this->
db);
2143 $vuser->fetch($obj->fk_user_valid);
2144 $this->user_validation = $vuser;
2147 if ($obj->fk_user_cloture) {
2148 $cluser =
new User($this->
db);
2149 $cluser->fetch($obj->fk_user_cloture);
2150 $this->user_cloture = $cluser;
2153 $this->
db->free($result);
2168 return $this->
LibStatut((isset($this->statut) ? $this->statut : $this->status), $mode);
2184 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2186 $langs->load(
"supplier_proposal");
2187 $this->labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2188 $this->labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2189 $this->labelStatus[self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2190 $this->labelStatus[self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2191 $this->labelStatus[self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2192 $this->labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2193 $this->labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"Opened");
2194 $this->labelStatusShort[self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2195 $this->labelStatusShort[self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2196 $this->labelStatusShort[self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2200 if ($status == self::STATUS_DRAFT) {
2201 $statusnew =
'status0';
2202 } elseif ($status == self::STATUS_VALIDATED) {
2203 $statusnew =
'status1';
2204 } elseif ($status == self::STATUS_SIGNED) {
2205 $statusnew =
'status4';
2206 } elseif ($status == self::STATUS_NOTSIGNED) {
2207 $statusnew =
'status9';
2208 } elseif ($status == self::STATUS_CLOSE) {
2209 $statusnew =
'status6';
2212 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2227 global $conf, $user, $langs;
2231 $this->nbtodo = $this->nbtodolate = 0;
2234 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2235 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2236 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2237 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2238 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2241 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2242 if ($mode ==
'opened') {
2243 $sql .=
" AND p.fk_statut = 1";
2245 if ($mode ==
'signed') {
2246 $sql .=
" AND p.fk_statut = 2";
2249 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2254 $label = $labelShort =
'';
2256 if ($mode ==
'opened') {
2257 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2258 $status = self::STATUS_VALIDATED;
2259 $label = $langs->trans(
"SupplierProposalsToClose");
2260 $labelShort = $langs->trans(
"ToAcceptRefuse");
2262 if ($mode ==
'signed') {
2263 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2264 $status = self::STATUS_SIGNED;
2265 $label = $langs->trans(
"SupplierProposalsToProcess");
2266 $labelShort = $langs->trans(
"ToClose");
2270 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2271 $response->label = $label;
2272 $response->labelShort = $labelShort;
2273 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2277 while ($obj = $this->
db->fetch_object(
$resql)) {
2278 $response->nbtodo++;
2279 if ($mode ==
'opened') {
2280 $datelimit = $this->
db->jdate($obj->datefin);
2281 if ($datelimit < ($now - $delay_warning)) {
2282 $response->nbtodolate++;
2290 $this->error = $this->
db->lasterror();
2305 global $user, $langs, $conf;
2310 $sql =
"SELECT rowid";
2311 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2312 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2313 $sql .= $this->
db->plimit(100);
2317 $num_prods = $this->
db->num_rows(
$resql);
2319 while ($i < $num_prods) {
2321 $row = $this->
db->fetch_row(
$resql);
2322 $prodids[$i] = $row[0];
2328 $this->
ref =
'SPECIMEN';
2329 $this->specimen = 1;
2331 $this->date = time();
2332 $this->cond_reglement_id = 1;
2333 $this->cond_reglement_code =
'RECEP';
2334 $this->mode_reglement_id = 7;
2335 $this->mode_reglement_code =
'CHQ';
2336 $this->note_public =
'This is a comment (public)';
2337 $this->note_private =
'This is a comment (private)';
2341 while ($xnbp < $nbp) {
2343 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2345 $line->subprice = 100;
2346 $line->tva_tx = 19.6;
2347 $line->localtax1_tx = 0;
2348 $line->localtax2_tx = 0;
2350 $line->total_ht = 50;
2351 $line->total_ttc = 59.8;
2352 $line->total_tva = 9.8;
2353 $line->remise_percent = 50;
2355 $line->total_ht = 100;
2356 $line->total_ttc = 119.6;
2357 $line->total_tva = 19.6;
2358 $line->remise_percent = 00;
2361 if ($num_prods > 0) {
2362 $prodid = mt_rand(1, $num_prods);
2363 $line->fk_product = $prodids[$prodid];
2366 $this->lines[$xnbp] = $line;
2368 $this->total_ht += $line->total_ht;
2369 $this->total_tva += $line->total_tva;
2370 $this->total_ttc += $line->total_ttc;
2385 global $conf, $user;
2387 $this->nb = array();
2390 $sql =
"SELECT count(p.rowid) as nb";
2391 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2392 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2393 if (empty($user->rights->societe->client->voir) && !$user->socid) {
2394 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2395 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2398 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2403 while ($obj = $this->
db->fetch_object(
$resql)) {
2404 $this->nb[
"supplier_proposals"] = $obj->nb;
2410 $this->error = $this->
db->lasterror();
2425 global $conf, $db, $langs;
2426 $langs->load(
"supplier_proposal");
2428 if (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON)) {
2431 $file = $conf->global->SUPPLIER_PROPOSAL_ADDON.
".php";
2432 $classname = $conf->global->SUPPLIER_PROPOSAL_ADDON;
2435 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2436 foreach ($dirmodels as $reldir) {
2437 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2440 $mybool |= @include_once $dir.$file;
2448 $obj =
new $classname();
2450 $numref = $obj->getNextValue($soc, $this);
2452 if ($numref !=
"") {
2455 $this->error = $obj->error;
2459 $langs->load(
"errors");
2460 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2476 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2478 global $langs, $conf, $user, $hookmanager;
2480 if (!empty($conf->dol_no_mouse_hover)) {
2487 $label =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2488 if (isset($this->status)) {
2489 $label .=
' '.$this->getLibStatut(5);
2491 if (!empty($this->
ref)) {
2492 $label .=
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2494 if (!empty($this->ref_fourn)) {
2495 $label .=
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2497 if (!empty($this->total_ht)) {
2498 $label .=
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
2500 if (!empty($this->total_tva)) {
2501 $label .=
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
2503 if (!empty($this->total_ttc)) {
2504 $label .=
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
2507 if ($option ==
'') {
2508 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2510 if ($option ==
'document') {
2511 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2514 if ($option !==
'nolink') {
2516 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2517 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2518 $add_save_lastsearch_values = 1;
2520 if ($add_save_lastsearch_values) {
2521 $url .=
'&save_lastsearch_values=1';
2526 if (empty($notooltip) && $user->rights->propal->lire) {
2527 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
2528 $label = $langs->trans(
"ShowSupplierProposal");
2529 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
2531 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
2532 $linkclose .=
' class="classfortooltip"';
2535 $linkstart =
'<a href="'.$url.
'"';
2536 $linkstart .= $linkclose.
'>';
2539 $result .= $linkstart;
2541 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
2543 if ($withpicto != 2) {
2544 $result .= $this->ref;
2546 $result .= $linkend;
2548 if ($addlinktonotes) {
2549 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2552 $result .=
' <span class="note inline-block">';
2553 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2558 $result .=
'</span>';
2562 $hookmanager->initHooks(array($this->element .
'dao'));
2563 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
2564 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2566 $result = $hookmanager->resPrint;
2568 $result .= $hookmanager->resPrint;
2582 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2583 $sql .=
' pt.qty, pt.tva_tx, pt.remise_percent, pt.subprice, pt.info_bits,';
2584 $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,';
2585 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line,';
2586 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2587 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2588 $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';
2589 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2590 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2591 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2592 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2594 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2597 $num = $this->
db->num_rows(
$resql);
2601 $obj = $this->
db->fetch_object(
$resql);
2604 $this->lines[$i]->id = $obj->rowid;
2605 $this->lines[$i]->rowid = $obj->rowid;
2606 $this->lines[$i]->label = $obj->custom_label;
2607 $this->lines[$i]->description = $obj->description;
2608 $this->lines[$i]->fk_product = $obj->fk_product;
2609 $this->lines[$i]->ref = $obj->ref;
2610 $this->lines[$i]->product_label = $obj->product_label;
2611 $this->lines[$i]->product_desc = $obj->product_desc;
2612 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2613 $this->lines[$i]->product_type = $obj->product_type;
2614 $this->lines[$i]->qty = $obj->qty;
2615 $this->lines[$i]->subprice = $obj->subprice;
2616 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2617 $this->lines[$i]->remise_percent = $obj->remise_percent;
2618 $this->lines[$i]->tva_tx = $obj->tva_tx;
2619 $this->lines[$i]->info_bits = $obj->info_bits;
2620 $this->lines[$i]->total_ht = $obj->total_ht;
2621 $this->lines[$i]->total_tva = $obj->total_tva;
2622 $this->lines[$i]->total_ttc = $obj->total_ttc;
2623 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2624 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2625 $this->lines[$i]->pa_ht = $marginInfos[0];
2626 $this->lines[$i]->marge_tx = $marginInfos[1];
2627 $this->lines[$i]->marque_tx = $marginInfos[2];
2628 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2629 $this->lines[$i]->special_code = $obj->special_code;
2630 $this->lines[$i]->rang = $obj->rang;
2632 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2633 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2636 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2637 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2638 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2639 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2640 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2641 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2642 $this->lines[$i]->fk_unit = $obj->fk_unit;
2650 $this->error = $this->
db->error();
2666 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams = null)
2668 global $conf, $langs;
2670 $langs->load(
"supplier_proposal");
2671 $outputlangs->load(
"products");
2676 if ($this->model_pdf) {
2677 $modele = $this->model_pdf;
2678 } elseif (!empty($conf->global->SUPPLIER_PROPOSAL_ADDON_PDF)) {
2679 $modele = $conf->global->SUPPLIER_PROPOSAL_ADDON_PDF;
2683 $modelpath =
"core/modules/supplier_proposal/doc/";
2685 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2717 'supplier_proposaldet'
2743 public $element =
'supplier_proposaldet';
2748 public $table_element =
'supplier_proposaldet';
2760 public $fk_supplier_proposal;
2765 public $fk_parent_line;
2788 public $vat_src_code;
2791 public $remise_percent;
2796 public $fk_remise_except;
2803 public $fk_fournprice;
2809 public $special_code;
2814 public $info_bits = 0;
2836 public $product_ref;
2848 public $product_label;
2854 public $product_desc;
2856 public $localtax1_tx;
2857 public $localtax2_tx;
2858 public $localtax1_type;
2859 public $localtax2_type;
2860 public $total_localtax1;
2861 public $total_localtax2;
2863 public $skip_update_total;
2866 public $ref_supplier;
2872 public $fk_multicurrency;
2874 public $multicurrency_code;
2875 public $multicurrency_subprice;
2876 public $multicurrency_total_ht;
2877 public $multicurrency_total_tva;
2878 public $multicurrency_total_ttc;
2898 $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,';
2899 $sql .=
' pd.date_start, pd.date_end,';
2900 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
2901 $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,';
2902 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
2903 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
2904 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn,';
2905 $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';
2906 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
2907 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
2908 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
2910 $result = $this->
db->query($sql);
2912 $objp = $this->
db->fetch_object($result);
2914 $this->
id = $objp->rowid;
2915 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
2916 $this->fk_parent_line = $objp->fk_parent_line;
2917 $this->label = $objp->custom_label;
2918 $this->desc = $objp->description;
2919 $this->qty = $objp->qty;
2920 $this->subprice = $objp->subprice;
2921 $this->tva_tx = $objp->tva_tx;
2922 $this->remise_percent = $objp->remise_percent;
2923 $this->fk_remise_except = $objp->fk_remise_except;
2924 $this->fk_product = $objp->fk_product;
2925 $this->info_bits = $objp->info_bits;
2926 $this->date_start = $this->
db->jdate($objp->date_start);
2927 $this->date_end = $this->
db->jdate($objp->date_end);
2929 $this->total_ht = $objp->total_ht;
2930 $this->total_tva = $objp->total_tva;
2931 $this->total_ttc = $objp->total_ttc;
2933 $this->fk_fournprice = $objp->fk_fournprice;
2935 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
2936 $this->pa_ht = $marginInfos[0];
2937 $this->marge_tx = $marginInfos[1];
2938 $this->marque_tx = $marginInfos[2];
2940 $this->special_code = $objp->special_code;
2941 $this->product_type = $objp->product_type;
2942 $this->rang = $objp->rang;
2944 $this->
ref = $objp->product_ref;
2945 $this->product_ref = $objp->product_ref;
2946 $this->libelle = $objp->product_label;
2947 $this->product_label = $objp->product_label;
2948 $this->product_desc = $objp->product_desc;
2950 $this->ref_fourn = $objp->ref_produit_fourn;
2953 $this->fk_multicurrency = $objp->fk_multicurrency;
2954 $this->multicurrency_code = $objp->multicurrency_code;
2955 $this->multicurrency_subprice = $objp->multicurrency_subprice;
2956 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
2957 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
2958 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2959 $this->fk_unit = $objp->fk_unit;
2961 $this->
db->free($result);
2977 global $conf, $langs, $user;
2981 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
2984 if (empty($this->tva_tx)) {
2987 if (empty($this->localtax1_tx)) {
2988 $this->localtax1_tx = 0;
2990 if (empty($this->localtax2_tx)) {
2991 $this->localtax2_tx = 0;
2993 if (empty($this->localtax1_type)) {
2994 $this->localtax1_type = 0;
2996 if (empty($this->localtax2_type)) {
2997 $this->localtax2_type = 0;
2999 if (empty($this->total_localtax1)) {
3000 $this->total_localtax1 = 0;
3002 if (empty($this->total_localtax2)) {
3003 $this->total_localtax2 = 0;
3005 if (empty($this->rang)) {
3008 if (empty($this->remise_percent)) {
3009 $this->remise_percent = 0;
3011 if (empty($this->info_bits)) {
3012 $this->info_bits = 0;
3014 if (empty($this->special_code)) {
3015 $this->special_code = 0;
3017 if (empty($this->fk_parent_line)) {
3018 $this->fk_parent_line = 0;
3020 if (empty($this->fk_fournprice)) {
3021 $this->fk_fournprice = 0;
3023 if (empty($this->fk_unit)) {
3026 if (empty($this->subprice)) {
3027 $this->subprice = 0;
3030 if (empty($this->pa_ht)) {
3035 if ($this->pa_ht == 0) {
3036 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3040 $this->pa_ht = $result;
3045 if ($this->product_type < 0) {
3052 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3053 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3054 $sql .=
' date_start, date_end,';
3055 $sql .=
' fk_remise_except, qty, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3056 $sql .=
' subprice, remise_percent, ';
3057 $sql .=
' info_bits, ';
3058 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3059 $sql .=
' ref_fourn,';
3060 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3061 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3062 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->
db->escape($this->fk_parent_line)) :
"null").
",";
3063 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3064 $sql .=
" '".$this->db->escape($this->desc).
"',";
3065 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3066 $sql .=
" '".$this->db->escape($this->product_type).
"',";
3067 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3068 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3069 $sql .=
" ".($this->fk_remise_except ? ((int) $this->
db->escape($this->fk_remise_except)) :
"null").
",";
3070 $sql .=
" ".price2num($this->qty,
'MS').
",";
3071 $sql .=
" ".price2num($this->tva_tx).
",";
3072 $sql .=
" ".price2num($this->localtax1_tx).
",";
3073 $sql .=
" ".price2num($this->localtax2_tx).
",";
3074 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3075 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3076 $sql .=
" ".(!empty($this->subprice) ?
price2num($this->subprice,
'MU') :
"null").
",";
3077 $sql .=
" ".((float) $this->remise_percent).
",";
3078 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3079 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3080 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3081 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3082 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3083 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3084 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3085 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3086 $sql .=
' '.((int) $this->special_code).
',';
3087 $sql .=
' '.((int) $this->rang).
',';
3088 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3089 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3090 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3091 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3092 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3093 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3094 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3095 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3098 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3101 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3110 if (!$error && !$notrigger) {
3112 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3114 $this->
db->rollback();
3120 $this->
db->commit();
3123 $this->error = $this->
db->error().
" sql=".$sql;
3124 $this->
db->rollback();
3134 public function delete()
3136 global $conf, $langs, $user;
3141 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE rowid = ".((int) $this->
id);
3142 dol_syslog(
"SupplierProposalLine::delete", LOG_DEBUG);
3143 if ($this->
db->query($sql)) {
3149 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3154 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3156 $this->
db->rollback();
3161 $this->
db->commit();
3165 $this->error = $this->
db->error().
" sql=".$sql;
3166 $this->
db->rollback();
3179 global $conf, $langs, $user;
3184 if (empty($this->tva_tx)) {
3187 if (empty($this->localtax1_tx)) {
3188 $this->localtax1_tx = 0;
3190 if (empty($this->localtax2_tx)) {
3191 $this->localtax2_tx = 0;
3193 if (empty($this->total_localtax1)) {
3194 $this->total_localtax1 = 0;
3196 if (empty($this->total_localtax2)) {
3197 $this->total_localtax2 = 0;
3199 if (empty($this->localtax1_type)) {
3200 $this->localtax1_type = 0;
3202 if (empty($this->localtax2_type)) {
3203 $this->localtax2_type = 0;
3205 if (empty($this->marque_tx)) {
3206 $this->marque_tx = 0;
3208 if (empty($this->marge_tx)) {
3209 $this->marge_tx = 0;
3211 if (empty($this->remise_percent)) {
3212 $this->remise_percent = 0;
3214 if (empty($this->info_bits)) {
3215 $this->info_bits = 0;
3217 if (empty($this->special_code)) {
3218 $this->special_code = 0;
3220 if (empty($this->fk_parent_line)) {
3221 $this->fk_parent_line = 0;
3223 if (empty($this->fk_fournprice)) {
3224 $this->fk_fournprice = 0;
3226 if (empty($this->fk_unit)) {
3229 if (empty($this->subprice)) {
3230 $this->subprice = 0;
3233 if (empty($this->pa_ht)) {
3238 if ($this->pa_ht == 0) {
3239 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3243 $this->pa_ht = $result;
3250 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3251 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3252 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3253 $sql .=
" , product_type=".((int) $this->product_type);
3254 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3255 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3256 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3257 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3258 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3259 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3260 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3261 $sql .=
" , qty='".price2num($this->qty).
"'";
3262 $sql .=
" , subprice=".price2num($this->subprice).
"";
3263 $sql .=
" , remise_percent=".price2num($this->remise_percent).
"";
3264 $sql .=
" , info_bits='".$this->db->escape($this->info_bits).
"'";
3265 if (empty($this->skip_update_total)) {
3266 $sql .=
" , total_ht=".price2num($this->total_ht).
"";
3267 $sql .=
" , total_tva=".price2num($this->total_tva).
"";
3268 $sql .=
" , total_ttc=".price2num($this->total_ttc).
"";
3269 $sql .=
" , total_localtax1=".price2num($this->total_localtax1).
"";
3270 $sql .=
" , total_localtax2=".price2num($this->total_localtax2).
"";
3272 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape($this->fk_fournprice).
"'" :
"null");
3273 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3274 if (strlen($this->special_code)) {
3275 $sql .=
" , special_code=".((int) $this->special_code);
3277 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3278 if (!empty($this->rang)) {
3279 $sql .=
", rang=".((int) $this->rang);
3281 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3282 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3285 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice).
"";
3286 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht).
"";
3287 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva).
"";
3288 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc).
"";
3290 $sql .=
" WHERE rowid = ".((int) $this->
id);
3292 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3302 if (!$error && !$notrigger) {
3304 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3306 $this->
db->rollback();
3312 $this->
db->commit();
3315 $this->error = $this->
db->error();
3316 $this->
db->rollback();
3334 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3335 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3336 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3337 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3338 $sql .=
" WHERE rowid = ".((int) $this->
id);
3340 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3344 $this->
db->commit();
3347 $this->error = $this->
db->error();
3348 $this->
db->rollback();
GETPOST($paramname, $check= 'alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
fetch($rowid)
Retrieve the propal line object.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto= 'UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
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...
LibStatut($status, $mode=1)
Return label of a status (draft, validated, ...)
const STATUS_NOTSIGNED
Not signed quote, canceled.
getMarginInfos($pvht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $paht)
Return an array with margins information of a line.
setDraft($user)
Set draft status.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
$conf db
API class for accounts.
updatePriceFournisseur($idProductFournPrice, $product, $user)
Upate ProductFournisseur.
updateRangOfLine($rowid, $rang)
Update position of line (rang)
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.
Class to manage products or services.
dol_now($mode= 'auto')
Return date for now.
line_order($renum=false, $rowidorder= 'ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteObjectLinked($sourceid=null, $sourcetype= '', $targetid=null, $targettype= '', $rowid= '', $f_user=null, $notrigger=0)
Delete all links between an object $this.
dol_delete_preview($object)
Delete all preview files linked to object instance.
static commonReplaceProduct(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
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.
Class to manage Dolibarr users.
__construct($db)
Class line Contructor.
Class to manage Dolibarr database access.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
__construct($db, $socid="", $supplier_proposalid=0)
Constructor.
const STATUS_CLOSE
Billed or closed/processed quote.
info($id)
Object SupplierProposal Information.
const TYPE_PRODUCT
Regular product.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Fonction qui renvoie si tva doit etre tva percue recuperable.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
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...
update($notrigger=0)
Update propal line object into DB.
load_state_board()
Load indicator this->nb of global stats widget.
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, from a $thirdparty_buyer to a $thirdparty_seller Note: This function applies same rules than get_default_tva.
reopen($user, $statut, $note= '', $notrigger=0)
Reopen the commercial proposal.
create($user, $notrigger=0)
Create commercial proposal into database this->ref can be set or empty.
getNomUrl($withpicto=0, $option= '', $get_params= '', $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0)
Return clicable link of object (with eventually picto)
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...
static replaceThirdparty(DoliDB $db, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
insertExtraFields($trigger= '', $userused=null)
Add/Update all extra fields values for the current object.
getLinesArray()
Retrieve an array of supplier proposal lines.
static getIdAndTxFromCode($dbs, $code, $date_document= '')
Get id and rate of currency from code.
const STATUS_SIGNED
Signed quote.
insert($notrigger=0)
Insert object line propal in database.
Class to manage third parties objects (customers, suppliers, prospects...)
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
dol_strlen($string, $stringencoding= 'UTF-8')
Make a strlen call.
createFromClone(User $user, $fromid=0)
Load an object from its id and create a new one in database.
update_total()
Update DB line fields total_xxx Used by migration.
price2num($amount, $rounding= '', $option=0)
Function that return a number with universal decimal format (decimal separator is '...
createPriceFournisseur($product, $user)
Create ProductFournisseur.
add_product($idproduct, $qty, $remise_percent=0)
Add line into array ->lines.
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) ...
const STATUS_VALIDATED
Validated status.
deleteEcmFiles($mode=0)
Delete related files of object in database.
insert_discount($idremise)
Adding line of fixed discount in the proposal in DB.
static commonReplaceThirdparty(DoliDB $db, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
img_picto($titlealt, $picto, $moreatt= '', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt= '', $morecss= '', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename= '', $restricttologhandler= '', $logcontext=null)
Write log message into outputs.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
valid($user, $notrigger=0)
Set status to validated.
img_object($titlealt, $picto, $moreatt= '', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
deleteExtraFields()
Delete all extra fields values for the current object.
Class to manage translations.
dol_sanitizeFileName($str, $newstr= '_', $unaccent=1)
Clean a string to use it as a file name.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0)
Scan a directory and return a list of files/directories.
set_remise_absolue($user, $remise)
Set an absolute overall discount on the proposal.
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...
set_date_livraison($user, $delivery_date)
Set delivery date.
defineBuyPrice($unitPrice=0.0, $discountPercent=0.0, $fk_product=0)
Get buy price to use for margin calculation.
Class to manage supplier_proposal lines.
if(isModEnabled('facture')&&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur')&&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD)&&$user->rights->fournisseur->facture->lire)||(isModEnabled('supplier_invoice')&&$user->rights->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->rights->commande->lire &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
trait CommonIncoterm
Superclass for incoterm classes.
div float
Buy price without taxes.
setDeliveryDate($user, $delivery_date)
Set delivery date.
call_trigger($triggerName, $user)
Call trigger based on this instance.
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add objects linked in llx_element_element.
const STATUS_DRAFT
Draft status.
getLibStatut($mode=0)
Return label of status of proposal (draft, validated, ...)
Class to manage price ask supplier.
dol_print_error($db= '', $error= '', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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...
Class to manage absolute discounts.
initAsSpecimen()
Initialise an instance with random values.
dolGetStatus($statusLabel= '', $statusLabelShort= '', $html= '', $statusType= 'status0', $displayMode=0, $url= '', $params=array())
Output the badge of a status.
cloture($user, $status, $note)
Close the askprice.
updateOrCreatePriceFournisseur($user)
Add or update supplier price according to result of proposal.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
getNextNumRef($soc)
Returns the reference to the following non used Proposal used depending on the active numbering modul...
deleteline($lineid)
Delete detail line.
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)...
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.
fetch($rowid, $ref= '')
Load a proposal from database and its ligne array.
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.
Parent class of all other business classes (invoices, contracts, proposals, orders, ...)
Class to manage predefined suppliers products.
set_remise_percent($user, $remise)
Set an overall discount on the proposal.
print *****$script_file(".$version.") pid c cd cd cd description as p label as s rowid