40require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
45require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
58 public $element =
'supplier_proposal';
63 public $table_element =
'supplier_proposal';
68 public $table_element_line =
'supplier_proposaldet';
73 public $class_element_line =
'SupplierProposalLine';
77 public $fk_element =
'fk_supplier_proposal';
82 public $picto =
'supplier_proposal';
88 public $restrictiononfksoc = 1;
114 public $ref_supplier;
130 public $delivery_date;
149 public $user_author_id;
175 public $cond_reglement_code;
179 public $cond_reglement_doc;
184 public $mode_reglement_code;
189 public $mode_reglement;
196 public $deposit_percent;
202 public $extraparams = array();
207 public $lines = array();
214 public $labelStatus = array();
215 public $labelStatusShort = array();
230 public $fk_multicurrency;
235 public $multicurrency_code;
239 public $multicurrency_tx;
243 public $multicurrency_total_ht;
247 public $multicurrency_total_tva;
251 public $multicurrency_total_ttc;
253 public $fields = array(
254 'ref' => array(
'type' =>
'varchar(255)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => 1,
'showoncombobox' => 1,
'position' => 25,
'searchall' => 1),
255 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 750,
'searchall' => 1),
292 public function __construct($db, $socid = 0, $supplier_proposalid = 0)
296 $this->ismultientitymanaged = 1;
297 $this->socid = $socid;
298 $this->
id = $supplier_proposalid;
313 public function add_product($idproduct, $qty, $remise_percent = 0)
322 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
323 if ($idproduct > 0) {
324 $prod =
new Product($this->db);
325 $prod->fetch($idproduct);
327 $productdesc = $prod->description;
331 if (empty($tva_tx)) {
339 $price = $prod->multiprices[$this->thirdparty->price_level];
341 $price = $prod->price;
346 $line->fk_product = $idproduct;
347 $line->desc = $productdesc;
349 $line->subprice = $price;
350 $line->remise_percent = $remise_percent;
351 $line->tva_tx = $tva_tx;
353 $this->lines[] = $line;
371 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
372 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
377 $result = $remise->fetch($idremise);
380 if ($remise->fk_facture) {
381 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
382 $this->db->rollback();
387 $supplier_proposalligne->fk_supplier_proposal = $this->id;
388 $supplier_proposalligne->fk_remise_except = $remise->id;
389 $supplier_proposalligne->desc = $remise->description;
390 $supplier_proposalligne->tva_tx = $remise->tva_tx;
391 $supplier_proposalligne->subprice = -(float) $remise->amount_ht;
392 $supplier_proposalligne->fk_product = 0;
393 $supplier_proposalligne->qty = 1;
394 $supplier_proposalligne->remise_percent = 0;
395 $supplier_proposalligne->rang = -1;
396 $supplier_proposalligne->info_bits = 2;
398 $supplier_proposalligne->total_ht = -(float) $remise->amount_ht;
399 $supplier_proposalligne->total_tva = -(float) $remise->amount_tva;
400 $supplier_proposalligne->total_ttc = -(float) $remise->amount_ttc;
402 $result = $supplier_proposalligne->insert();
409 $this->db->rollback();
414 $this->db->rollback();
418 $this->db->rollback();
460 public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $price_base_type =
'HT', $pu_ttc = 0, $info_bits = 0, $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice = 0, $pa_ht = 0, $label =
'', $array_options = [], $ref_supplier =
'', $fk_unit = 0, $origin =
'', $origin_id = 0, $pu_ht_devise = 0, $date_start = 0, $date_end = 0)
464 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");
465 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
468 if (empty($remise_percent)) {
474 if (empty($info_bits)) {
480 if (empty($fk_parent_line) || $fk_parent_line < 0) {
487 $remise_percent =
price2num($remise_percent);
491 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
497 if ($price_base_type ==
'HT') {
508 if ($this->
status == self::STATUS_DRAFT) {
511 if ($fk_product > 0) {
512 if (
getDolGlobalInt(
'SUPPLIER_PROPOSAL_WITH_PREDEFINED_PRICES_ONLY') == 1) {
514 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_fournprice=".$fk_fournprice.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
516 if ($productsupplier->fetch($fk_product) > 0) {
517 $product_type = $productsupplier->type;
518 $label = $productsupplier->label;
519 $fk_prod_fourn_price = $fk_fournprice;
524 $result = $productsupplier->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', $this->socid);
526 $pu = $productsupplier->fourn_pu;
527 $ref_supplier = $productsupplier->ref_supplier;
529 if ($remise_percent == 0 && $productsupplier->remise_percent != 0) {
530 $remise_percent = $productsupplier->remise_percent;
534 $langs->load(
"errors");
535 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
536 $this->db->rollback();
537 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
543 $langs->load(
"errors");
544 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
545 $this->db->rollback();
546 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
551 $this->db->rollback();
552 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
557 $this->db->rollback();
562 $product_type = $type;
575 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
576 $vat_src_code = $reg[1];
577 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
580 if (
isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
587 (
float) $remise_percent,
589 (
float) $txlocaltax1,
590 (
float) $txlocaltax2,
598 (
float) $this->multicurrency_tx,
601 $total_ht = $tabprice[0];
602 $total_tva = $tabprice[1];
603 $total_ttc = $tabprice[2];
604 $total_localtax1 = $tabprice[9];
605 $total_localtax2 = $tabprice[10];
606 $pu = $pu_ht = $tabprice[3];
609 $multicurrency_total_ht = $tabprice[16];
610 $multicurrency_total_tva = $tabprice[17];
611 $multicurrency_total_ttc = $tabprice[18];
612 $pu_ht_devise = $tabprice[19];
616 if ($ranktouse == -1) {
617 $rangmax = $this->
line_max($fk_parent_line);
618 $ranktouse = $rangmax + 1;
624 $this->line->fk_supplier_proposal = $this->id;
625 $this->line->label = $label;
626 $this->line->desc = $desc;
627 $this->line->qty = $qty;
629 $this->line->vat_src_code = $vat_src_code;
630 $this->line->tva_tx = $txtva;
631 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
632 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
633 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
634 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
635 $this->line->fk_product = $fk_product;
636 $this->line->remise_percent = $remise_percent;
637 $this->line->subprice = (float) $pu_ht;
638 $this->line->rang = $ranktouse;
639 $this->line->info_bits = $info_bits;
640 $this->line->total_ht = (float) $total_ht;
641 $this->line->total_tva = (float) $total_tva;
642 $this->line->total_localtax1 = (float) $total_localtax1;
643 $this->line->total_localtax2 = (float) $total_localtax2;
644 $this->line->total_ttc = (float) $total_ttc;
645 $this->line->product_type = $type;
646 $this->line->special_code = $special_code;
647 $this->line->fk_parent_line = $fk_parent_line;
648 $this->line->fk_unit = $fk_unit;
649 $this->line->origin = $origin;
650 $this->line->origin_type = $origin;
651 $this->line->origin_id = $origin_id;
652 $this->line->ref_fourn = $this->db->escape($ref_supplier);
653 $this->line->date_start = $date_start;
654 $this->line->date_end = $date_end;
657 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
659 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
661 $productFournisseur->find_min_price_product_fournisseur($fk_product);
662 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
664 $this->line->fk_fournprice = ($fk_fournprice > 0 ? $fk_fournprice : 0);
666 $this->line->pa_ht = $pa_ht;
670 $this->line->fk_multicurrency = $this->fk_multicurrency;
671 $this->line->multicurrency_code = $this->multicurrency_code;
672 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
673 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
674 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
675 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
678 if (empty($qty) && empty($special_code)) {
679 $this->line->special_code = 3;
682 if (is_array($array_options) && count($array_options) > 0) {
683 $this->line->array_options = $array_options;
686 $result = $this->line->insert();
689 if (!empty($fk_parent_line)) {
691 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
692 $linecount = count($this->lines);
693 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
699 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
702 return $this->line->id;
704 $this->db->rollback();
709 $this->db->rollback();
713 $this->error =
'BadStatusOfObjectToAddLine';
745 public function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $desc =
'', $price_base_type =
'HT', $info_bits = 0, $special_code = 0, $fk_parent_line = 0, $skip_update_total = 0, $fk_fournprice = 0, $pa_ht = 0, $label =
'', $type = 0, $array_options = [], $ref_supplier =
'', $fk_unit = 0, $pu_ht_devise = 0)
750 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
754 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
755 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
758 $remise_percent =
price2num($remise_percent);
761 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
767 if (empty($qty) && empty($special_code)) {
770 if (!empty($qty) && $special_code == 3) {
787 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
788 $vat_src_code = $reg[1];
789 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
792 if (
isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
799 (
float) $remise_percent,
801 (
float) $txlocaltax1,
802 (
float) $txlocaltax2,
810 (
float) $this->multicurrency_tx,
813 $total_ht = $tabprice[0];
814 $total_tva = $tabprice[1];
815 $total_ttc = $tabprice[2];
816 $total_localtax1 = $tabprice[9];
817 $total_localtax2 = $tabprice[10];
818 $pu_ht = $tabprice[3];
819 $pu_tva = $tabprice[4];
820 $pu_ttc = $tabprice[5];
823 $multicurrency_total_ht = $tabprice[16];
824 $multicurrency_total_tva = $tabprice[17];
825 $multicurrency_total_ttc = $tabprice[18];
826 $pu_ht_devise = $tabprice[19];
829 if ($price_base_type ==
'TTC') {
835 $line->fetch($rowid);
836 $line->fetch_optionals();
838 $fk_product = $line->fk_product;
841 $staticline = clone $line;
843 $line->oldline = $staticline;
845 $this->line->context = $this->context;
848 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
849 $rangmax = $this->
line_max($fk_parent_line);
850 $this->line->rang = $rangmax + 1;
853 $this->line->id = $rowid;
854 $this->line->label = $label;
855 $this->line->desc = $desc;
856 $this->line->qty = $qty;
857 $this->line->product_type = $type;
859 $this->line->vat_src_code = $vat_src_code;
860 $this->line->tva_tx = $txtva;
861 $this->line->localtax1_tx = $txlocaltax1;
862 $this->line->localtax2_tx = $txlocaltax2;
863 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
864 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
865 $this->line->remise_percent = $remise_percent;
866 $this->line->subprice = (float) $pu;
867 $this->line->info_bits = $info_bits;
868 $this->line->total_ht = (float) $total_ht;
869 $this->line->total_tva = (float) $total_tva;
870 $this->line->total_localtax1 = (float) $total_localtax1;
871 $this->line->total_localtax2 = (float) $total_localtax2;
872 $this->line->total_ttc = (float) $total_ttc;
873 $this->line->special_code = $special_code;
874 $this->line->fk_parent_line = $fk_parent_line;
875 $this->line->skip_update_total = $skip_update_total;
876 $this->line->ref_fourn = $ref_supplier;
877 $this->line->fk_unit = $fk_unit;
880 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
882 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
884 $productFournisseur->find_min_price_product_fournisseur($fk_product);
885 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
887 $this->line->fk_fournprice = $fk_fournprice;
889 $this->line->pa_ht = $pa_ht;
891 if (is_array($array_options) && count($array_options) > 0) {
893 foreach ($array_options as $key => $value) {
894 $this->line->array_options[$key] = $array_options[$key];
899 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
900 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
901 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
902 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
904 $result = $this->line->update();
907 if (!empty($fk_parent_line)) {
916 $this->error = $this->db->error();
917 $this->db->rollback();
921 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
941 $line->fetch($lineid);
943 if ($this->
id > 0 && (
int) $line->fk_supplier_proposal !== (
int) $this->id) {
944 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
948 if ($line->delete($user) > 0) {
969 public function create($user, $notrigger = 0)
971 global $langs, $conf,
$mysoc, $hookmanager;
981 $this->error =
"Failed to fetch company";
982 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
985 if (!empty($this->
ref)) {
988 $this->error =
'ErrorRefAlreadyExists';
989 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
990 $this->db->rollback();
996 $delivery_date = $this->delivery_date;
999 if (!empty($this->multicurrency_code)) {
1002 if (empty($this->fk_multicurrency)) {
1004 $this->fk_multicurrency = 0;
1005 $this->multicurrency_tx = 1;
1011 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"supplier_proposal (";
1014 $sql .=
", total_tva";
1015 $sql .=
", total_ttc";
1018 $sql .=
", fk_user_author";
1019 $sql .=
", note_private";
1020 $sql .=
", note_public";
1021 $sql .=
", model_pdf";
1022 $sql .=
", fk_cond_reglement";
1023 $sql .=
", deposit_percent";
1024 $sql .=
", fk_mode_reglement";
1025 $sql .=
", fk_account";
1026 $sql .=
", date_livraison";
1027 $sql .=
", fk_shipping_method";
1028 $sql .=
", fk_projet";
1030 $sql .=
", fk_multicurrency";
1031 $sql .=
", multicurrency_code";
1032 $sql .=
", multicurrency_tx";
1034 $sql .=
" VALUES (";
1035 $sql .= ((int) $this->socid);
1039 $sql .=
", '".$this->db->idate($now).
"'";
1040 $sql .=
", '(PROV)'";
1041 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
1042 $sql .=
", '".$this->db->escape($this->note_private).
"'";
1043 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1044 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1045 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
1046 $sql .=
", ".(!empty($this->deposit_percent) ?
"'" . $this->db->escape($this->deposit_percent) .
"'" :
'NULL');
1047 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
1048 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1049 $sql .=
", ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1050 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1051 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
1052 $sql .=
", ".((int) $conf->entity);
1053 $sql .=
", ".((int) $this->fk_multicurrency);
1054 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1055 $sql .=
", ".((float) $this->multicurrency_tx);
1058 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1059 $resql = $this->db->query($sql);
1061 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
1064 $this->
ref =
'(PROV'.$this->id.
')';
1065 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
1067 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1068 $resql = $this->db->query($sql);
1073 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1074 $this->linked_objects = $this->linkedObjectsIds;
1078 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1079 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1080 if (is_array($tmp_origin_id)) {
1081 foreach ($tmp_origin_id as $origin_id) {
1096 $fk_parent_line = 0;
1097 $num = count($this->lines);
1099 for ($i = 0; $i < $num; $i++) {
1101 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1102 $fk_parent_line = 0;
1106 $this->lines[$i]->desc,
1107 $this->lines[$i]->subprice,
1108 $this->lines[$i]->qty,
1109 $this->lines[$i]->tva_tx,
1110 $this->lines[$i]->localtax1_tx,
1111 $this->lines[$i]->localtax2_tx,
1112 $this->lines[$i]->fk_product,
1113 $this->lines[$i]->remise_percent,
1117 $this->lines[$i]->product_type,
1118 $this->lines[$i]->rang,
1119 $this->lines[$i]->special_code,
1121 $this->lines[$i]->fk_fournprice,
1122 $this->lines[$i]->pa_ht,
1123 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1124 $this->lines[$i]->array_options,
1125 $this->lines[$i]->ref_fourn,
1126 $this->lines[$i]->fk_unit,
1127 'supplier_proposal',
1128 $this->lines[$i]->rowid
1133 $this->error = $this->db->error;
1138 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1139 $fk_parent_line = $result;
1158 if (!$error && !$notrigger) {
1160 $result = $this->call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1167 $this->error = $this->db->lasterror();
1172 $this->error = $this->db->lasterror();
1177 $this->db->commit();
1178 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1181 $this->db->rollback();
1185 $this->error = $this->db->lasterror();
1186 $this->db->rollback();
1200 global $conf, $hookmanager;
1208 foreach ($this->lines as $line) {
1209 $line->fetch_optionals();
1213 $objFrom = clone $this;
1215 $objsoc =
new Societe($this->db);
1218 if (!empty($fromid) && $fromid != $this->socid) {
1219 if ($objsoc->fetch($fromid) > 0) {
1220 $this->socid = $objsoc->id;
1221 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1222 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent : 0);
1223 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1224 unset($this->fk_project);
1229 $objsoc->fetch($this->socid);
1236 if (!
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON') || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
".php")) {
1237 $this->error =
'ErrorSetupNotComplete';
1242 $this->user_author_id = $user->id;
1243 $this->user_validation_id = 0;
1247 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
'.php';
1249 $modSupplierProposal =
new $obj();
1250 '@phan-var-force ModeleNumRefSupplierProposal $modSupplierProposal';
1251 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1254 $this->context[
'createfromclone'] =
'createfromclone';
1255 $result = $this->
create($user);
1262 if (is_object($hookmanager)) {
1263 $parameters = array(
'objFrom' => $objFrom);
1265 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1273 unset($this->context[
'createfromclone']);
1277 $this->db->commit();
1280 $this->db->rollback();
1292 public function fetch($rowid, $ref =
'')
1294 $sql =
"SELECT p.rowid, p.entity, p.ref, p.fk_soc as socid";
1295 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1296 $sql .=
", p.datec, GREATEST(p.tms, COALESCE(pef.tms, p.tms)) as date_modification";
1297 $sql .=
", p.date_valid as datev";
1298 $sql .=
", p.date_livraison as delivery_date";
1299 $sql .=
", p.model_pdf, p.extraparams";
1300 $sql .=
", p.note_private, p.note_public";
1301 $sql .=
", p.fk_projet as fk_project, p.fk_statut as status";
1302 $sql .=
", p.fk_user_author, p.fk_user_modif, p.fk_user_valid, p.fk_user_cloture";
1303 $sql .=
", p.fk_cond_reglement";
1304 $sql .=
", p.fk_mode_reglement";
1305 $sql .=
', p.fk_account';
1306 $sql .=
", p.fk_shipping_method";
1307 $sql .=
", p.last_main_doc";
1308 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1309 $sql .=
", c.label as statut_label";
1310 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc, p.deposit_percent";
1311 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1312 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1313 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"supplier_proposal_extrafields as pef ON pef.fk_object=p.rowid";
1314 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1315 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1316 $sql .=
" WHERE p.fk_statut = c.id";
1317 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1319 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1321 $sql .=
" AND p.rowid = ".((int) $rowid);
1324 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1325 $resql = $this->db->query($sql);
1327 if ($this->db->num_rows($resql)) {
1328 $obj = $this->db->fetch_object($resql);
1330 $this->
id = $obj->rowid;
1331 $this->entity = $obj->entity;
1333 $this->
ref = $obj->ref;
1334 $this->total_ht = $obj->total_ht;
1335 $this->total_tva = $obj->total_tva;
1336 $this->total_localtax1 = $obj->localtax1;
1337 $this->total_localtax2 = $obj->localtax2;
1338 $this->total_ttc = $obj->total_ttc;
1339 $this->socid = $obj->socid;
1340 $this->fk_project = $obj->fk_project;
1341 $this->model_pdf = $obj->model_pdf;
1342 $this->note = $obj->note_private;
1343 $this->note_private = $obj->note_private;
1344 $this->note_public = $obj->note_public;
1345 $this->statut = (int) $obj->status;
1346 $this->
status = (int) $obj->status;
1347 $this->datec = $this->db->jdate($obj->datec);
1348 $this->datev = $this->db->jdate($obj->datev);
1349 $this->date_creation = $this->db->jdate($obj->datec);
1350 $this->date_modification = $this->db->jdate($obj->date_modification);
1351 $this->
date = $this->date_creation;
1352 $this->date_validation = $this->db->jdate($obj->datev);
1353 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1354 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1356 $this->last_main_doc = $obj->last_main_doc;
1357 $this->mode_reglement_id = $obj->fk_mode_reglement;
1358 $this->mode_reglement_code = $obj->mode_reglement_code;
1359 $this->mode_reglement = $obj->mode_reglement;
1360 $this->deposit_percent = $obj->deposit_percent;
1361 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1362 $this->cond_reglement_id = $obj->fk_cond_reglement;
1363 $this->cond_reglement_code = $obj->cond_reglement_code;
1364 $this->cond_reglement = $obj->cond_reglement;
1365 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1367 $this->extraparams = (array) (!empty($obj->extraparams) ? json_decode($obj->extraparams,
true) : array());
1369 $this->user_author_id = $obj->fk_user_author;
1370 $this->user_modification_id = $obj->fk_user_modif;
1371 $this->user_validation_id = $obj->fk_user_valid;
1372 $this->user_closing_id = $obj->fk_user_cloture;
1375 $this->fk_multicurrency = $obj->fk_multicurrency;
1376 $this->multicurrency_code = $obj->multicurrency_code;
1377 $this->multicurrency_tx = $obj->multicurrency_tx;
1378 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1379 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1380 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1382 $this->db->free($resql);
1388 $this->lines = array();
1391 $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,";
1392 $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,";
1393 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1394 $sql .=
' d.ref_fourn as ref_produit_fourn, d.extraparams,';
1395 $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';
1396 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1397 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1398 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1399 $sql .=
" ORDER by d.rang";
1401 $result = $this->db->query($sql);
1403 $num = $this->db->num_rows($result);
1407 $objp = $this->db->fetch_object($result);
1411 $line->rowid = $objp->rowid;
1412 $line->id = $objp->rowid;
1413 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1414 $line->fk_parent_line = $objp->fk_parent_line;
1415 $line->product_type = $objp->product_type;
1416 $line->label = $objp->custom_label;
1417 $line->desc = $objp->description;
1418 $line->qty = $objp->qty;
1419 $line->tva_tx = $objp->tva_tx;
1420 $line->localtax1_tx = $objp->localtax1_tx;
1421 $line->localtax2_tx = $objp->localtax2_tx;
1422 $line->subprice = $objp->subprice;
1423 $line->fk_remise_except = $objp->fk_remise_except;
1424 $line->remise_percent = $objp->remise_percent;
1426 $line->info_bits = $objp->info_bits;
1427 $line->total_ht = $objp->total_ht;
1428 $line->total_tva = $objp->total_tva;
1429 $line->total_localtax1 = $objp->total_localtax1;
1430 $line->total_localtax2 = $objp->total_localtax2;
1431 $line->total_ttc = $objp->total_ttc;
1432 $line->fk_fournprice = $objp->fk_fournprice;
1433 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1434 $line->pa_ht = $marginInfos[0];
1435 $line->marge_tx = $marginInfos[1];
1436 $line->marque_tx = $marginInfos[2];
1437 $line->special_code = $objp->special_code;
1438 $line->rang = $objp->rang;
1440 $line->fk_product = $objp->fk_product;
1442 $line->ref = $objp->product_ref;
1443 $line->product_ref = $objp->product_ref;
1444 $line->libelle = $objp->product_label;
1445 $line->product_label = $objp->product_label;
1446 $line->product_desc = $objp->product_desc;
1447 $line->fk_product_type = $objp->fk_product_type;
1449 $line->ref_fourn = $objp->ref_produit_fourn;
1451 $line->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
1454 $line->fk_multicurrency = $objp->fk_multicurrency;
1455 $line->multicurrency_code = $objp->multicurrency_code;
1456 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1457 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1458 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1459 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1460 $line->fk_unit = $objp->fk_unit;
1462 $line->fetch_optionals();
1464 $this->lines[$i] = $line;
1468 $this->db->free($result);
1470 $this->error = $this->db->error();
1477 $this->error =
"Record Not Found";
1480 $this->error = $this->db->error();
1492 public function valid($user, $notrigger = 0)
1494 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1496 global $conf, $langs;
1501 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'creer'))
1502 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'validate_advance'))) {
1506 $soc =
new Societe($this->db);
1507 $result = $soc->fetch($this->socid);
1513 dol_syslog(get_class($this).
"::valid checkActiveProductInLines ".$this->error, LOG_INFO);
1517 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1518 $num = $this->getNextNumRef($soc);
1520 $num = (string) $this->
ref;
1524 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1525 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1526 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1527 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1529 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1530 $resql = $this->db->query($sql);
1537 if (!$error && !$notrigger) {
1539 $result = $this->call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1547 $this->oldref = $this->ref;
1550 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1552 $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).
"'";
1553 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1554 $resql = $this->db->query($sql);
1557 $this->error = $this->db->lasterror();
1559 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'supplier_proposal/".$this->db->escape($this->newref).
"'";
1560 $sql .=
" WHERE filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1561 $resql = $this->db->query($sql);
1564 $this->error = $this->db->lasterror();
1570 $dirsource = $conf->supplier_proposal->dir_output.
'/'.$oldref;
1571 $dirdest = $conf->supplier_proposal->dir_output.
'/'.$newref;
1572 if (!$error && file_exists($dirsource)) {
1573 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1574 if (@rename($dirsource, $dirdest)) {
1577 $listoffiles =
dol_dir_list($conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1578 foreach ($listoffiles as $fileentry) {
1579 $dirsource = $fileentry[
'name'];
1580 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1581 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1582 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1583 @rename($dirsource, $dirdest);
1592 $this->user_validation_id = $user->id;
1593 $this->datev = $now;
1594 $this->date_validation = $now;
1597 $result = $this->
add_contact($user->id,
'SALESREPFOLL',
'internal', 1);
1598 if ($result < 0 && $result != -2) {
1603 $this->db->commit();
1606 $this->db->rollback();
1610 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1639 if ($user->hasRight(
'supplier_proposal',
'creer')) {
1640 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1641 $sql .=
" SET date_livraison = ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1642 $sql .=
" WHERE rowid = ".((int) $this->
id);
1644 if ($this->db->query($sql)) {
1645 $this->delivery_date = $delivery_date;
1648 $this->error = $this->db->error();
1649 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1735 public function reopen($user, $status, $note =
'', $notrigger = 0)
1737 global $langs, $conf;
1741 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1742 $sql .=
" SET fk_statut = ".((int) $status).
",";
1743 if (!empty($note)) {
1744 $sql .=
" note_private = '".$this->db->escape($note).
"',";
1746 $sql .=
" date_cloture = NULL, fk_user_cloture = NULL";
1747 $sql .=
" WHERE rowid = ".((int) $this->
id);
1751 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1752 $resql = $this->db->query($sql);
1755 $this->errors[] =
"Error ".$this->db->lasterror();
1760 $result = $this->call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1770 if (!empty($this->errors)) {
1771 foreach ($this->errors as $errmsg) {
1772 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1773 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1776 $this->db->rollback();
1779 $this->statut = $status;
1782 $this->db->commit();
1798 global $langs, $conf;
1808 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1809 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape($note).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".((int) $user->id);
1810 $sql .=
" WHERE rowid = ".((int) $this->
id);
1812 $resql = $this->db->query($sql);
1814 $this->statut = $status;
1817 $modelpdf =
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED', (empty($this->model_pdf) ?
'' : $this->model_pdf));
1818 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1821 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1822 $modelpdf =
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL', (empty($this->model_pdf) ?
'' : $this->model_pdf));
1829 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1834 $outputlangs = $langs;
1836 $outputlangs =
new Translate(
"", $conf);
1837 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1838 $outputlangs->setDefaultLang($newlang);
1841 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1845 $result = $this->call_trigger($triggerName, $user);
1852 $this->db->commit();
1855 $this->db->rollback();
1859 $this->error = $this->db->lasterror();
1860 $this->errors[] = $this->db->lasterror();
1861 $this->db->rollback();
1876 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1877 foreach ($this->lines as $product) {
1878 if ($product->subprice <= 0) {
1883 $multicurrency_tx = 1;
1884 $fk_multicurrency = 0;
1886 if (empty($this->thirdparty)) {
1890 $ref_fourn = $product->ref_fourn;
1891 if (empty($ref_fourn)) {
1892 $ref_fourn = $product->ref_supplier;
1894 if (
isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1897 $productsupplier->id = $product->fk_product;
1899 $productsupplier->update_buyprice($product->qty, $product->total_ht, $user,
'HT', $this->thirdparty, 0, $ref_fourn, $product->tva_tx, 0, 0, 0, $product->info_bits, 0,
'', array(),
'', $product->multicurrency_total_ht,
'HT', $multicurrency_tx, $product->multicurrency_code,
'',
'', 0);
1915 $price =
price2num($product->subprice * $product->qty,
'MU');
1916 $unitPrice =
price2num($product->subprice,
'MU');
1918 $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);
1920 $resql = $this->db->query($sql);
1922 $this->error = $this->db->error();
1923 $this->db->rollback();
1940 $price =
price2num($product->subprice * $product->qty,
'MU');
1942 $unitPrice =
price2num($product->subprice,
'MU');
1947 "'".$this->db->idate($now).
"'",
1948 (
int) $product->fk_product,
1949 (
int) $this->thirdparty->id,
1950 "'".$this->db->escape($product->ref_fourn).
"'",
1954 (
float) $product->tva_tx,
1958 if (!empty($product->multicurrency_code)) {
1959 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1961 $multicurrency->fetch(0, $product->multicurrency_code);
1962 if (!empty($multicurrency->id)) {
1963 $values[] = (int) $multicurrency->id;
1964 $values[] =
"'".$this->db->escape($product->multicurrency_code).
"'";
1965 $values[] = (float) $product->multicurrency_subprice;
1966 $values[] = (float) $product->multicurrency_total_ht;
1967 $values[] = (float) $multicurrency->rate->rate;
1969 for ($i = 0; $i < 5; $i++) {
1976 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1977 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1978 if (
isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1979 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1981 $sql .=
') VALUES ('.implode(
',', $values).
')';
1983 $resql = $this->db->query($sql);
1985 $this->error = $this->db->error();
1986 $this->db->rollback();
2002 global $conf, $langs;
2006 if ($this->
status == self::STATUS_DRAFT) {
2007 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
2011 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
2012 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
2013 $sql .=
" WHERE rowid = ".((int) $this->
id);
2015 if ($this->db->query($sql)) {
2017 $this->oldcopy = clone $this;
2022 $result = $this->call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
2031 $this->db->commit();
2034 $this->db->rollback();
2057 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
2065 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2066 $search_sale = $user->id;
2069 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2070 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
2071 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
2072 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
2073 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
2074 $sql .=
" AND p.fk_soc = s.rowid";
2075 $sql .=
" AND p.fk_statut = c.id";
2077 $sql .=
" AND s.rowid = ".((int) $socid);
2080 $sql .=
" AND p.fk_statut = 0";
2082 if ($notcurrentuser > 0) {
2083 $sql .=
" AND p.fk_user_author <> ".((int) $user->id);
2086 if ($search_sale && $search_sale !=
'-1') {
2087 if ($search_sale == -2) {
2088 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
2089 } elseif ($search_sale > 0) {
2090 $sql .=
" AND EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc AND sc.fk_user = ".((int) $search_sale).
")";
2093 $sql .= $this->db->order($sortfield, $sortorder);
2094 $sql .= $this->db->plimit($limit, $offset);
2096 $result = $this->db->query($sql);
2098 $num = $this->db->num_rows($result);
2102 $obj = $this->db->fetch_object($result);
2104 if ($shortlist == 1) {
2105 $ga[$obj->supplier_proposalid] = $obj->ref;
2106 } elseif ($shortlist == 2) {
2107 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
2109 $ga[$i][
'id'] = $obj->supplier_proposalid;
2110 $ga[$i][
'ref'] = $obj->ref;
2111 $ga[$i][
'name'] = $obj->name;
2131 public function delete($user, $notrigger = 0)
2133 global $conf, $langs;
2134 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2142 $result = $this->call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2151 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"categorie_supplier_proposal";
2152 $sql .=
" WHERE fk_supplier_proposal = ".((int) $this->
id);
2154 $result = $this->db->query($sql);
2157 $this->error = $this->db->lasterror();
2158 $this->errors[] = $this->error;
2163 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2164 $ef = $main.
"_extrafields";
2165 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2166 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2167 if ($this->db->query($sql)) {
2168 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2169 if ($this->db->query($sqlef) && $this->db->query($sql)) {
2183 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2184 $dir = $conf->supplier_proposal->dir_output.
"/".$ref;
2185 $file = $dir.
"/".$ref.
".pdf";
2186 if (file_exists($file)) {
2190 $this->error =
'ErrorFailToDeleteFile';
2191 $this->errors = array(
'ErrorFailToDeleteFile');
2192 $this->db->rollback();
2196 if (file_exists($dir)) {
2199 $this->error =
'ErrorFailToDeleteDir';
2200 $this->errors = array(
'ErrorFailToDeleteDir');
2201 $this->db->rollback();
2214 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2219 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2220 $this->db->commit();
2223 $this->error = $this->db->lasterror();
2224 $this->db->rollback();
2228 $this->error = $this->db->lasterror();
2229 $this->db->rollback();
2233 $this->error = $this->db->lasterror();
2234 $this->db->rollback();
2238 $this->db->rollback();
2251 $sql =
"SELECT c.rowid, GREATEST(c.tms, COALESCE(cef.tms, c.tms)) as date_modification,";
2252 $sql .=
" c.datec as date_creation, c.date_valid as date_validation, c.date_cloture as date_closure,";
2253 $sql .=
" c.fk_user_author, c.fk_user_modif, c.fk_user_valid, c.fk_user_cloture";
2254 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2255 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"supplier_proposal_extrafields as cef ON cef.fk_object=c.rowid";
2256 $sql .=
" WHERE c.rowid = ".((int) $id);
2258 $result = $this->db->query($sql);
2261 if ($this->db->num_rows($result)) {
2262 $obj = $this->db->fetch_object($result);
2264 $this->
id = $obj->rowid;
2266 $this->date_creation = $this->db->jdate($obj->date_creation);
2267 $this->date_modification = empty($obj->date_modification) ?
'' : $this->db->jdate($obj->date_modification);
2268 $this->date_validation = $this->db->jdate($obj->date_validation);
2269 $this->date_cloture = $this->db->jdate($obj->date_closure);
2271 $this->user_creation_id = $obj->fk_user_author;
2272 $this->user_modification_id = $obj->fk_user_modif;
2273 $this->user_validation_id = $obj->fk_user_valid;
2274 $this->user_closing_id = $obj->fk_user_cloture;
2276 $this->db->free($result);
2307 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2309 $langs->load(
"supplier_proposal");
2310 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2311 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2312 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2313 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2314 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2315 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2316 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2317 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2318 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2319 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2323 if ($status == self::STATUS_DRAFT) {
2324 $statusnew =
'status0';
2325 } elseif ($status == self::STATUS_VALIDATED) {
2326 $statusnew =
'status1';
2327 } elseif ($status == self::STATUS_SIGNED) {
2328 $statusnew =
'status4';
2329 } elseif ($status == self::STATUS_NOTSIGNED) {
2330 $statusnew =
'status9';
2331 } elseif ($status == self::STATUS_CLOSE) {
2332 $statusnew =
'status6';
2335 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2350 global $conf, $langs;
2356 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2357 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2358 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2359 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2360 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2363 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2364 if ($mode ==
'opened') {
2365 $sql .=
" AND p.fk_statut = 1";
2367 if ($mode ==
'signed') {
2368 $sql .=
" AND p.fk_statut = 2";
2371 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2374 $resql = $this->db->query($sql);
2376 $label = $labelShort =
'';
2379 if ($mode ==
'opened') {
2380 $delay_warning = !empty($conf->supplier_proposal->cloture->warning_delay) ? $conf->supplier_proposal->cloture->warning_delay : 0;
2382 $label = $langs->trans(
"SupplierProposalsToClose");
2383 $labelShort = $langs->trans(
"ToAcceptRefuse");
2385 if ($mode ==
'signed') {
2386 $delay_warning = !empty($conf->supplier_proposal->facturation->warning_delay) ? $conf->supplier_proposal->facturation->warning_delay : 0;
2388 $label = $langs->trans(
"SupplierProposalsToProcess");
2389 $labelShort = $langs->trans(
"ToClose");
2393 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2394 $response->label = $label;
2395 $response->labelShort = $labelShort;
2396 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2400 while ($obj = $this->db->fetch_object($resql)) {
2401 $response->nbtodo++;
2402 if ($mode ==
'opened') {
2403 $datelimit = $this->db->jdate($obj->datefin);
2404 if ($datelimit < ($now - $delay_warning)) {
2405 $response->nbtodolate++;
2413 $this->error = $this->db->lasterror();
2429 global $conf, $langs;
2434 $sql =
"SELECT rowid";
2435 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2436 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2437 if (array_key_exists(
'tobuy', $param)) {
2438 $sql .=
" AND tobuy = ".((int) $param[
'tobuy']);
2440 $sql .= $this->db->plimit(100);
2442 $resql = $this->db->query($sql);
2444 $num_prods = $this->db->num_rows($resql);
2446 while ($i < $num_prods) {
2448 $row = $this->db->fetch_row($resql);
2449 $prodids[$i] = $row[0];
2455 $this->
ref =
'SPECIMEN';
2456 $this->ref_supplier =
'NEMICEPS';
2457 $this->specimen = 1;
2459 $this->
date = time();
2460 $this->cond_reglement_id = 1;
2461 $this->cond_reglement_code =
'RECEP';
2462 $this->mode_reglement_id = 7;
2463 $this->mode_reglement_code =
'CHQ';
2464 $this->note_public =
'This is a comment (public)';
2465 $this->note_private =
'This is a comment (private)';
2467 $this->multicurrency_tx = 1;
2473 while ($xnbp < $nbp) {
2475 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2477 $line->subprice = 100;
2478 $line->tva_tx = 19.6;
2479 $line->localtax1_tx = 0;
2480 $line->localtax2_tx = 0;
2482 $line->total_ht = 50;
2483 $line->total_ttc = 59.8;
2484 $line->total_tva = 9.8;
2485 $line->remise_percent = 50;
2487 $line->total_ht = 100;
2488 $line->total_ttc = 119.6;
2489 $line->total_tva = 19.6;
2490 $line->remise_percent = 00;
2493 if ($num_prods > 0) {
2494 $prodid = mt_rand(1, $num_prods);
2495 $line->fk_product = $prodids[$prodid];
2498 $this->lines[$xnbp] = $line;
2500 $this->total_ht += $line->total_ht;
2501 $this->total_tva += $line->total_tva;
2502 $this->total_ttc += $line->total_ttc;
2519 $this->nb = array();
2522 $sql =
"SELECT count(p.rowid) as nb";
2523 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2524 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2525 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2526 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2527 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2530 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2532 $resql = $this->db->query($sql);
2535 while ($obj = $this->db->fetch_object($resql)) {
2536 $this->nb[
"supplier_proposals"] = $obj->nb;
2538 $this->db->free($resql);
2542 $this->error = $this->db->lasterror();
2555 public function getNextNumRef($soc)
2557 global $conf, $db, $langs;
2558 $langs->load(
"supplier_proposal");
2567 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
2568 foreach ($dirmodels as $reldir) {
2569 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2572 $mybool = ((bool) @include_once $dir.$file) || $mybool;
2580 $obj =
new $classname();
2581 '@phan-var-force ModeleNumRefSupplierProposal $obj';
2584 $numref = $obj->getNextValue($soc, $this);
2586 if ($numref !=
"") {
2589 $this->error = $obj->error;
2593 $langs->load(
"errors");
2594 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2607 global $conf, $langs;
2609 $langs->load(
'supplier_proposal');
2612 return [
'optimize' => $langs->trans(
"ShowSupplierProposal")];
2618 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2619 if (isset($this->
status)) {
2620 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
2622 if (!empty($this->
ref)) {
2623 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2625 if (!empty($this->ref_fourn)) {
2626 $datas[
'ref_supplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2628 if (!empty($this->total_ht)) {
2629 $datas[
'amount_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
getDolCurrency());
2631 if (!empty($this->total_tva)) {
2632 $datas[
'amount_vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
getDolCurrency());
2634 if (!empty($this->total_ttc)) {
2635 $datas[
'amount_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
getDolCurrency());
2652 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2654 global $langs, $conf, $user, $hookmanager;
2656 if (!empty($conf->dol_no_mouse_hover)) {
2664 'objecttype' => $this->element,
2665 'option' => $option,
2667 $classfortooltip =
'classfortooltip';
2670 $classfortooltip =
'classforajaxtooltip';
2671 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2677 if ($option ==
'') {
2678 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2680 if ($option ==
'document') {
2681 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2684 if ($option !==
'nolink') {
2686 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2687 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2688 $add_save_lastsearch_values = 1;
2690 if ($add_save_lastsearch_values) {
2691 $url .=
'&save_lastsearch_values=1';
2696 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
2698 $label = $langs->trans(
"ShowSupplierProposal");
2699 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
2701 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
2702 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2705 $linkstart =
'<a href="'.$url.
'"';
2706 $linkstart .= $linkclose.
'>';
2709 $result .= $linkstart;
2711 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
2713 if ($withpicto != 2) {
2714 $result .= $this->ref;
2716 $result .= $linkend;
2718 if ($addlinktonotes) {
2719 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2722 $result .=
' <span class="note inline-block">';
2723 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2728 $result .=
'</span>';
2732 $hookmanager->initHooks(array($this->element .
'dao'));
2733 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
2734 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2736 $result = $hookmanager->resPrint;
2738 $result .= $hookmanager->resPrint;
2752 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2753 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2754 $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,';
2755 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line, pt.extraparams,';
2756 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2757 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2758 $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';
2759 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2760 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2761 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2762 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2764 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2765 $resql = $this->db->query($sql);
2767 $num = $this->db->num_rows($resql);
2771 $obj = $this->db->fetch_object($resql);
2774 $this->lines[$i]->id = $obj->rowid;
2775 $this->lines[$i]->rowid = $obj->rowid;
2777 $this->lines[$i]->label = $obj->custom_label;
2778 $this->lines[$i]->description = $obj->description;
2779 $this->lines[$i]->desc = $obj->description;
2781 $this->lines[$i]->fk_product = $obj->fk_product;
2782 $this->lines[$i]->ref = $obj->ref;
2783 $this->lines[$i]->product_label = $obj->product_label;
2784 $this->lines[$i]->product_desc = $obj->product_desc;
2785 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2786 $this->lines[$i]->product_type = $obj->product_type;
2787 $this->lines[$i]->qty = $obj->qty;
2788 $this->lines[$i]->subprice = $obj->subprice;
2789 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2790 $this->lines[$i]->remise_percent = $obj->remise_percent;
2791 $this->lines[$i]->tva_tx = $obj->tva_tx;
2792 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2793 $this->lines[$i]->info_bits = $obj->info_bits;
2794 $this->lines[$i]->total_ht = $obj->total_ht;
2795 $this->lines[$i]->total_tva = $obj->total_tva;
2796 $this->lines[$i]->total_ttc = $obj->total_ttc;
2797 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2798 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2799 $this->lines[$i]->pa_ht = $marginInfos[0];
2800 $this->lines[$i]->marge_tx = $marginInfos[1];
2801 $this->lines[$i]->marque_tx = $marginInfos[2];
2802 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2803 $this->lines[$i]->special_code = $obj->special_code;
2804 $this->lines[$i]->rang = $obj->rang;
2806 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2807 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2810 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2811 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2812 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2813 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2814 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2815 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2816 $this->lines[$i]->fk_unit = $obj->fk_unit;
2817 $this->lines[$i]->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
2819 $this->lines[$i]->fetch_optionals();
2823 $this->db->free($resql);
2827 $this->error = $this->db->error();
2843 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2847 $langs->load(
"supplier_proposal");
2848 $outputlangs->load(
"products");
2853 if ($this->model_pdf) {
2854 $modele = $this->model_pdf;
2860 if (empty($modele)) {
2864 $modelpath =
"core/modules/supplier_proposal/doc/";
2866 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2898 'supplier_proposaldet'
2916 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2918 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2919 $return .=
'<div class="info-box info-box-sm">';
2920 $return .=
'<span class="info-box-icon bg-infobox-action">';
2923 $return .=
'</span>';
2924 $return .=
'<div class="info-box-content">';
2925 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
2926 if ($selected >= 0) {
2927 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2929 if (property_exists($this,
'socid')) {
2930 $return .=
'<span class="info-box-ref"> | '.$this->socid.
'</span>';
2932 if (property_exists($this,
'delivery_date')) {
2933 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"DateEnd").
'</span> : <span class="info-box-label">'.
dol_print_date($this->delivery_date).
'</span>';
2935 if (property_exists($this,
'total_ttc')) {
2936 $return .=
'<br><span class="opacitymedium" >'.$langs->trans(
"AmountHT").
' : </span><span class="info-box-label amount">'.
price($this->total_ttc).
'</span>';
2938 if (method_exists($this,
'getLibStatut')) {
2939 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2941 $return .=
'</div>';
2942 $return .=
'</div>';
2943 $return .=
'</div>';
2959 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
2960 return parent::setCategoriesCommon($categories, Categorie::TYPE_SUPPLIER_PROPOSAL);
2983 public $element =
'supplier_proposaldet';
2988 public $table_element =
'supplier_proposaldet';
3013 public $fk_supplier_proposal;
3018 public $fk_parent_line;
3035 public $fk_product_type;
3054 public $vat_src_code;
3059 public $remise_percent;
3064 public $fk_remise_except;
3074 public $fk_fournprice;
3092 public $special_code;
3100 public $info_bits = 0;
3138 public $product_ref;
3151 public $product_label;
3163 public $product_desc;
3168 public $localtax1_tx;
3172 public $localtax2_tx;
3176 public $localtax1_type;
3180 public $localtax2_type;
3184 public $total_localtax1;
3188 public $total_localtax2;
3193 public $skip_update_total;
3202 public $ref_supplier;
3208 public $fk_multicurrency;
3213 public $multicurrency_code;
3217 public $multicurrency_subprice;
3221 public $multicurrency_total_ht;
3225 public $multicurrency_total_tva;
3229 public $multicurrency_total_ttc;
3249 $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,';
3250 $sql .=
' pd.date_start, pd.date_end,';
3251 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice, pd.subprice_ttc,';
3252 $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,';
3253 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
3254 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
3255 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn, pd.extraparams,';
3256 $sql .=
' pd.fk_multicurrency, pd.multicurrency_code, pd.multicurrency_subprice, pd.multicurrency_subprice_ttc, pd.multicurrency_total_ht, pd.multicurrency_total_tva, pd.multicurrency_total_ttc, pd.fk_unit';
3257 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
3258 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
3259 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
3261 $result = $this->db->query($sql);
3263 if ($objp = $this->db->fetch_object($result)) {
3264 $this->
id = $objp->rowid;
3265 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
3266 $this->fk_parent_line = $objp->fk_parent_line;
3267 $this->label = $objp->custom_label;
3268 $this->desc = $objp->description;
3269 $this->qty = $objp->qty;
3271 $this->subprice = $objp->subprice;
3272 $this->subprice_ttc = $objp->subprice_ttc;
3274 $this->tva_tx = $objp->tva_tx;
3275 $this->remise_percent = $objp->remise_percent;
3276 $this->fk_remise_except = $objp->fk_remise_except;
3277 $this->fk_product = $objp->fk_product;
3278 $this->info_bits = $objp->info_bits;
3279 $this->date_start = $this->db->jdate($objp->date_start);
3280 $this->date_end = $this->db->jdate($objp->date_end);
3282 $this->total_ht = $objp->total_ht;
3283 $this->total_tva = $objp->total_tva;
3284 $this->total_ttc = $objp->total_ttc;
3286 $this->fk_fournprice = $objp->fk_fournprice;
3288 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
3289 $this->pa_ht = $marginInfos[0];
3290 $this->marge_tx = $marginInfos[1];
3291 $this->marque_tx = $marginInfos[2];
3293 $this->special_code = $objp->special_code;
3294 $this->product_type = $objp->product_type;
3295 $this->rang = $objp->rang;
3297 $this->product_ref = $objp->product_ref;
3298 $this->product_label = $objp->product_label;
3299 $this->product_desc = $objp->product_desc;
3301 $this->ref_fourn = $objp->ref_produit_fourn;
3303 $this->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
3306 $this->fk_multicurrency = $objp->fk_multicurrency;
3307 $this->multicurrency_code = $objp->multicurrency_code;
3308 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3309 $this->multicurrency_subprice_ttc = $objp->multicurrency_subprice_ttc;
3310 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3311 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3312 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3313 $this->fk_unit = $objp->fk_unit;
3315 $this->db->free($result);
3337 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3340 if (empty($this->tva_tx)) {
3343 if (empty($this->vat_src_code)) {
3344 $this->vat_src_code =
'';
3346 if (empty($this->localtax1_tx)) {
3347 $this->localtax1_tx = 0;
3349 if (empty($this->localtax2_tx)) {
3350 $this->localtax2_tx = 0;
3352 if (empty($this->localtax1_type)) {
3353 $this->localtax1_type =
'';
3355 if (empty($this->localtax2_type)) {
3356 $this->localtax2_type =
'';
3358 if (empty($this->total_localtax1)) {
3359 $this->total_localtax1 = 0;
3361 if (empty($this->total_localtax2)) {
3362 $this->total_localtax2 = 0;
3364 if (empty($this->rang)) {
3367 if (empty($this->remise_percent)) {
3368 $this->remise_percent = 0;
3370 if (empty($this->info_bits)) {
3371 $this->info_bits = 0;
3373 if (empty($this->special_code)) {
3374 $this->special_code = 0;
3376 if (empty($this->fk_parent_line)) {
3377 $this->fk_parent_line = 0;
3379 if (empty($this->fk_fournprice)) {
3380 $this->fk_fournprice = 0;
3382 if (empty($this->fk_unit)) {
3385 if (empty($this->subprice)) {
3386 $this->subprice = 0;
3389 if (empty($this->pa_ht)) {
3394 if ($this->pa_ht == 0) {
3395 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3399 $this->pa_ht = $result;
3404 if ($this->product_type < 0) {
3411 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3412 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3413 $sql .=
' date_start, date_end,';
3414 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3415 $sql .=
' subprice, subprice_ttc, remise_percent, ';
3416 $sql .=
' info_bits, ';
3417 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3418 $sql .=
' ref_fourn,';
3419 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_subprice_ttc, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3420 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3421 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3422 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3423 $sql .=
" '".$this->db->escape($this->desc).
"',";
3424 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3425 $sql .=
" ".((int) $this->product_type).
",";
3426 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3427 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3428 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3429 $sql .=
" ".(float)
price2num($this->qty,
'MS').
",";
3430 $sql .=
" ".(float)
price2num($this->tva_tx).
",";
3431 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3432 $sql .=
" ".(float)
price2num($this->localtax1_tx).
",";
3433 $sql .=
" ".(float)
price2num($this->localtax2_tx).
",";
3434 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3435 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3436 $sql .=
" ".(float)
price2num($this->subprice,
'MU') .
",";
3437 $sql .=
" ".(float)
price2num($this->subprice_ttc,
'MU') .
",";
3438 $sql .=
" ".((float) $this->remise_percent).
",";
3439 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3440 $sql .=
" ".(float)
price2num($this->total_ht,
'MT').
",";
3441 $sql .=
" ".(float)
price2num($this->total_tva,
'MT').
",";
3442 $sql .=
" ".(float)
price2num($this->total_localtax1,
'MT').
",";
3443 $sql .=
" ".(float)
price2num($this->total_localtax2,
'MT').
",";
3444 $sql .=
" ".(float)
price2num($this->total_ttc,
'MT').
",";
3445 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3446 $sql .=
" ".(isset($this->pa_ht) ? (float)
price2num($this->pa_ht,
'MU') :
"null").
",";
3447 $sql .=
' '.((int) $this->special_code).
',';
3448 $sql .=
' '.((int) $this->rang).
',';
3449 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3450 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3451 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3452 $sql .=
", ".(float)
price2num($this->multicurrency_subprice,
'CU');
3453 $sql .=
", ".(float)
price2num($this->multicurrency_subprice_ttc,
'CU');
3454 $sql .=
", ".(float)
price2num($this->multicurrency_total_ht,
'CT');
3455 $sql .=
", ".(float)
price2num($this->multicurrency_total_tva,
'CT');
3456 $sql .=
", ".(float)
price2num($this->multicurrency_total_ttc,
'CT');
3457 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3460 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3461 $resql = $this->db->query($sql);
3463 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3472 if (!$error && !$notrigger) {
3474 $result = $this->call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3476 $this->db->rollback();
3482 $this->db->commit();
3485 $this->error = $this->db->error().
" sql=".$sql;
3486 $this->db->rollback();
3497 public function delete($user)
3503 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet";
3504 $sql .=
" WHERE rowid = ".((int) $this->
id);
3506 if ($this->db->query($sql)) {
3512 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3517 $result = $this->call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3519 $this->db->rollback();
3524 $this->db->commit();
3528 $this->error = $this->db->error().
" sql=".$sql;
3529 $this->db->rollback();
3547 if (empty($this->tva_tx)) {
3550 if (empty($this->localtax1_tx)) {
3551 $this->localtax1_tx = 0;
3553 if (empty($this->localtax2_tx)) {
3554 $this->localtax2_tx = 0;
3556 if (empty($this->total_localtax1)) {
3557 $this->total_localtax1 = 0;
3559 if (empty($this->total_localtax2)) {
3560 $this->total_localtax2 = 0;
3562 if (empty($this->localtax1_type)) {
3563 $this->localtax1_type =
'';
3565 if (empty($this->localtax2_type)) {
3566 $this->localtax2_type =
'';
3568 if (empty($this->marque_tx)) {
3569 $this->marque_tx = 0;
3571 if (empty($this->marge_tx)) {
3572 $this->marge_tx = 0;
3574 if (empty($this->remise_percent)) {
3575 $this->remise_percent = 0;
3577 if (empty($this->info_bits)) {
3578 $this->info_bits = 0;
3580 if (empty($this->special_code)) {
3581 $this->special_code = 0;
3583 if (empty($this->fk_parent_line)) {
3584 $this->fk_parent_line = 0;
3586 if (empty($this->fk_fournprice)) {
3587 $this->fk_fournprice = 0;
3589 if (empty($this->fk_unit)) {
3592 if (empty($this->subprice)) {
3593 $this->subprice = 0;
3596 if (empty($this->pa_ht)) {
3601 if ($this->pa_ht == 0) {
3602 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3606 $this->pa_ht = $result;
3613 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3614 $sql .=
" description = '".$this->db->escape($this->desc).
"'";
3615 $sql .=
" , label = ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3616 $sql .=
" , product_type = ".((int) $this->product_type);
3617 $sql .=
" , date_start = ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3618 $sql .=
" , date_end = ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3619 $sql .=
" , tva_tx = '".price2num($this->tva_tx).
"'";
3620 $sql .=
" , localtax1_tx = ".(float)
price2num($this->localtax1_tx);
3621 $sql .=
" , localtax2_tx = ".(float)
price2num($this->localtax2_tx);
3622 $sql .=
" , localtax1_type = '".$this->db->escape($this->localtax1_type).
"'";
3623 $sql .=
" , localtax2_type = '".$this->db->escape($this->localtax2_type).
"'";
3624 $sql .=
" , qty = ".(float)
price2num($this->qty);
3625 $sql .=
" , subprice = ".(float)
price2num($this->subprice);
3626 $sql .=
" , subprice_ttc = ".(float)
price2num($this->subprice_ttc);
3627 $sql .=
" , remise_percent = ".(float)
price2num($this->remise_percent);
3628 $sql .=
" , info_bits = ".((int) $this->info_bits);
3629 if (empty($this->skip_update_total)) {
3630 $sql .=
" , total_ht = ".(float)
price2num($this->total_ht);
3631 $sql .=
" , total_tva = ".(float)
price2num($this->total_tva);
3632 $sql .=
" , total_ttc = ".(float)
price2num($this->total_ttc);
3633 $sql .=
" , total_localtax1 = ".(float)
price2num($this->total_localtax1);
3634 $sql .=
" , total_localtax2 = ".(float)
price2num($this->total_localtax2);
3636 $sql .=
" , fk_product_fournisseur_price = ".(!empty($this->fk_fournprice) ?
"'".$this->db->escape((
string) $this->fk_fournprice).
"'" :
"null");
3637 $sql .=
" , buy_price_ht = ".(float)
price2num($this->pa_ht);
3638 $sql .=
" , special_code = ".((int) $this->special_code);
3639 $sql .=
" , fk_parent_line = ".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3640 if (!empty($this->rang)) {
3641 $sql .=
", rang = ".((int) $this->rang);
3643 $sql .=
" , ref_fourn = ".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3644 $sql .=
" , fk_unit = ".($this->fk_unit ? (int) $this->fk_unit :
'null');
3647 $sql .=
" , multicurrency_subprice = ".(float)
price2num($this->multicurrency_subprice);
3648 $sql .=
" , multicurrency_subprice_ttc = ".(float)
price2num($this->multicurrency_subprice_ttc);
3649 $sql .=
" , multicurrency_total_ht = ".(float)
price2num($this->multicurrency_total_ht);
3650 $sql .=
" , multicurrency_total_tva = ".(float)
price2num($this->multicurrency_total_tva);
3651 $sql .=
" , multicurrency_total_ttc = ".(float)
price2num($this->multicurrency_total_ttc);
3653 $sql .=
" WHERE rowid = ".((int) $this->
id);
3655 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3656 $resql = $this->db->query($sql);
3665 if (!$error && !$notrigger) {
3667 $result = $this->call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3669 $this->db->rollback();
3675 $this->db->commit();
3678 $this->error = $this->db->error();
3679 $this->db->rollback();
3697 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3698 $sql .=
" total_ht = ".(float)
price2num($this->total_ht,
'MT');
3699 $sql .=
",total_tva = ".(float)
price2num($this->total_tva,
'MT');
3700 $sql .=
",total_ttc = ".(float)
price2num($this->total_ttc,
'MT');
3701 $sql .=
" WHERE rowid = ".((int) $this->
id);
3703 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3705 $resql = $this->db->query($sql);
3707 $this->db->commit();
3710 $this->error = $this->db->error();
3711 $this->db->rollback();
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteEcmFiles($mode=0)
Delete related files of object in database.
update_price($exclspec=0, $roundingadjust='auto', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
defineBuyPrice($unitPrice=0.0, $discountPercent=0.0, $fk_product=0)
Get buy price to use for margin calculation.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setErrorsFromObject($object)
setErrorsFromObject
isLineOfObject($lineid)
Check that a line belongs to this object, using $this->table_element_line and $this->fk_element.
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check if an object id or ref exists If you don't need or want to instantiate the object and just need...
updateRangOfLine($rowid, $rang)
Update position of line (rang)
checkActiveProductInLines($status='onsale')
Check if all products have the right status (on sale, on buy) called during validation of propal,...
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
add_contact($fk_socpeople, $type_contact, $source='external', $notrigger=0)
Add a link between element $this->element and a contact.
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=0)
Get id and rate of currency from code.
Class to manage predefined suppliers products.
Class to manage products or services.
const TYPE_PRODUCT
Regular product.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage price ask supplier.
updatePriceFournisseur($idProductFournPrice, $product, $user)
Update ProductFournisseur.
updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0, $txlocaltax2=0, $desc='', $price_base_type='HT', $info_bits=0, $special_code=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=0, $pa_ht=0, $label='', $type=0, $array_options=[], $ref_supplier='', $fk_unit=0, $pu_ht_devise=0)
Update a proposal line.
cloture($user, $status, $note)
Close the askprice.
initAsSpecimen($param=array())
Initialise an instance with random values.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $pu_ttc=0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='', $array_options=[], $ref_supplier='', $fk_unit=0, $origin='', $origin_id=0, $pu_ht_devise=0, $date_start=0, $date_end=0)
Add a proposal line into database (linked to product/service or not) Les parameters sont deja cense e...
info($id)
Object SupplierProposal Information.
create($user, $notrigger=0)
Create commercial proposal into database this->ref can be set or empty.
insert_discount($idremise)
Adding line of fixed discount in the proposal in DB.
reopen($user, $status, $note='', $notrigger=0)
Set an overall discount on the proposal.
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
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.
const STATUS_NOTSIGNED
Not signed quote, canceled.
const STATUS_DRAFT
Draft status.
liste_array($shortlist=0, $draft=0, $notcurrentuser=0, $socid=0, $limit=0, $offset=0, $sortfield='p.datec', $sortorder='DESC')
Return list of askprice (eventually filtered on user) into an array.
setDeliveryDate($user, $delivery_date)
Set delivery date.
__construct($db, $socid=0, $supplier_proposalid=0)
Constructor.
LibStatut($status, $mode=1)
Return label of a status (draft, validated, ...)
setCategories($categories)
Sets object to supplied categories.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
updateOrCreatePriceFournisseur($user)
Add or update supplier price according to result of proposal.
loadStateBoard()
Load indicator this->nb of global stats widget.
deleteLine($lineid)
Delete detail line.
const STATUS_VALIDATED
Validated status.
createPriceFournisseur($product, $user)
Create Price Fournisseur.
getLibStatut($mode=0)
Return label of status of proposal (draft, validated, ...)
add_product($idproduct, $qty, $remise_percent=0)
Add line into array ->lines.
set_date_livraison($user, $delivery_date)
Set delivery date.
const STATUS_SIGNED
Signed quote.
getNomUrl($withpicto=0, $option='', $get_params='', $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0)
Return clickable link of object (with eventually picto)
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with eventually picto)
getTooltipContentArray($params)
getTooltipContentArray
valid($user, $notrigger=0)
Set status to validated.
const STATUS_CLOSE
Billed or closed/processed quote.
getLinesArray()
Retrieve an array of supplier proposal lines.
setDraft($user)
Set draft status.
Class to manage supplier_proposal lines.
fetch($rowid)
Retrieve the propal line object.
insert($notrigger=0)
Insert object line propal in database.
update_total()
Update DB line fields total_xxx Used by migration.
update($notrigger=0)
Update propal line object into DB.
__construct($db)
Class line Constructor.
Class to manage translations.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_now($mode='gmt')
Return date for now.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
getDolCurrency()
Return the main currency ('EUR', 'USD', ...)
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
getMarginInfos($pv_ht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $pa_ht)
Return an array with margins information of a line.
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller=null, $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.
if(getDolGlobalString( 'TAKEPOS_SHOW_CUSTOMER')) print $langs trans('Date')." left Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date