39require_once DOL_DOCUMENT_ROOT.
'/core/class/commonorder.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/commande/class/orderline.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
43require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/subtotals/class/commonsubtotal.class.php';
58 public $element =
'commande';
63 public $table_element =
'commande';
68 public $table_element_line =
'commandedet';
73 public $class_element_line =
'OrderLine';
78 public $fk_element =
'fk_commande';
83 public $picto =
'order';
89 public $restrictiononfksoc = 1;
109 public $ref_customer;
137 public $date_lim_reglement;
141 public $cond_reglement_code;
146 public $cond_reglement_doc;
153 public $deposit_percent;
163 public $mode_reglement;
168 public $mode_reglement_id;
173 public $mode_reglement_code;
179 public $availability_id;
185 public $availability_code;
191 public $availability;
196 public $demand_reason_id;
201 public $demand_reason_code;
213 public $date_commande;
218 public $delivery_date;
223 public $fk_remise_except;
229 public $remise_percent;
240 public $signed_status = 0;
245 public $warehouse_id;
250 public $extraparams = array();
252 public $linked_objects = array();
257 public $user_author_id;
267 public $lines = array();
273 public $module_source;
287 public $online_payment_url;
320 public $fields = array(
321 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
322 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 20,
'index' => 1),
323 'ref' => array(
'type' =>
'varchar(30)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 25),
324 'ref_ext' => array(
'type' =>
'varchar(255)',
'label' =>
'RefExt',
'enabled' => 1,
'visible' => 0,
'position' => 26),
325 'ref_client' => array(
'type' =>
'varchar(255)',
'label' =>
'RefCustomer',
'enabled' => 1,
'visible' => -1,
'position' => 28),
326 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php',
'label' =>
'ThirdParty',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'notnull' => 1,
'position' => 20),
327 'fk_projet' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label' =>
'Project',
'enabled' =>
"isModEnabled('project')",
'visible' => -1,
'position' => 25),
328 'date_commande' => array(
'type' =>
'date',
'label' =>
'Date',
'enabled' => 1,
'visible' => 1,
'position' => 60,
'csslist' =>
'nowraponall'),
329 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -1,
'position' => 62,
'csslist' =>
'nowraponall'),
330 'date_cloture' => array(
'type' =>
'datetime',
'label' =>
'DateClosing',
'enabled' => 1,
'visible' => -1,
'position' => 65,
'csslist' =>
'nowraponall'),
331 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'enabled' => 1,
'visible' => -1,
'position' => 85),
332 'fk_user_cloture' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserClosing',
'enabled' => 1,
'visible' => -1,
'position' => 90),
333 'source' => array(
'type' =>
'smallint(6)',
'label' =>
'Source',
'enabled' => 1,
'visible' => -1,
'position' => 95),
334 'total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'VAT',
'enabled' => 1,
'visible' => -1,
'position' => 125,
'isameasure' => 1),
335 'localtax1' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax1',
'enabled' => 1,
'visible' => -1,
'position' => 130,
'isameasure' => 1),
336 'localtax2' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax2',
'enabled' => 1,
'visible' => -1,
'position' => 135,
'isameasure' => 1),
337 'total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalHT',
'enabled' => 1,
'visible' => -1,
'position' => 140,
'isameasure' => 1),
338 'total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalTTC',
'enabled' => 1,
'visible' => -1,
'position' => 145,
'isameasure' => 1),
339 'signed_status' => array(
'type' =>
'smallint(6)',
'label' =>
'SignedStatus',
'enabled' => 1,
'visible' => -1,
'position' => 146,
'arrayofkeyval' => array(0 =>
'NoSignature', 1 =>
'SignedSender', 2 =>
'SignedReceiver', 9 =>
'SignedAll')),
340 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 150),
341 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 155),
342 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'PDFTemplate',
'enabled' => 1,
'visible' => 0,
'position' => 160),
343 'fk_account' => array(
'type' =>
'integer',
'label' =>
'BankAccount',
'enabled' =>
'isModEnabled("bank")',
'visible' => -1,
'position' => 170),
344 'fk_currency' => array(
'type' =>
'varchar(3)',
'label' =>
'MulticurrencyID',
'enabled' => 1,
'visible' => -1,
'position' => 175),
345 'fk_cond_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentTerm',
'enabled' => 1,
'visible' => -1,
'position' => 180),
346 'deposit_percent' => array(
'type' =>
'varchar(63)',
'label' =>
'DepositPercent',
'enabled' => 1,
'visible' => -1,
'position' => 181),
347 'fk_mode_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentMode',
'enabled' => 1,
'visible' => -1,
'position' => 185),
348 'date_livraison' => array(
'type' =>
'date',
'label' =>
'DateDeliveryPlanned',
'enabled' => 1,
'visible' => -1,
'position' => 190,
'csslist' =>
'nowraponall'),
349 'fk_shipping_method' => array(
'type' =>
'integer',
'label' =>
'ShippingMethod',
'enabled' => 1,
'visible' => -1,
'position' => 195),
350 'fk_warehouse' => array(
'type' =>
'integer:Entrepot:product/stock/class/entrepot.class.php',
'label' =>
'DefaultWarehouse',
'enabled' =>
'isModEnabled("stock")',
'visible' => -1,
'position' => 200,
'nodepth' => 1),
351 'fk_availability' => array(
'type' =>
'integer',
'label' =>
'Availability',
'enabled' => 1,
'visible' => -1,
'position' => 205),
352 'fk_input_reason' => array(
'type' =>
'integer',
'label' =>
'InputReason',
'enabled' => 1,
'visible' => -1,
'position' => 210),
354 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 225),
355 'fk_incoterms' => array(
'type' =>
'integer',
'label' =>
'IncotermCode',
'enabled' =>
'$conf->incoterm->enabled',
'visible' => -1,
'position' => 230),
356 'location_incoterms' => array(
'type' =>
'varchar(255)',
'label' =>
'IncotermLabel',
'enabled' =>
'$conf->incoterm->enabled',
'visible' => -1,
'position' => 235),
357 'fk_multicurrency' => array(
'type' =>
'integer',
'label' =>
'Fk multicurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 240),
358 'multicurrency_code' => array(
'type' =>
'varchar(255)',
'label' =>
'MulticurrencyCurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 245),
359 'multicurrency_tx' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyRate',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 250,
'isameasure' => 1),
360 'multicurrency_total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountHT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 255,
'isameasure' => 1),
361 'multicurrency_total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountVAT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 260,
'isameasure' => 1),
362 'multicurrency_total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountTTC',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 265,
'isameasure' => 1),
363 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'LastMainDoc',
'enabled' => 1,
'visible' => -1,
'position' => 270),
364 'module_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSModule',
'enabled' => 1,
'visible' => -1,
'position' => 275),
365 'pos_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSTerminal',
'enabled' => 1,
'visible' => -1,
'position' => 280),
366 'fk_user_author' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'visible' => -1,
'position' => 300),
367 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'notnull' => -1,
'position' => 302),
368 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'position' => 304,
'csslist' =>
'nowraponall'),
369 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 306),
370 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 400),
371 'fk_statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Status',
'enabled' => 1,
'visible' => -1,
'position' => 500),
411 const STATUS_NO_SIGNATURE = 0;
416 const STATUS_SIGNED_SENDER = 1;
421 const STATUS_SIGNED_RECEIVER = 2;
426 const STATUS_SIGNED_ALL = 9;
438 $this->ismultientitymanaged = 1;
439 $this->isextrafieldmanaged = 1;
441 $this->fields[
'ref_ext'][
'visible'] =
getDolGlobalInt(
'MAIN_LIST_SHOW_REF_EXT');
451 public function getNextNumRef($soc)
453 global $langs,
$conf;
454 $langs->load(
"order");
463 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
464 foreach ($dirmodels as $reldir) {
468 $mybool = ((bool) @include_once $dir.$file) || $mybool;
476 $obj =
new $classname();
478 '@phan-var-force ModeleNumRefCommandes $obj';
480 $numref = $obj->getNextValue($soc, $this);
485 $this->error = $obj->error;
490 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_COMMANDE_ADDON_NotDefined");
504 public function valid($user, $idwarehouse = 0, $notrigger = 0)
506 global
$conf, $langs;
508 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
513 if ($this->
status == self::STATUS_VALIDATED) {
514 dol_syslog(get_class($this).
"::valid action abandoned: already validated", LOG_WARNING);
518 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
519 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
520 $this->error =
'NotEnoughPermissions';
521 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
531 $soc->fetch($this->socid);
534 $result = $soc->setAsCustomer();
537 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
538 $num = $this->getNextNumRef($soc);
545 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
546 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
547 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
548 $sql .=
" date_valid = '".$this->db->idate($now).
"',";
549 $sql .=
" fk_user_valid = ".($user->id > 0 ? (int) $user->id :
"null").
",";
550 $sql .=
" fk_user_modif = ".((int) $user->id);
551 $sql .=
" WHERE rowid = ".((int) $this->
id);
553 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
554 $resql = $this->db->query($sql);
557 $this->error = $this->db->lasterror();
563 if ($result >= 0 && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
564 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
565 $langs->load(
"agenda");
568 $cpt = count($this->lines);
569 for ($i = 0; $i < $cpt; $i++) {
570 if ($this->lines[$i]->fk_product > 0) {
572 $mouvP->origin = &$this;
573 $mouvP->setOrigin($this->element, $this->
id);
575 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"OrderValidatedInDolibarr", $num));
578 $this->error = $mouvP->error;
588 if (!$error && !$notrigger) {
598 $this->oldref = $this->ref;
601 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
603 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'commande/".$this->db->escape($this->newref).
"'";
604 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
605 $resql = $this->db->query($sql);
608 $this->error = $this->db->lasterror();
610 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'commande/".$this->db->escape($this->newref).
"'";
611 $sql .=
" WHERE filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
612 $resql = $this->db->query($sql);
615 $this->error = $this->db->lasterror();
621 $dirsource =
$conf->commande->multidir_output[$this->entity].
'/'.$oldref;
622 $dirdest =
$conf->commande->multidir_output[$this->entity].
'/'.$newref;
623 if (!$error && file_exists($dirsource)) {
624 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
626 if (@rename($dirsource, $dirdest)) {
629 $listoffiles =
dol_dir_list(
$conf->commande->multidir_output[$this->entity].
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
630 foreach ($listoffiles as $fileentry) {
631 $dirsource = $fileentry[
'name'];
632 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
633 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
634 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
635 @rename($dirsource, $dirdest);
653 $this->db->rollback();
678 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
679 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
680 $this->error =
'Permission denied';
688 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
689 $sql .=
" SET fk_statut = ".((int) self::STATUS_DRAFT).
",";
690 $sql .=
" fk_user_modif = ".((int) $user->id);
691 $sql .=
" WHERE rowid = ".((int) $this->
id);
693 if ($this->db->query($sql)) {
695 $this->oldcopy = clone $this;
699 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
702 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
703 $langs->load(
"agenda");
705 $num = count($this->lines);
706 for ($i = 0; $i < $num; $i++) {
707 if ($this->lines[$i]->fk_product > 0) {
709 $mouvP->origin = &$this;
710 $mouvP->setOrigin($this->element, $this->
id);
712 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderBackToDraftInDolibarr", $this->ref));
715 $this->error = $mouvP->error;
724 $result = $this->
call_trigger(
'ORDER_UNVALIDATE', $user);
736 $this->db->rollback();
740 $this->error = $this->db->error();
741 $this->db->rollback();
760 if ($this->
status != self::STATUS_CANCELED && $this->
status != self::STATUS_CLOSED) {
761 dol_syslog(get_class($this).
"::set_reopen order has not status closed", LOG_WARNING);
767 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
768 $sql .=
' SET fk_statut='.self::STATUS_VALIDATED.
', facture=0,';
769 $sql .=
" fk_user_modif = ".((int) $user->id);
770 $sql .=
" WHERE rowid = ".((int) $this->
id);
772 dol_syslog(get_class($this).
"::set_reopen", LOG_DEBUG);
773 $resql = $this->db->query($sql);
783 $this->error = $this->db->lasterror();
795 foreach ($this->errors as $errmsg) {
796 dol_syslog(get_class($this).
"::set_reopen ".$errmsg, LOG_ERR);
797 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
799 $this->db->rollback();
812 public function cloture($user, $notrigger = 0, $checkpermission = 1)
816 $usercanclose = (!$checkpermission
817 || (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
818 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'close')));
821 if ($this->
status == self::STATUS_CLOSED) {
828 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
829 $sql .=
' SET fk_statut = '.self::STATUS_CLOSED.
',';
830 $sql .=
' fk_user_cloture = '.((int) $user->id).
',';
831 $sql .=
" date_cloture = '".$this->db->idate($now).
"',";
832 $sql .=
" fk_user_modif = ".((int) $user->id);
835 if ($this->db->query($sql)) {
852 $this->db->rollback();
856 $this->error = $this->db->lasterror();
858 $this->db->rollback();
878 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
879 return parent::setCategoriesCommon($categories, Categorie::TYPE_ORDER);
889 public function cancel($idwarehouse = -1)
891 global $user, $langs;
897 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
898 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
",";
899 $sql .=
" fk_user_modif = ".((int) $user->id);
900 $sql .=
" WHERE rowid = ".((int) $this->
id);
901 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
903 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
904 if ($this->db->query($sql)) {
906 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
907 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
908 $langs->load(
"agenda");
910 $num = count($this->lines);
911 for ($i = 0; $i < $num; $i++) {
912 if ($this->lines[$i]->fk_product > 0) {
914 $mouvP->setOrigin($this->element, $this->
id);
916 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderCanceledInDolibarr", $this->ref));
919 $this->error = $mouvP->error;
941 foreach ($this->errors as $errmsg) {
942 dol_syslog(get_class($this).
"::cancel ".$errmsg, LOG_ERR);
943 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
945 $this->db->rollback();
949 $this->error = $this->db->error();
950 $this->db->rollback();
963 public function create($user, $notrigger = 0)
965 global
$conf, $langs, $mysoc;
971 $date = ($this->date_commande ? $this->date_commande : $this->date);
972 $delivery_date = $this->delivery_date;
975 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
980 if (empty($this->fk_multicurrency)) {
981 $this->multicurrency_code =
$conf->currency;
982 $this->fk_multicurrency = 0;
983 $this->multicurrency_tx = 1;
988 dol_syslog(get_class($this).
"::create user=".$user->id);
991 if (!empty($this->
ref)) {
994 $this->error =
'ErrorRefAlreadyExists';
995 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
996 $this->db->rollback();
1001 $soc =
new Societe($this->db);
1002 $result = $soc->fetch($this->socid);
1004 $this->error =
"Failed to fetch company";
1005 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1009 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Source"));
1010 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1018 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$this->table_element.
" (";
1019 $sql .=
" ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client";
1020 $sql .=
", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address";
1021 $sql .=
", fk_shipping_method";
1022 $sql .=
", fk_warehouse";
1023 $sql .=
", fk_incoterms, location_incoterms";
1024 $sql .=
", entity, module_source, pos_source";
1025 $sql .=
", fk_multicurrency";
1026 $sql .=
", multicurrency_code";
1027 $sql .=
", multicurrency_tx";
1029 $sql .=
" VALUES ('(PROV)', ".((int) $this->socid).
", '".$this->db->idate($now).
"', ".((int) $user->id);
1030 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
1031 $sql .=
", '".$this->db->idate($date).
"'";
1032 $sql .=
", ".($this->source >= 0 && $this->source !=
'' ? $this->db->escape((
string) $this->source) :
'null');
1033 $sql .=
", '".$this->db->escape($this->note_private).
"'";
1034 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1035 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
1036 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
1037 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1038 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
1039 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape((
string) $this->deposit_percent).
"'" :
"null");
1040 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
1041 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1042 $sql .=
", ".($this->availability_id > 0 ? ((int) $this->availability_id) :
"null");
1043 $sql .=
", ".($this->demand_reason_id > 0 ? ((int) $this->demand_reason_id) :
"null");
1044 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1045 $sql .=
", ".($this->fk_delivery_address > 0 ? ((int) $this->fk_delivery_address) :
'NULL');
1046 $sql .=
", ".(!empty($this->shipping_method_id) && $this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1047 $sql .=
", ".(!empty($this->warehouse_id) && $this->warehouse_id > 0 ? ((int) $this->warehouse_id) :
'NULL');
1048 $sql .=
", ".(int) $this->fk_incoterms;
1049 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
1050 $sql .=
", ".(int) $this->entity;
1051 $sql .=
", ".($this->module_source ?
"'".$this->db->escape($this->module_source).
"'" :
"null");
1052 $sql .=
", ".((!is_null($this->pos_source) && $this->pos_source !=
'') ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
1053 $sql .=
", ".(int) $this->fk_multicurrency;
1054 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1055 $sql .=
", ".(float) $this->multicurrency_tx;
1058 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1059 $resql = $this->db->query($sql);
1061 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commande');
1064 $fk_parent_line = 0;
1065 $num = count($this->lines);
1070 for ($i = 0; $i < $num; $i++) {
1071 $line = $this->lines[$i];
1075 if (!is_object($line)) {
1077 foreach ($line as $key => $val) {
1078 $lineobj->$key = $val;
1081 $this->lines[$i] = $line;
1085 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1086 $fk_parent_line = 0;
1090 $vatrate = $line->tva_tx;
1091 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', (
string) $vatrate)) {
1092 $vatrate .=
' ('.$line->vat_src_code.
')';
1096 $originid = $line->origin_id;
1097 $origintype = empty($line->origin_type) ? $line->origin : $line->origin_type;
1099 $originid = $line->id;
1100 $origintype = $this->element;
1104 if (empty($line->ref_ext)) {
1105 $line->ref_ext =
'';
1113 $line->localtax1_tx,
1114 $line->localtax2_tx,
1116 $line->remise_percent,
1118 $line->fk_remise_except,
1123 $line->product_type,
1125 $line->special_code,
1127 $line->fk_fournprice,
1130 $line->array_options,
1132 (
string) $origintype,
1140 if ($result != self::STOCK_NOT_ENOUGH_FOR_ORDER) {
1141 $this->error = $this->db->lasterror();
1142 $this->errors[] = $this->error;
1145 $this->db->rollback();
1149 if ($result > 0 && $line->product_type == 9) {
1150 $fk_parent_line = $result;
1157 $initialref =
'(PROV'.$this->id.
')';
1158 if (!empty($this->
ref)) {
1159 $initialref = $this->ref;
1162 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
" SET ref='".$this->db->escape($initialref).
"' WHERE rowid=".((int) $this->
id);
1163 if ($this->db->query($sql)) {
1164 $this->
ref = $initialref;
1166 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1167 $this->linked_objects = $this->linkedObjectsIds;
1171 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1172 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1173 if (is_array($tmp_origin_id)) {
1174 foreach ($tmp_origin_id as $origin_id) {
1177 $this->error = $this->db->lasterror();
1182 $origin_id = $tmp_origin_id;
1185 $this->error = $this->db->lasterror();
1192 if (!$error && $this->
id &&
getDolGlobalString(
'MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN') && !empty($this->origin) && !empty($this->origin_id)) {
1193 $originforcontact = empty($this->origin_type) ? $this->origin : $this->origin_type;
1194 $originidforcontact = $this->origin_id;
1195 if ($originforcontact ==
'shipping') {
1196 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1198 $exp->fetch($this->origin_id);
1199 $exp->fetchObjectLinked();
1200 if (count($exp->linkedObjectsIds[
'commande']) > 0) {
1201 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1202 $originforcontact =
'commande';
1203 if (is_object($value)) {
1204 $originidforcontact = $value->id;
1206 $originidforcontact = $value;
1213 $sqlcontact =
"SELECT ctc.code, ctc.source, ec.fk_socpeople FROM ".MAIN_DB_PREFIX.
"element_contact as ec, ".MAIN_DB_PREFIX.
"c_type_contact as ctc";
1214 $sqlcontact .=
" WHERE element_id = ".((int) $originidforcontact).
" AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = '".$this->db->escape($originforcontact).
"'";
1216 $resqlcontact = $this->db->query($sqlcontact);
1217 if ($resqlcontact) {
1218 while ($objcontact = $this->db->fetch_object($resqlcontact)) {
1220 $this->
add_contact($objcontact->fk_socpeople, $objcontact->code, $objcontact->source);
1234 if (!$error && !$notrigger) {
1244 $this->db->commit();
1247 $this->db->rollback();
1251 $this->error = $this->db->lasterror();
1252 $this->db->rollback();
1259 $this->error = $this->db->lasterror();
1260 $this->db->rollback();
1275 global $user, $hookmanager;
1282 foreach ($this->lines as $line) {
1283 $line->fetch_optionals();
1287 $objFrom = clone $this;
1290 if (!empty($socid) && $socid != $this->socid) {
1291 $objsoc =
new Societe($this->db);
1293 if ($objsoc->fetch($socid) > 0) {
1294 $this->socid = $objsoc->id;
1295 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1296 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent : 0);
1297 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1298 $this->fk_project = 0;
1299 $this->fk_delivery_address = 0;
1311 $this->user_author_id = $user->id;
1312 $this->user_validation_id = 0;
1314 $this->date_commande =
dol_now();
1315 $this->date_creation =
'';
1316 $this->date_validation =
'';
1318 $this->ref_client =
'';
1319 $this->ref_customer =
'';
1323 $num = count($this->lines);
1324 for ($i = 0; $i < $num; $i++) {
1325 $this->lines[$i]->ref_ext =
'';
1329 $this->context[
'createfromclone'] =
'createfromclone';
1330 $result = $this->
create($user);
1344 if ($this->socid == $objFrom->socid) {
1353 if (is_object($hookmanager)) {
1354 $parameters = array(
'objFrom' => $objFrom);
1356 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1364 unset($this->context[
'createfromclone']);
1368 $this->db->commit();
1371 $this->db->rollback();
1386 global
$conf, $hookmanager;
1388 require_once DOL_DOCUMENT_ROOT .
'/multicurrency/class/multicurrency.class.php';
1389 require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
1393 $this->date_commande =
dol_now();
1398 for ($i = 0; $i < $num; $i++) {
1401 $line->libelle =
$object->lines[$i]->libelle;
1402 $line->label =
$object->lines[$i]->label;
1403 $line->desc =
$object->lines[$i]->desc;
1404 $line->price =
$object->lines[$i]->price;
1405 $line->subprice =
$object->lines[$i]->subprice;
1406 $line->vat_src_code =
$object->lines[$i]->vat_src_code;
1407 $line->tva_tx =
$object->lines[$i]->tva_tx;
1408 $line->localtax1_tx =
$object->lines[$i]->localtax1_tx;
1409 $line->localtax2_tx =
$object->lines[$i]->localtax2_tx;
1410 $line->qty =
$object->lines[$i]->qty;
1411 $line->fk_remise_except =
$object->lines[$i]->fk_remise_except;
1412 $line->remise_percent =
$object->lines[$i]->remise_percent;
1413 $line->fk_product =
$object->lines[$i]->fk_product;
1414 $line->info_bits =
$object->lines[$i]->info_bits;
1415 $line->product_type =
$object->lines[$i]->product_type;
1416 $line->rang =
$object->lines[$i]->rang;
1417 $line->special_code =
$object->lines[$i]->special_code;
1418 $line->fk_parent_line =
$object->lines[$i]->fk_parent_line;
1419 $line->fk_unit =
$object->lines[$i]->fk_unit;
1421 $line->date_start =
$object->lines[$i]->date_start;
1422 $line->date_end =
$object->lines[$i]->date_end;
1424 $line->fk_fournprice =
$object->lines[$i]->fk_fournprice;
1426 $line->pa_ht = $marginInfos[0];
1427 $line->marge_tx = $marginInfos[1];
1428 $line->marque_tx = $marginInfos[2];
1430 $line->origin =
$object->element;
1431 $line->origin_id =
$object->lines[$i]->id;
1434 $object->lines[$i]->fetch_optionals();
1435 foreach (
$object->lines[$i]->array_options as $options_key => $value) {
1436 $line->array_options[$options_key] = $value;
1439 $this->lines[$i] = $line;
1442 $this->entity =
$object->entity;
1443 $this->socid =
$object->socid;
1444 $this->fk_project =
$object->fk_project;
1445 $this->cond_reglement_id =
$object->cond_reglement_id;
1446 $this->deposit_percent =
$object->deposit_percent;
1447 $this->mode_reglement_id =
$object->mode_reglement_id;
1448 $this->fk_account =
$object->fk_account;
1449 $this->availability_id =
$object->availability_id;
1450 $this->demand_reason_id =
$object->demand_reason_id;
1451 $this->delivery_date =
$object->delivery_date;
1452 $this->shipping_method_id =
$object->shipping_method_id;
1453 $this->warehouse_id =
$object->warehouse_id;
1454 $this->fk_delivery_address =
$object->fk_delivery_address;
1455 $this->contact_id =
$object->contact_id;
1456 $this->ref_client =
$object->ref_client;
1457 $this->ref_customer =
$object->ref_client;
1460 $this->note_private =
$object->note_private;
1461 $this->note_public =
$object->note_public;
1464 $this->origin =
$object->element;
1465 $this->origin_id =
$object->id;
1468 if (isModEnabled(
'multicurrency')) {
1469 if (!empty(
$object->multicurrency_code)) {
1470 $this->multicurrency_code =
$object->multicurrency_code;
1473 $this->multicurrency_tx =
$object->multicurrency_tx;
1476 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1478 $this->fk_multicurrency = $tmparray[0];
1479 $this->multicurrency_tx = $tmparray[1];
1483 if (empty($this->fk_multicurrency)) {
1484 $this->multicurrency_code =
$conf->currency;
1485 $this->fk_multicurrency = 0;
1486 $this->multicurrency_tx = 1;
1494 $element_extrafields = $e->fetch_name_optionals_label($this->table_element);
1496 foreach (
$object->array_options as $options_key => $value) {
1497 if (array_key_exists(str_replace(
'options_',
'', $options_key), $element_extrafields)) {
1498 $this->array_options[$options_key] = $value;
1502 $this->linked_objects[$this->origin] = $this->origin_id;
1503 if (isset(
$object->other_linked_objects) && is_array(
$object->other_linked_objects) && !empty(
$object->other_linked_objects)) {
1504 $this->linked_objects = array_merge($this->linked_objects,
$object->other_linked_objects);
1507 $ret = $this->
create($user);
1511 $hookmanager->initHooks(array(
'orderdao'));
1513 $parameters = array(
'objFrom' =>
$object);
1515 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1525 $this->
valid($user);
1577 public function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1 = 0, $txlocaltax2 = 0, $fk_product = 0, $remise_percent = 0, $info_bits = 0, $fk_remise_except = 0, $price_base_type =
'HT', $pu_ttc = 0, $date_start =
'', $date_end =
'', $type = 0, $rang = -1, $special_code = 0, $fk_parent_line = 0, $fk_fournprice =
null, $pa_ht = 0, $label =
'', $array_options = array(), $fk_unit =
null, $origin =
'', $origin_id = 0, $pu_ht_devise = 0, $ref_ext =
'', $noupdateafterinsertline = 0)
1579 global $mysoc, $langs, $user;
1581 $logtext =
"::addline commandeid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent";
1582 $logtext .=
", info_bits=$info_bits, fk_remise_except=$fk_remise_except, price_base_type=$price_base_type, pu_ttc=$pu_ttc, date_start=$date_start";
1583 $logtext .=
", date_end=$date_end, type=$type special_code=$special_code, fk_unit=$fk_unit, origin=$origin, origin_id=$origin_id, pu_ht_devise=$pu_ht_devise, ref_ext=$ref_ext rang=$rang";
1584 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
1586 if ($this->
status == self::STATUS_DRAFT) {
1587 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1591 if (empty($remise_percent)) {
1592 $remise_percent = 0;
1597 if (empty($info_bits)) {
1603 if (empty($txtva)) {
1606 if (empty($txlocaltax1)) {
1609 if (empty($txlocaltax2)) {
1612 if (empty($fk_parent_line) || $fk_parent_line < 0) {
1613 $fk_parent_line = 0;
1615 if (empty($this->fk_multicurrency)) {
1616 $this->fk_multicurrency = 0;
1618 if (empty($ref_ext)) {
1622 $remise_percent = (float)
price2num($remise_percent);
1625 $pu_ht_devise =
price2num($pu_ht_devise);
1628 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
1633 if ($price_base_type ==
'HT') {
1638 $label = trim($label);
1639 $desc = trim($desc);
1646 if ($date_start && $date_end && $date_start > $date_end) {
1647 $langs->load(
"errors");
1648 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1654 $product_type = $type;
1655 if (!empty($fk_product) && $fk_product > 0) {
1656 $product =
new Product($this->db);
1657 $result = $product->fetch($fk_product);
1658 $product_type = $product->type;
1662 $productChildrenNb = 0;
1664 $productChildrenNb = $product->hasFatherOrChild(1);
1666 if ($productChildrenNb > 0) {
1668 $product_stock =
null;
1669 $product->loadStockForVirtualProduct(
'warehouseopen', $qty);
1670 foreach ($product->stock_warehouse as $componentStockWarehouse) {
1671 if ($product_stock ===
null) {
1672 $product_stock = $componentStockWarehouse->real;
1674 $product_stock = min($product_stock, $componentStockWarehouse->real);
1677 if ($product_stock ===
null) {
1681 $product_stock = $product->stock_reel;
1684 if ($product_stock < $qty) {
1685 $langs->load(
"errors");
1686 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
1687 $this->errors[] = $this->error;
1688 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
1689 $this->db->rollback();
1702 $tmpproduct =
new Product($this->db);
1703 $result = $tmpproduct->fetch($fk_product);
1704 if (abs($qty) < $tmpproduct->packaging) {
1705 $qty = (float) $tmpproduct->packaging;
1706 setEventMessages($langs->trans(
'QtyRecalculatedWithPackaging'),
null,
'mesgs');
1708 if (!empty($tmpproduct->packaging) && $qty > $tmpproduct->packaging) {
1709 $coeff = intval(abs($qty) / $tmpproduct->packaging) + 1;
1710 $qty =
price2num((
float) $tmpproduct->packaging * $coeff,
'MS');
1711 setEventMessages($langs->trans(
'QtyRecalculatedWithPackaging'),
null,
'mesgs');
1719 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1720 $vat_src_code = $reg[1];
1721 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1724 $tabprice =
calcul_price_total($qty, (
float) $pu, $remise_percent, $txtva, (
float) $txlocaltax1, (
float) $txlocaltax2, 0, $price_base_type, $info_bits, $product_type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, (
float) $pu_ht_devise);
1734 $total_ht = $tabprice[0];
1735 $total_tva = $tabprice[1];
1736 $total_ttc = $tabprice[2];
1737 $total_localtax1 = $tabprice[9];
1738 $total_localtax2 = $tabprice[10];
1739 $pu_ht = $tabprice[3];
1742 $multicurrency_total_ht = $tabprice[16];
1743 $multicurrency_total_tva = $tabprice[17];
1744 $multicurrency_total_ttc = $tabprice[18];
1745 $pu_ht_devise = $tabprice[19];
1750 if ($ranktouse == -1) {
1751 $rangmax = $this->
line_max($fk_parent_line);
1752 $ranktouse = $rangmax + 1;
1759 if ($remise_percent > 0) {
1760 $remise = round(((
float) $pu * $remise_percent / 100), 2);
1761 $price = (float) $pu - $remise;
1767 $this->line->context = $this->context;
1769 $this->line->fk_commande = $this->id;
1770 $this->line->label = $label;
1771 $this->line->desc = $desc;
1772 $this->line->qty = (float) $qty;
1773 $this->line->ref_ext = $ref_ext;
1775 $this->line->vat_src_code = $vat_src_code;
1776 $this->line->tva_tx = $txtva;
1777 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
1778 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
1779 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
1780 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
1781 $this->line->fk_product = $fk_product;
1782 $this->line->product_type = $product_type;
1783 $this->line->fk_remise_except = $fk_remise_except;
1784 $this->line->remise_percent = $remise_percent;
1785 $this->line->subprice = (float) $pu_ht;
1786 $this->line->rang = $ranktouse;
1787 $this->line->info_bits = $info_bits;
1788 $this->line->total_ht = (float) $total_ht;
1789 $this->line->total_tva = (float) $total_tva;
1790 $this->line->total_localtax1 = (float) $total_localtax1;
1791 $this->line->total_localtax2 = (float) $total_localtax2;
1792 $this->line->total_ttc = (float) $total_ttc;
1793 $this->line->special_code = $special_code;
1794 if (empty($qty) && empty($special_code)) {
1795 $this->line->special_code = 3;
1797 $this->line->origin = $origin;
1798 $this->line->origin_id = $origin_id;
1799 $this->line->fk_parent_line = $fk_parent_line;
1800 $this->line->fk_unit = $fk_unit;
1802 $this->line->date_start = $date_start;
1803 $this->line->date_end = $date_end;
1805 $this->line->fk_fournprice = $fk_fournprice;
1806 $this->line->pa_ht = $pa_ht;
1809 $this->line->fk_multicurrency = $this->fk_multicurrency;
1810 $this->line->multicurrency_code = $this->multicurrency_code;
1811 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
1812 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
1813 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
1814 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
1817 $this->line->price = $price;
1819 if (is_array($array_options) && count($array_options) > 0) {
1820 $this->line->array_options = $array_options;
1823 $result = $this->line->insert($user);
1826 if (empty($noupdateafterinsertline)) {
1831 if (!isset($this->context[
'createfromclone'])) {
1832 if (!empty($fk_parent_line)) {
1835 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
1837 foreach ($this->lines as $tmpline) {
1838 if ($tmpline->rang >= $ranktouse) {
1839 if (!empty($tmpline->id)) {
1846 $this->lines[] = $this->line;
1848 foreach ($this->lines as $line) {
1849 if ($line->id == $origin_id) {
1850 $this->line->extraparams = $line->extraparams;
1851 $this->line->setExtraParameters();
1856 $this->db->commit();
1857 return $this->line->id;
1859 $this->db->rollback();
1863 $this->error = $this->line->error;
1864 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
1865 $this->db->rollback();
1869 dol_syslog(get_class($this).
"::addline status of order must be Draft to allow use of ->addline()", LOG_ERR);
1889 public function add_product($idproduct, $qty, $remise_percent = 0.0, $date_start =
'', $date_end =
'')
1892 global
$conf, $mysoc;
1898 if ($idproduct > 0) {
1899 $prod =
new Product($this->db);
1900 $prod->fetch($idproduct);
1904 if (empty($tva_tx)) {
1909 $localtax1_tx =
get_localtax($tva_tx, 1, $this->thirdparty, $mysoc, $tva_npr);
1910 $localtax2_tx =
get_localtax($tva_tx, 2, $this->thirdparty, $mysoc, $tva_npr);
1914 $price = $prod->multiprices[$this->thirdparty->price_level];
1916 $price = $prod->price;
1921 $line->context = $this->context;
1923 $line->fk_product = $idproduct;
1924 $line->desc = $prod->description;
1926 $line->subprice = $price;
1927 $line->remise_percent = $remise_percent;
1928 $line->vat_src_code = $vat_src_code;
1929 $line->tva_tx = $tva_tx;
1930 $line->localtax1_tx = $localtax1_tx;
1931 $line->localtax2_tx = $localtax2_tx;
1933 $line->product_ref = $prod->ref;
1934 $line->product_label = $prod->label;
1935 $line->product_desc = $prod->description;
1936 $line->fk_unit = $prod->fk_unit;
1940 $line->date_start = $date_start;
1943 $line->date_end = $date_end;
1946 $this->lines[] = $line;
1978 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
1981 if (empty($id) && empty($ref) && empty($ref_ext)) {
1985 $sql =
'SELECT c.rowid, c.entity, c.date_creation, c.ref, c.fk_soc, c.fk_user_author, c.fk_user_valid, c.fk_user_modif, c.fk_statut as status';
1986 $sql .=
', c.amount_ht, c.total_ht, c.total_ttc, c.total_tva, c.localtax1 as total_localtax1, c.localtax2 as total_localtax2, c.fk_cond_reglement, c.deposit_percent, c.fk_mode_reglement, c.fk_availability, c.fk_input_reason';
1987 $sql .=
', c.fk_account';
1988 $sql .=
', c.date_commande, c.date_valid, c.tms';
1989 $sql .=
', c.date_livraison as delivery_date';
1990 $sql .=
', c.fk_shipping_method';
1991 $sql .=
', c.fk_warehouse';
1992 $sql .=
', c.fk_projet as fk_project, c.source, c.facture as billed';
1993 $sql .=
', c.note_private, c.note_public, c.ref_client, c.ref_ext, c.model_pdf, c.last_main_doc, c.fk_delivery_address, c.extraparams';
1994 $sql .=
', c.fk_incoterms, c.location_incoterms';
1995 $sql .=
", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
1996 $sql .=
", c.module_source, c.pos_source";
1997 $sql .=
", i.libelle as label_incoterms";
1998 $sql .=
', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
1999 $sql .=
', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
2000 $sql .=
', ca.code as availability_code, ca.label as availability_label';
2001 $sql .=
', dr.code as demand_reason_code';
2002 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
2003 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid';
2004 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON c.fk_mode_reglement = p.id';
2005 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON c.fk_availability = ca.rowid';
2006 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON c.fk_input_reason = dr.rowid';
2007 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
2010 $sql .=
" WHERE c.rowid = ".((int) $id);
2012 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2016 $sql .=
" AND c.ref = '".$this->db->escape($ref).
"'";
2019 $sql .=
" AND c.ref_ext = '".$this->db->escape($ref_ext).
"'";
2022 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
2023 $result = $this->db->query($sql);
2025 $obj = $this->db->fetch_object($result);
2027 $this->
id = $obj->rowid;
2028 $this->entity = $obj->entity;
2030 $this->
ref = $obj->ref;
2031 $this->ref_client = $obj->ref_client;
2032 $this->ref_customer = $obj->ref_client;
2033 $this->ref_ext = $obj->ref_ext;
2035 $this->socid = $obj->fk_soc;
2036 $this->thirdparty =
null;
2038 $this->fk_project = $obj->fk_project;
2039 $this->project =
null;
2041 $this->statut = $obj->status;
2042 $this->
status = $obj->status;
2044 $this->user_author_id = $obj->fk_user_author;
2045 $this->user_creation_id = $obj->fk_user_author;
2046 $this->user_validation_id = $obj->fk_user_valid;
2047 $this->user_modification_id = $obj->fk_user_modif;
2048 $this->total_ht = $obj->total_ht;
2049 $this->total_tva = $obj->total_tva;
2050 $this->total_localtax1 = $obj->total_localtax1;
2051 $this->total_localtax2 = $obj->total_localtax2;
2052 $this->total_ttc = $obj->total_ttc;
2053 $this->date = $this->db->jdate($obj->date_commande);
2054 $this->date_commande = $this->db->jdate($obj->date_commande);
2055 $this->date_creation = $this->db->jdate($obj->date_creation);
2056 $this->date_validation = $this->db->jdate($obj->date_valid);
2057 $this->date_modification = $this->db->jdate($obj->tms);
2058 $this->source = $obj->source;
2059 $this->billed = $obj->billed;
2060 $this->note = $obj->note_private;
2061 $this->note_private = $obj->note_private;
2062 $this->note_public = $obj->note_public;
2063 $this->model_pdf = $obj->model_pdf;
2064 $this->last_main_doc = $obj->last_main_doc;
2065 $this->mode_reglement_id = $obj->fk_mode_reglement;
2066 $this->mode_reglement_code = $obj->mode_reglement_code;
2067 $this->mode_reglement = $obj->mode_reglement_libelle;
2068 $this->cond_reglement_id = $obj->fk_cond_reglement;
2069 $this->cond_reglement_code = $obj->cond_reglement_code;
2070 $this->cond_reglement = $obj->cond_reglement_libelle;
2071 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
2072 $this->deposit_percent = $obj->deposit_percent;
2073 $this->fk_account = $obj->fk_account;
2074 $this->availability_id = $obj->fk_availability;
2075 $this->availability_code = $obj->availability_code;
2077 $this->demand_reason_id = $obj->fk_input_reason;
2078 $this->demand_reason_code = $obj->demand_reason_code;
2079 $this->delivery_date = $this->db->jdate($obj->delivery_date);
2080 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
2081 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
2082 $this->fk_delivery_address = $obj->fk_delivery_address;
2083 $this->module_source = $obj->module_source;
2084 $this->pos_source = $obj->pos_source;
2087 $this->fk_incoterms = $obj->fk_incoterms;
2088 $this->location_incoterms = $obj->location_incoterms;
2089 $this->label_incoterms = $obj->label_incoterms;
2092 $this->fk_multicurrency = $obj->fk_multicurrency;
2093 $this->multicurrency_code = $obj->multicurrency_code;
2094 $this->multicurrency_tx = $obj->multicurrency_tx;
2095 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
2096 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
2097 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2099 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
2101 $this->lines = array();
2107 $this->db->free($result);
2116 $this->error =
'Order with id '.$id.
' not found sql='.$sql;
2120 $this->error = $this->db->error();
2138 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2139 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
2144 $result = $remise->fetch($idremise);
2147 if ($remise->fk_facture) {
2148 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
2149 $this->db->rollback();
2155 $line->fk_commande = $this->id;
2156 $line->fk_remise_except = $remise->id;
2157 $line->desc = $remise->description;
2158 $line->vat_src_code = $remise->vat_src_code;
2159 $line->tva_tx = $remise->tva_tx;
2160 $line->subprice = -(float) $remise->amount_ht;
2161 $line->price = -(float) $remise->amount_ht;
2162 $line->fk_product = 0;
2164 $line->remise_percent = 0;
2166 $line->info_bits = 2;
2168 $line->total_ht = -(float) $remise->amount_ht;
2169 $line->total_tva = -(float) $remise->amount_tva;
2170 $line->total_ttc = -(float) $remise->amount_ttc;
2172 $result = $line->insert();
2176 $this->db->commit();
2179 $this->db->rollback();
2183 $this->error = $line->error;
2184 $this->errors = $line->errors;
2185 $this->db->rollback();
2189 $this->db->rollback();
2203 public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
2206 $this->lines = array();
2208 $sql =
'SELECT l.rowid, l.fk_product, l.fk_parent_line, l.product_type, l.fk_commande, l.label as custom_label, l.description, l.price, l.qty, l.vat_src_code, l.tva_tx, l.ref_ext,';
2209 $sql .=
' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.fk_remise_except, l.remise_percent, l.subprice, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.rang, l.info_bits, l.special_code,';
2210 $sql .=
' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
2211 $sql .=
' l.fk_unit, l.extraparams,';
2212 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2213 $sql .=
' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label, p.tosell as product_tosell, p.tobuy as product_tobuy, p.tobatch as product_tobatch, p.barcode as product_barcode,';
2214 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units, p.packaging';
2215 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element_line.
' as l';
2216 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (p.rowid = l.fk_product)';
2217 $sql .=
' WHERE l.fk_commande = '.((int) $this->
id);
2218 if ($only_product) {
2219 $sql .=
' AND p.fk_product_type = 0';
2221 $sql .=
' ORDER BY l.rang, l.rowid';
2223 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
2224 $result = $this->db->query($sql);
2226 $num = $this->db->num_rows($result);
2230 $objp = $this->db->fetch_object($result);
2234 $line->rowid = $objp->rowid;
2235 $line->id = $objp->rowid;
2236 $line->fk_commande = $objp->fk_commande;
2237 $line->commande_id = $objp->fk_commande;
2238 $line->label = $objp->custom_label;
2239 $line->desc = $objp->description;
2240 $line->description = $objp->description;
2241 $line->product_type = $objp->product_type;
2242 $line->qty = $objp->qty;
2243 $line->ref_ext = $objp->ref_ext;
2245 $line->vat_src_code = $objp->vat_src_code;
2246 $line->tva_tx = $objp->tva_tx;
2247 $line->localtax1_tx = $objp->localtax1_tx;
2248 $line->localtax2_tx = $objp->localtax2_tx;
2249 $line->localtax1_type = $objp->localtax1_type;
2250 $line->localtax2_type = $objp->localtax2_type;
2251 $line->total_ht = $objp->total_ht;
2252 $line->total_ttc = $objp->total_ttc;
2253 $line->total_tva = $objp->total_tva;
2254 $line->total_localtax1 = $objp->total_localtax1;
2255 $line->total_localtax2 = $objp->total_localtax2;
2256 $line->subprice = $objp->subprice;
2257 $line->fk_remise_except = $objp->fk_remise_except;
2258 $line->remise_percent = $objp->remise_percent;
2259 $line->price = $objp->price;
2260 $line->fk_product = $objp->fk_product;
2261 $line->fk_fournprice = $objp->fk_fournprice;
2262 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
2263 $line->pa_ht = $marginInfos[0];
2264 $line->marge_tx = $marginInfos[1];
2265 $line->marque_tx = $marginInfos[2];
2266 $line->rang = $objp->rang;
2267 $line->info_bits = $objp->info_bits;
2268 $line->special_code = $objp->special_code;
2269 $line->fk_parent_line = $objp->fk_parent_line;
2271 $line->ref = $objp->product_ref;
2272 $line->libelle = $objp->product_label;
2274 $line->product_ref = $objp->product_ref;
2275 $line->product_label = $objp->product_label;
2276 $line->product_tosell = $objp->product_tosell;
2277 $line->product_tobuy = $objp->product_tobuy;
2278 $line->product_desc = $objp->product_desc;
2279 $line->product_tobatch = $objp->product_tobatch;
2280 $line->product_barcode = $objp->product_barcode;
2282 $line->fk_product_type = $objp->fk_product_type;
2283 $line->fk_unit = $objp->fk_unit;
2285 $line->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
2287 $line->weight = $objp->weight;
2288 $line->weight_units = $objp->weight_units;
2289 $line->volume = $objp->volume;
2290 $line->volume_units = $objp->volume_units;
2291 $line->packaging = $objp->packaging;
2293 $line->date_start = $this->db->jdate($objp->date_start);
2294 $line->date_end = $this->db->jdate($objp->date_end);
2297 $line->fk_multicurrency = $objp->fk_multicurrency;
2298 $line->multicurrency_code = $objp->multicurrency_code;
2299 $line->multicurrency_subprice = $objp->multicurrency_subprice;
2300 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
2301 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
2302 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2304 $line->fetch_optionals();
2307 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
2308 $tmpproduct =
new Product($this->db);
2309 $tmpproduct->fetch($objp->fk_product);
2310 $tmpproduct->getMultiLangs();
2312 $line->multilangs = $tmpproduct->multilangs;
2315 $this->lines[$i] = $line;
2320 $this->db->free($result);
2324 $this->error = $this->db->error();
2338 foreach ($this->lines as $line) {
2339 if ($line->product_type == 0) {
2354 foreach ($this->lines as $line) {
2355 if ($line->product_type == 1) {
2371 $sql =
'SELECT COUNT(DISTINCT ed.fk_expedition) as nb';
2372 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2373 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2375 $sql .=
' ed.fk_elementdet = cd.rowid';
2376 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2379 dol_syslog(get_class($this).
"::getNbOfShipments", LOG_DEBUG);
2380 $resql = $this->db->query($sql);
2382 $obj = $this->db->fetch_object($resql);
2387 $this->db->free($resql);
2390 $this->error = $this->db->lasterror();
2405 $this->expeditions = array();
2407 $sql =
'SELECT cd.rowid, cd.fk_product,';
2408 $sql .=
' sum(ed.qty) as qty';
2409 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2410 if ($filtre_statut >= 0) {
2411 $sql .=
' '.MAIN_DB_PREFIX.
'expedition as e,';
2413 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2415 if ($filtre_statut >= 0) {
2416 $sql .=
' ed.fk_expedition = e.rowid AND';
2418 $sql .=
' ed.fk_elementdet = cd.rowid';
2419 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2420 if ($fk_product > 0) {
2421 $sql .=
' AND cd.fk_product = '.((int) $fk_product);
2423 if ($filtre_statut >= 0) {
2424 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
2426 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
2429 dol_syslog(get_class($this).
"::loadExpeditions", LOG_DEBUG);
2430 $resql = $this->db->query($sql);
2432 $num = $this->db->num_rows($resql);
2435 $obj = $this->db->fetch_object($resql);
2436 $this->expeditions[$obj->rowid] = $obj->qty;
2439 $this->db->free($resql);
2442 $this->error = $this->db->lasterror();
2454 $sql =
'SELECT count(*)';
2455 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expedition as e';
2456 $sql .=
', '.MAIN_DB_PREFIX.
'element_element as el';
2457 $sql .=
' WHERE el.fk_source = '.((int) $this->
id);
2458 $sql .=
" AND el.sourcetype = 'commande'";
2459 $sql .=
" AND el.fk_target = e.rowid";
2460 $sql .=
" AND el.targettype = 'shipping'";
2462 $resql = $this->db->query($sql);
2464 $row = $this->db->fetch_row($resql);
2483 if ($this->
status == self::STATUS_DRAFT) {
2489 $line->context = $this->context;
2492 $line->fetch($lineid);
2497 if ($id > 0 && (
int) $line->fk_commande !== (
int) $id) {
2498 $this->db->rollback();
2499 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
2504 $staticline = clone $line;
2505 $line->oldline = $staticline;
2507 if ($line->delete($user) > 0) {
2511 $this->db->commit();
2514 $this->db->rollback();
2515 $this->error = $this->db->lasterror();
2519 $this->db->rollback();
2520 $this->error = $line->error;
2524 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
2543 dol_syslog(get_class($this).
"::set_remise is deprecated, use setDiscount instead", LOG_NOTICE);
2545 return $this->
setDiscount($user, $remise, $notrigger);
2558 $remise = trim((
string) $remise) ? trim((
string) $remise) : 0;
2560 if ($user->hasRight(
'commande',
'creer')) {
2567 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2568 $sql .=
' SET remise_percent = '.((float) $remise);
2569 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_DRAFT);
2572 $resql = $this->db->query($sql);
2574 $this->errors[] = $this->db->error();
2579 $this->oldcopy = clone $this;
2580 $this->remise_percent = $remise;
2584 if (!$notrigger && empty($error)) {
2594 $this->db->commit();
2597 foreach ($this->errors as $errmsg) {
2598 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2599 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2601 $this->db->rollback();
2622 if ($user->hasRight(
'commande',
'creer')) {
2627 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2628 $sql .=
" SET date_commande = ".($date ?
"'".$this->db->idate($date).
"'" :
'null');
2629 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = ".((int) self::STATUS_DRAFT);
2632 $resql = $this->db->query($sql);
2634 $this->errors[] = $this->db->error();
2639 $this->oldcopy = clone $this;
2640 $this->date = $date;
2643 if (!$notrigger && empty($error)) {
2653 $this->db->commit();
2656 foreach ($this->errors as $errmsg) {
2657 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2658 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2660 $this->db->rollback();
2694 if ($user->hasRight(
'commande',
'creer')) {
2699 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2700 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2701 $sql .=
" WHERE rowid = ".((int) $this->
id);
2704 $resql = $this->db->query($sql);
2706 $this->errors[] = $this->db->error();
2711 $this->oldcopy = clone $this;
2712 $this->delivery_date = $delivery_date;
2715 if (!$notrigger && empty($error)) {
2725 $this->db->commit();
2728 foreach ($this->errors as $errmsg) {
2729 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2730 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2732 $this->db->rollback();
2754 public function liste_array($shortlist = 0, $draft = 0, $excluser =
null, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'c.date_commande', $sortorder =
'DESC')
2761 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2762 $sql .=
" c.rowid as cid, c.ref";
2763 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2764 $sql .=
", sc.fk_soc, sc.fk_user";
2766 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.$this->table_element.
" as c";
2767 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2768 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
2770 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2771 $sql .=
" AND c.fk_soc = s.rowid";
2772 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2773 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2776 $sql .=
" AND s.rowid = ".((int) $socid);
2779 $sql .=
" AND c.fk_statut = ".self::STATUS_DRAFT;
2781 if (is_object($excluser)) {
2782 $sql .=
" AND c.fk_user_author <> ".((int) $excluser->id);
2784 $sql .= $this->db->order($sortfield, $sortorder);
2785 $sql .= $this->db->plimit($limit, $offset);
2787 $result = $this->db->query($sql);
2789 $numc = $this->db->num_rows($result);
2792 while ($i < $numc) {
2793 $obj = $this->db->fetch_object($result);
2795 if ($shortlist == 1) {
2796 $ga[$obj->cid] = $obj->ref;
2797 } elseif ($shortlist == 2) {
2798 $ga[$obj->cid] = $obj->ref.
' ('.$obj->name.
')';
2800 $ga[$i][
'id'] = $obj->cid;
2801 $ga[$i][
'ref'] = $obj->ref;
2802 $ga[$i][
'name'] = $obj->name;
2825 dol_syslog(
'Commande::availability('.$availability_id.
')');
2826 if ($this->
status >= self::STATUS_DRAFT) {
2831 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2832 $sql .=
' SET fk_availability = '.((int) $availability_id);
2833 $sql .=
' WHERE rowid='.((int) $this->
id);
2836 $resql = $this->db->query($sql);
2838 $this->errors[] = $this->db->error();
2843 $this->oldcopy = clone $this;
2844 $this->availability_id = $availability_id;
2847 if (!$notrigger && empty($error)) {
2857 $this->db->commit();
2860 foreach ($this->errors as $errmsg) {
2861 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2862 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2864 $this->db->rollback();
2868 $error_str =
'Command status do not meet requirement '.$this->status;
2870 $this->error = $error_str;
2871 $this->errors[] = $this->error;
2889 dol_syslog(
'Commande::demand_reason('.$demand_reason_id.
')');
2890 if ($this->
status >= self::STATUS_DRAFT) {
2895 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2896 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
2897 $sql .=
' WHERE rowid='.((int) $this->
id);
2900 $resql = $this->db->query($sql);
2902 $this->errors[] = $this->db->error();
2907 $this->oldcopy = clone $this;
2908 $this->demand_reason_id = $demand_reason_id;
2911 if (!$notrigger && empty($error)) {
2921 $this->db->commit();
2924 foreach ($this->errors as $errmsg) {
2925 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2926 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2928 $this->db->rollback();
2932 $error_str =
'order status do not meet requirement '.$this->status;
2934 $this->error = $error_str;
2935 $this->errors[] = $this->error;
2952 if ($user->hasRight(
'commande',
'creer')) {
2957 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET';
2958 $sql .=
' ref_client = '.(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2959 $sql .=
' WHERE rowid = '.((int) $this->
id);
2961 dol_syslog(__METHOD__.
' this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2962 $resql = $this->db->query($sql);
2964 $this->errors[] = $this->db->error();
2969 $this->oldcopy = clone $this;
2970 $this->ref_client = $ref_client;
2971 $this->ref_customer = $ref_client;
2974 if (!$notrigger && empty($error)) {
2983 $this->db->commit();
2986 foreach ($this->errors as $errmsg) {
2987 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2988 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2990 $this->db->rollback();
3009 if ($this->billed) {
3015 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 1';
3018 dol_syslog(get_class($this).
"::classifyBilled", LOG_DEBUG);
3019 if ($this->db->query($sql)) {
3021 $this->oldcopy = clone $this;
3025 if (!$notrigger && empty($error)) {
3027 $result = $this->
call_trigger(
'ORDER_CLASSIFY_BILLED', $user);
3035 $this->db->commit();
3038 foreach ($this->errors as $errmsg) {
3039 dol_syslog(get_class($this).
"::classifyBilled ".$errmsg, LOG_ERR);
3040 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3042 $this->db->rollback();
3046 $this->error = $this->db->error();
3047 $this->db->rollback();
3065 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 0';
3068 dol_syslog(get_class($this).
"::classifyUnBilled", LOG_DEBUG);
3069 if ($this->db->query($sql)) {
3071 $this->oldcopy = clone $this;
3075 if (!$notrigger && empty($error)) {
3077 $result = $this->
call_trigger(
'ORDER_CLASSIFY_UNBILLED', $user);
3087 $this->db->commit();
3090 foreach ($this->errors as $errmsg) {
3091 dol_syslog(get_class($this).
"::classifyUnBilled ".$errmsg, LOG_ERR);
3092 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3094 $this->db->rollback();
3098 $this->error = $this->db->error();
3099 $this->db->rollback();
3135 public function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0.0, $txlocaltax2 = 0.0, $price_base_type =
'HT', $info_bits = 0, $date_start =
'', $date_end =
'', $type = 0, $fk_parent_line = 0, $skip_update_total = 0, $fk_fournprice =
null, $pa_ht = 0, $label =
'', $special_code = 0, $array_options = array(), $fk_unit =
null, $pu_ht_devise = 0, $notrigger = 0, $ref_ext =
'', $rang = 0)
3137 global $mysoc, $langs, $user;
3139 dol_syslog(get_class($this).
"::updateline id=$rowid, desc=$desc, pu=$pu, qty=$qty, remise_percent=$remise_percent, txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, price_base_type=$price_base_type, info_bits=$info_bits, date_start=$date_start, date_end=$date_end, type=$type, fk_parent_line=$fk_parent_line, pa_ht=$pa_ht, special_code=$special_code, ref_ext=$ref_ext");
3140 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3147 if (empty($info_bits)) {
3150 if (empty($txtva)) {
3153 if (empty($txlocaltax1)) {
3156 if (empty($txlocaltax2)) {
3159 if (empty($remise_percent)) {
3160 $remise_percent = 0;
3162 if (empty($qty) && empty($special_code)) {
3165 if (!empty($qty) && $special_code == 3) {
3168 if (empty($ref_ext)) {
3172 if ($date_start && $date_end && $date_start > $date_end) {
3173 $langs->load(
"errors");
3174 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
3178 $remise_percent = (float)
price2num($remise_percent);
3182 $pu_ht_devise =
price2num($pu_ht_devise);
3183 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
3186 $txlocaltax1 = (float)
price2num($txlocaltax1);
3187 $txlocaltax2 = (float)
price2num($txlocaltax2);
3201 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
3202 $vat_src_code = $reg[1];
3203 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
3206 $tabprice =
calcul_price_total($qty, (
float) $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, (
float) $pu_ht_devise);
3208 $total_ht = $tabprice[0];
3209 $total_tva = $tabprice[1];
3210 $total_ttc = $tabprice[2];
3211 $total_localtax1 = $tabprice[9];
3212 $total_localtax2 = $tabprice[10];
3213 $pu_ht = $tabprice[3];
3214 $pu_tva = $tabprice[4];
3215 $pu_ttc = $tabprice[5];
3218 $multicurrency_total_ht = $tabprice[16];
3219 $multicurrency_total_tva = $tabprice[17];
3220 $multicurrency_total_ttc = $tabprice[18];
3221 $pu_ht_devise = $tabprice[19];
3225 if ($price_base_type ==
'TTC') {
3226 $subprice = $pu_ttc;
3231 if ($remise_percent > 0) {
3232 $remise = round(((
float) $pu * $remise_percent / 100), 2);
3233 $price = ((float) $pu - $remise);
3238 $line->fetch($rowid);
3239 $line->fetch_optionals();
3241 if (!empty($line->fk_product)) {
3242 $product =
new Product($this->db);
3243 $result = $product->fetch($line->fk_product);
3244 $product_type = $product->type;
3248 $productChildrenNb = 0;
3250 $productChildrenNb = $product->hasFatherOrChild(1);
3252 if ($productChildrenNb > 0) {
3254 $product_stock =
null;
3255 $product->loadStockForVirtualProduct(
'warehouseopen', $qty);
3256 foreach ($product->stock_warehouse as $componentStockWarehouse) {
3257 if ($product_stock ===
null) {
3258 $product_stock = $componentStockWarehouse->real;
3260 $product_stock = min($product_stock, $componentStockWarehouse->real);
3263 if ($product_stock ===
null) {
3267 $product_stock = $product->stock_reel;
3270 if ($product_stock < $qty) {
3271 $langs->load(
"errors");
3272 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
3273 $this->errors[] = $this->error;
3275 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
3277 $this->db->rollback();
3283 $staticline = clone $line;
3285 $line->oldline = $staticline;
3286 $this->line = $line;
3287 $this->line->context = $this->context;
3288 $this->line->rang = $rang;
3291 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
3292 $rangmax = $this->
line_max($fk_parent_line);
3293 $this->line->rang = $rangmax + 1;
3297 if ($qty < $this->line->packaging) {
3298 $qty = $this->line->packaging;
3300 if (!empty($this->line->packaging)
3301 && is_numeric($this->line->packaging)
3302 && (
float) $this->line->packaging > 0
3303 && fmod((
float) $qty, (
float) $this->line->packaging) > 0) {
3304 $coeff = intval($qty / $this->line->packaging) + 1;
3305 $qty = $this->line->packaging * $coeff;
3306 setEventMessage($langs->trans(
'QtyRecalculatedWithPackaging'),
'mesgs');
3311 $this->line->id = $rowid;
3312 $this->line->label = $label;
3313 $this->line->desc = $desc;
3314 $this->line->qty = $qty;
3315 $this->line->ref_ext = $ref_ext;
3317 $this->line->vat_src_code = $vat_src_code;
3318 $this->line->tva_tx = $txtva;
3319 $this->line->localtax1_tx = $txlocaltax1;
3320 $this->line->localtax2_tx = $txlocaltax2;
3321 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
3322 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
3323 $this->line->remise_percent = $remise_percent;
3324 $this->line->subprice = (float) $pu_ht;
3325 $this->line->info_bits = $info_bits;
3326 $this->line->special_code = $special_code;
3327 $this->line->total_ht = (float) $total_ht;
3328 $this->line->total_tva = (float) $total_tva;
3329 $this->line->total_localtax1 = (float) $total_localtax1;
3330 $this->line->total_localtax2 = (float) $total_localtax2;
3331 $this->line->total_ttc = (float) $total_ttc;
3332 $this->line->date_start = $date_start;
3333 $this->line->date_end = $date_end;
3334 $this->line->product_type = $type;
3335 $this->line->fk_parent_line = $fk_parent_line;
3336 $this->line->skip_update_total = $skip_update_total;
3337 $this->line->fk_unit = $fk_unit;
3339 $this->line->fk_fournprice = $fk_fournprice;
3340 $this->line->pa_ht = $pa_ht;
3343 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
3344 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
3345 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
3346 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
3349 $this->line->price = $price;
3351 if (is_array($array_options) && count($array_options) > 0) {
3353 foreach ($array_options as $key => $value) {
3354 $this->line->array_options[$key] = $array_options[$key];
3358 $result = $this->line->update($user, $notrigger);
3361 if (!empty($fk_parent_line)) {
3368 $this->db->commit();
3371 $this->error = $this->line->error;
3373 $this->db->rollback();
3377 $this->error = get_class($this).
"::updateline Order status makes operation forbidden";
3378 $this->errors = array(
'OrderStatusMakeOperationForbidden');
3395 if (isset($this->
ref)) {
3396 $this->
ref = trim($this->
ref);
3398 if (isset($this->ref_client)) {
3399 $this->ref_client = trim($this->ref_client);
3401 if (isset($this->ref_customer)) {
3402 $this->ref_customer = trim($this->ref_customer);
3404 if (isset($this->note) || isset($this->note_private)) {
3405 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
3407 if (isset($this->note_public)) {
3408 $this->note_public = trim($this->note_public);
3410 if (isset($this->model_pdf)) {
3411 $this->model_pdf = trim($this->model_pdf);
3413 if (isset($this->import_key)) {
3414 $this->import_key = trim($this->import_key);
3416 $delivery_date = $this->delivery_date;
3422 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
3424 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
3425 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
3426 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
3427 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
3428 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
3429 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
3430 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
3431 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
3432 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
3433 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
3434 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
3435 $sql .=
" fk_statut=".(isset($this->
status) ? $this->
status :
"null").
",";
3436 $sql .=
" fk_user_modif=".(isset($user->id) ? $user->id :
"null").
",";
3437 $sql .=
" fk_user_valid=".((isset($this->user_validation_id) && $this->user_validation_id > 0) ? $this->user_validation_id :
"null").
",";
3438 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
3439 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
3440 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ? strval($this->deposit_percent) :
"null").
",";
3441 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
3442 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
3443 $sql .=
" fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id :
"null").
",";
3444 $sql .=
" fk_account=".($this->fk_account > 0 ? $this->fk_account :
"null").
",";
3445 $sql .=
" fk_input_reason=".($this->demand_reason_id > 0 ? $this->demand_reason_id :
"null").
",";
3446 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
3447 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
3448 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
3449 $sql .=
" fk_warehouse=".($this->warehouse_id > 0 ? $this->warehouse_id :
"null").
",";
3450 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null").
",";
3451 $sql .=
" module_source = ".(isset($this->module_source) ?
"'".$this->db->escape($this->module_source).
"'" :
"null").
",";
3452 $sql .=
" pos_source = ".(isset($this->pos_source) ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
3453 $sql .=
" WHERE rowid=".((int) $this->
id);
3457 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3458 $resql = $this->db->query($sql);
3461 $this->errors[] =
"Error ".$this->db->lasterror();
3471 if (!$error && !$notrigger) {
3482 foreach ($this->errors as $errmsg) {
3483 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
3484 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3486 $this->db->rollback();
3489 $this->db->commit();
3501 public function delete($user, $notrigger = 0)
3503 global
$conf, $langs;
3504 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3508 dol_syslog(get_class($this).
"::delete ".$this->
id, LOG_DEBUG);
3523 $this->errors[] = $langs->trans(
'SomeShipmentExists');
3529 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"categorie_order";
3530 $sql .=
" WHERE fk_order = ".((int) $this->
id);
3532 $result = $this->db->query($sql);
3535 $this->errors[] = $this->db->lasterror();
3540 if (!$error && !empty($this->table_element_line)) {
3541 $tabletodelete = $this->table_element_line;
3542 $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).
")";
3543 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3544 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3546 $this->error = $this->db->lasterror();
3547 $this->errors[] = $this->error;
3548 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3573 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3579 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3580 $res = $this->db->query($sql);
3583 $this->error = $this->db->lasterror();
3584 $this->errors[] = $this->error;
3585 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3601 if ($conf->commande->multidir_output[$this->entity] && !empty($this->
ref)) {
3602 $dir =
$conf->commande->multidir_output[$this->entity].
"/".$ref;
3603 $file = $dir.
"/".$ref.
".pdf";
3604 if (file_exists($file)) {
3608 $this->error =
'ErrorFailToDeleteFile';
3609 $this->errors[] = $this->error;
3610 $this->db->rollback();
3614 if (file_exists($dir)) {
3617 $this->error =
'ErrorFailToDeleteDir';
3618 $this->errors[] = $this->error;
3619 $this->db->rollback();
3627 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3628 $this->db->commit();
3631 $this->db->rollback();
3648 global
$conf, $langs;
3652 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht";
3653 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as c";
3654 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
3655 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc";
3656 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3659 $sql .= $clause.
" c.entity IN (".
getEntity(
'commande').
")";
3661 if ($mode ==
'toship') {
3663 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
")";
3665 if ($mode ==
'tobill') {
3667 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
", " . self::STATUS_CLOSED .
") AND c.facture = 0";
3669 if ($mode ==
'shippedtobill') {
3671 $sql .=
" AND c.fk_statut IN (" . self::STATUS_CLOSED .
") AND c.facture = 0";
3674 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3677 $resql = $this->db->query($sql);
3680 $label = $labelShort = $url =
'';
3681 if ($mode ==
'toship') {
3682 $delay_warning =
$conf->commande->client->warning_delay / 60 / 60 / 24;
3683 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-2&mainmenu=commercial&leftmenu=orders';
3684 $label = $langs->transnoentitiesnoconv(
"OrdersToProcess");
3685 $labelShort = $langs->transnoentitiesnoconv(
"Opened");
3687 if ($mode ==
'tobill') {
3688 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3689 $label = $langs->trans(
"OrdersToBill");
3690 $labelShort = $langs->trans(
"ToBill");
3692 if ($mode ==
'shippedtobill') {
3693 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3694 $label = $langs->trans(
"OrdersToBill");
3695 $labelShort = $langs->trans(
"StatusOrderDelivered").
' '.$langs->trans(
"and").
' '.$langs->trans(
"ToBill");
3700 $response->warning_delay = $delay_warning;
3701 $response->label = $label;
3702 $response->labelShort = $labelShort;
3703 $response->url = $url;
3704 $response->url_late = DOL_URL_ROOT.
'/commande/list.php?search_option=late&mainmenu=commercial&leftmenu=orders';
3707 $generic_commande =
new Commande($this->db);
3709 while ($obj = $this->db->fetch_object($resql)) {
3710 $response->nbtodo++;
3711 $response->total += $obj->total_ht;
3713 $generic_commande->status = $obj->fk_statut;
3714 $generic_commande->date = $this->db->jdate($obj->date_commande);
3715 $generic_commande->delivery_date = $this->db->jdate($obj->delivery_date);
3717 if ($mode ==
'toship' && $generic_commande->hasDelay()) {
3718 $response->nbtodolate++;
3724 $this->error = $this->db->error();
3738 $label = $langs->trans(
'OrderSource'.$this->source);
3740 if ($label ==
'OrderSource') {
3767 public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
3770 global $langs, $hookmanager;
3773 if (empty($donotshowbilled)) {
3774 $billedtext .= ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3776 $billedtextlong = ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3780 if ($status == self::STATUS_CANCELED) {
3781 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderCanceled');
3782 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderCanceledShort');
3783 $statusType =
'status9';
3784 } elseif ($status == self::STATUS_DRAFT) {
3785 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDraft');
3786 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDraftShort');
3787 $statusType =
'status0';
3788 } elseif ($status == self::STATUS_VALIDATED) {
3789 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderValidated').$billedtextlong;
3790 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderValidatedShort').$billedtext;
3791 $statusType =
'status1';
3792 } elseif ($status == self::STATUS_SHIPMENTONPROCESS) {
3793 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderSent').$billedtextlong;
3794 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderSentShort').$billedtext;
3795 $labelTooltip = $langs->transnoentitiesnoconv(
"StatusOrderSent");
3796 if (!empty($this->delivery_date)) {
3797 $labelTooltip .=
' - '.$langs->transnoentitiesnoconv(
"DateDeliveryPlanned").dol_print_date($this->delivery_date,
'day').$billedtext;
3799 $statusType =
'status4';
3800 } elseif ($status == self::STATUS_CLOSED) {
3801 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDelivered').$billedtextlong;
3802 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDeliveredShort').$billedtext;
3803 $statusType =
'status6';
3805 $labelStatus = $langs->transnoentitiesnoconv(
'Unknown');
3806 $labelStatusShort =
'';
3811 $parameters = array(
3812 'status' => $status,
3814 'billed' => $billed,
3815 'donotshowbilled' => $donotshowbilled
3818 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3821 return $hookmanager->resPrint;
3824 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode,
'', array(
'tooltip' => $labelTooltip));
3836 global
$conf, $langs, $user;
3838 $langs->load(
'orders');
3840 $nofetch = !empty($params[
'nofetch']);
3843 return [
'optimize' => $langs->trans(
"Order")];
3846 if ($user->hasRight(
'commande',
'lire')) {
3847 $datas[
'picto'] =
img_picto(
'', $this->picto,
'', 0, 0, 0,
'',
'paddingrightonly').
'<u>'.$langs->trans(
"Order").
'</u>';
3848 if (isset($this->
status)) {
3849 $datas[
'status'] =
' '.$this->getLibStatut(5);
3851 $datas[
'Ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3853 $langs->load(
'companies');
3854 if (empty($this->thirdparty)) {
3857 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3859 $datas[
'RefCustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.(empty($this->ref_customer) ? (empty($this->ref_client) ?
'' : $this->ref_client) : $this->ref_customer);
3861 $langs->load(
'project');
3862 if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
3864 if ($res > 0 && $this->project instanceof
Project) {
3865 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0,
'1');
3869 if (!empty($this->total_ht)) {
3870 $datas[
'AmountHT'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
$conf->currency);
3872 if (!empty($this->total_tva)) {
3873 $datas[
'VAT'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
$conf->currency);
3875 if (!empty($this->total_ttc)) {
3876 $datas[
'AmountTTC'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency);
3878 if (!empty($this->date)) {
3879 $datas[
'Date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
3881 if (!empty($this->delivery_date)) {
3882 $datas[
'DeliveryDate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3902 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target =
'')
3904 global
$conf, $langs, $user, $hookmanager;
3906 if (!empty(
$conf->dol_no_mouse_hover)) {
3912 if (isModEnabled(
"shipping") && ($option ==
'1' || $option ==
'2')) {
3913 $url = DOL_URL_ROOT.
'/expedition/shipment.php?id='.$this->id;
3915 $url = DOL_URL_ROOT.
'/commande/card.php?id='.$this->id;
3918 if (!$user->hasRight(
'commande',
'lire')) {
3922 if ($option !==
'nolink') {
3924 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3925 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3926 $add_save_lastsearch_values = 1;
3928 if ($add_save_lastsearch_values) {
3929 $url .=
'&save_lastsearch_values=1';
3938 'objecttype' => $this->element,
3939 'option' => $option,
3942 $classfortooltip =
'classfortooltip';
3945 $classfortooltip =
'classforajaxtooltip';
3946 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3953 if (empty($notooltip) && $user->hasRight(
'commande',
'lire')) {
3955 $label = $langs->trans(
"Order");
3956 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
3958 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
3959 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3961 $target_value = array(
'_self',
'_blank',
'_parent',
'_top');
3962 if (in_array($target, $target_value)) {
3963 $linkclose .=
' target="'.dol_escape_htmltag($target).
'"';
3967 $linkstart =
'<a href="'.$url.
'"';
3968 $linkstart .= $linkclose.
'>';
3971 if ($option ===
'nolink') {
3976 $result .= $linkstart;
3978 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
3980 if ($withpicto != 2) {
3981 $result .= $this->ref;
3983 $result .= $linkend;
3985 if ($addlinktonotes) {
3986 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
3989 $result .=
' <span class="note inline-block">';
3990 $result .=
'<a href="'.DOL_URL_ROOT.
'/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
3995 $result .=
'</span>';
4000 $hookmanager->initHooks(array($this->element .
'dao'));
4001 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
4002 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
4004 $result = $hookmanager->resPrint;
4006 $result .= $hookmanager->resPrint;
4020 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem,';
4021 $sql .=
' date_valid as datev,';
4022 $sql .=
' date_cloture as datecloture,';
4023 $sql .=
' fk_user_author, fk_user_valid, fk_user_cloture';
4024 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
4025 $sql .=
' WHERE c.rowid = '.((int) $id);
4026 $result = $this->db->query($sql);
4028 if ($this->db->num_rows($result)) {
4029 $obj = $this->db->fetch_object($result);
4030 $this->
id = $obj->rowid;
4031 if ($obj->fk_user_author) {
4032 $this->user_creation_id = $obj->fk_user_author;
4034 if ($obj->fk_user_valid) {
4035 $this->user_validation_id = $obj->fk_user_valid;
4037 if ($obj->fk_user_cloture) {
4038 $this->user_closing_id = $obj->fk_user_cloture;
4041 $this->date_creation = $this->db->jdate($obj->datec);
4042 $this->date_modification = $this->db->jdate($obj->datem);
4043 $this->date_validation = $this->db->jdate($obj->datev);
4044 $this->date_cloture = $this->db->jdate($obj->datecloture);
4047 $this->db->free($result);
4063 global
$conf, $langs;
4065 dol_syslog(get_class($this).
"::initAsSpecimen");
4070 $sql =
"SELECT rowid";
4071 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
4072 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
4073 $sql .= $this->db->plimit(100);
4075 $resql = $this->db->query($sql);
4077 $num_prods = $this->db->num_rows($resql);
4079 while ($i < $num_prods) {
4081 $row = $this->db->fetch_row($resql);
4082 $prodids[$i] = $row[0];
4088 $this->
ref =
'SPECIMEN';
4089 $this->specimen = 1;
4090 $this->entity =
$conf->entity;
4092 $this->date = time();
4093 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
4094 $this->cond_reglement_code =
'RECEP';
4095 $this->mode_reglement_code =
'CHQ';
4096 $this->availability_code =
'DSP';
4097 $this->demand_reason_code =
'SRC_00';
4099 $this->note_public =
'This is a comment (public)';
4100 $this->note_private =
'This is a comment (private)';
4102 $this->multicurrency_tx = 1;
4103 $this->multicurrency_code =
$conf->currency;
4105 $this->
status = $this::STATUS_DRAFT;
4111 while ($xnbp < $nbp) {
4114 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
4116 $line->subprice = 100;
4120 $line->total_ht = 50;
4121 $line->total_ttc = 60;
4122 $line->total_tva = 10;
4123 $line->remise_percent = 50;
4125 $line->total_ht = 100;
4126 $line->total_ttc = 120;
4127 $line->total_tva = 20;
4128 $line->remise_percent = 0;
4130 if ($num_prods > 0) {
4131 $prodid = mt_rand(1, $num_prods);
4132 $line->fk_product = $prodids[$prodid];
4133 $line->product_ref =
'SPECIMEN';
4136 $this->lines[$xnbp] = $line;
4138 $this->total_ht += $line->total_ht;
4139 $this->total_tva += $line->total_tva;
4140 $this->total_ttc += $line->total_ttc;
4158 $this->nb = array();
4161 $sql =
"SELECT count(co.rowid) as nb";
4162 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as co";
4163 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON co.fk_soc = s.rowid";
4164 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
4165 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
4166 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
4169 $sql .=
" ".$clause.
" co.entity IN (".
getEntity(
'commande').
")";
4171 $resql = $this->db->query($sql);
4173 while ($obj = $this->db->fetch_object($resql)) {
4174 $this->nb[
"orders"] = $obj->nb;
4176 $this->db->free($resql);
4180 $this->error = $this->db->error();
4206 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
4210 $langs->load(
"orders");
4211 $outputlangs->load(
"products");
4214 $modele =
'einstein';
4216 if (!empty($this->model_pdf)) {
4217 $modele = $this->model_pdf;
4223 $modelpath =
"core/modules/commande/doc/";
4225 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4278 return max($this->date, $this->delivery_date) < ($now -
$conf->commande->client->warning_delay);
4288 global
$conf, $langs;
4290 if (empty($this->delivery_date)) {
4291 $text = $langs->trans(
"OrderDate").
' '.
dol_print_date($this->date,
'day');
4293 $text = $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
4295 $text .=
' '.($conf->commande->client->warning_delay > 0 ?
'+' :
'-').
' '.round(abs(
$conf->commande->client->warning_delay) / 3600 / 24, 1).
' '.$langs->trans(
"days").
' < '.$langs->trans(
"Today");
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Class to manage customers orders.
getNbOfServicesLines()
Return number of line with type service.
getNbOfShipments()
Count number of shipments for this order.
createFromProposal($object, User $user)
Load an object from a proposal and create a new order into database.
setDraft($user, $idwarehouse=-1)
Set draft status.
setDeliveryDate($user, $delivery_date, $notrigger=0)
Set the planned delivery date.
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
getLinesArray()
Create an array of order lines.
showDelay()
Show the customer delayed info.
set_date($user, $date, $notrigger=0)
Set the order date.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
loadStateBoard()
Load the indicators this->nb for the state board.
fetch_lines($only_product=0, $loadalsotranslation=0)
Load array lines.
createFromClone(User $user, $socid=0)
Load an object from its id and create a new one in database.
const STATUS_SHIPMENTONPROCESS
Shipment on process.
LibStatut($status, $billed, $mode, $donotshowbilled=0)
Return label of status.
getLibStatut($mode)
Return status label of Order.
hasDelay()
Is the sales order delayed?
const STATUS_CLOSED
Closed (Sent, billed or not)
valid($user, $idwarehouse=0, $notrigger=0)
Validate order.
getLabelSource()
Return source label of order.
set_remise($user, $remise, $notrigger=0)
Applique une remise relative.
const STATUS_CANCELED
Canceled status.
getNomUrl($withpicto=0, $option='', $max=0, $short=0, $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0, $target='')
Return clickable link of object (with eventually picto)
loadExpeditions($filtre_statut=-1, $fk_product=0)
Load array this->expeditions of lines of shipments with nb of products sent for each order line Note:...
__construct($db)
Constructor.
availability($availability_id, $notrigger=0)
Update delivery delay.
set_reopen($user)
Tag the order as validated (opened) Function used when order is reopend after being closed.
set_ref_client($user, $ref_client, $notrigger=0)
Set customer ref.
addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $info_bits=0, $fk_remise_except=0, $price_base_type='HT', $pu_ttc=0, $date_start='', $date_end='', $type=0, $rang=-1, $special_code=0, $fk_parent_line=0, $fk_fournprice=null, $pa_ht=0, $label='', $array_options=array(), $fk_unit=null, $origin='', $origin_id=0, $pu_ht_devise=0, $ref_ext='', $noupdateafterinsertline=0)
Add an order line into database (linked to product/service or not)
getTooltipContentArray($params)
getTooltipContentArray
create($user, $notrigger=0)
Create sale order Note that this->ref can be set or empty.
demand_reason($demand_reason_id, $notrigger=0)
Update order demand_reason.
const STATUS_DRAFT
Draft status.
const STOCK_NOT_ENOUGH_FOR_ORDER
ERR Not enough stock.
initAsSpecimen()
Initialise an instance with random values.
insert_discount($idremise)
Add a discount line into a sale order (as a sale order line) using an existing absolute discount (Con...
getNbOfProductsLines()
Return number of line with type product.
update(User $user, $notrigger=0)
Update database.
classifyUnBilled(User $user, $notrigger=0)
Classify the order as not invoiced.
setDiscount($user, $remise, $notrigger=0)
Set a percentage discount.
cancel($idwarehouse=-1)
Cancel an order If stock is decremented on order validation, we must reincrement it.
setCategories($categories)
Sets object to given categories.
const STATUS_ACCEPTED
For backward compatibility.
updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_options=array(), $fk_unit=null, $pu_ht_devise=0, $notrigger=0, $ref_ext='', $rang=0)
Update a line in database.
classifyBilled(User $user, $notrigger=0)
Classify the order as invoiced.
info($id)
Charge les information d'ordre info dans l'objet commande.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
const STATUS_VALIDATED
Validated status.
deleteLine($user=null, $lineid=0, $id=0)
Delete an order line.
countNbOfShipments()
Returns an array with expeditions lines number.
liste_array($shortlist=0, $draft=0, $excluser=null, $socid=0, $limit=0, $offset=0, $sortfield='c.date_commande', $sortorder='DESC')
Return list of orders (eventuelly filtered on a user) into an array.
fetch($id, $ref='', $ref_ext='', $notused='')
Get object from database.
cloture($user, $notrigger=0, $checkpermission=1)
Close order.
set_date_livraison($user, $delivery_date, $notrigger=0)
Set delivery date.
add_product($idproduct, $qty, $remise_percent=0.0, $date_start='', $date_end='')
Add line into array $this->client must be loaded.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
setSignedStatus(User $user, int $status=0, int $notrigger=0, $triggercode='')
Set signed status.
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.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
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.
add_contact($fk_socpeople, $type_contact, $source='external', $notrigger=0)
Add a link between element $this->element and a contact.
Superclass for orders classes.
Class to manage absolute discounts.
Class to manage Dolibarr database access.
Class to manage stock movements.
static getIdAndTxFromCode($dbs, $code, $date_document=0)
Get id and rate of currency from code.
static getIdFromCode($dbs, $code)
Get id of currency from code.
Class to manage order lines.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
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...
setSignedStatusCommon(User $user, int $status, int $notrigger=0, string $triggercode='')
Set signed status & call trigger with context message.
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0, $level=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_dir_list($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_delete_preview($object)
Delete all preview files linked to object instance.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
getMarginInfos($pv_ht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $pa_ht)
Return an array with margins information of a line.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller=null, $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.