40require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/contact/class/contact.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
45require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
58 public $element =
'supplier_proposal';
63 public $table_element =
'supplier_proposal';
68 public $table_element_line =
'supplier_proposaldet';
73 public $class_element_line =
'SupplierProposalLine';
77 public $fk_element =
'fk_supplier_proposal';
82 public $picto =
'supplier_proposal';
88 public $restrictiononfksoc = 1;
114 public $ref_supplier;
130 public $delivery_date;
149 public $user_author_id;
175 public $cond_reglement_code;
179 public $cond_reglement_doc;
184 public $mode_reglement_code;
189 public $mode_reglement;
194 public $extraparams = array();
199 public $lines = array();
206 public $labelStatus = array();
207 public $labelStatusShort = array();
222 public $fk_multicurrency;
227 public $multicurrency_code;
231 public $multicurrency_tx;
235 public $multicurrency_total_ht;
239 public $multicurrency_total_tva;
243 public $multicurrency_total_ttc;
245 public $fields = array(
246 'ref' => array(
'type' =>
'varchar(255)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => 1,
'showoncombobox' => 1,
'position' => 25,
'searchall' => 1),
247 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 750,
'searchall' => 1),
284 public function __construct($db, $socid = 0, $supplier_proposalid = 0)
286 global
$conf, $langs;
290 $this->ismultientitymanaged = 1;
291 $this->socid = $socid;
292 $this->
id = $supplier_proposalid;
307 public function add_product($idproduct, $qty, $remise_percent = 0)
310 global
$conf, $mysoc;
316 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
317 if ($idproduct > 0) {
318 $prod =
new Product($this->db);
319 $prod->fetch($idproduct);
321 $productdesc = $prod->description;
325 if (empty($tva_tx)) {
328 $localtax1_tx =
get_localtax($tva_tx, 1, $mysoc, $this->thirdparty, $tva_npr);
329 $localtax2_tx =
get_localtax($tva_tx, 2, $mysoc, $this->thirdparty, $tva_npr);
332 if (
$conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
333 $price = $prod->multiprices[$this->thirdparty->price_level];
335 $price = $prod->price;
340 $line->fk_product = $idproduct;
341 $line->desc = $productdesc;
343 $line->subprice = $price;
344 $line->remise_percent = $remise_percent;
345 $line->tva_tx = $tva_tx;
347 $this->lines[] = $line;
365 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
366 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
371 $result = $remise->fetch($idremise);
374 if ($remise->fk_facture) {
375 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
376 $this->db->rollback();
381 $supplier_proposalligne->fk_supplier_proposal = $this->id;
382 $supplier_proposalligne->fk_remise_except = $remise->id;
383 $supplier_proposalligne->desc = $remise->description;
384 $supplier_proposalligne->tva_tx = $remise->tva_tx;
385 $supplier_proposalligne->subprice = -(float) $remise->amount_ht;
386 $supplier_proposalligne->fk_product = 0;
387 $supplier_proposalligne->qty = 1;
388 $supplier_proposalligne->remise_percent = 0;
389 $supplier_proposalligne->rang = -1;
390 $supplier_proposalligne->info_bits = 2;
392 $supplier_proposalligne->total_ht = -(float) $remise->amount_ht;
393 $supplier_proposalligne->total_tva = -(float) $remise->amount_tva;
394 $supplier_proposalligne->total_ttc = -(float) $remise->amount_ttc;
396 $result = $supplier_proposalligne->insert();
403 $this->db->rollback();
407 $this->error = $supplier_proposalligne->error;
408 $this->db->rollback();
412 $this->db->rollback();
454 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)
456 global $mysoc,
$conf, $langs;
458 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");
459 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
462 if (empty($remise_percent)) {
468 if (empty($info_bits)) {
474 if (empty($fk_parent_line) || $fk_parent_line < 0) {
481 $remise_percent =
price2num($remise_percent);
485 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
491 if ($price_base_type ==
'HT') {
502 if ($this->statut == self::STATUS_DRAFT) {
505 if ($fk_product > 0) {
506 if (
getDolGlobalInt(
'SUPPLIER_PROPOSAL_WITH_PREDEFINED_PRICES_ONLY') == 1) {
508 dol_syslog(get_class($this).
"::addline we check supplier prices fk_product=".$fk_product.
" fk_fournprice=".$fk_fournprice.
" qty=".$qty.
" ref_supplier=".$ref_supplier);
510 if ($productsupplier->fetch($fk_product) > 0) {
511 $product_type = $productsupplier->type;
512 $label = $productsupplier->label;
513 $fk_prod_fourn_price = $fk_fournprice;
518 $result = $productsupplier->get_buyprice($fk_prod_fourn_price, $qty, $fk_product,
'none', $this->socid);
520 $pu = $productsupplier->fourn_pu;
521 $ref_supplier = $productsupplier->ref_supplier;
523 if ($remise_percent == 0 && $productsupplier->remise_percent != 0) {
524 $remise_percent = $productsupplier->remise_percent;
528 $langs->load(
"errors");
529 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
530 $this->db->rollback();
531 dol_syslog(get_class($this).
"::addline we did not found supplier price, so we can't guess unit price");
537 $langs->load(
"errors");
538 $this->error =
"Ref ".$productsupplier->ref.
" ".$langs->trans(
"ErrorQtyTooLowForThisSupplier");
539 $this->db->rollback();
540 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_DEBUG);
544 $this->error = $productsupplier->error;
545 $this->errors = $productsupplier->errors;
546 $this->db->rollback();
547 dol_syslog(get_class($this).
"::addline result=".$result.
" - ".$this->error, LOG_ERR);
551 $this->error = $productsupplier->error;
552 $this->errors = $productsupplier->errors;
553 $this->db->rollback();
558 $product_type = $type;
571 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
572 $vat_src_code = $reg[1];
573 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
576 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
580 $tabprice =
calcul_price_total($qty, $pu, (
float) $remise_percent, $txtva, (
float) $txlocaltax1, (
float) $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
581 $total_ht = $tabprice[0];
582 $total_tva = $tabprice[1];
583 $total_ttc = $tabprice[2];
584 $total_localtax1 = $tabprice[9];
585 $total_localtax2 = $tabprice[10];
586 $pu = $pu_ht = $tabprice[3];
589 $multicurrency_total_ht = $tabprice[16];
590 $multicurrency_total_tva = $tabprice[17];
591 $multicurrency_total_ttc = $tabprice[18];
592 $pu_ht_devise = $tabprice[19];
596 if ($ranktouse == -1) {
597 $rangmax = $this->
line_max($fk_parent_line);
598 $ranktouse = $rangmax + 1;
605 if ($remise_percent > 0) {
606 $remise = round(((
float) $pu * (
float) $remise_percent / 100), 2);
607 $price = (float) $pu - $remise;
613 $this->line->fk_supplier_proposal = $this->id;
614 $this->line->label = $label;
615 $this->line->desc = $desc;
616 $this->line->qty = $qty;
618 $this->line->vat_src_code = $vat_src_code;
619 $this->line->tva_tx = $txtva;
620 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
621 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
622 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
623 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
624 $this->line->fk_product = $fk_product;
625 $this->line->remise_percent = $remise_percent;
626 $this->line->subprice = (float) $pu_ht;
627 $this->line->rang = $ranktouse;
628 $this->line->info_bits = $info_bits;
629 $this->line->total_ht = (float) $total_ht;
630 $this->line->total_tva = (float) $total_tva;
631 $this->line->total_localtax1 = (float) $total_localtax1;
632 $this->line->total_localtax2 = (float) $total_localtax2;
633 $this->line->total_ttc = (float) $total_ttc;
634 $this->line->product_type = $type;
635 $this->line->special_code = $special_code;
636 $this->line->fk_parent_line = $fk_parent_line;
637 $this->line->fk_unit = $fk_unit;
638 $this->line->origin = $origin;
639 $this->line->origin_id = $origin_id;
640 $this->line->ref_fourn = $this->db->escape($ref_supplier);
641 $this->line->date_start = $date_start;
642 $this->line->date_end = $date_end;
645 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
647 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
649 $productFournisseur->find_min_price_product_fournisseur($fk_product);
650 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
652 $this->line->fk_fournprice = ($fk_fournprice > 0 ? $fk_fournprice : 0);
654 $this->line->pa_ht = $pa_ht;
658 $this->line->fk_multicurrency = $this->fk_multicurrency;
659 $this->line->multicurrency_code = $this->multicurrency_code;
660 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
661 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
662 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
663 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
666 if (empty($qty) && empty($special_code)) {
667 $this->line->special_code = 3;
670 if (is_array($array_options) && count($array_options) > 0) {
671 $this->line->array_options = $array_options;
674 $result = $this->line->insert();
677 if (!empty($fk_parent_line)) {
679 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
680 $linecount = count($this->lines);
681 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
687 $result = $this->
update_price(1,
'auto', 0, $this->thirdparty);
690 return $this->line->id;
692 $this->db->rollback();
696 $this->error = $this->line->error;
697 $this->errors = $this->line->errors;
698 $this->db->rollback();
702 $this->error =
'BadStatusOfObjectToAddLine';
734 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)
736 global
$conf, $user, $langs, $mysoc;
738 dol_syslog(get_class($this).
"::updateLine $rowid, $pu, $qty, $remise_percent, $txtva, $desc, $price_base_type, $info_bits");
739 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
742 $remise_percent =
price2num($remise_percent);
745 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
751 if (empty($qty) && empty($special_code)) {
754 if (!empty($qty) && $special_code == 3) {
771 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
772 $vat_src_code = $reg[1];
773 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
776 if (isModEnabled(
"multicurrency") && $pu_ht_devise > 0) {
780 $tabprice =
calcul_price_total($qty, $pu, (
float) $remise_percent, $txtva, (
float) $txlocaltax1, (
float) $txlocaltax2, 0, $price_base_type, $info_bits, $type, $this->thirdparty, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
781 $total_ht = $tabprice[0];
782 $total_tva = $tabprice[1];
783 $total_ttc = $tabprice[2];
784 $total_localtax1 = $tabprice[9];
785 $total_localtax2 = $tabprice[10];
786 $pu_ht = $tabprice[3];
787 $pu_tva = $tabprice[4];
788 $pu_ttc = $tabprice[5];
791 $multicurrency_total_ht = $tabprice[16];
792 $multicurrency_total_tva = $tabprice[17];
793 $multicurrency_total_ttc = $tabprice[18];
794 $pu_ht_devise = $tabprice[19];
797 if ($price_base_type ==
'TTC') {
803 $line->fetch($rowid);
804 $line->fetch_optionals();
806 $fk_product = $line->fk_product;
809 $staticline = clone $line;
811 $line->oldline = $staticline;
813 $this->line->context = $this->context;
816 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
817 $rangmax = $this->
line_max($fk_parent_line);
818 $this->line->rang = $rangmax + 1;
821 $this->line->id = $rowid;
822 $this->line->label = $label;
823 $this->line->desc = $desc;
824 $this->line->qty = $qty;
825 $this->line->product_type = $type;
827 $this->line->vat_src_code = $vat_src_code;
828 $this->line->tva_tx = $txtva;
829 $this->line->localtax1_tx = $txlocaltax1;
830 $this->line->localtax2_tx = $txlocaltax2;
831 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
832 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
833 $this->line->remise_percent = $remise_percent;
834 $this->line->subprice = (float) $pu;
835 $this->line->info_bits = $info_bits;
836 $this->line->total_ht = (float) $total_ht;
837 $this->line->total_tva = (float) $total_tva;
838 $this->line->total_localtax1 = (float) $total_localtax1;
839 $this->line->total_localtax2 = (float) $total_localtax2;
840 $this->line->total_ttc = (float) $total_ttc;
841 $this->line->special_code = $special_code;
842 $this->line->fk_parent_line = $fk_parent_line;
843 $this->line->skip_update_total = $skip_update_total;
844 $this->line->ref_fourn = $ref_supplier;
845 $this->line->fk_unit = $fk_unit;
848 if (!empty($fk_product) && $fk_product > 0 && empty($fk_fournprice) && empty($pa_ht)) {
850 include_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.product.class.php';
852 $productFournisseur->find_min_price_product_fournisseur($fk_product);
853 $this->line->fk_fournprice = $productFournisseur->product_fourn_price_id;
855 $this->line->fk_fournprice = $fk_fournprice;
857 $this->line->pa_ht = $pa_ht;
859 if (is_array($array_options) && count($array_options) > 0) {
861 foreach ($array_options as $key => $value) {
862 $this->line->array_options[$key] = $array_options[$key];
867 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
868 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
869 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
870 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
872 $result = $this->line->update();
875 if (!empty($fk_parent_line)) {
884 $this->error = $this->db->error();
885 $this->db->rollback();
889 dol_syslog(get_class($this).
"::updateline Erreur -2 SupplierProposal en mode incompatible pour cette action");
905 if ($this->statut == 0) {
909 $line->fetch($lineid);
911 if ($this->
id > 0 && (
int) $line->fk_supplier_proposal !== (
int) $this->id) {
912 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
916 if ($line->delete($user) > 0) {
937 public function create($user, $notrigger = 0)
939 global $langs,
$conf, $mysoc, $hookmanager;
949 $this->error =
"Failed to fetch company";
950 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
953 if (!empty($this->
ref)) {
956 $this->error =
'ErrorRefAlreadyExists';
957 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
958 $this->db->rollback();
964 $delivery_date = $this->delivery_date;
967 if (!empty($this->multicurrency_code)) {
970 if (empty($this->fk_multicurrency)) {
971 $this->multicurrency_code =
$conf->currency;
972 $this->fk_multicurrency = 0;
973 $this->multicurrency_tx = 1;
979 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"supplier_proposal (";
982 $sql .=
", total_tva";
983 $sql .=
", total_ttc";
986 $sql .=
", fk_user_author";
987 $sql .=
", note_private";
988 $sql .=
", note_public";
989 $sql .=
", model_pdf";
990 $sql .=
", fk_cond_reglement";
991 $sql .=
", fk_mode_reglement";
992 $sql .=
", fk_account";
993 $sql .=
", date_livraison";
994 $sql .=
", fk_shipping_method";
995 $sql .=
", fk_projet";
997 $sql .=
", fk_multicurrency";
998 $sql .=
", multicurrency_code";
999 $sql .=
", multicurrency_tx";
1001 $sql .=
" VALUES (";
1002 $sql .= ((int) $this->socid);
1006 $sql .=
", '".$this->db->idate($now).
"'";
1007 $sql .=
", '(PROV)'";
1008 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"null");
1009 $sql .=
", '".$this->db->escape($this->note_private).
"'";
1010 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1011 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1012 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
1013 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
1014 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1015 $sql .=
", ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1016 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1017 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
1018 $sql .=
", ".((int)
$conf->entity);
1019 $sql .=
", ".((int) $this->fk_multicurrency);
1020 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1021 $sql .=
", ".((float) $this->multicurrency_tx);
1024 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1025 $resql = $this->db->query($sql);
1027 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"supplier_proposal");
1030 $this->
ref =
'(PROV'.$this->id.
')';
1031 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"supplier_proposal SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
1033 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1034 $resql = $this->db->query($sql);
1039 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1040 $this->linked_objects = $this->linkedObjectsIds;
1044 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1045 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1046 if (is_array($tmp_origin_id)) {
1047 foreach ($tmp_origin_id as $origin_id) {
1062 $fk_parent_line = 0;
1063 $num = count($this->lines);
1065 for ($i = 0; $i < $num; $i++) {
1067 if (($this->lines[$i]->product_type != 9 && empty($this->lines[$i]->fk_parent_line)) || $this->lines[$i]->product_type == 9) {
1068 $fk_parent_line = 0;
1072 $this->lines[$i]->desc,
1073 $this->lines[$i]->subprice,
1074 $this->lines[$i]->qty,
1075 $this->lines[$i]->tva_tx,
1076 $this->lines[$i]->localtax1_tx,
1077 $this->lines[$i]->localtax2_tx,
1078 $this->lines[$i]->fk_product,
1079 $this->lines[$i]->remise_percent,
1083 $this->lines[$i]->product_type,
1084 $this->lines[$i]->rang,
1085 $this->lines[$i]->special_code,
1087 $this->lines[$i]->fk_fournprice,
1088 $this->lines[$i]->pa_ht,
1089 empty($this->lines[$i]->label) ?
'' : $this->lines[$i]->label,
1090 $this->lines[$i]->array_options,
1091 $this->lines[$i]->ref_fourn,
1092 $this->lines[$i]->fk_unit,
1093 'supplier_proposal',
1094 $this->lines[$i]->rowid
1099 $this->error = $this->db->error;
1104 if ($result > 0 && $this->lines[$i]->product_type == 9) {
1105 $fk_parent_line = $result;
1124 if (!$error && !$notrigger) {
1126 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_CREATE', $user);
1133 $this->error = $this->db->lasterror();
1138 $this->error = $this->db->lasterror();
1143 $this->db->commit();
1144 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1147 $this->db->rollback();
1151 $this->error = $this->db->lasterror();
1152 $this->db->rollback();
1166 global
$conf, $hookmanager;
1174 foreach ($this->lines as $line) {
1175 $line->fetch_optionals();
1179 $objFrom = clone $this;
1181 $objsoc =
new Societe($this->db);
1184 if (!empty($fromid) && $fromid != $this->socid) {
1185 if ($objsoc->fetch($fromid) > 0) {
1186 $this->socid = $objsoc->id;
1187 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1188 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1189 unset($this->fk_project);
1194 $objsoc->fetch($this->socid);
1200 if (!
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON') || !is_readable(DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
".php")) {
1201 $this->error =
'ErrorSetupNotComplete';
1206 $this->user_author_id = $user->id;
1207 $this->user_validation_id = 0;
1211 require_once DOL_DOCUMENT_ROOT.
"/core/modules/supplier_proposal/" .
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON').
'.php';
1213 $modSupplierProposal =
new $obj();
1214 '@phan-var-force ModeleNumRefSupplierProposal $modSupplierProposal';
1215 $this->
ref = $modSupplierProposal->getNextValue($objsoc, $this);
1218 $this->context[
'createfromclone'] =
'createfromclone';
1219 $result = $this->
create($user);
1226 if (is_object($hookmanager)) {
1227 $parameters = array(
'objFrom' => $objFrom);
1229 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1237 unset($this->context[
'createfromclone']);
1241 $this->db->commit();
1244 $this->db->rollback();
1256 public function fetch($rowid, $ref =
'')
1260 $sql =
"SELECT p.rowid, p.entity, p.ref, p.fk_soc as socid";
1261 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1262 $sql .=
", p.datec";
1263 $sql .=
", p.date_valid as datev";
1264 $sql .=
", p.date_livraison as delivery_date";
1265 $sql .=
", p.model_pdf, p.extraparams";
1266 $sql .=
", p.note_private, p.note_public";
1267 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1268 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1269 $sql .=
", p.fk_cond_reglement";
1270 $sql .=
", p.fk_mode_reglement";
1271 $sql .=
', p.fk_account';
1272 $sql .=
", p.fk_shipping_method";
1273 $sql .=
", p.last_main_doc";
1274 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1275 $sql .=
", c.label as statut_label";
1276 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc";
1277 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1278 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_propalst as c, ".MAIN_DB_PREFIX.
"supplier_proposal as p";
1279 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id';
1280 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid';
1281 $sql .=
" WHERE p.fk_statut = c.id";
1282 $sql .=
" AND p.entity IN (".getEntity(
'supplier_proposal').
")";
1284 $sql .=
" AND p.ref = '".$this->db->escape($ref).
"'";
1286 $sql .=
" AND p.rowid = ".((int) $rowid);
1289 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1290 $resql = $this->db->query($sql);
1292 if ($this->db->num_rows($resql)) {
1293 $obj = $this->db->fetch_object($resql);
1295 $this->
id = $obj->rowid;
1296 $this->entity = $obj->entity;
1298 $this->
ref = $obj->ref;
1299 $this->total_ht = $obj->total_ht;
1300 $this->total_tva = $obj->total_tva;
1301 $this->total_localtax1 = $obj->localtax1;
1302 $this->total_localtax2 = $obj->localtax2;
1303 $this->total_ttc = $obj->total_ttc;
1304 $this->socid = $obj->socid;
1305 $this->fk_project = $obj->fk_project;
1306 $this->model_pdf = $obj->model_pdf;
1307 $this->note = $obj->note_private;
1308 $this->note_private = $obj->note_private;
1309 $this->note_public = $obj->note_public;
1310 $this->statut = (int) $obj->fk_statut;
1311 $this->
status = (int) $obj->fk_statut;
1312 $this->datec = $this->db->jdate($obj->datec);
1313 $this->datev = $this->db->jdate($obj->datev);
1314 $this->date_creation = $this->db->jdate($obj->datec);
1315 $this->date = $this->date_creation;
1316 $this->date_validation = $this->db->jdate($obj->datev);
1317 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1318 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1320 $this->last_main_doc = $obj->last_main_doc;
1321 $this->mode_reglement_id = $obj->fk_mode_reglement;
1322 $this->mode_reglement_code = $obj->mode_reglement_code;
1323 $this->mode_reglement = $obj->mode_reglement;
1324 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1325 $this->cond_reglement_id = $obj->fk_cond_reglement;
1326 $this->cond_reglement_code = $obj->cond_reglement_code;
1327 $this->cond_reglement = $obj->cond_reglement;
1328 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1330 $this->extraparams = (array) (!empty($obj->extraparams) ? json_decode($obj->extraparams,
true) : array());
1332 $this->user_author_id = $obj->fk_user_author;
1333 $this->user_validation_id = $obj->fk_user_valid;
1334 $this->user_closing_id = $obj->fk_user_cloture;
1337 $this->fk_multicurrency = $obj->fk_multicurrency;
1338 $this->multicurrency_code = $obj->multicurrency_code;
1339 $this->multicurrency_tx = $obj->multicurrency_tx;
1340 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1341 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1342 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1344 $this->db->free($resql);
1350 $this->lines = array();
1353 $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,";
1354 $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,";
1355 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,';
1356 $sql .=
' d.ref_fourn as ref_produit_fourn, d.extraparams,';
1357 $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';
1358 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet as d";
1359 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON d.fk_product = p.rowid";
1360 $sql .=
" WHERE d.fk_supplier_proposal = ".((int) $this->
id);
1361 $sql .=
" ORDER by d.rang";
1363 $result = $this->db->query($sql);
1365 $num = $this->db->num_rows($result);
1369 $objp = $this->db->fetch_object($result);
1373 $line->rowid = $objp->rowid;
1374 $line->id = $objp->rowid;
1375 $line->fk_supplier_proposal = $objp->fk_supplier_proposal;
1376 $line->fk_parent_line = $objp->fk_parent_line;
1377 $line->product_type = $objp->product_type;
1378 $line->label = $objp->custom_label;
1379 $line->desc = $objp->description;
1380 $line->qty = $objp->qty;
1381 $line->tva_tx = $objp->tva_tx;
1382 $line->localtax1_tx = $objp->localtax1_tx;
1383 $line->localtax2_tx = $objp->localtax2_tx;
1384 $line->subprice = $objp->subprice;
1385 $line->fk_remise_except = $objp->fk_remise_except;
1386 $line->remise_percent = $objp->remise_percent;
1388 $line->info_bits = $objp->info_bits;
1389 $line->total_ht = $objp->total_ht;
1390 $line->total_tva = $objp->total_tva;
1391 $line->total_localtax1 = $objp->total_localtax1;
1392 $line->total_localtax2 = $objp->total_localtax2;
1393 $line->total_ttc = $objp->total_ttc;
1394 $line->fk_fournprice = $objp->fk_fournprice;
1395 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1396 $line->pa_ht = $marginInfos[0];
1397 $line->marge_tx = $marginInfos[1];
1398 $line->marque_tx = $marginInfos[2];
1399 $line->special_code = $objp->special_code;
1400 $line->rang = $objp->rang;
1402 $line->fk_product = $objp->fk_product;
1404 $line->ref = $objp->product_ref;
1405 $line->product_ref = $objp->product_ref;
1406 $line->libelle = $objp->product_label;
1407 $line->product_label = $objp->product_label;
1408 $line->product_desc = $objp->product_desc;
1409 $line->fk_product_type = $objp->fk_product_type;
1411 $line->ref_fourn = $objp->ref_produit_fourn;
1413 $line->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
1416 $line->fk_multicurrency = $objp->fk_multicurrency;
1417 $line->multicurrency_code = $objp->multicurrency_code;
1418 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1419 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1420 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1421 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1422 $line->fk_unit = $objp->fk_unit;
1424 $line->fetch_optionals();
1426 $this->lines[$i] = $line;
1430 $this->db->free($result);
1432 $this->error = $this->db->error();
1439 $this->error =
"Record Not Found";
1442 $this->error = $this->db->error();
1454 public function valid($user, $notrigger = 0)
1456 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1458 global
$conf, $langs;
1463 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'creer'))
1464 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'supplier_proposal',
'validate_advance'))) {
1468 $soc =
new Societe($this->db);
1469 $result = $soc->fetch($this->socid);
1476 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
1483 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1484 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
1485 $sql .=
" fk_statut = 1, date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
1486 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = 0";
1488 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
1489 $resql = $this->db->query($sql);
1496 if (!$error && !$notrigger) {
1498 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_VALIDATE', $user);
1506 $this->oldref = $this->ref;
1509 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
1511 $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).
"'";
1512 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1513 $resql = $this->db->query($sql);
1516 $this->error = $this->db->lasterror();
1518 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'supplier_proposal/".$this->db->escape($this->newref).
"'";
1519 $sql .=
" WHERE filepath = 'supplier_proposal/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
1520 $resql = $this->db->query($sql);
1523 $this->error = $this->db->lasterror();
1529 $dirsource =
$conf->supplier_proposal->dir_output.
'/'.$oldref;
1530 $dirdest =
$conf->supplier_proposal->dir_output.
'/'.$newref;
1531 if (!$error && file_exists($dirsource)) {
1532 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
1533 if (@rename($dirsource, $dirdest)) {
1536 $listoffiles =
dol_dir_list(
$conf->supplier_proposal->dir_output.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
1537 foreach ($listoffiles as $fileentry) {
1538 $dirsource = $fileentry[
'name'];
1539 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
1540 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
1541 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
1542 @rename($dirsource, $dirdest);
1551 $this->user_validation_id = $user->id;
1552 $this->datev = $now;
1553 $this->date_validation = $now;
1556 $result = $this->
add_contact($user->id,
'SALESREPFOLL',
'internal', 1);
1557 if ($result < 0 && $result != -2) {
1562 $this->db->commit();
1565 $this->db->rollback();
1569 dol_syslog(
"You don't have permission to validate supplier proposal", LOG_WARNING);
1598 if ($user->hasRight(
'supplier_proposal',
'creer')) {
1599 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal ";
1600 $sql .=
" SET date_livraison = ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1601 $sql .=
" WHERE rowid = ".((int) $this->
id);
1603 if ($this->db->query($sql)) {
1604 $this->delivery_date = $delivery_date;
1607 $this->error = $this->db->error();
1608 dol_syslog(get_class($this).
"::setDeliveryDate Erreur SQL");
1694 public function reopen($user, $status, $note =
'', $notrigger = 0)
1698 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1699 $sql .=
" SET fk_statut = ".((int) $status).
",";
1700 if (!empty($note)) {
1701 $sql .=
" note_private = '".$this->db->escape($note).
"',";
1703 $sql .=
" date_cloture = NULL, fk_user_cloture = NULL";
1704 $sql .=
" WHERE rowid = ".((int) $this->
id);
1708 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
1709 $resql = $this->db->query($sql);
1712 $this->errors[] =
"Error ".$this->db->lasterror();
1717 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_REOPEN', $user);
1727 if (!empty($this->errors)) {
1728 foreach ($this->errors as $errmsg) {
1729 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1730 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1733 $this->db->rollback();
1736 $this->statut = $status;
1739 $this->db->commit();
1755 global $langs,
$conf;
1765 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1766 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape($note).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".((int) $user->id);
1767 $sql .=
" WHERE rowid = ".((int) $this->
id);
1769 $resql = $this->db->query($sql);
1771 $this->statut = $status;
1774 $modelpdf =
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON_PDF_ODT_CLOSED', (empty($this->model_pdf) ?
'' : $this->model_pdf));
1775 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_REFUSED';
1778 $triggerName =
'PROPOSAL_SUPPLIER_CLOSE_SIGNED';
1779 $modelpdf =
getDolGlobalString(
'SUPPLIER_PROPOSAL_ADDON_PDF_ODT_TOBILL', (empty($this->model_pdf) ?
'' : $this->model_pdf));
1786 $triggerName =
'PROPOSAL_SUPPLIER_CLASSIFY_BILLED';
1791 $outputlangs = $langs;
1794 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
1795 $outputlangs->setDefaultLang($newlang);
1798 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1809 $this->db->commit();
1812 $this->db->rollback();
1816 $this->error = $this->db->lasterror();
1817 $this->errors[] = $this->db->lasterror();
1818 $this->db->rollback();
1833 dol_syslog(get_class($this).
"::updateOrCreatePriceFournisseur", LOG_DEBUG);
1834 foreach ($this->lines as $product) {
1835 if ($product->subprice <= 0) {
1840 $multicurrency_tx = 1;
1841 $fk_multicurrency = 0;
1843 if (empty($this->thirdparty)) {
1847 $ref_fourn = $product->ref_fourn;
1848 if (empty($ref_fourn)) {
1849 $ref_fourn = $product->ref_supplier;
1851 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1854 $productsupplier->id = $product->fk_product;
1856 $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);
1872 $price =
price2num($product->subprice * $product->qty,
'MU');
1873 $unitPrice =
price2num($product->subprice,
'MU');
1875 $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);
1877 $resql = $this->db->query($sql);
1879 $this->error = $this->db->error();
1880 $this->db->rollback();
1897 $price =
price2num($product->subprice * $product->qty,
'MU');
1899 $unitPrice =
price2num($product->subprice,
'MU');
1904 "'".$this->db->idate($now).
"'",
1905 (
int) $product->fk_product,
1906 (
int) $this->thirdparty->id,
1907 "'".$this->db->escape($product->ref_fourn).
"'",
1911 (
float) $product->tva_tx,
1914 if (isModEnabled(
"multicurrency")) {
1915 if (!empty($product->multicurrency_code)) {
1916 include_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
1918 $multicurrency->fetch(0, $product->multicurrency_code);
1919 if (!empty($multicurrency->id)) {
1920 $values[] = (int) $multicurrency->id;
1921 $values[] =
"'".$this->db->escape($product->multicurrency_code).
"'";
1922 $values[] = (float) $product->multicurrency_subprice;
1923 $values[] = (float) $product->multicurrency_total_ht;
1924 $values[] = (float) $multicurrency->rate->rate;
1926 for ($i = 0; $i < 5; $i++) {
1933 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'product_fournisseur_price ';
1934 $sql .=
'(datec, fk_product, fk_soc, ref_fourn, price, quantity, unitprice, tva_tx, fk_user';
1935 if (isModEnabled(
"multicurrency") && !empty($product->multicurrency_code)) {
1936 $sql .=
',fk_multicurrency, multicurrency_code, multicurrency_unitprice, multicurrency_price, multicurrency_tx';
1938 $sql .=
') VALUES ('.implode(
',', $values).
')';
1940 $resql = $this->db->query($sql);
1942 $this->error = $this->db->error();
1943 $this->db->rollback();
1959 global
$conf, $langs;
1963 if ($this->
status == self::STATUS_DRAFT) {
1964 dol_syslog(get_class($this).
"::setDraft already draft status", LOG_WARNING);
1968 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposal";
1969 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
1970 $sql .=
" WHERE rowid = ".((int) $this->
id);
1972 if ($this->db->query($sql)) {
1974 $this->oldcopy = clone $this;
1979 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_UNVALIDATE', $user);
1988 $this->db->commit();
1991 $this->db->rollback();
2014 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datec', $sortorder =
'DESC')
2022 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2023 $search_sale = $user->id;
2026 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2027 $sql .=
" p.rowid as supplier_proposalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
2028 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
2029 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"supplier_proposal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
2030 $sql .=
" WHERE p.entity IN (".getEntity(
'supplier_proposal').
")";
2031 $sql .=
" AND p.fk_soc = s.rowid";
2032 $sql .=
" AND p.fk_statut = c.id";
2034 $sql .=
" AND s.rowid = ".((int) $socid);
2037 $sql .=
" AND p.fk_statut = 0";
2039 if ($notcurrentuser > 0) {
2040 $sql .=
" AND p.fk_user_author <> ".((int) $user->id);
2043 if ($search_sale && $search_sale !=
'-1') {
2044 if ($search_sale == -2) {
2045 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
2046 } elseif ($search_sale > 0) {
2047 $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).
")";
2050 $sql .= $this->db->order($sortfield, $sortorder);
2051 $sql .= $this->db->plimit($limit, $offset);
2053 $result = $this->db->query($sql);
2055 $num = $this->db->num_rows($result);
2059 $obj = $this->db->fetch_object($result);
2061 if ($shortlist == 1) {
2062 $ga[$obj->supplier_proposalid] = $obj->ref;
2063 } elseif ($shortlist == 2) {
2064 $ga[$obj->supplier_proposalid] = $obj->ref.
' ('.$obj->name.
')';
2066 $ga[$i][
'id'] = $obj->supplier_proposalid;
2067 $ga[$i][
'ref'] = $obj->ref;
2068 $ga[$i][
'name'] = $obj->name;
2088 public function delete($user, $notrigger = 0)
2090 global
$conf, $langs;
2091 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2099 $result = $this->
call_trigger(
'PROPOSAL_SUPPLIER_DELETE', $user);
2107 $main = MAIN_DB_PREFIX.
'supplier_proposaldet';
2108 $ef = $main.
"_extrafields";
2109 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_supplier_proposal = ".((int) $this->
id).
")";
2110 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet WHERE fk_supplier_proposal = ".((int) $this->
id);
2111 if ($this->db->query($sql)) {
2112 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposal WHERE rowid = ".((int) $this->
id);
2113 if ($this->db->query($sqlef) && $this->db->query($sql)) {
2127 if ($conf->supplier_proposal->dir_output && !empty($this->
ref)) {
2128 $dir =
$conf->supplier_proposal->dir_output.
"/".$ref;
2129 $file = $dir.
"/".$ref.
".pdf";
2130 if (file_exists($file)) {
2134 $this->error =
'ErrorFailToDeleteFile';
2135 $this->errors = array(
'ErrorFailToDeleteFile');
2136 $this->db->rollback();
2140 if (file_exists($dir)) {
2143 $this->error =
'ErrorFailToDeleteDir';
2144 $this->errors = array(
'ErrorFailToDeleteDir');
2145 $this->db->rollback();
2158 dol_syslog(get_class($this).
"::delete erreur ".$errorflag.
" ".$this->error, LOG_ERR);
2163 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
2164 $this->db->commit();
2167 $this->error = $this->db->lasterror();
2168 $this->db->rollback();
2172 $this->error = $this->db->lasterror();
2173 $this->db->rollback();
2177 $this->error = $this->db->lasterror();
2178 $this->db->rollback();
2182 $this->db->rollback();
2195 $sql =
"SELECT c.rowid, ";
2196 $sql .=
" c.datec as date_creation, c.date_valid as date_validation, c.date_cloture as date_closure,";
2197 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_cloture";
2198 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as c";
2199 $sql .=
" WHERE c.rowid = ".((int) $id);
2201 $result = $this->db->query($sql);
2204 if ($this->db->num_rows($result)) {
2205 $obj = $this->db->fetch_object($result);
2207 $this->
id = $obj->rowid;
2209 $this->date_creation = $this->db->jdate($obj->date_creation);
2210 $this->date_validation = $this->db->jdate($obj->date_validation);
2211 $this->date_cloture = $this->db->jdate($obj->date_closure);
2213 $this->user_creation_id = $obj->fk_user_author;
2214 $this->user_validation_id = $obj->fk_user_valid;
2215 $this->user_closing_id = $obj->fk_user_cloture;
2217 $this->db->free($result);
2248 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
2250 $langs->load(
"supplier_proposal");
2251 $this->labelStatus[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraft");
2252 $this->labelStatus[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidated");
2253 $this->labelStatus[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSigned");
2254 $this->labelStatus[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSigned");
2255 $this->labelStatus[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosed");
2256 $this->labelStatusShort[
self::STATUS_DRAFT] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusDraftShort");
2257 $this->labelStatusShort[
self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusValidatedShort");
2258 $this->labelStatusShort[
self::STATUS_SIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusSignedShort");
2259 $this->labelStatusShort[
self::STATUS_NOTSIGNED] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusNotSignedShort");
2260 $this->labelStatusShort[
self::STATUS_CLOSE] = $langs->transnoentitiesnoconv(
"SupplierProposalStatusClosedShort");
2264 if ($status == self::STATUS_DRAFT) {
2265 $statusnew =
'status0';
2266 } elseif ($status == self::STATUS_VALIDATED) {
2267 $statusnew =
'status1';
2268 } elseif ($status == self::STATUS_SIGNED) {
2269 $statusnew =
'status4';
2270 } elseif ($status == self::STATUS_NOTSIGNED) {
2271 $statusnew =
'status9';
2272 } elseif ($status == self::STATUS_CLOSE) {
2273 $statusnew =
'status6';
2276 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusnew, $mode);
2291 global
$conf, $langs;
2297 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.date_cloture as datefin";
2298 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2299 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2300 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON p.fk_soc = sc.fk_soc";
2301 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2304 $sql .= $clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2305 if ($mode ==
'opened') {
2306 $sql .=
" AND p.fk_statut = 1";
2308 if ($mode ==
'signed') {
2309 $sql .=
" AND p.fk_statut = 2";
2312 $sql .=
" AND p.fk_soc = ".((int) $user->socid);
2315 $resql = $this->db->query($sql);
2317 $label = $labelShort =
'';
2320 if ($mode ==
'opened') {
2321 $delay_warning = !empty(
$conf->supplier_proposal->cloture->warning_delay) ?
$conf->supplier_proposal->cloture->warning_delay : 0;
2323 $label = $langs->trans(
"SupplierProposalsToClose");
2324 $labelShort = $langs->trans(
"ToAcceptRefuse");
2326 if ($mode ==
'signed') {
2327 $delay_warning = !empty(
$conf->supplier_proposal->facturation->warning_delay) ?
$conf->supplier_proposal->facturation->warning_delay : 0;
2329 $label = $langs->trans(
"SupplierProposalsToProcess");
2330 $labelShort = $langs->trans(
"ToClose");
2334 $response->warning_delay = $delay_warning / 60 / 60 / 24;
2335 $response->label = $label;
2336 $response->labelShort = $labelShort;
2337 $response->url = DOL_URL_ROOT.
'/supplier_proposal/list.php?search_status='.$status;
2341 while ($obj = $this->db->fetch_object($resql)) {
2342 $response->nbtodo++;
2343 if ($mode ==
'opened') {
2344 $datelimit = $this->db->jdate($obj->datefin);
2345 if ($datelimit < ($now - $delay_warning)) {
2346 $response->nbtodolate++;
2354 $this->error = $this->db->lasterror();
2369 global $user, $langs,
$conf;
2374 $sql =
"SELECT rowid";
2375 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
2376 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
2377 $sql .= $this->db->plimit(100);
2379 $resql = $this->db->query($sql);
2381 $num_prods = $this->db->num_rows($resql);
2383 while ($i < $num_prods) {
2385 $row = $this->db->fetch_row($resql);
2386 $prodids[$i] = $row[0];
2392 $this->
ref =
'SPECIMEN';
2393 $this->specimen = 1;
2395 $this->date = time();
2396 $this->cond_reglement_id = 1;
2397 $this->cond_reglement_code =
'RECEP';
2398 $this->mode_reglement_id = 7;
2399 $this->mode_reglement_code =
'CHQ';
2400 $this->note_public =
'This is a comment (public)';
2401 $this->note_private =
'This is a comment (private)';
2405 while ($xnbp < $nbp) {
2407 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
2409 $line->subprice = 100;
2410 $line->tva_tx = 19.6;
2411 $line->localtax1_tx = 0;
2412 $line->localtax2_tx = 0;
2414 $line->total_ht = 50;
2415 $line->total_ttc = 59.8;
2416 $line->total_tva = 9.8;
2417 $line->remise_percent = 50;
2419 $line->total_ht = 100;
2420 $line->total_ttc = 119.6;
2421 $line->total_tva = 19.6;
2422 $line->remise_percent = 00;
2425 if ($num_prods > 0) {
2426 $prodid = mt_rand(1, $num_prods);
2427 $line->fk_product = $prodids[$prodid];
2430 $this->lines[$xnbp] = $line;
2432 $this->total_ht += $line->total_ht;
2433 $this->total_tva += $line->total_tva;
2434 $this->total_ttc += $line->total_ttc;
2449 global
$conf, $user;
2451 $this->nb = array();
2454 $sql =
"SELECT count(p.rowid) as nb";
2455 $sql .=
" FROM ".MAIN_DB_PREFIX.
"supplier_proposal as p";
2456 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
2457 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2458 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
2459 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
2462 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'supplier_proposal').
")";
2464 $resql = $this->db->query($sql);
2467 while ($obj = $this->db->fetch_object($resql)) {
2468 $this->nb[
"supplier_proposals"] = $obj->nb;
2470 $this->db->free($resql);
2474 $this->error = $this->db->lasterror();
2489 global
$conf, $db, $langs;
2490 $langs->load(
"supplier_proposal");
2499 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
2500 foreach ($dirmodels as $reldir) {
2501 $dir =
dol_buildpath($reldir.
"core/modules/supplier_proposal/");
2504 $mybool = ((bool) @include_once $dir.$file) || $mybool;
2512 $obj =
new $classname();
2513 '@phan-var-force ModeleNumRefSupplierProposal $obj';
2515 $numref = $obj->getNextValue($soc, $this);
2517 if ($numref !=
"") {
2520 $this->error = $obj->error;
2524 $langs->load(
"errors");
2525 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"SupplierProposal"));
2538 global
$conf, $langs, $menumanager;
2540 $langs->load(
'supplier_proposal');
2543 return [
'optimize' => $langs->trans(
"ShowSupplierProposal")];
2546 $option = $params[
'option'] ??
'';
2549 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"SupplierProposal").
'</u>';
2550 if (isset($this->
status)) {
2551 $datas[
'picto'] .=
' '.$this->getLibStatut(5);
2553 if (!empty($this->
ref)) {
2554 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
2556 if (!empty($this->ref_fourn)) {
2557 $datas[
'ref_supplier'] =
'<br><b>'.$langs->trans(
'RefSupplier').
':</b> '.$this->ref_fourn;
2559 if (!empty($this->total_ht)) {
2560 $datas[
'amount_ht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
$conf->currency);
2562 if (!empty($this->total_tva)) {
2563 $datas[
'amount_vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
$conf->currency);
2565 if (!empty($this->total_ttc)) {
2566 $datas[
'amount_ttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency);
2583 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
2585 global $langs,
$conf, $user, $hookmanager;
2587 if (!empty(
$conf->dol_no_mouse_hover)) {
2595 'objecttype' => $this->element,
2596 'option' => $option,
2598 $classfortooltip =
'classfortooltip';
2601 $classfortooltip =
'classforajaxtooltip';
2602 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
2608 if ($option ==
'') {
2609 $url = DOL_URL_ROOT.
'/supplier_proposal/card.php?id='.$this->
id.$get_params;
2611 if ($option ==
'document') {
2612 $url = DOL_URL_ROOT.
'/supplier_proposal/document.php?id='.$this->
id.$get_params;
2615 if ($option !==
'nolink') {
2617 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
2618 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
2619 $add_save_lastsearch_values = 1;
2621 if ($add_save_lastsearch_values) {
2622 $url .=
'&save_lastsearch_values=1';
2627 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
2629 $label = $langs->trans(
"ShowSupplierProposal");
2630 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
2632 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
2633 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
2636 $linkstart =
'<a href="'.$url.
'"';
2637 $linkstart .= $linkclose.
'>';
2640 $result .= $linkstart;
2642 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
2644 if ($withpicto != 2) {
2645 $result .= $this->ref;
2647 $result .= $linkend;
2649 if ($addlinktonotes) {
2650 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
2653 $result .=
' <span class="note inline-block">';
2654 $result .=
'<a href="'.DOL_URL_ROOT.
'/supplier_proposal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
2659 $result .=
'</span>';
2663 $hookmanager->initHooks(array($this->element .
'dao'));
2664 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
2665 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
2667 $result = $hookmanager->resPrint;
2669 $result .= $hookmanager->resPrint;
2683 $sql =
'SELECT pt.rowid, pt.label as custom_label, pt.description, pt.fk_product, pt.fk_remise_except,';
2684 $sql .=
' pt.qty, pt.tva_tx, pt.vat_src_code, pt.remise_percent, pt.subprice, pt.info_bits,';
2685 $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,';
2686 $sql .=
' pt.product_type, pt.rang, pt.fk_parent_line, pt.extraparams,';
2687 $sql .=
' p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid,';
2688 $sql .=
' p.description as product_desc, pt.ref_fourn as ref_supplier,';
2689 $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';
2690 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pt';
2691 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pt.fk_product=p.rowid';
2692 $sql .=
' WHERE pt.fk_supplier_proposal = '.((int) $this->
id);
2693 $sql .=
' ORDER BY pt.rang ASC, pt.rowid';
2695 dol_syslog(get_class($this).
'::getLinesArray', LOG_DEBUG);
2696 $resql = $this->db->query($sql);
2698 $num = $this->db->num_rows($resql);
2702 $obj = $this->db->fetch_object($resql);
2705 $this->lines[$i]->id = $obj->rowid;
2706 $this->lines[$i]->rowid = $obj->rowid;
2707 $this->lines[$i]->fetch_optionals();
2708 $this->lines[$i]->label = $obj->custom_label;
2709 $this->lines[$i]->description = $obj->description;
2710 $this->lines[$i]->fk_product = $obj->fk_product;
2711 $this->lines[$i]->ref = $obj->ref;
2712 $this->lines[$i]->product_label = $obj->product_label;
2713 $this->lines[$i]->product_desc = $obj->product_desc;
2714 $this->lines[$i]->fk_product_type = $obj->fk_product_type;
2715 $this->lines[$i]->product_type = $obj->product_type;
2716 $this->lines[$i]->qty = $obj->qty;
2717 $this->lines[$i]->subprice = $obj->subprice;
2718 $this->lines[$i]->fk_remise_except = $obj->fk_remise_except;
2719 $this->lines[$i]->remise_percent = $obj->remise_percent;
2720 $this->lines[$i]->tva_tx = $obj->tva_tx;
2721 $this->lines[$i]->vat_src_code = $obj->vat_src_code;
2722 $this->lines[$i]->info_bits = $obj->info_bits;
2723 $this->lines[$i]->total_ht = $obj->total_ht;
2724 $this->lines[$i]->total_tva = $obj->total_tva;
2725 $this->lines[$i]->total_ttc = $obj->total_ttc;
2726 $this->lines[$i]->fk_fournprice = $obj->fk_fournprice;
2727 $marginInfos =
getMarginInfos($obj->subprice, $obj->remise_percent, $obj->tva_tx, $obj->localtax1_tx, $obj->localtax2_tx, $this->lines[$i]->fk_fournprice, $obj->pa_ht);
2728 $this->lines[$i]->pa_ht = $marginInfos[0];
2729 $this->lines[$i]->marge_tx = $marginInfos[1];
2730 $this->lines[$i]->marque_tx = $marginInfos[2];
2731 $this->lines[$i]->fk_parent_line = $obj->fk_parent_line;
2732 $this->lines[$i]->special_code = $obj->special_code;
2733 $this->lines[$i]->rang = $obj->rang;
2735 $this->lines[$i]->ref_fourn = $obj->ref_supplier;
2736 $this->lines[$i]->ref_supplier = $obj->ref_supplier;
2738 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
2741 $this->lines[$i]->fk_multicurrency = $obj->fk_multicurrency;
2742 $this->lines[$i]->multicurrency_code = $obj->multicurrency_code;
2743 $this->lines[$i]->multicurrency_subprice = $obj->multicurrency_subprice;
2744 $this->lines[$i]->multicurrency_total_ht = $obj->multicurrency_total_ht;
2745 $this->lines[$i]->multicurrency_total_tva = $obj->multicurrency_total_tva;
2746 $this->lines[$i]->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2747 $this->lines[$i]->fk_unit = $obj->fk_unit;
2751 $this->db->free($resql);
2755 $this->error = $this->db->error();
2771 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2775 $langs->load(
"supplier_proposal");
2776 $outputlangs->load(
"products");
2781 if ($this->model_pdf) {
2782 $modele = $this->model_pdf;
2788 if (empty($modele)) {
2792 $modelpath =
"core/modules/supplier_proposal/doc/";
2794 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2826 'supplier_proposaldet'
2844 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
2846 $return =
'<div class="box-flex-item box-flex-grow-zero">';
2847 $return .=
'<div class="info-box info-box-sm">';
2848 $return .=
'<span class="info-box-icon bg-infobox-action">';
2851 $return .=
'</span>';
2852 $return .=
'<div class="info-box-content">';
2853 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
2854 if ($selected >= 0) {
2855 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
2857 if (property_exists($this,
'socid')) {
2858 $return .=
'<span class="info-box-ref"> | '.$this->socid.
'</span>';
2860 if (property_exists($this,
'delivery_date')) {
2861 $return .=
'<br><span class="opacitymedium">'.$langs->trans(
"DateEnd").
'</span> : <span class="info-box-label">'.
dol_print_date($this->delivery_date).
'</span>';
2863 if (property_exists($this,
'total_ttc')) {
2864 $return .=
'<br><span class="opacitymedium" >'.$langs->trans(
"AmountHT").
' : </span><span class="info-box-label amount">'.
price($this->total_ttc).
'</span>';
2866 if (method_exists($this,
'getLibStatut')) {
2867 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
2869 $return .=
'</div>';
2870 $return .=
'</div>';
2871 $return .=
'</div>';
2895 public $element =
'supplier_proposaldet';
2900 public $table_element =
'supplier_proposaldet';
2925 public $fk_supplier_proposal;
2930 public $fk_parent_line;
2947 public $fk_product_type;
2966 public $vat_src_code;
2976 public $remise_percent;
2981 public $fk_remise_except;
2991 public $fk_fournprice;
3009 public $special_code;
3017 public $info_bits = 0;
3055 public $product_ref;
3068 public $product_label;
3080 public $product_desc;
3085 public $localtax1_tx;
3089 public $localtax2_tx;
3093 public $localtax1_type;
3097 public $localtax2_type;
3101 public $total_localtax1;
3105 public $total_localtax2;
3110 public $skip_update_total;
3119 public $ref_supplier;
3125 public $fk_multicurrency;
3130 public $multicurrency_code;
3134 public $multicurrency_subprice;
3138 public $multicurrency_total_ht;
3142 public $multicurrency_total_tva;
3146 public $multicurrency_total_ttc;
3166 $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,';
3167 $sql .=
' pd.date_start, pd.date_end,';
3168 $sql .=
' pd.remise, pd.remise_percent, pd.fk_remise_except, pd.subprice,';
3169 $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,';
3170 $sql .=
' pd.localtax1_tx, pd.localtax2_tx, pd.total_localtax1, pd.total_localtax2,';
3171 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc,';
3172 $sql .=
' pd.product_type, pd.ref_fourn as ref_produit_fourn, pd.extraparams,';
3173 $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';
3174 $sql .=
' FROM '.MAIN_DB_PREFIX.
'supplier_proposaldet as pd';
3175 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON pd.fk_product = p.rowid';
3176 $sql .=
' WHERE pd.rowid = '.((int) $rowid);
3178 $result = $this->db->query($sql);
3180 if ($objp = $this->db->fetch_object($result)) {
3181 $this->
id = $objp->rowid;
3182 $this->fk_supplier_proposal = $objp->fk_supplier_proposal;
3183 $this->fk_parent_line = $objp->fk_parent_line;
3184 $this->label = $objp->custom_label;
3185 $this->desc = $objp->description;
3186 $this->qty = $objp->qty;
3187 $this->subprice = $objp->subprice;
3188 $this->tva_tx = $objp->tva_tx;
3189 $this->remise_percent = $objp->remise_percent;
3190 $this->fk_remise_except = $objp->fk_remise_except;
3191 $this->fk_product = $objp->fk_product;
3192 $this->info_bits = $objp->info_bits;
3193 $this->date_start = $this->db->jdate($objp->date_start);
3194 $this->date_end = $this->db->jdate($objp->date_end);
3196 $this->total_ht = $objp->total_ht;
3197 $this->total_tva = $objp->total_tva;
3198 $this->total_ttc = $objp->total_ttc;
3200 $this->fk_fournprice = $objp->fk_fournprice;
3202 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
3203 $this->pa_ht = $marginInfos[0];
3204 $this->marge_tx = $marginInfos[1];
3205 $this->marque_tx = $marginInfos[2];
3207 $this->special_code = $objp->special_code;
3208 $this->product_type = $objp->product_type;
3209 $this->rang = $objp->rang;
3211 $this->
ref = $objp->product_ref;
3212 $this->product_ref = $objp->product_ref;
3213 $this->libelle = $objp->product_label;
3214 $this->product_label = $objp->product_label;
3215 $this->product_desc = $objp->product_desc;
3217 $this->ref_fourn = $objp->ref_produit_fourn;
3219 $this->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
3222 $this->fk_multicurrency = $objp->fk_multicurrency;
3223 $this->multicurrency_code = $objp->multicurrency_code;
3224 $this->multicurrency_subprice = $objp->multicurrency_subprice;
3225 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
3226 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
3227 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
3228 $this->fk_unit = $objp->fk_unit;
3230 $this->db->free($result);
3248 global
$conf, $langs, $user;
3252 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
3255 if (empty($this->tva_tx)) {
3258 if (empty($this->vat_src_code)) {
3259 $this->vat_src_code =
'';
3261 if (empty($this->localtax1_tx)) {
3262 $this->localtax1_tx = 0;
3264 if (empty($this->localtax2_tx)) {
3265 $this->localtax2_tx = 0;
3267 if (empty($this->localtax1_type)) {
3268 $this->localtax1_type =
'';
3270 if (empty($this->localtax2_type)) {
3271 $this->localtax2_type =
'';
3273 if (empty($this->total_localtax1)) {
3274 $this->total_localtax1 = 0;
3276 if (empty($this->total_localtax2)) {
3277 $this->total_localtax2 = 0;
3279 if (empty($this->rang)) {
3282 if (empty($this->remise_percent)) {
3283 $this->remise_percent = 0;
3285 if (empty($this->info_bits)) {
3286 $this->info_bits = 0;
3288 if (empty($this->special_code)) {
3289 $this->special_code = 0;
3291 if (empty($this->fk_parent_line)) {
3292 $this->fk_parent_line = 0;
3294 if (empty($this->fk_fournprice)) {
3295 $this->fk_fournprice = 0;
3297 if (empty($this->fk_unit)) {
3300 if (empty($this->subprice)) {
3301 $this->subprice = 0;
3304 if (empty($this->pa_ht)) {
3309 if ($this->pa_ht == 0) {
3310 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3314 $this->pa_ht = $result;
3319 if ($this->product_type < 0) {
3326 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'supplier_proposaldet';
3327 $sql .=
' (fk_supplier_proposal, fk_parent_line, label, description, fk_product, product_type,';
3328 $sql .=
' date_start, date_end,';
3329 $sql .=
' fk_remise_except, qty, tva_tx, vat_src_code, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
3330 $sql .=
' subprice, remise_percent, ';
3331 $sql .=
' info_bits, ';
3332 $sql .=
' total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, fk_product_fournisseur_price, buy_price_ht, special_code, rang,';
3333 $sql .=
' ref_fourn,';
3334 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc, fk_unit)';
3335 $sql .=
" VALUES (".$this->fk_supplier_proposal.
",";
3336 $sql .=
" ".($this->fk_parent_line > 0 ? ((int) $this->fk_parent_line) :
"null").
",";
3337 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
3338 $sql .=
" '".$this->db->escape($this->desc).
"',";
3339 $sql .=
" ".($this->fk_product ? ((int) $this->fk_product) :
"null").
",";
3340 $sql .=
" '".$this->db->escape((
string) $this->product_type).
"',";
3341 $sql .=
" ".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
",";
3342 $sql .=
" ".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
",";
3343 $sql .=
" ".($this->fk_remise_except ? ((int) $this->fk_remise_except) :
"null").
",";
3344 $sql .=
" ".price2num($this->qty,
'MS').
",";
3345 $sql .=
" ".price2num($this->tva_tx).
",";
3346 $sql .=
" '".$this->db->escape($this->vat_src_code).
"',";
3347 $sql .=
" ".price2num($this->localtax1_tx).
",";
3348 $sql .=
" ".price2num($this->localtax2_tx).
",";
3349 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
3350 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
3351 $sql .=
" ".price2num($this->subprice,
'MU') .
",";
3352 $sql .=
" ".((float) $this->remise_percent).
",";
3353 $sql .=
" ".(isset($this->info_bits) ? ((int) $this->info_bits) :
"null").
",";
3354 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
3355 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
3356 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
3357 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
3358 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
3359 $sql .=
" ".(!empty($this->fk_fournprice) ? ((int) $this->fk_fournprice) :
"null").
",";
3360 $sql .=
" ".(isset($this->pa_ht) ?
price2num($this->pa_ht,
'MU') :
"null").
",";
3361 $sql .=
' '.((int) $this->special_code).
',';
3362 $sql .=
' '.((int) $this->rang).
',';
3363 $sql .=
" '".$this->db->escape($this->ref_fourn).
"'";
3364 $sql .=
", ".($this->fk_multicurrency > 0 ? ((int) $this->fk_multicurrency) :
'null');
3365 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
3366 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
3367 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
3368 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
3369 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
3370 $sql .=
", ".($this->fk_unit ? ((int) $this->fk_unit) :
'null');
3373 dol_syslog(get_class($this).
'::insert', LOG_DEBUG);
3374 $resql = $this->db->query($sql);
3376 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'supplier_proposaldet');
3385 if (!$error && !$notrigger) {
3387 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_INSERT', $user);
3389 $this->db->rollback();
3395 $this->db->commit();
3398 $this->error = $this->db->error().
" sql=".$sql;
3399 $this->db->rollback();
3410 public function delete($user)
3416 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"supplier_proposaldet";
3417 $sql .=
" WHERE rowid = ".((int) $this->
id);
3419 if ($this->db->query($sql)) {
3425 dol_syslog(get_class($this).
"::delete error -4 ".$this->error, LOG_ERR);
3430 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_DELETE', $user);
3432 $this->db->rollback();
3437 $this->db->commit();
3441 $this->error = $this->db->error().
" sql=".$sql;
3442 $this->db->rollback();
3455 global
$conf, $langs, $user;
3460 if (empty($this->tva_tx)) {
3463 if (empty($this->localtax1_tx)) {
3464 $this->localtax1_tx = 0;
3466 if (empty($this->localtax2_tx)) {
3467 $this->localtax2_tx = 0;
3469 if (empty($this->total_localtax1)) {
3470 $this->total_localtax1 = 0;
3472 if (empty($this->total_localtax2)) {
3473 $this->total_localtax2 = 0;
3475 if (empty($this->localtax1_type)) {
3476 $this->localtax1_type =
'';
3478 if (empty($this->localtax2_type)) {
3479 $this->localtax2_type =
'';
3481 if (empty($this->marque_tx)) {
3482 $this->marque_tx = 0;
3484 if (empty($this->marge_tx)) {
3485 $this->marge_tx = 0;
3487 if (empty($this->remise_percent)) {
3488 $this->remise_percent = 0;
3490 if (empty($this->info_bits)) {
3491 $this->info_bits = 0;
3493 if (empty($this->special_code)) {
3494 $this->special_code = 0;
3496 if (empty($this->fk_parent_line)) {
3497 $this->fk_parent_line = 0;
3499 if (empty($this->fk_fournprice)) {
3500 $this->fk_fournprice = 0;
3502 if (empty($this->fk_unit)) {
3505 if (empty($this->subprice)) {
3506 $this->subprice = 0;
3509 if (empty($this->pa_ht)) {
3514 if ($this->pa_ht == 0) {
3515 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
3519 $this->pa_ht = $result;
3526 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3527 $sql .=
" description='".$this->db->escape($this->desc).
"'";
3528 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
3529 $sql .=
" , product_type=".((int) $this->product_type);
3530 $sql .=
" , date_start=".($this->date_start ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
3531 $sql .=
" , date_end=".($this->date_end ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
3532 $sql .=
" , tva_tx='".price2num($this->tva_tx).
"'";
3533 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
3534 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
3535 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
3536 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
3537 $sql .=
" , qty='".price2num($this->qty).
"'";
3538 $sql .=
" , subprice=".price2num($this->subprice);
3539 $sql .=
" , remise_percent=".price2num($this->remise_percent);
3540 $sql .=
" , info_bits='".$this->db->escape((
string) $this->info_bits).
"'";
3541 if (empty($this->skip_update_total)) {
3542 $sql .=
" , total_ht=".price2num($this->total_ht);
3543 $sql .=
" , total_tva=".price2num($this->total_tva);
3544 $sql .=
" , total_ttc=".price2num($this->total_ttc);
3545 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
3546 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
3548 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ?
"'".$this->db->escape((
string) $this->fk_fournprice).
"'" :
"null");
3549 $sql .=
" , buy_price_ht=".price2num($this->pa_ht);
3550 $sql .=
" , special_code=".((int) $this->special_code);
3551 $sql .=
" , fk_parent_line=".($this->fk_parent_line > 0 ? $this->fk_parent_line :
"null");
3552 if (!empty($this->rang)) {
3553 $sql .=
", rang=".((int) $this->rang);
3555 $sql .=
" , ref_fourn=".(!empty($this->ref_fourn) ?
"'".$this->db->escape($this->ref_fourn).
"'" :
"null");
3556 $sql .=
" , fk_unit=".($this->fk_unit ? $this->fk_unit :
'null');
3559 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
3560 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
3561 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
3562 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
3564 $sql .=
" WHERE rowid = ".((int) $this->
id);
3566 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3567 $resql = $this->db->query($sql);
3576 if (!$error && !$notrigger) {
3578 $result = $this->
call_trigger(
'LINESUPPLIER_PROPOSAL_MODIFY', $user);
3580 $this->db->rollback();
3586 $this->db->commit();
3589 $this->error = $this->db->error();
3590 $this->db->rollback();
3608 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"supplier_proposaldet SET";
3609 $sql .=
" total_ht=".price2num($this->total_ht,
'MT');
3610 $sql .=
",total_tva=".price2num($this->total_tva,
'MT');
3611 $sql .=
",total_ttc=".price2num($this->total_ttc,
'MT');
3612 $sql .=
" WHERE rowid = ".((int) $this->
id);
3614 dol_syslog(
"SupplierProposalLine::update_total", LOG_DEBUG);
3616 $resql = $this->db->query($sql);
3618 $this->db->commit();
3621 $this->error = $this->db->error();
3622 $this->db->rollback();
Parent class of all other business classes (invoices, contracts, proposals, orders,...
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteEcmFiles($mode=0)
Delete related files of object in database.
update_price($exclspec=0, $roundingadjust='auto', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
defineBuyPrice($unitPrice=0.0, $discountPercent=0.0, $fk_product=0)
Get buy price to use for margin calculation.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setErrorsFromObject($object)
setErrorsFromObject
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check if an object id or ref exists If you don't need or want to instantiate the object and just need...
updateRangOfLine($rowid, $rang)
Update position of line (rang)
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
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.
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.
getNextNumRef($soc)
Returns the reference to the following non used Proposal used depending on the active numbering modul...
fetch($rowid, $ref='')
Load a proposal from database and its ligne array.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
createFromClone(User $user, $fromid=0)
Load an object from its id and create a new one in database.
initAsSpecimen()
Initialise an instance with random values.
const STATUS_NOTSIGNED
Not signed quote, canceled.
const STATUS_DRAFT
Draft status.
liste_array($shortlist=0, $draft=0, $notcurrentuser=0, $socid=0, $limit=0, $offset=0, $sortfield='p.datec', $sortorder='DESC')
Return list of askprice (eventually filtered on user) into an array.
setDeliveryDate($user, $delivery_date)
Set delivery date.
__construct($db, $socid=0, $supplier_proposalid=0)
Constructor.
LibStatut($status, $mode=1)
Return label of a status (draft, validated, ...)
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
updateOrCreatePriceFournisseur($user)
Add or update supplier price according to result of proposal.
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.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
getMarginInfos($pv_ht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $pa_ht)
Return an array with margins information of a line.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller=null, $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.