44require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propaleligne.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
48require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
66 public $element =
'propal';
71 public $table_element =
'propal';
76 public $table_element_line =
'propaldet';
81 public $fk_element =
'fk_propal';
86 public $picto =
'propal';
92 public $restrictiononfksoc = 1;
123 public $ref_customer;
157 public $date_validation;
162 public $date_signature;
167 public $user_signature;
184 public $delivery_date;
190 public $fin_validite;
195 public $user_author_id;
225 public $cond_reglement_code;
230 public $cond_reglement;
235 public $cond_reglement_doc;
240 public $mode_reglement_code;
245 public $mode_reglement;
252 public $deposit_percent;
264 public $address_type;
275 public $availability_id;
282 public $fk_availability;
287 public $availability_code;
292 public $availability;
297 public $duree_validite;
302 public $demand_reason_id;
307 public $demand_reason_code;
312 public $demand_reason;
317 public $warehouse_id;
322 public $lines = array();
329 public $labelStatus = array();
330 public $labelStatusShort = array();
361 public $fields = array(
362 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
363 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 15,
'index' => 1),
364 'ref' => array(
'type' =>
'varchar(30)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 20),
365 'ref_client' => array(
'type' =>
'varchar(255)',
'label' =>
'RefCustomer',
'enabled' => 1,
'visible' => -1,
'position' => 22),
366 'ref_ext' => array(
'type' =>
'varchar(255)',
'label' =>
'RefExt',
'enabled' => 1,
'visible' => 0,
'position' => 40),
367 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php',
'label' =>
'ThirdParty',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'position' => 23),
368 'fk_projet' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label' =>
'Fk projet',
'enabled' =>
"isModEnabled('project')",
'visible' => -1,
'position' => 24),
369 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 25),
370 'datec' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -1,
'position' => 55),
371 'datep' => array(
'type' =>
'date',
'label' =>
'Date',
'enabled' => 1,
'visible' => -1,
'position' => 60),
372 'fin_validite' => array(
'type' =>
'datetime',
'label' =>
'DateEnd',
'enabled' => 1,
'visible' => -1,
'position' => 65),
373 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -1,
'position' => 70),
374 'date_cloture' => array(
'type' =>
'datetime',
'label' =>
'DateClosing',
'enabled' => 1,
'visible' => -1,
'position' => 75),
375 'fk_user_author' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'Fk user author',
'enabled' => 1,
'visible' => -1,
'position' => 80),
376 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'notnull' => -1,
'position' => 85),
377 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'enabled' => 1,
'visible' => -1,
'position' => 90),
378 'fk_user_cloture' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'Fk user cloture',
'enabled' => 1,
'visible' => -1,
'position' => 95),
379 'price' => array(
'type' =>
'double',
'label' =>
'Price',
'enabled' => 1,
'visible' => -1,
'position' => 105),
380 'total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalHT',
'enabled' => 1,
'visible' => -1,
'position' => 125,
'isameasure' => 1),
381 'total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'VAT',
'enabled' => 1,
'visible' => -1,
'position' => 130,
'isameasure' => 1),
382 'localtax1' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax1',
'enabled' => 1,
'visible' => -1,
'position' => 135,
'isameasure' => 1),
383 'localtax2' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax2',
'enabled' => 1,
'visible' => -1,
'position' => 140,
'isameasure' => 1),
384 'total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalTTC',
'enabled' => 1,
'visible' => -1,
'position' => 145,
'isameasure' => 1),
385 'fk_account' => array(
'type' =>
'integer',
'label' =>
'BankAccount',
'enabled' =>
'isModEnabled("bank")',
'visible' => -1,
'position' => 150),
386 'fk_currency' => array(
'type' =>
'varchar(3)',
'label' =>
'Currency',
'enabled' => 1,
'visible' => -1,
'position' => 155),
387 'fk_cond_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentTerm',
'enabled' => 1,
'visible' => -1,
'position' => 160),
388 'deposit_percent' => array(
'type' =>
'varchar(63)',
'label' =>
'DepositPercent',
'enabled' => 1,
'visible' => -1,
'position' => 161),
389 'fk_mode_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentMode',
'enabled' => 1,
'visible' => -1,
'position' => 165),
390 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 170),
391 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 175),
392 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'PDFTemplate',
'enabled' => 1,
'visible' => 0,
'position' => 180),
393 'date_livraison' => array(
'type' =>
'date',
'label' =>
'DateDeliveryPlanned',
'enabled' => 1,
'visible' => -1,
'position' => 185),
394 'fk_shipping_method' => array(
'type' =>
'integer',
'label' =>
'ShippingMethod',
'enabled' => 1,
'visible' => -1,
'position' => 190),
395 'fk_warehouse' => array(
'type' =>
'integer:Entrepot:product/stock/class/entrepot.class.php',
'label' =>
'Fk warehouse',
'enabled' =>
'isModEnabled("stock")',
'visible' => -1,
'position' => 191),
396 'fk_availability' => array(
'type' =>
'integer',
'label' =>
'Availability',
'enabled' => 1,
'visible' => -1,
'position' => 195),
397 'fk_delivery_address' => array(
'type' =>
'integer',
'label' =>
'DeliveryAddress',
'enabled' => 1,
'visible' => 0,
'position' => 200),
398 'fk_input_reason' => array(
'type' =>
'integer',
'label' =>
'InputReason',
'enabled' => 1,
'visible' => -1,
'position' => 205),
399 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 215),
400 'fk_incoterms' => array(
'type' =>
'integer',
'label' =>
'IncotermCode',
'enabled' =>
'isModEnabled("incoterm")',
'visible' => -1,
'position' => 220),
401 'location_incoterms' => array(
'type' =>
'varchar(255)',
'label' =>
'IncotermLabel',
'enabled' =>
'isModEnabled("incoterm")',
'visible' => -1,
'position' => 225),
402 'fk_multicurrency' => array(
'type' =>
'integer',
'label' =>
'MulticurrencyID',
'enabled' => 1,
'visible' => -1,
'position' => 230),
403 'multicurrency_code' => array(
'type' =>
'varchar(255)',
'label' =>
'MulticurrencyCurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 235),
404 'multicurrency_tx' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyRate',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 240,
'isameasure' => 1),
405 'multicurrency_total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountHT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 245,
'isameasure' => 1),
406 'multicurrency_total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountVAT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 250,
'isameasure' => 1),
407 'multicurrency_total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountTTC',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 255,
'isameasure' => 1),
408 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'LastMainDoc',
'enabled' => 1,
'visible' => -1,
'position' => 260),
409 'fk_statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Status',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 500),
410 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 900),
451 $this->ismultientitymanaged = 1;
452 $this->socid = $socid;
453 $this->
id = $propalid;
455 $this->duree_validite =
getDolGlobalInt(
'PROPALE_VALIDITY_DURATION', 0);
471 public function add_product($idproduct, $qty, $remise_percent = 0)
474 global
$conf, $mysoc;
480 dol_syslog(get_class($this).
"::add_product $idproduct, $qty, $remise_percent");
481 if ($idproduct > 0) {
482 $prod =
new Product($this->db);
483 $prod->fetch($idproduct);
485 $productdesc = $prod->description;
487 $tva_tx = (string)
get_default_tva($mysoc, $this->thirdparty, $prod->id);
489 if (empty($tva_tx)) {
494 $localtax1_tx =
get_localtax($tva_tx, 1, $mysoc, $this->thirdparty, $tva_npr);
495 $localtax2_tx =
get_localtax($tva_tx, 2, $mysoc, $this->thirdparty, $tva_npr);
498 if (
$conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
499 $price = $prod->multiprices[$this->thirdparty->price_level];
501 $price = $prod->price;
506 $line->fk_product = $idproduct;
507 $line->desc = $productdesc;
509 $line->subprice = $price;
510 $line->remise_percent = $remise_percent;
511 $line->vat_src_code = $vat_src_code;
512 $line->tva_tx = $tva_tx;
513 $line->fk_unit = $prod->fk_unit;
515 $line->info_bits = 1;
518 $this->lines[] = $line;
536 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
537 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
542 $result = $remise->fetch($idremise);
545 if ($remise->fk_facture) {
546 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
547 $this->db->rollback();
553 $line->context = $this->context;
555 $line->fk_propal = $this->id;
556 $line->fk_remise_except = $remise->id;
557 $line->desc = $remise->description;
558 $line->vat_src_code = $remise->vat_src_code;
559 $line->tva_tx = $remise->tva_tx;
560 $line->subprice = -(float) $remise->amount_ht;
561 $line->fk_product = 0;
563 $line->remise_percent = 0;
565 $line->info_bits = 2;
568 $line->price = -(float) $remise->amount_ht;
570 $line->total_ht = -(float) $remise->amount_ht;
571 $line->total_tva = -(float) $remise->amount_tva;
572 $line->total_ttc = -(float) $remise->amount_ttc;
574 $result = $line->insert();
581 $this->db->rollback();
585 $this->error = $line->error;
586 $this->errors = $line->errors;
587 $this->db->rollback();
591 $this->db->rollback();
633 public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0.0, $txlocaltax2 = 0.0, $fk_product = 0, $remise_percent = 0.0, $price_base_type =
'HT', $pu_ttc = 0.0, $info_bits = 0, $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice = 0, $pa_ht = 0, $label =
'', $date_start =
'', $date_end =
'', $array_options = array(), $fk_unit =
null, $origin =
'', $origin_id = 0, $pu_ht_devise = 0, $fk_remise_except = 0, $noupdateafterinsertline = 0)
635 global $mysoc,
$conf, $langs;
637 dol_syslog(get_class($this).
"::addline propalid=$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, fk_remise_except=".$fk_remise_except);
639 if ($this->statut == self::STATUS_DRAFT) {
640 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
643 if (empty($remise_percent)) {
649 if (empty($info_bits)) {
655 if (empty($fk_parent_line) || $fk_parent_line < 0) {
659 $remise_percent =
price2num($remise_percent);
662 $pu_ht_devise =
price2num($pu_ht_devise);
664 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
670 if ($price_base_type ==
'HT') {
681 if ($date_start && $date_end && $date_start > $date_end) {
682 $langs->load(
"errors");
683 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
689 $product_type = $type;
690 if (!empty($fk_product) && $fk_product > 0) {
691 $product =
new Product($this->db);
692 $result = $product->fetch($fk_product);
693 $product_type = $product->type;
695 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_PROPOSAL') && $product_type == 0 && $product->stock_reel < $qty) {
696 $langs->load(
"errors");
697 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnProposal', $product->ref);
698 $this->db->rollback();
713 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
714 $vat_src_code = $reg[1];
715 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
718 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $product_type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
720 $total_ht = $tabprice[0];
721 $total_tva = $tabprice[1];
722 $total_ttc = $tabprice[2];
723 $total_localtax1 = $tabprice[9];
724 $total_localtax2 = $tabprice[10];
725 $pu_ht = $tabprice[3];
726 $pu_tva = $tabprice[4];
727 $pu_ttc = $tabprice[5];
730 $multicurrency_total_ht = $tabprice[16];
731 $multicurrency_total_tva = $tabprice[17];
732 $multicurrency_total_ttc = $tabprice[18];
733 $pu_ht_devise = $tabprice[19];
737 if ($ranktouse == -1) {
738 $rangmax = $this->
line_max($fk_parent_line);
739 $ranktouse = $rangmax + 1;
746 if ((
float) $remise_percent > 0) {
747 $remise = round(((
float) $pu * (
float) $remise_percent / 100), 2);
748 $price = (float) $pu - $remise;
754 $this->line->context = $this->context;
756 $this->line->fk_propal = $this->id;
757 $this->line->label = $label;
758 $this->line->desc = $desc;
759 $this->line->qty = $qty;
761 $this->line->vat_src_code = $vat_src_code;
762 $this->line->tva_tx = $txtva;
763 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
764 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
765 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
766 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
767 $this->line->fk_product = $fk_product;
768 $this->line->product_type = $type;
769 $this->line->fk_remise_except = $fk_remise_except;
770 $this->line->remise_percent = $remise_percent;
771 $this->line->subprice = (float) $pu_ht;
772 $this->line->rang = $ranktouse;
773 $this->line->info_bits = $info_bits;
774 $this->line->total_ht = (float) $total_ht;
775 $this->line->total_tva = (float) $total_tva;
776 $this->line->total_localtax1 = (float) $total_localtax1;
777 $this->line->total_localtax2 = (float) $total_localtax2;
778 $this->line->total_ttc = (float) $total_ttc;
779 $this->line->special_code = $special_code;
780 $this->line->fk_parent_line = $fk_parent_line;
781 $this->line->fk_unit = $fk_unit;
783 $this->line->date_start = $date_start;
784 $this->line->date_end = $date_end;
786 $this->line->fk_fournprice = $fk_fournprice;
787 $this->line->pa_ht = $pa_ht;
789 $this->line->origin_id = $origin_id;
790 $this->line->origin = $origin;
793 $this->line->fk_multicurrency = $this->fk_multicurrency;
794 $this->line->multicurrency_code = $this->multicurrency_code;
795 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
796 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
797 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
798 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
801 if (empty($qty) && empty($special_code)) {
802 $this->line->special_code = 3;
806 $this->line->price = $price;
808 if (is_array($array_options) && count($array_options) > 0) {
809 $this->line->array_options = $array_options;
812 $result = $this->line->insert();
815 if (!empty($fk_parent_line)) {
817 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
818 $linecount = count($this->lines);
819 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
825 if (empty($noupdateafterinsertline)) {
831 return $this->line->id;
833 $this->error = $this->db->error();
834 $this->db->rollback();
838 $this->error = $this->line->error;
839 $this->errors = $this->line->errors;
840 $this->db->rollback();
844 dol_syslog(get_class($this).
"::addline status of proposal must be Draft to allow use of ->addline()", LOG_ERR);
879 public function updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0.0, $txlocaltax2 = 0.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, $date_start =
'', $date_end =
'', $array_options = array(), $fk_unit =
null, $pu_ht_devise = 0, $notrigger = 0, $rang = 0)
881 global $mysoc, $langs;
883 dol_syslog(get_class($this).
"::updateLine rowid=$rowid, pu=$pu, qty=$qty, remise_percent=$remise_percent,
884 txtva=$txtva, desc=$desc, price_base_type=$price_base_type, info_bits=$info_bits, special_code=$special_code, fk_parent_line=$fk_parent_line, pa_ht=$pa_ht, type=$type, date_start=$date_start, date_end=$date_end");
885 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
888 $remise_percent =
price2num($remise_percent);
891 $pu_ht_devise =
price2num($pu_ht_devise);
892 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
898 if (empty($qty) && empty($special_code)) {
901 if (!empty($qty) && $special_code == 3) {
908 if ($date_start && $date_end && $date_start > $date_end) {
909 $langs->load(
"errors");
910 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
914 if ($this->
status == self::STATUS_DRAFT) {
927 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
928 $vat_src_code = $reg[1];
929 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
934 $tabprice =
calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
935 $total_ht = $tabprice[0];
936 $total_tva = $tabprice[1];
937 $total_ttc = $tabprice[2];
938 $total_localtax1 = $tabprice[9];
939 $total_localtax2 = $tabprice[10];
940 $pu_ht = $tabprice[3];
941 $pu_tva = $tabprice[4];
942 $pu_ttc = $tabprice[5];
945 $multicurrency_total_ht = $tabprice[16];
946 $multicurrency_total_tva = $tabprice[17];
947 $multicurrency_total_ttc = $tabprice[18];
948 $pu_ht_devise = $tabprice[19];
953 if ((
float) $remise_percent > 0) {
954 $remise = round(((
float) $pu * (
float) $remise_percent / 100), 2);
955 $price = (float) $pu - $remise;
960 $line->fetch($rowid);
962 $staticline = clone $line;
964 $line->oldline = $staticline;
966 $this->line->context = $this->context;
967 $this->line->rang = $rang;
970 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
971 $rangmax = $this->
line_max($fk_parent_line);
972 $this->line->rang = $rangmax + 1;
975 $this->line->id = $rowid;
976 $this->line->label = $label;
977 $this->line->desc = $desc;
978 $this->line->qty = $qty;
979 $this->line->product_type = $type;
980 $this->line->vat_src_code = $vat_src_code;
981 $this->line->tva_tx = $txtva;
982 $this->line->localtax1_tx = $txlocaltax1;
983 $this->line->localtax2_tx = $txlocaltax2;
984 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
985 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
986 $this->line->remise_percent = $remise_percent;
987 $this->line->subprice = (float) $pu_ht;
988 $this->line->info_bits = $info_bits;
990 $this->line->total_ht = (float) $total_ht;
991 $this->line->total_tva = (float) $total_tva;
992 $this->line->total_localtax1 = (float) $total_localtax1;
993 $this->line->total_localtax2 = (float) $total_localtax2;
994 $this->line->total_ttc = (float) $total_ttc;
995 $this->line->special_code = $special_code;
996 $this->line->fk_parent_line = $fk_parent_line;
997 $this->line->skip_update_total = $skip_update_total;
998 $this->line->fk_unit = $fk_unit;
1000 $this->line->fk_fournprice = $fk_fournprice;
1001 $this->line->pa_ht = $pa_ht;
1003 $this->line->date_start = $date_start;
1004 $this->line->date_end = $date_end;
1006 if (is_array($array_options) && count($array_options) > 0) {
1008 foreach ($array_options as $key => $value) {
1009 $this->line->array_options[$key] = $array_options[$key];
1014 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
1015 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
1016 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
1017 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
1019 $result = $this->line->update($notrigger);
1022 if (!empty($fk_parent_line)) {
1032 $this->db->commit();
1035 $this->error = $this->line->error;
1036 $this->errors = $this->line->errors;
1037 $this->db->rollback();
1041 dol_syslog(get_class($this).
"::updateline Erreur -2 Propal en mode incompatible pour cette action");
1058 if ($this->
status == self::STATUS_DRAFT) {
1063 $line->context = $this->context;
1066 $line->fetch($lineid);
1068 if ($id > 0 && $line->fk_propal != $id) {
1069 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
1074 $staticline = clone $line;
1075 $line->oldline = $staticline;
1077 if ($line->delete($user) > 0) {
1080 $this->db->commit();
1083 $this->error = $line->error;
1084 $this->errors = $line->errors;
1085 $this->db->rollback();
1089 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
1103 public function create($user, $notrigger = 0)
1105 global
$conf, $hookmanager, $mysoc;
1111 if (empty($this->date)) {
1112 $this->date = $this->datep;
1114 $this->fin_validite = $this->date + ($this->duree_validite * 24 * 3600);
1115 if (empty($this->availability_id)) {
1116 $this->availability_id = 0;
1118 if (empty($this->demand_reason_id)) {
1119 $this->demand_reason_id = 0;
1123 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1128 if (empty($this->fk_multicurrency)) {
1129 $this->multicurrency_code =
$conf->currency;
1130 $this->fk_multicurrency = 0;
1131 $this->multicurrency_tx = 1;
1137 $delivery_date = $this->delivery_date;
1144 $this->error =
"Failed to fetch company";
1145 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1150 if (!empty($this->
ref)) {
1153 $this->error =
'ErrorRefAlreadyExists';
1154 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
1155 $this->db->rollback();
1160 if (empty($this->date)) {
1161 $this->error =
"Date of proposal is required";
1162 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1170 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"propal (";
1173 $sql .=
", total_tva";
1174 $sql .=
", total_ttc";
1178 $sql .=
", fk_user_author";
1179 $sql .=
", note_private";
1180 $sql .=
", note_public";
1181 $sql .=
", model_pdf";
1182 $sql .=
", fin_validite";
1183 $sql .=
", fk_cond_reglement";
1184 $sql .=
", deposit_percent";
1185 $sql .=
", fk_mode_reglement";
1186 $sql .=
", fk_account";
1187 $sql .=
", ref_client";
1188 $sql .=
", ref_ext";
1189 $sql .=
", date_livraison";
1190 $sql .=
", fk_shipping_method";
1191 $sql .=
", fk_warehouse";
1192 $sql .=
", fk_availability";
1193 $sql .=
", fk_input_reason";
1194 $sql .=
", fk_projet";
1195 $sql .=
", fk_incoterms";
1196 $sql .=
", location_incoterms";
1198 $sql .=
", fk_multicurrency";
1199 $sql .=
", multicurrency_code";
1200 $sql .=
", multicurrency_tx";
1202 $sql .=
" VALUES (";
1203 $sql .= $this->socid;
1207 $sql .=
", '".$this->db->idate($this->date).
"'";
1208 $sql .=
", '".$this->db->idate($now).
"'";
1209 $sql .=
", '(PROV)'";
1210 $sql .=
", ".($user->id > 0 ? ((int) $user->id) :
"NULL");
1211 $sql .=
", '".$this->db->escape($this->note_private).
"'";
1212 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1213 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1214 $sql .=
", ".($this->fin_validite !=
'' ?
"'".$this->db->idate($this->fin_validite).
"'" :
"NULL");
1215 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
'NULL');
1216 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
'NULL');
1217 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
'NULL');
1218 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1219 $sql .=
", '".$this->db->escape($this->ref_client).
"'";
1220 $sql .=
", '".$this->db->escape($this->ref_ext).
"'";
1221 $sql .=
", ".(!
isDolTms($delivery_date) ?
"NULL" :
"'".$this->db->idate($delivery_date).
"'");
1222 $sql .=
", ".($this->shipping_method_id > 0 ? $this->shipping_method_id :
'NULL');
1223 $sql .=
", ".($this->warehouse_id > 0 ? $this->warehouse_id :
'NULL');
1224 $sql .=
", ".$this->availability_id;
1225 $sql .=
", ".$this->demand_reason_id;
1226 $sql .=
", ".($this->fk_project ? $this->fk_project :
"null");
1227 $sql .=
", ".(int) $this->fk_incoterms;
1228 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
1229 $sql .=
", ".(int) $this->entity;
1230 $sql .=
", ".(int) $this->fk_multicurrency;
1231 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1232 $sql .=
", ".(float) $this->multicurrency_tx;
1235 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1236 $resql = $this->db->query($sql);
1238 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
"propal");
1241 $this->
ref =
'(PROV'.$this->id.
')';
1242 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"propal SET ref='".$this->db->escape($this->
ref).
"' WHERE rowid=".((int) $this->
id);
1244 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1245 $resql = $this->db->query($sql);
1250 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1251 $this->linked_objects = $this->linkedObjectsIds;
1255 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1256 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1257 if (is_array($tmp_origin_id)) {
1258 foreach ($tmp_origin_id as $origin_id) {
1261 $this->error = $this->db->lasterror();
1266 $origin_id = $tmp_origin_id;
1269 $this->error = $this->db->lasterror();
1281 $fk_parent_line = 0;
1282 $num = count($this->lines);
1284 for ($i = 0; $i < $num; $i++) {
1285 if (!is_object($this->lines[$i])) {
1287 $line = (object) $this->lines[$i];
1289 $line = $this->lines[$i];
1292 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1293 $fk_parent_line = 0;
1296 $vatrate = $line->tva_tx;
1297 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', $vatrate)) {
1298 $vatrate .=
' ('.$line->vat_src_code.
')';
1302 $originid = $line->origin_id;
1303 $origintype = $line->origin;
1305 $originid = $line->id;
1306 $origintype = $this->element;
1314 $line->localtax1_tx,
1315 $line->localtax2_tx,
1317 $line->remise_percent,
1321 $line->product_type,
1323 $line->special_code,
1325 $line->fk_fournprice,
1330 $line->array_options,
1341 $this->error = $this->db->error;
1347 $line->id = $result;
1350 if ($result > 0 && $line->product_type == 9) {
1351 $fk_parent_line = $result;
1381 if (!$error && !$notrigger) {
1390 $this->error = $this->db->lasterror();
1395 $this->error = $this->db->lasterror();
1400 $this->db->commit();
1401 dol_syslog(get_class($this).
"::create done id=".$this->
id);
1404 $this->db->rollback();
1408 $this->error = $this->db->lasterror();
1409 $this->db->rollback();
1424 public function createFromClone(
User $user, $socid = 0, $forceentity =
null, $update_prices =
false, $update_desc =
false)
1426 global
$conf, $hookmanager, $mysoc;
1435 $object =
new self($this->db);
1442 $objsoc =
new Societe($this->db);
1445 if (!empty($socid) && $socid !=
$object->socid) {
1446 if ($objsoc->fetch($socid) > 0) {
1448 $object->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1449 $object->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent :
null);
1450 $object->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1451 $object->fk_delivery_address = 0;
1474 $objsoc->fetch(
$object->socid);
1478 if ($update_prices ===
true || $update_desc ===
true) {
1479 if ($objsoc->id > 0 && !empty(
$object->lines)) {
1482 require_once DOL_DOCUMENT_ROOT .
'/product/class/productcustomerprice.class.php';
1485 foreach (
$object->lines as $line) {
1488 if ($line->fk_product > 0) {
1489 $prod =
new Product($this->db);
1490 $res = $prod->fetch($line->fk_product);
1492 if ($update_prices ===
true) {
1493 $pu_ht = $prod->price;
1495 $remise_percent = $objsoc->remise_percent;
1498 $pu_ht = $prod->multiprices[$objsoc->price_level];
1500 if (isset($prod->multiprices_tva_tx[$objsoc->price_level])) {
1501 $tva_tx = (string) $prod->multiprices_tva_tx[$objsoc->price_level];
1506 $filter = array(
't.fk_product' => $prod->id,
't.fk_soc' => $objsoc->id);
1507 $result = $prodcustprice->fetchAll(
'',
'', 0, 0, $filter);
1510 if (count($prodcustprice->lines) > 0) {
1511 $pu_ht =
price($prodcustprice->lines[0]->price);
1512 $tva_tx = ($prodcustprice->lines[0]->default_vat_code ? $prodcustprice->lines[0]->tva_tx.
' ('.$prodcustprice->lines[0]->default_vat_code.
' )' : $prodcustprice->lines[0]->tva_tx);
1513 if ($prodcustprice->lines[0]->default_vat_code && !preg_match(
'/\(.*\)/', $tva_tx)) {
1514 $tva_tx .=
' ('.$prodcustprice->lines[0]->default_vat_code.
')';
1520 $line->subprice = $pu_ht;
1521 $line->tva_tx = $tva_tx;
1522 $line->remise_percent = $remise_percent;
1524 if ($update_desc ===
true) {
1525 $line->desc = $prod->description;
1535 $object->entity = (!empty($forceentity) ? $forceentity :
$object->entity);
1539 $object->user_creation_id = $user->id;
1540 $object->user_validation_id = 0;
1553 $object->context[
'createfromclone'] =
'createfromclone';
1554 $result =
$object->create($user);
1556 $this->error =
$object->error;
1557 $this->errors = array_merge($this->errors,
$object->errors);
1563 if (
$object->copy_linked_contact($this,
'internal') < 0) {
1570 if ($this->socid ==
$object->socid) {
1571 if (
$object->copy_linked_contact($this,
'external') < 0) {
1579 if (is_object($hookmanager)) {
1580 $parameters = array(
'objFrom' => $this,
'clonedObj' =>
$object);
1582 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters,
$object, $action);
1590 unset(
$object->context[
'createfromclone']);
1594 $this->db->commit();
1597 $this->db->rollback();
1611 public function fetch($rowid, $ref =
'', $ref_ext =
'', $forceentity = 0)
1613 $sql =
"SELECT p.rowid, p.ref, p.entity, p.fk_soc";
1614 $sql .=
", p.total_ttc, p.total_tva, p.localtax1, p.localtax2, p.total_ht";
1615 $sql .=
", p.datec";
1616 $sql .=
", p.date_signature as dates";
1617 $sql .=
", p.date_valid as datev";
1618 $sql .=
", p.datep as dp";
1619 $sql .=
", p.fin_validite as dfv";
1620 $sql .=
", p.date_livraison as delivery_date";
1621 $sql .=
", p.model_pdf, p.last_main_doc, p.ref_client, ref_ext, p.extraparams";
1622 $sql .=
", p.note_private, p.note_public";
1623 $sql .=
", p.fk_projet as fk_project, p.fk_statut";
1624 $sql .=
", p.fk_user_author, p.fk_user_valid, p.fk_user_cloture";
1625 $sql .=
", p.fk_delivery_address";
1626 $sql .=
", p.fk_availability";
1627 $sql .=
", p.fk_input_reason";
1628 $sql .=
", p.fk_cond_reglement";
1629 $sql .=
", p.fk_mode_reglement";
1630 $sql .=
', p.fk_account';
1631 $sql .=
", p.fk_shipping_method";
1632 $sql .=
", p.fk_warehouse";
1633 $sql .=
", p.fk_incoterms, p.location_incoterms";
1634 $sql .=
", p.fk_multicurrency, p.multicurrency_code, p.multicurrency_tx, p.multicurrency_total_ht, p.multicurrency_total_tva, p.multicurrency_total_ttc";
1635 $sql .=
", p.tms as date_modification";
1636 $sql .=
", i.libelle as label_incoterms";
1637 $sql .=
", c.label as statut_label";
1638 $sql .=
", ca.code as availability_code, ca.label as availability";
1639 $sql .=
", dr.code as demand_reason_code, dr.label as demand_reason";
1640 $sql .=
", cr.code as cond_reglement_code, cr.libelle as cond_reglement, cr.libelle_facture as cond_reglement_libelle_doc, p.deposit_percent";
1641 $sql .=
", cp.code as mode_reglement_code, cp.libelle as mode_reglement";
1642 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal as p";
1643 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_propalst as c ON p.fk_statut = c.id';
1644 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as cp ON p.fk_mode_reglement = cp.id AND cp.entity IN ('.
getEntity(
'c_paiement').
')';
1645 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON p.fk_cond_reglement = cr.rowid AND cr.entity IN ('.
getEntity(
'c_payment_term').
')';
1646 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON p.fk_availability = ca.rowid';
1647 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON p.fk_input_reason = dr.rowid';
1648 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON p.fk_incoterms = i.rowid';
1651 if (!empty($forceentity)) {
1652 $sql .=
" WHERE p.entity = ".(int) $forceentity;
1654 $sql .=
" WHERE p.entity IN (".getEntity(
'propal').
")";
1656 $sql .=
" AND p.ref='".$this->db->escape($ref).
"'";
1659 $sql .=
" WHERE p.rowid = ".((int) $rowid);
1662 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1663 $resql = $this->db->query($sql);
1665 if ($this->db->num_rows($resql)) {
1666 $obj = $this->db->fetch_object($resql);
1668 $this->
id = $obj->rowid;
1669 $this->entity = $obj->entity;
1671 $this->
ref = $obj->ref;
1672 $this->ref_client = $obj->ref_client;
1673 $this->ref_customer = $obj->ref_client;
1674 $this->ref_ext = $obj->ref_ext;
1676 $this->total = $obj->total_ttc;
1677 $this->total_ttc = $obj->total_ttc;
1678 $this->total_ht = $obj->total_ht;
1679 $this->total_tva = $obj->total_tva;
1680 $this->total_localtax1 = $obj->localtax1;
1681 $this->total_localtax2 = $obj->localtax2;
1683 $this->socid = $obj->fk_soc;
1684 $this->thirdparty =
null;
1686 $this->fk_project = $obj->fk_project;
1687 $this->project =
null;
1689 $this->model_pdf = $obj->model_pdf;
1690 $this->last_main_doc = $obj->last_main_doc;
1691 $this->note = $obj->note_private;
1692 $this->note_private = $obj->note_private;
1693 $this->note_public = $obj->note_public;
1695 $this->
status = (int) $obj->fk_statut;
1696 $this->statut = $this->status;
1698 $this->datec = $this->db->jdate($obj->datec);
1699 $this->datev = $this->db->jdate($obj->datev);
1700 $this->date_creation = $this->db->jdate($obj->datec);
1701 $this->date_validation = $this->db->jdate($obj->datev);
1702 $this->date_modification = $this->db->jdate($obj->date_modification);
1703 $this->date_signature = $this->db->jdate($obj->dates);
1704 $this->date = $this->db->jdate($obj->dp);
1705 $this->datep = $this->db->jdate($obj->dp);
1706 $this->fin_validite = $this->db->jdate($obj->dfv);
1707 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1708 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1709 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
1710 $this->availability_id = $obj->fk_availability;
1711 $this->availability_code = $obj->availability_code;
1713 $this->demand_reason_id = $obj->fk_input_reason;
1714 $this->demand_reason_code = $obj->demand_reason_code;
1716 $this->fk_address = $obj->fk_delivery_address;
1718 $this->mode_reglement_id = $obj->fk_mode_reglement;
1719 $this->mode_reglement_code = $obj->mode_reglement_code;
1720 $this->mode_reglement = $obj->mode_reglement;
1721 $this->fk_account = ($obj->fk_account > 0) ? $obj->fk_account :
null;
1722 $this->cond_reglement_id = $obj->fk_cond_reglement;
1723 $this->cond_reglement_code = $obj->cond_reglement_code;
1724 $this->cond_reglement = $obj->cond_reglement;
1725 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1726 $this->deposit_percent = $obj->deposit_percent;
1728 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
1730 $this->user_author_id = $obj->fk_user_author;
1731 $this->user_validation_id = $obj->fk_user_valid;
1732 $this->user_closing_id = $obj->fk_user_cloture;
1735 $this->fk_incoterms = $obj->fk_incoterms;
1736 $this->location_incoterms = $obj->location_incoterms;
1737 $this->label_incoterms = $obj->label_incoterms;
1740 $this->fk_multicurrency = $obj->fk_multicurrency;
1741 $this->multicurrency_code = $obj->multicurrency_code;
1742 $this->multicurrency_tx = $obj->multicurrency_tx;
1743 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1744 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1745 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1751 $this->db->free($resql);
1753 $this->lines = array();
1764 $this->error =
"Record Not Found";
1767 $this->error = $this->db->lasterror();
1786 if (isset($this->
ref)) {
1787 $this->
ref = trim($this->
ref);
1789 if (isset($this->ref_client)) {
1790 $this->ref_client = trim($this->ref_client);
1792 if (isset($this->note) || isset($this->note_private)) {
1793 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
1795 if (isset($this->note_public)) {
1796 $this->note_public = trim($this->note_public);
1798 if (isset($this->model_pdf)) {
1799 $this->model_pdf = trim($this->model_pdf);
1801 if (isset($this->import_key)) {
1802 $this->import_key = trim($this->import_key);
1804 if (!empty($this->duree_validite) && is_numeric($this->duree_validite)) {
1805 $this->fin_validite = $this->date + ($this->duree_validite * 24 * 3600);
1812 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal SET";
1813 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
1814 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
1815 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
1816 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
1817 $sql .=
" datep=".(strval($this->date) !=
'' ?
"'".$this->db->idate($this->date).
"'" :
'null').
",";
1818 if (!empty($this->fin_validite)) {
1819 $sql .=
" fin_validite=".(strval($this->fin_validite) !=
'' ?
"'".$this->db->idate($this->fin_validite).
"'" :
'null').
",";
1821 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
1822 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
1823 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
1824 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
1825 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
1826 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
1827 $sql .=
" fk_statut=".(isset($this->
status) ? $this->
status :
"null").
",";
1828 $sql .=
" fk_user_author=".(isset($this->user_author_id) ? $this->user_author_id :
"null").
",";
1829 $sql .=
" fk_user_valid=".(isset($this->user_validation_id) ? $this->user_validation_id :
"null").
",";
1830 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
1831 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
1832 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
"null").
",";
1833 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
1834 $sql .=
" fk_input_reason=".(isset($this->demand_reason_id) ? $this->demand_reason_id :
"null").
",";
1835 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
1836 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
1837 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
1838 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
1839 $sql .=
" WHERE rowid=".((int) $this->
id);
1843 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1844 $resql = $this->db->query($sql);
1847 $this->errors[] =
"Error ".$this->db->lasterror();
1857 if (!$error && !$notrigger) {
1868 foreach ($this->errors as $errmsg) {
1869 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1870 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1872 $this->db->rollback();
1875 $this->db->commit();
1890 public function fetch_lines($only_product = 0, $loadalsotranslation = 0, $sqlforgedfilters =
'')
1893 $this->lines = array();
1895 $sql =
'SELECT d.rowid, d.fk_propal, d.fk_parent_line, d.label as custom_label, d.description, d.price, d.vat_src_code, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.localtax1_type, d.localtax2_type, d.qty, d.fk_remise_except, d.remise_percent, d.subprice, d.fk_product,';
1896 $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,';
1897 $sql .=
' d.fk_unit,';
1898 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label, p.tobatch as product_tobatch, p.barcode as product_barcode,';
1899 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units,';
1900 $sql .=
' d.date_start, d.date_end,';
1901 $sql .=
' d.fk_multicurrency, d.multicurrency_code, d.multicurrency_subprice, d.multicurrency_total_ht, d.multicurrency_total_tva, d.multicurrency_total_ttc';
1902 $sql .=
' FROM '.MAIN_DB_PREFIX.
'propaldet as d';
1903 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (d.fk_product = p.rowid)';
1904 $sql .=
' WHERE d.fk_propal = '.((int) $this->
id);
1905 if ($only_product) {
1906 $sql .=
' AND p.fk_product_type = 0';
1908 if ($sqlforgedfilters) {
1909 $sql .= $sqlforgedfilters;
1911 $sql .=
' ORDER by d.rang';
1913 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
1914 $result = $this->db->query($sql);
1916 require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
1918 $num = $this->db->num_rows($result);
1922 $objp = $this->db->fetch_object($result);
1926 $line->rowid = $objp->rowid;
1927 $line->id = $objp->rowid;
1928 $line->fk_propal = $objp->fk_propal;
1929 $line->fk_parent_line = $objp->fk_parent_line;
1930 $line->product_type = $objp->product_type;
1931 $line->label = $objp->custom_label;
1932 $line->desc = $objp->description;
1933 $line->description = $objp->description;
1934 $line->qty = $objp->qty;
1935 $line->vat_src_code = $objp->vat_src_code;
1936 $line->tva_tx = $objp->tva_tx;
1937 $line->localtax1_tx = $objp->localtax1_tx;
1938 $line->localtax2_tx = $objp->localtax2_tx;
1939 $line->localtax1_type = $objp->localtax1_type;
1940 $line->localtax2_type = $objp->localtax2_type;
1941 $line->subprice = $objp->subprice;
1942 $line->fk_remise_except = $objp->fk_remise_except;
1943 $line->remise_percent = $objp->remise_percent;
1944 $line->price = $objp->price;
1946 $line->info_bits = $objp->info_bits;
1947 $line->total_ht = $objp->total_ht;
1948 $line->total_tva = $objp->total_tva;
1949 $line->total_localtax1 = $objp->total_localtax1;
1950 $line->total_localtax2 = $objp->total_localtax2;
1951 $line->total_ttc = $objp->total_ttc;
1952 $line->fk_fournprice = $objp->fk_fournprice;
1953 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
1954 $line->pa_ht = $marginInfos[0];
1955 $line->marge_tx = $marginInfos[1];
1956 $line->marque_tx = $marginInfos[2];
1957 $line->special_code = $objp->special_code;
1958 $line->rang = $objp->rang;
1960 $line->fk_product = $objp->fk_product;
1962 $line->ref = $objp->product_ref;
1963 $line->libelle = $objp->product_label;
1965 $line->product_ref = $objp->product_ref;
1966 $line->product_label = $objp->product_label;
1967 $line->product_desc = $objp->product_desc;
1968 $line->product_tobatch = $objp->product_tobatch;
1969 $line->product_barcode = $objp->product_barcode;
1971 $line->fk_product_type = $objp->fk_product_type;
1972 $line->fk_unit = $objp->fk_unit;
1973 $line->weight = $objp->weight;
1974 $line->weight_units = $objp->weight_units;
1975 $line->volume = $objp->volume;
1976 $line->volume_units = $objp->volume_units;
1978 $line->date_start = $this->db->jdate($objp->date_start);
1979 $line->date_end = $this->db->jdate($objp->date_end);
1982 $line->fk_multicurrency = $objp->fk_multicurrency;
1983 $line->multicurrency_code = $objp->multicurrency_code;
1984 $line->multicurrency_subprice = $objp->multicurrency_subprice;
1985 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
1986 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
1987 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
1989 $line->fetch_optionals();
1992 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
1993 $tmpproduct =
new Product($this->db);
1994 $tmpproduct->fetch($objp->fk_product);
1995 $tmpproduct->getMultiLangs();
1997 $line->multilangs = $tmpproduct->multilangs;
2000 $this->lines[$i] = $line;
2005 $this->db->free($result);
2009 $this->error = $this->db->lasterror();
2021 public function valid($user, $notrigger = 0)
2025 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
2030 if ($this->
status == self::STATUS_VALIDATED) {
2031 dol_syslog(get_class($this).
"::valid action abandoned: already validated", LOG_WARNING);
2035 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'creer'))
2036 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'propal',
'propal_advance',
'validate')))) {
2037 $this->error =
'ErrorPermissionDenied';
2038 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
2047 $soc =
new Societe($this->db);
2048 $soc->fetch($this->socid);
2051 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
2058 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal";
2059 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
2060 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
", date_valid='".$this->db->idate($now).
"', fk_user_valid=".((int) $user->id);
2063 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
2064 $resql = $this->db->query($sql);
2071 if (!$error && !$notrigger) {
2073 $result = $this->
call_trigger(
'PROPAL_VALIDATE', $user);
2081 $this->oldref = $this->ref;
2084 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
2086 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'propale/".$this->db->escape($this->newref).
"'";
2087 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'propale/".$this->db->escape($this->
ref).
"' and entity = ".((int)
$conf->entity);
2088 $resql = $this->db->query($sql);
2091 $this->error = $this->db->lasterror();
2093 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'propale/".$this->db->escape($this->newref).
"'";
2094 $sql .=
" WHERE filepath = 'propale/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
2095 $resql = $this->db->query($sql);
2098 $this->error = $this->db->lasterror();
2104 $dirsource =
$conf->propal->multidir_output[$this->entity].
'/'.$oldref;
2105 $dirdest =
$conf->propal->multidir_output[$this->entity].
'/'.$newref;
2106 if (!$error && file_exists($dirsource)) {
2107 dol_syslog(get_class($this).
"::validate rename dir ".$dirsource.
" into ".$dirdest);
2108 if (@rename($dirsource, $dirdest)) {
2111 $listoffiles =
dol_dir_list($dirdest,
'files', 1,
'^'.preg_quote($oldref,
'/'));
2112 foreach ($listoffiles as $fileentry) {
2113 $dirsource = $fileentry[
'name'];
2114 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
2115 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
2116 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
2117 @rename($dirsource, $dirdest);
2126 $this->user_validation_id = $user->id;
2127 $this->datev = $now;
2128 $this->date_validation = $now;
2130 $this->db->commit();
2133 $this->db->rollback();
2152 $this->error =
'ErrorBadParameter';
2153 dol_syslog(get_class($this).
"::set_date ".$this->error, LOG_ERR);
2157 if ($user->hasRight(
'propal',
'creer')) {
2162 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal SET datep = '".$this->db->idate($date).
"'";
2163 $sql .=
" WHERE rowid = ".((int) $this->
id);
2166 $resql = $this->db->query($sql);
2168 $this->errors[] = $this->db->error();
2173 $this->oldcopy = clone $this;
2174 $this->date = $date;
2175 $this->datep = $date;
2178 if (!$notrigger && empty($error)) {
2188 $this->db->commit();
2191 foreach ($this->errors as $errmsg) {
2192 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2193 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2195 $this->db->rollback();
2215 if ($user->hasRight(
'propal',
'creer')) {
2220 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal SET fin_validite = ".($date_end_validity !=
'' ?
"'".$this->db->idate($date_end_validity).
"'" :
'null');
2221 $sql .=
" WHERE rowid = ".((int) $this->
id);
2225 $resql = $this->db->query($sql);
2227 $this->errors[] = $this->db->error();
2233 $this->oldcopy = clone $this;
2234 $this->fin_validite = $date_end_validity;
2237 if (!$notrigger && empty($error)) {
2247 $this->db->commit();
2250 foreach ($this->errors as $errmsg) {
2251 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2252 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2254 $this->db->rollback();
2288 if ($user->hasRight(
'propal',
'creer')) {
2293 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal ";
2294 $sql .=
" SET date_livraison = ".(isDolTms($delivery_date) ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2295 $sql .=
" WHERE rowid = ".((int) $this->
id);
2298 $resql = $this->db->query($sql);
2300 $this->errors[] = $this->db->error();
2305 $this->oldcopy = clone $this;
2306 $this->delivery_date = $delivery_date;
2309 if (!$notrigger && empty($error)) {
2319 $this->db->commit();
2322 foreach ($this->errors as $errmsg) {
2323 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2324 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2326 $this->db->rollback();
2346 if ($user->hasRight(
'propal',
'creer') && $this->status >= self::STATUS_DRAFT) {
2351 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal";
2352 $sql .=
" SET fk_availability = ".((int) $id);
2353 $sql .=
" WHERE rowid = ".((int) $this->
id);
2355 dol_syslog(__METHOD__.
' availability('.$id.
')', LOG_DEBUG);
2356 $resql = $this->db->query($sql);
2358 $this->errors[] = $this->db->error();
2363 $this->oldcopy = clone $this;
2364 $this->fk_availability = $id;
2365 $this->availability_id = $id;
2368 if (!$notrigger && empty($error)) {
2378 $this->db->commit();
2381 foreach ($this->errors as $errmsg) {
2382 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2383 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2385 $this->db->rollback();
2389 $error_str =
'Propal status do not meet requirement '.$this->status;
2391 $this->error = $error_str;
2392 $this->errors[] = $this->error;
2409 if ($user->hasRight(
'propal',
'creer') && $this->status >= self::STATUS_DRAFT) {
2414 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal ";
2415 $sql .=
" SET fk_input_reason = ".((int) $id);
2416 $sql .=
" WHERE rowid = ".((int) $this->
id);
2419 $resql = $this->db->query($sql);
2421 $this->errors[] = $this->db->error();
2427 $this->oldcopy = clone $this;
2429 $this->demand_reason_id = $id;
2433 if (!$notrigger && empty($error)) {
2443 $this->db->commit();
2446 foreach ($this->errors as $errmsg) {
2447 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2448 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2450 $this->db->rollback();
2454 $error_str =
'Propal status do not meet requirement '.$this->status;
2456 $this->error = $error_str;
2457 $this->errors[] = $this->error;
2474 if ($user->hasRight(
'propal',
'creer')) {
2479 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal SET ref_client = ".(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2480 $sql .=
" WHERE rowid = ".((int) $this->
id);
2482 dol_syslog(__METHOD__.
' $this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2483 $resql = $this->db->query($sql);
2485 $this->errors[] = $this->db->error();
2490 $this->oldcopy = clone $this;
2491 $this->ref_client = $ref_client;
2494 if (!$notrigger && empty($error)) {
2504 $this->db->commit();
2507 foreach ($this->errors as $errmsg) {
2508 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2509 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2511 $this->db->rollback();
2529 public function reopen($user, $status, $note =
'', $notrigger = 0)
2533 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal";
2534 $sql .=
" SET fk_statut = ".((int) $status).
",";
2535 if (!empty($note)) {
2536 $sql .=
" note_private = '".$this->db->escape($note).
"',";
2538 $sql .=
" date_cloture=NULL, fk_user_cloture=NULL";
2539 $sql .=
" WHERE rowid = ".((int) $this->
id);
2543 dol_syslog(get_class($this).
"::reopen", LOG_DEBUG);
2544 $resql = $this->db->query($sql);
2547 $this->errors[] =
"Error ".$this->db->lasterror();
2562 if (!empty($this->errors)) {
2563 foreach ($this->errors as $errmsg) {
2564 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
2565 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2568 $this->db->rollback();
2571 $this->statut = $status;
2574 $this->db->commit();
2589 public function closeProposal($user, $status, $note_private =
'', $notrigger = 0, $note_public =
'')
2591 global $langs,
$conf;
2598 $newprivatenote =
dol_concatdesc($this->note_private, $note_private);
2599 $newpublicnote =
dol_concatdesc($this->note_public, $note_public);
2602 $date_signature = $now;
2603 $fk_user_signature = $user->id;
2605 $this->
info($this->
id);
2606 if (!isset($this->date_signature) || $this->date_signature ==
'') {
2607 $date_signature = $now;
2608 $fk_user_signature = $user->id;
2610 $date_signature = $this->date_signature;
2611 $fk_user_signature = $this->user_signature->id;
2615 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal";
2616 $sql .=
" SET fk_statut = ".((int) $status).
", note_private = '".$this->db->escape($newprivatenote).
"', note_public = '".$this->db->escape($newpublicnote).
"'";
2617 if ($status == self::STATUS_SIGNED) {
2618 $sql .=
", date_signature='".$this->db->idate($now).
"', fk_user_signature = ".($fk_user_signature);
2620 $sql .=
" WHERE rowid = ".((int) $this->
id);
2622 $resql = $this->db->query($sql);
2626 $trigger_name =
'PROPAL_CLOSE_REFUSED';
2628 if ($status == self::STATUS_SIGNED) {
2629 $trigger_name =
'PROPAL_CLOSE_SIGNED';
2630 $modelpdf =
getDolGlobalString(
'PROPALE_ADDON_PDF_ODT_TOBILL') ?
$conf->global->PROPALE_ADDON_PDF_ODT_TOBILL : $this->model_pdf;
2633 $soc =
new Societe($this->db);
2634 $soc->id = $this->socid;
2635 $result = $soc->setAsCustomer();
2638 $this->error = $this->db->lasterror();
2639 $this->db->rollback();
2646 $outputlangs = $langs;
2649 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
2650 $outputlangs->setDefaultLang($newlang);
2659 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2663 $this->oldcopy = clone $this;
2664 $this->statut = $status;
2666 $this->date_signature = $date_signature;
2667 $this->note_private = $newprivatenote;
2670 if (!$notrigger && empty($error)) {
2680 $this->db->commit();
2683 $this->statut = $this->oldcopy->status;
2684 $this->
status = $this->oldcopy->status;
2685 $this->date_signature = $this->oldcopy->date_signature;
2686 $this->note_private = $this->oldcopy->note_private;
2688 $this->db->rollback();
2692 $this->error = $this->db->lasterror();
2693 $this->db->rollback();
2708 global
$conf, $langs;
2715 $triggerName =
'PROPAL_CLASSIFY_BILLED';
2721 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'propal SET fk_statut = '.self::STATUS_BILLED.
", ";
2722 $sql .=
" note_private = '".$this->db->escape($newprivatenote).
"', date_cloture='".$this->db->idate($now).
"', fk_user_cloture=".((int) $user->id);
2723 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_SIGNED);
2726 $resql = $this->db->query($sql);
2728 $this->errors[] = $this->db->error();
2731 $num = $this->db->affected_rows($resql);
2739 $outputlangs = $langs;
2742 $newlang = (
GETPOST(
'lang_id',
'aZ09') ?
GETPOST(
'lang_id',
'aZ09') : $this->thirdparty->default_lang);
2743 $outputlangs->setDefaultLang($newlang);
2752 $this->
generateDocument($modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
2755 $this->oldcopy = clone $this;
2758 $this->date_cloture = $now;
2759 $this->note_private = $newprivatenote;
2762 if (!$notrigger && empty($error)) {
2772 $this->db->commit();
2775 foreach ($this->errors as $errmsg) {
2776 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2777 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2779 $this->db->rollback();
2796 $sql =
"UPDATE ". MAIN_DB_PREFIX .
"propal";
2797 $sql .=
" SET fk_statut = " . self::STATUS_CANCELED .
",";
2798 $sql .=
" fk_user_modif = " . ((int) $user->id);
2799 $sql .=
" WHERE rowid = " . ((int) $this->
id);
2801 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
2802 if ($this->db->query($sql)) {
2815 $this->db->commit();
2818 foreach ($this->errors as $errmsg) {
2819 dol_syslog(get_class($this).
"::cancel ".$errmsg, LOG_ERR);
2820 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2822 $this->db->rollback();
2826 $this->error = $this->db->error();
2827 $this->db->rollback();
2846 if ($this->
status <= self::STATUS_DRAFT) {
2850 dol_syslog(get_class($this).
"::setDraft", LOG_DEBUG);
2854 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"propal";
2855 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT;
2856 $sql .=
", online_sign_ip = NULL , online_sign_name = NULL";
2857 $sql .=
" WHERE rowid = ".((int) $this->
id);
2859 $resql = $this->db->query($sql);
2861 $this->errors[] = $this->db->error();
2866 $this->oldcopy = clone $this;
2869 if (!$notrigger && empty($error)) {
2882 $this->db->commit();
2885 foreach ($this->errors as $errmsg) {
2886 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2887 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2889 $this->db->rollback();
2909 public function liste_array($shortlist = 0, $draft = 0, $notcurrentuser = 0, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'p.datep', $sortorder =
'DESC')
2916 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2917 $sql .=
" p.rowid as propalid, p.fk_statut, p.total_ht, p.ref, p.remise, ";
2918 $sql .=
" p.datep as dp, p.fin_validite as datelimite";
2919 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"propal as p, ".MAIN_DB_PREFIX.
"c_propalst as c";
2920 $sql .=
" WHERE p.entity IN (".getEntity(
'propal').
")";
2921 $sql .=
" AND p.fk_soc = s.rowid";
2922 $sql .=
" AND p.fk_statut = c.id";
2926 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2927 $search_sale = $user->id;
2930 if ($search_sale && $search_sale !=
'-1') {
2931 if ($search_sale == -2) {
2932 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
2933 } elseif ($search_sale > 0) {
2934 $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).
")";
2939 $sql .=
" AND p.fk_soc = ".((int) $socid);
2942 $sql .=
" AND p.fk_statut = ".((int) self::STATUS_DRAFT);
2944 if ($notcurrentuser > 0) {
2945 $sql .=
" AND p.fk_user_author <> ".((int) $user->id);
2947 $sql .= $this->db->order($sortfield, $sortorder);
2948 $sql .= $this->db->plimit($limit, $offset);
2950 $result = $this->db->query($sql);
2952 $num = $this->db->num_rows($result);
2956 $obj = $this->db->fetch_object($result);
2958 if ($shortlist == 1) {
2959 $ga[$obj->propalid] = $obj->ref;
2960 } elseif ($shortlist == 2) {
2961 $ga[$obj->propalid] = $obj->ref.
' ('.$obj->name.
')';
2963 $ga[$i][
'id'] = $obj->propalid;
2964 $ga[$i][
'ref'] = $obj->ref;
2965 $ga[$i][
'name'] = $obj->name;
2999 $linkedInvoices = array();
3002 foreach ($this->linkedObjectsIds as $objecttype => $objectid) {
3005 foreach ($objectid as $key =>
$object) {
3007 if ($objecttype ==
'facture') {
3012 foreach ($this->linkedObjectsIds as $subobjecttype => $subobjectid) {
3013 foreach ($subobjectid as $subkey => $subobject) {
3014 if ($subobjecttype ==
'facture') {
3015 $linkedInvoices[] = $subobject;
3023 if (count($linkedInvoices) > 0) {
3024 $sql =
"SELECT rowid as facid, ref, total_ht as total, datef as df, fk_user_author, fk_statut, paye";
3025 $sql .=
" FROM ".MAIN_DB_PREFIX.
"facture";
3026 $sql .=
" WHERE rowid IN (".$this->db->sanitize(implode(
',', $linkedInvoices)).
")";
3028 dol_syslog(get_class($this).
"::InvoiceArrayList", LOG_DEBUG);
3029 $resql = $this->db->query($sql);
3032 $tab_sqlobj = array();
3033 $nump = $this->db->num_rows($resql);
3034 for ($i = 0; $i < $nump; $i++) {
3035 $sqlobj = $this->db->fetch_object($resql);
3036 $tab_sqlobj[] = $sqlobj;
3038 $this->db->free($resql);
3040 $nump = count($tab_sqlobj);
3044 while ($i < $nump) {
3045 $obj = array_shift($tab_sqlobj);
3068 public function delete($user, $notrigger = 0)
3071 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3087 if (!$error && !empty($this->table_element_line)) {
3088 $tabletodelete = $this->table_element_line;
3089 $sqlef =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
"_extrafields WHERE fk_object IN (SELECT rowid FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id).
")";
3090 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3091 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3093 $this->error = $this->db->lasterror();
3094 $this->errors[] = $this->error;
3095 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3120 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3126 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3127 $res = $this->db->query($sql);
3130 $this->error = $this->db->lasterror();
3131 $this->errors[] = $this->error;
3132 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3148 if ($conf->propal->multidir_output[$this->entity] && !empty($this->
ref)) {
3149 $dir =
$conf->propal->multidir_output[$this->entity].
"/".$ref;
3150 $file = $dir.
"/".$ref.
".pdf";
3151 if (file_exists($file)) {
3155 $this->error =
'ErrorFailToDeleteFile';
3156 $this->errors[] = $this->error;
3157 $this->db->rollback();
3161 if (file_exists($dir)) {
3164 $this->error =
'ErrorFailToDeleteDir';
3165 $this->errors[] = $this->error;
3166 $this->db->rollback();
3174 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3175 $this->db->commit();
3178 $this->db->rollback();
3195 if ($this->
status >= self::STATUS_DRAFT) {
3200 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'propal';
3201 $sql .=
' SET fk_availability = '.((int) $availability_id);
3202 $sql .=
' WHERE rowid='.((int) $this->
id);
3204 dol_syslog(__METHOD__.
' availability('.$availability_id.
')', LOG_DEBUG);
3205 $resql = $this->db->query($sql);
3207 $this->errors[] = $this->db->error();
3212 $this->oldcopy = clone $this;
3213 $this->availability_id = $availability_id;
3216 if (!$notrigger && empty($error)) {
3226 $this->db->commit();
3229 foreach ($this->errors as $errmsg) {
3230 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
3231 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3233 $this->db->rollback();
3237 $error_str =
'Propal status do not meet requirement '.$this->status;
3239 $this->error = $error_str;
3240 $this->errors[] = $this->error;
3259 if ($this->
status >= self::STATUS_DRAFT) {
3264 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'propal';
3265 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
3266 $sql .=
' WHERE rowid='.((int) $this->
id);
3268 dol_syslog(__METHOD__.
' demand_reason('.$demand_reason_id.
')', LOG_DEBUG);
3269 $resql = $this->db->query($sql);
3271 $this->errors[] = $this->db->error();
3276 $this->oldcopy = clone $this;
3277 $this->demand_reason_id = $demand_reason_id;
3280 if (!$notrigger && empty($error)) {
3290 $this->db->commit();
3293 foreach ($this->errors as $errmsg) {
3294 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
3295 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3297 $this->db->rollback();
3301 $error_str =
'Propal status do not meet requirement '.$this->status;
3303 $this->error = $error_str;
3304 $this->errors[] = $this->error;
3318 $sql =
"SELECT c.rowid, ";
3319 $sql .=
" c.datec, c.date_valid as datev, c.date_signature, c.date_cloture,";
3320 $sql .=
" c.fk_user_author, c.fk_user_valid, c.fk_user_signature, c.fk_user_cloture";
3321 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal as c";
3322 $sql .=
" WHERE c.rowid = ".((int) $id);
3324 $result = $this->db->query($sql);
3327 if ($this->db->num_rows($result)) {
3328 $obj = $this->db->fetch_object($result);
3330 $this->
id = $obj->rowid;
3332 $this->date_creation = $this->db->jdate($obj->datec);
3333 $this->date_validation = $this->db->jdate($obj->datev);
3334 $this->date_signature = $this->db->jdate($obj->date_signature);
3335 $this->date_cloture = $this->db->jdate($obj->date_cloture);
3337 $this->user_creation_id = $obj->fk_user_author;
3338 $this->user_validation_id = $obj->fk_user_valid;
3340 if ($obj->fk_user_signature) {
3341 $user_signature =
new User($this->db);
3342 $user_signature->fetch($obj->fk_user_signature);
3343 $this->user_signature = $user_signature;
3346 $this->user_closing_id = $obj->fk_user_cloture;
3348 $this->db->free($result);
3377 global $hookmanager;
3380 if (empty($this->labelStatus) || empty($this->labelStatusShort)) {
3382 $langs->load(
"propal");
3383 $this->labelStatus[-1] = $langs->transnoentitiesnoconv(
"PropalStatusCanceled");
3384 $this->labelStatus[0] = $langs->transnoentitiesnoconv(
"PropalStatusDraft");
3385 $this->labelStatus[1] = $langs->transnoentitiesnoconv(
"PropalStatusValidated");
3386 $this->labelStatus[2] = $langs->transnoentitiesnoconv(
"PropalStatusSigned");
3387 $this->labelStatus[3] = $langs->transnoentitiesnoconv(
"PropalStatusNotSigned");
3388 $this->labelStatus[4] = $langs->transnoentitiesnoconv(
"PropalStatusBilled");
3389 $this->labelStatusShort[-1] = $langs->transnoentitiesnoconv(
"PropalStatusCanceledShort");
3390 $this->labelStatusShort[0] = $langs->transnoentitiesnoconv(
"PropalStatusDraftShort");
3391 $this->labelStatusShort[1] = $langs->transnoentitiesnoconv(
"PropalStatusValidatedShort");
3392 $this->labelStatusShort[2] = $langs->transnoentitiesnoconv(
"PropalStatusSignedShort");
3393 $this->labelStatusShort[3] = $langs->transnoentitiesnoconv(
"PropalStatusNotSignedShort");
3394 $this->labelStatusShort[4] = $langs->transnoentitiesnoconv(
"PropalStatusBilledShort");
3398 if ($status == self::STATUS_CANCELED) {
3399 $statusType =
'status9';
3400 } elseif ($status == self::STATUS_DRAFT) {
3401 $statusType =
'status0';
3402 } elseif ($status == self::STATUS_VALIDATED) {
3403 $statusType =
'status1';
3404 } elseif ($status == self::STATUS_SIGNED) {
3405 $statusType =
'status4';
3406 } elseif ($status == self::STATUS_NOTSIGNED) {
3407 $statusType =
'status9';
3408 } elseif ($status == self::STATUS_BILLED) {
3409 $statusType =
'status6';
3412 $parameters = array(
'status' => $status,
'mode' => $mode);
3413 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3416 return $hookmanager->resPrint;
3419 return dolGetStatus($this->labelStatus[$status], $this->labelStatusShort[$status],
'', $statusType, $mode);
3434 global
$conf, $langs;
3438 $sql =
"SELECT p.rowid, p.ref, p.datec as datec, p.fin_validite as datefin, p.total_ht";
3439 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal as p";
3440 $sql .= $clause.
" p.entity IN (".
getEntity(
'propal').
")";
3441 if ($mode ==
'opened') {
3442 $sql .=
" AND p.fk_statut = ".self::STATUS_VALIDATED;
3444 if ($mode ==
'signed') {
3445 $sql .=
" AND p.fk_statut = ".self::STATUS_SIGNED;
3449 if (!$user->hasRight(
'societe',
'client',
'voir')) {
3450 $search_sale = $user->id;
3453 if ($search_sale && $search_sale !=
'-1') {
3454 if ($search_sale == -2) {
3455 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
3456 } elseif ($search_sale > 0) {
3457 $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).
")";
3461 $resql = $this->db->query($sql);
3463 $langs->load(
"propal");
3468 $label = $labelShort =
'';
3469 if ($mode ==
'opened') {
3470 $delay_warning =
$conf->propal->cloture->warning_delay;
3472 $label = $langs->transnoentitiesnoconv(
"PropalsToClose");
3473 $labelShort = $langs->transnoentitiesnoconv(
"ToAcceptRefuse");
3475 if ($mode ==
'signed') {
3476 $delay_warning =
$conf->propal->facturation->warning_delay;
3478 $label = $langs->trans(
"PropalsToBill");
3479 $labelShort = $langs->trans(
"ToBill");
3483 $response->warning_delay = $delay_warning / 60 / 60 / 24;
3484 $response->label = $label;
3485 $response->labelShort = $labelShort;
3486 $response->url = DOL_URL_ROOT.
'/comm/propal/list.php?search_status='.$status.
'&mainmenu=commercial&leftmenu=propals';
3487 $response->url_late = DOL_URL_ROOT.
'/comm/propal/list.php?search_option=late&mainmenu=commercial&leftmenu=propals&sortfield=p.datep&sortorder=asc';
3491 while ($obj = $this->db->fetch_object($resql)) {
3492 $response->nbtodo++;
3493 $response->total += $obj->total_ht;
3495 if ($mode ==
'opened') {
3496 $datelimit = $this->db->jdate($obj->datefin);
3497 if ($datelimit < ($now - $delay_warning)) {
3498 $response->nbtodolate++;
3507 $this->error = $this->db->error();
3522 global
$conf, $langs;
3527 $sql =
"SELECT rowid";
3528 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
3529 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
3530 $sql .= $this->db->plimit(100);
3532 $resql = $this->db->query($sql);
3534 $num_prods = $this->db->num_rows($resql);
3536 while ($i < $num_prods) {
3538 $row = $this->db->fetch_row($resql);
3539 $prodids[$i] = $row[0];
3545 $this->
ref =
'SPECIMEN';
3546 $this->ref_client =
'NEMICEPS';
3547 $this->specimen = 1;
3549 $this->date = time();
3550 $this->fin_validite = $this->date + 3600 * 24 * 30;
3551 $this->cond_reglement_id = 1;
3552 $this->cond_reglement_code =
'RECEP';
3553 $this->mode_reglement_id = 7;
3554 $this->mode_reglement_code =
'CHQ';
3555 $this->availability_id = 1;
3556 $this->availability_code =
'AV_NOW';
3557 $this->demand_reason_id = 1;
3558 $this->demand_reason_code =
'SRC_00';
3559 $this->note_public =
'This is a comment (public)';
3560 $this->note_private =
'This is a comment (private)';
3562 $this->multicurrency_tx = 1;
3563 $this->multicurrency_code =
$conf->currency;
3568 while ($xnbp < $nbp) {
3570 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
3572 $line->subprice = 100;
3575 $line->localtax1_tx = 0;
3576 $line->localtax2_tx = 0;
3578 $line->total_ht = 50;
3579 $line->total_ttc = 60;
3580 $line->total_tva = 10;
3581 $line->remise_percent = 50;
3583 $line->total_ht = 100;
3584 $line->total_ttc = 120;
3585 $line->total_tva = 20;
3586 $line->remise_percent = 00;
3589 if ($num_prods > 0) {
3590 $prodid = mt_rand(1, $num_prods);
3591 $line->fk_product = $prodids[$prodid];
3592 $line->product_ref =
'SPECIMEN';
3595 $this->lines[$xnbp] = $line;
3597 $this->total_ht += $line->total_ht;
3598 $this->total_tva += $line->total_tva;
3599 $this->total_ttc += $line->total_ttc;
3616 $this->nb = array();
3619 $sql =
"SELECT count(p.rowid) as nb";
3620 $sql .=
" FROM ".MAIN_DB_PREFIX.
"propal as p";
3621 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON p.fk_soc = s.rowid";
3622 $sql .=
" ".$clause.
" p.entity IN (".
getEntity(
'propal').
")";
3626 if (!$user->hasRight(
'societe',
'client',
'voir')) {
3627 $search_sale = $user->id;
3630 if ($search_sale && $search_sale !=
'-1') {
3631 if ($search_sale == -2) {
3632 $sql .=
" AND NOT EXISTS (SELECT sc.fk_soc FROM ".MAIN_DB_PREFIX.
"societe_commerciaux as sc WHERE sc.fk_soc = p.fk_soc)";
3633 } elseif ($search_sale > 0) {
3634 $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).
")";
3638 $resql = $this->db->query($sql);
3641 while ($obj = $this->db->fetch_object($resql)) {
3642 $this->nb[
"proposals"] = $obj->nb;
3644 $this->db->free($resql);
3648 $this->error = $this->db->error();
3663 global
$conf, $langs;
3664 $langs->load(
"propal");
3668 if (!empty($classname)) {
3671 $file = $classname.
".php";
3674 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
3675 foreach ($dirmodels as $reldir) {
3679 $mybool = ((bool) @include_once $dir.$file) || $mybool;
3687 $obj =
new $classname();
3688 '@phan-var-force ModeleNumRefPropales $obj';
3690 $numref = $obj->getNextValue($soc, $this);
3692 if ($numref !=
"") {
3695 $this->error = $obj->error;
3700 $langs->load(
"errors");
3701 print $langs->trans(
"Error").
" ".$langs->trans(
"ErrorModuleSetupNotComplete", $langs->transnoentitiesnoconv(
"Proposal"));
3714 global
$conf, $langs, $user;
3716 $langs->load(
'propal');
3718 $nofetch = !empty($params[
'nofetch']);
3721 return [
'optimize' => $langs->trans(
"Proposal")];
3723 if ($user->hasRight(
'propal',
'lire')) {
3724 $datas[
'picto'] =
img_picto(
'', $this->picto,
'', 0, 0, 0,
'',
'paddingrightonly').
'<u>'.$langs->trans(
"Proposal").
'</u>';
3725 if (isset($this->
status)) {
3726 $datas[
'status'] =
' '.$this->getLibStatut(5);
3728 if (!empty($this->
ref)) {
3729 $datas[
'ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3732 $langs->load(
'companies');
3733 if (empty($this->thirdparty)) {
3736 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3738 if (!empty($this->ref_customer)) {
3739 $datas[
'refcustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.$this->ref_customer;
3742 $langs->load(
'project');
3743 if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
3745 if ($res > 0 && $this->project instanceof
Project) {
3746 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0, 1);
3750 if (!empty($this->total_ht)) {
3751 $datas[
'amountht'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
$conf->currency);
3753 if (!empty($this->total_tva)) {
3754 $datas[
'vat'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
$conf->currency);
3756 if (!empty($this->total_ttc)) {
3757 $datas[
'amountttc'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency);
3759 if (!empty($this->date)) {
3760 $datas[
'date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
3762 if (!empty($this->delivery_date)) {
3763 $datas[
'deliverydate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3781 public function getNomUrl($withpicto = 0, $option =
'', $get_params =
'', $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = -1)
3783 global $langs,
$conf, $user, $hookmanager;
3785 if (!empty(
$conf->dol_no_mouse_hover)) {
3792 'objecttype' => $this->element,
3793 'option' => $option,
3796 $classfortooltip =
'classfortooltip';
3799 $classfortooltip =
'classforajaxtooltip';
3800 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3807 if ($user->hasRight(
'propal',
'lire')) {
3808 if ($option ==
'') {
3809 $url = DOL_URL_ROOT.
'/comm/propal/card.php?id='.$this->
id.$get_params;
3810 } elseif ($option ==
'compta') {
3811 $url = DOL_URL_ROOT.
'/comm/propal/card.php?id='.$this->
id.$get_params;
3812 } elseif ($option ==
'expedition') {
3813 $url = DOL_URL_ROOT.
'/expedition/propal.php?id='.$this->
id.$get_params;
3814 } elseif ($option ==
'document') {
3815 $url = DOL_URL_ROOT.
'/comm/propal/document.php?id='.$this->
id.$get_params;
3818 if ($option !=
'nolink') {
3820 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3821 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3822 $add_save_lastsearch_values = 1;
3824 if ($add_save_lastsearch_values) {
3825 $url .=
'&save_lastsearch_values=1';
3831 if (empty($notooltip) && $user->hasRight(
'propal',
'lire')) {
3833 $label = $langs->trans(
"Proposal");
3834 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
3836 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
3837 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3840 $linkstart =
'<a href="'.$url.
'"';
3841 $linkstart .= $linkclose.
'>';
3844 $result .= $linkstart;
3846 $result .=
img_object(($notooltip ?
'' : $label), ($this->picto ? $this->picto :
'generic'), (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
3848 if ($withpicto != 2) {
3849 $result .= $this->ref;
3851 $result .= $linkend;
3853 if ($addlinktonotes >= 0) {
3856 if ($addlinktonotes == 0) {
3857 if (!empty($this->note_private) || !empty($this->note_public)) {
3858 $txttoshow = $langs->trans(
'ViewPrivateNote');
3860 } elseif ($addlinktonotes == 1) {
3861 if (!empty($this->note_private)) {
3864 } elseif ($addlinktonotes == 2) {
3865 if (!empty($this->note_public)) {
3868 } elseif ($addlinktonotes == 3) {
3869 if ($user->socid > 0) {
3870 if (!empty($this->note_public)) {
3874 if (!empty($this->note_public)) {
3877 if (!empty($this->note_private)) {
3878 if (!empty($txttoshow)) {
3879 $txttoshow .=
'<br><br>';
3887 $result .=
' <span class="note inline-block">';
3888 $result .=
'<a href="'.DOL_URL_ROOT.
'/comm/propal/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($txttoshow).
'">';
3891 $result .=
'</span>';
3896 $hookmanager->initHooks(array($this->element .
'dao'));
3897 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
3898 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
3900 $result = $hookmanager->resPrint;
3902 $result .= $hookmanager->resPrint;
3915 return $this->
fetch_lines(0, 0, $sqlforgedfilters);
3929 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
3931 global
$conf, $langs;
3933 $langs->load(
"propale");
3934 $outputlangs->load(
"products");
3939 if ($this->model_pdf) {
3940 $modele = $this->model_pdf;
3946 $modelpath =
"core/modules/propale/doc/";
3948 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
3996 $selected = (empty($arraydata[
'selected']) ? 0 : $arraydata[
'selected']);
3998 $return =
'<div class="box-flex-item box-flex-grow-zero">';
3999 $return .=
'<div class="info-box info-box-sm">';
4000 $return .=
'<div class="info-box-icon bg-infobox-action">';
4002 $return .=
'</div>';
4003 $return .=
'<div class="info-box-content">';
4004 $return .=
'<span class="info-box-ref inline-block tdoverflowmax150 valignmiddle">'.(method_exists($this,
'getNomUrl') ? $this->
getNomUrl() : $this->ref).
'</span>';
4005 if ($selected >= 0) {
4006 $return .=
'<input id="cb'.$this->id.
'" class="flat checkforselect fright" type="checkbox" name="toselect[]" value="'.$this->
id.
'"'.($selected ?
' checked="checked"' :
'').
'>';
4008 if (!empty($arraydata[
'projectlink'])) {
4009 $return .=
'<span class="info-box-ref"> | '.$arraydata[
'projectlink'].
'</span>';
4012 if (property_exists($this,
'thirdparty') && is_object($this->thirdparty)) {
4013 $return .=
'<div class="info-box-ref tdoverflowmax150">'.$this->thirdparty->getNomUrl(1).
'</div>';
4015 if (property_exists($this,
'total_ht')) {
4016 $return .=
'<span class="info-box-label amount" title="'.$langs->trans(
"AmountHT").
'">'.
price($this->total_ht).
'</span>';
4018 if (!empty($arraydata[
'authorlink'])) {
4019 $return .=
' <span class="info-box-label">'.$arraydata[
'authorlink'].
'</span>';
4021 if (method_exists($this,
'getLibStatut')) {
4022 $return .=
'<br><div class="info-box-status">'.$this->getLibStatut(3).
'</div>';
4024 $return .=
'</div>';
4025 $return .=
'</div>';
4026 $return .=
'</div>';
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetchProject()
Load the project with id $this->fk_project into this->project.
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.
fetchObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $clause='OR', $alsosametype=1, $orderby='sourcetype', $loadalsoobjects=1)
Fetch array of objects linked to current object (object of enabled modules only).
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.
delete_linked_contact($source='', $code='')
Delete all links between an object $this and all its contacts in llx_element_contact.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Class to manage absolute discounts.
Class to manage Dolibarr database access.
static getIdFromCode($dbs, $code)
Get id of currency from code.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
File of class to manage predefined price products or services by customer.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
getTooltipContentArray($params)
getTooltipContentArray
const STATUS_DRAFT
Draft status.
set_date($user, $date, $notrigger=0)
Define proposal date.
const STATUS_SIGNED
Signed quote.
getNomUrl($withpicto=0, $option='', $get_params='', $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=-1)
Return clickable link of object (with eventually picto)
getKanbanView($option='', $arraydata=null)
Return clickable link of object (with eventually picto)
InvoiceArrayList($id)
Returns an array with id and ref of related invoices.
availability($availability_id, $notrigger=0)
Change the delivery time.
const STATUS_NOTSIGNED
Not signed quote.
setDeliveryDate($user, $delivery_date, $notrigger=0)
Set delivery date.
classifyBilled(User $user, $notrigger=0, $note='')
Classify the proposal to status Billed.
getLinesArray($sqlforgedfilters='')
Retrieve an array of proposal lines.
fetch($rowid, $ref='', $ref_ext='', $forceentity=0)
Load a proposal from database.
set_availability($user, $id, $notrigger=0)
Set delivery.
fetch_lines($only_product=0, $loadalsotranslation=0, $sqlforgedfilters='')
Load array lines.
updateline($rowid, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.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, $date_start='', $date_end='', $array_options=array(), $fk_unit=null, $pu_ht_devise=0, $notrigger=0, $rang=0)
Update a proposal line.
update(User $user, $notrigger=0)
Update database.
closeProposal($user, $status, $note_private='', $notrigger=0, $note_public='')
Close/set the commercial proposal to status signed or refused (fill also date signature)
demand_reason($demand_reason_id, $notrigger=0)
Change source demand.
info($id)
Object Proposal Information.
const STATUS_BILLED
Billed or processed quote.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
getLibStatut($mode=0)
Return label of status of proposal (draft, validated, ...)
const STATUS_CANCELED
Canceled status.
insert_discount($idremise)
Add a discount line into an proposal (as a proposal line) using an existing absolute discount (Consum...
getNextNumRef($soc)
Returns the reference to the following non used Proposal used depending on the active numbering modul...
LibStatut($status, $mode=1)
Return label of a status (draft, validated, ...)
valid($user, $notrigger=0)
Set status to validated.
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
set_ref_client($user, $ref_client, $notrigger=0)
Set customer reference number.
setDraft($user, $notrigger=0)
Set draft status.
set_echeance($user, $date_end_validity, $notrigger=0)
Define end validity date.
set_demand_reason($user, $id, $notrigger=0)
Set source of demand.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
create($user, $notrigger=0)
Create commercial proposal into database this->ref can be set or empty.
liste_array($shortlist=0, $draft=0, $notcurrentuser=0, $socid=0, $limit=0, $offset=0, $sortfield='p.datep', $sortorder='DESC')
Return list of proposal (eventually filtered on user) into an array.
add_product($idproduct, $qty, $remise_percent=0)
Add line into array ->lines $this->thirdparty should be loaded.
initAsSpecimen()
Initialise an instance with random values.
reopen($user, $status, $note='', $notrigger=0)
Reopen the commercial proposal.
deleteLine($lineid, $id=0)
Delete detail line.
__construct($db, $socid=0, $propalid=0)
Constructor.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
setCancel(User $user)
Cancel the proposal.
addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $fk_product=0, $remise_percent=0.0, $price_base_type='HT', $pu_ttc=0.0, $info_bits=0, $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=0, $pa_ht=0, $label='', $date_start='', $date_end='', $array_options=array(), $fk_unit=null, $origin='', $origin_id=0, $pu_ht_devise=0, $fk_remise_except=0, $noupdateafterinsertline=0)
Add a proposal line into database (linked to product/service or not) The parameters are already suppo...
getInvoiceArrayList()
Returns an array with the numbers of related invoices.
set_date_livraison($user, $delivery_date, $notrigger=0)
Set delivery date.
const STATUS_VALIDATED
Validated status.
loadStateBoard()
Load the indicators this->nb for the state board.
createFromClone(User $user, $socid=0, $forceentity=null, $update_prices=false, $update_desc=false)
Load an object from its id and create a new one in database.
Class to manage commercial proposal lines.
Class to manage third parties objects (customers, suppliers, prospects...)
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_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_dir_list($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_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
setEntity($currentobject)
Set entity id to use when to create an object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
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 '.
isDolTms($timestamp)
isDolTms check if a timestamp is valid.
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).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
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)
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
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_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
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.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
getMarginInfos($pv_ht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $pa_ht)
Return an array with margins information of a line.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller='', $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.