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';
64 public $TRIGGER_PREFIX =
'ORDER';
69 public $table_element =
'commande';
74 public $table_element_line =
'commandedet';
79 public $class_element_line =
'OrderLine';
84 public $fk_element =
'fk_commande';
89 public $picto =
'order';
95 public $restrictiononfksoc = 1;
115 public $ref_customer;
143 public $date_lim_reglement;
147 public $cond_reglement_code;
152 public $cond_reglement_doc;
158 public $deposit_percent;
168 public $mode_reglement;
173 public $mode_reglement_id;
178 public $mode_reglement_code;
184 public $availability_id;
190 public $availability_code;
196 public $availability;
201 public $demand_reason_id;
206 public $demand_reason_code;
218 public $date_commande;
223 public $delivery_date;
228 public $fk_remise_except;
234 public $remise_percent;
245 public $signed_status = 0;
250 public $warehouse_id;
255 public $extraparams = array();
260 public $user_author_id;
270 public $lines = array();
276 public $module_source;
290 public $online_payment_url;
323 public $fields = array(
324 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
325 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 20,
'index' => 1),
326 'ref' => array(
'type' =>
'varchar(30)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 25),
327 'ref_ext' => array(
'type' =>
'varchar(255)',
'label' =>
'RefExt',
'enabled' => 1,
'visible' => 0,
'position' => 26),
328 'ref_client' => array(
'type' =>
'varchar(255)',
'label' =>
'RefCustomer',
'enabled' => 1,
'visible' => -1,
'position' => 28),
329 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php',
'label' =>
'ThirdParty',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'notnull' => 1,
'position' => 20),
330 'fk_projet' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label' =>
'Project',
'enabled' =>
"isModEnabled('project')",
'visible' => -1,
'position' => 25),
331 'date_commande' => array(
'type' =>
'date',
'label' =>
'Date',
'enabled' => 1,
'visible' => 1,
'position' => 60,
'csslist' =>
'nowraponall'),
332 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -1,
'position' => 62,
'csslist' =>
'nowraponall'),
333 'date_cloture' => array(
'type' =>
'datetime',
'label' =>
'DateClosing',
'enabled' => 1,
'visible' => -1,
'position' => 65,
'csslist' =>
'nowraponall'),
334 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'enabled' => 1,
'visible' => -1,
'position' => 85),
335 'fk_user_cloture' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserClosing',
'enabled' => 1,
'visible' => -1,
'position' => 90),
336 'source' => array(
'type' =>
'smallint(6)',
'label' =>
'Source',
'enabled' => 1,
'visible' => -1,
'position' => 95),
337 'total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'VAT',
'enabled' => 1,
'visible' => -1,
'position' => 125,
'isameasure' => 1),
338 'localtax1' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax1',
'enabled' => 1,
'visible' => -1,
'position' => 130,
'isameasure' => 1),
339 'localtax2' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax2',
'enabled' => 1,
'visible' => -1,
'position' => 135,
'isameasure' => 1),
340 'total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalHT',
'enabled' => 1,
'visible' => -1,
'position' => 140,
'isameasure' => 1),
341 'total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalTTC',
'enabled' => 1,
'visible' => -1,
'position' => 145,
'isameasure' => 1),
342 'signed_status' => array(
'type' =>
'smallint(6)',
'label' =>
'SignedStatus',
'enabled' => 1,
'visible' => -1,
'position' => 146,
'arrayofkeyval' => array(0 =>
'NoSignature', 1 =>
'SignedSender', 2 =>
'SignedReceiver', 9 =>
'SignedAll')),
343 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 150),
344 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 155),
345 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'PDFTemplate',
'enabled' => 1,
'visible' => 0,
'position' => 160),
346 'fk_account' => array(
'type' =>
'integer',
'label' =>
'BankAccount',
'enabled' =>
'isModEnabled("bank")',
'visible' => -1,
'position' => 170),
347 'fk_currency' => array(
'type' =>
'varchar(3)',
'label' =>
'MulticurrencyID',
'enabled' => 1,
'visible' => -1,
'position' => 175),
348 'fk_cond_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentTerm',
'enabled' => 1,
'visible' => -1,
'position' => 180),
349 'deposit_percent' => array(
'type' =>
'varchar(63)',
'label' =>
'DepositPercent',
'enabled' => 1,
'visible' => -1,
'position' => 181),
350 'fk_mode_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentMode',
'enabled' => 1,
'visible' => -1,
'position' => 185),
351 'date_livraison' => array(
'type' =>
'date',
'label' =>
'DateDeliveryPlanned',
'enabled' => 1,
'visible' => -1,
'position' => 190,
'csslist' =>
'nowraponall'),
352 'fk_shipping_method' => array(
'type' =>
'integer',
'label' =>
'ShippingMethod',
'enabled' => 1,
'visible' => -1,
'position' => 195),
353 'fk_warehouse' => array(
'type' =>
'integer:Entrepot:product/stock/class/entrepot.class.php',
'label' =>
'DefaultWarehouse',
'enabled' =>
'isModEnabled("stock")',
'visible' => -1,
'position' => 200,
'nodepth' => 1),
354 'fk_availability' => array(
'type' =>
'integer',
'label' =>
'Availability',
'enabled' => 1,
'visible' => -1,
'position' => 205),
355 'fk_input_reason' => array(
'type' =>
'integer',
'label' =>
'InputReason',
'enabled' => 1,
'visible' => -1,
'position' => 210),
357 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 225),
358 'fk_incoterms' => array(
'type' =>
'integer',
'label' =>
'IncotermCode',
'enabled' =>
'isModEnabled("incoterm")',
'visible' => -1,
'position' => 230),
359 'location_incoterms' => array(
'type' =>
'varchar(255)',
'label' =>
'IncotermLabel',
'enabled' =>
'isModEnabled("incoterm")',
'visible' => -1,
'position' => 235),
360 'fk_multicurrency' => array(
'type' =>
'integer',
'label' =>
'Fk multicurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 240),
361 'multicurrency_code' => array(
'type' =>
'varchar(255)',
'label' =>
'MulticurrencyCurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 245),
362 'multicurrency_tx' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyRate',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 250,
'isameasure' => 1),
363 'multicurrency_total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountHT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 255,
'isameasure' => 1),
364 'multicurrency_total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountVAT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 260,
'isameasure' => 1),
365 'multicurrency_total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountTTC',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 265,
'isameasure' => 1),
366 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'LastMainDoc',
'enabled' => 1,
'visible' => -1,
'position' => 270),
367 'module_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSModule',
'enabled' => 1,
'visible' => -1,
'position' => 275),
368 'pos_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSTerminal',
'enabled' => 1,
'visible' => -1,
'position' => 280),
369 'fk_user_author' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'visible' => -1,
'position' => 300),
370 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'notnull' => -1,
'position' => 302),
371 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'position' => 304,
'csslist' =>
'nowraponall'),
372 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 306),
373 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 400),
374 'fk_statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Status',
'enabled' => 1,
'visible' => -1,
'position' => 500),
414 const STATUS_NO_SIGNATURE = 0;
419 const STATUS_SIGNED_SENDER = 1;
424 const STATUS_SIGNED_RECEIVER = 2;
429 const STATUS_SIGNED_ALL = 9;
441 $this->ismultientitymanaged = 1;
442 $this->isextrafieldmanaged = 1;
444 $this->fields[
'ref_ext'][
'visible'] =
getDolGlobalInt(
'MAIN_LIST_SHOW_REF_EXT');
454 public function getNextNumRef($soc)
456 global $langs, $conf;
457 $langs->load(
"order");
466 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
467 foreach ($dirmodels as $reldir) {
471 $mybool = ((bool) @include_once $dir.$file) || $mybool;
479 $obj =
new $classname();
481 '@phan-var-force ModeleNumRefCommandes $obj';
483 $numref = $obj->getNextValue($soc, $this);
488 $this->error = $obj->error;
493 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_COMMANDE_ADDON_NotDefined");
507 public function valid($user, $idwarehouse = 0, $notrigger = 0)
509 global $conf, $langs;
511 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
516 if ($this->
status == self::STATUS_VALIDATED) {
517 dol_syslog(get_class($this).
"::valid action abandoned: already validated", LOG_WARNING);
521 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
522 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
523 $this->error =
'NotEnoughPermissions';
524 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
527 if (empty($this->socid)) {
528 $this->error =
'ErrorWrongParameters';
532 dol_syslog(get_class($this).
"::valid checkActiveProductInLines ".$this->error, LOG_INFO);
541 $soc->fetch($this->socid);
544 $result = $soc->setAsCustomer();
547 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
548 $num = $this->getNextNumRef($soc);
550 $num = (string) $this->
ref;
555 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
556 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
557 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
558 $sql .=
" date_valid = '".$this->db->idate($now).
"',";
559 $sql .=
" fk_user_valid = ".($user->id > 0 ? (int) $user->id :
"null").
",";
560 $sql .=
" fk_user_modif = ".((int) $user->id);
561 $sql .=
" WHERE rowid = ".((int) $this->
id);
563 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
564 $resql = $this->db->query($sql);
567 $this->error = $this->db->lasterror();
574 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
575 $langs->load(
"agenda");
578 $cpt = count($this->lines);
579 for ($i = 0; $i < $cpt; $i++) {
580 if ($this->lines[$i]->fk_product > 0) {
582 $mouvP->origin = &$this;
583 $mouvP->setOrigin($this->element, $this->
id);
585 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"OrderValidatedInDolibarr", $num));
598 if (!$error && !$notrigger) {
600 $result = $this->call_trigger(
'ORDER_VALIDATE', $user);
608 $this->oldref = $this->ref;
611 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
613 $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).
"'";
614 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
615 $resql = $this->db->query($sql);
618 $this->error = $this->db->lasterror();
620 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'commande/".$this->db->escape($this->newref).
"'";
621 $sql .=
" WHERE filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
622 $resql = $this->db->query($sql);
625 $this->error = $this->db->lasterror();
631 $dirsource = $conf->commande->multidir_output[$this->entity].
'/'.$oldref;
632 $dirdest = $conf->commande->multidir_output[$this->entity].
'/'.$newref;
633 if (!$error && file_exists($dirsource)) {
634 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
636 if (@rename($dirsource, $dirdest)) {
639 $listoffiles =
dol_dir_list($conf->commande->multidir_output[$this->entity].
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
640 foreach ($listoffiles as $fileentry) {
641 $dirsource = $fileentry[
'name'];
642 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
643 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
644 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
645 @rename($dirsource, $dirdest);
663 $this->db->rollback();
688 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
689 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
690 $this->error =
'Permission denied';
698 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
699 $sql .=
" SET fk_statut = ".((int) self::STATUS_DRAFT).
",";
700 $sql .=
" fk_user_modif = ".((int) $user->id);
701 $sql .=
" WHERE rowid = ".((int) $this->
id);
703 if ($this->db->query($sql)) {
704 $this->oldcopy = clone $this;
710 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
711 $langs->load(
"agenda");
713 $num = count($this->lines);
714 for ($i = 0; $i < $num; $i++) {
715 if ($this->lines[$i]->fk_product > 0) {
717 $mouvP->origin = &$this;
718 $mouvP->setOrigin($this->element, $this->
id);
720 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderBackToDraftInDolibarr", $this->ref));
732 $result = $this->call_trigger(
'ORDER_UNVALIDATE', $user);
744 $this->db->rollback();
748 $this->error = $this->db->error();
749 $this->db->rollback();
768 if ($this->
status != self::STATUS_CANCELED && $this->
status != self::STATUS_CLOSED) {
769 dol_syslog(get_class($this).
"::set_reopen order has not status closed", LOG_WARNING);
775 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
776 $sql .=
' SET fk_statut='.self::STATUS_VALIDATED.
', facture=0,';
777 $sql .=
" fk_user_modif = ".((int) $user->id);
778 $sql .=
" WHERE rowid = ".((int) $this->
id);
780 dol_syslog(get_class($this).
"::set_reopen", LOG_DEBUG);
781 $resql = $this->db->query($sql);
784 $result = $this->call_trigger(
'ORDER_REOPEN', $user);
791 $this->error = $this->db->lasterror();
803 foreach ($this->errors as $errmsg) {
804 dol_syslog(get_class($this).
"::set_reopen ".$errmsg, LOG_ERR);
805 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
807 $this->db->rollback();
819 public function cloture($user, $notrigger = 0)
823 $usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
824 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'close')));
827 if ($this->
status == self::STATUS_CLOSED) {
834 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
835 $sql .=
' SET fk_statut = '.self::STATUS_CLOSED.
',';
836 $sql .=
' fk_user_cloture = '.((int) $user->id).
',';
837 $sql .=
" date_cloture = '".$this->db->idate($now).
"',";
838 $sql .=
" fk_user_modif = ".((int) $user->id);
841 if ($this->db->query($sql)) {
844 $result = $this->call_trigger(
'ORDER_CLOSE', $user);
858 $this->db->rollback();
862 $this->error = $this->db->lasterror();
864 $this->db->rollback();
884 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
885 return parent::setCategoriesCommon($categories, Categorie::TYPE_ORDER);
896 public function cancel($user, $idwarehouse = -1)
898 global $user, $langs;
904 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
905 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
",";
906 $sql .=
" fk_user_modif = ".((int) $user->id);
907 $sql .=
" WHERE rowid = ".((int) $this->
id);
908 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
910 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
911 if ($this->db->query($sql)) {
914 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
915 $langs->load(
"agenda");
917 $num = count($this->lines);
918 for ($i = 0; $i < $num; $i++) {
919 if ($this->lines[$i]->fk_product > 0) {
921 $mouvP->setOrigin($this->element, $this->
id);
923 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderCanceledInDolibarr", $this->ref));
935 $result = $this->call_trigger(
'ORDER_CANCEL', $user);
948 foreach ($this->errors as $errmsg) {
949 dol_syslog(get_class($this).
"::cancel ".$errmsg, LOG_ERR);
950 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
952 $this->db->rollback();
956 $this->error = $this->db->error();
957 $this->db->rollback();
970 public function create($user, $notrigger = 0)
972 global $conf, $langs,
$mysoc;
977 if (empty($this->socid)) {
978 $this->error =
'ErrorWrongParameters';
983 $date = ($this->date_commande ? $this->date_commande : $this->date);
984 $this->import_key = trim((
string) $this->import_key);
985 $delivery_date = $this->delivery_date;
988 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
993 if (empty($this->fk_multicurrency)) {
994 $this->multicurrency_code = $conf->currency;
995 $this->fk_multicurrency = 0;
996 $this->multicurrency_tx = 1;
1001 dol_syslog(get_class($this).
"::create user=".$user->id);
1004 if (!empty($this->
ref)) {
1007 $this->error =
'ErrorRefAlreadyExists';
1008 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
1009 $this->db->rollback();
1014 $soc =
new Societe($this->db);
1015 $result = $soc->fetch($this->socid);
1017 $this->error =
"Failed to fetch company";
1018 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1022 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Source"));
1023 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1027 $this->date_creation =
dol_now();
1031 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$this->table_element.
" (";
1032 $sql .=
" ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client";
1033 $sql .=
", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address";
1034 $sql .=
", fk_shipping_method";
1035 $sql .=
", fk_warehouse";
1036 $sql .=
", fk_incoterms, location_incoterms";
1037 $sql .=
", entity, module_source, pos_source";
1038 $sql .=
", fk_multicurrency";
1039 $sql .=
", multicurrency_code";
1040 $sql .=
", multicurrency_tx";
1041 $sql .=
", import_key";
1043 $sql .=
" VALUES ('(PROV)', ".((int) $this->socid).
", '".$this->db->idate($this->date_creation).
"', ".($user->id > 0 ? ((int) $user->id) :
"null");
1044 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
1045 $sql .=
", '".$this->db->idate($date).
"'";
1046 $sql .=
", ".($this->source >= 0 && $this->source !=
'' ? $this->db->escape((
string) $this->source) :
'null');
1047 $sql .=
", '".$this->db->escape($this->note_private).
"'";
1048 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1049 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
1050 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
1051 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1052 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
1053 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
"null");
1054 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
1055 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1056 $sql .=
", ".($this->availability_id > 0 ? ((int) $this->availability_id) :
"null");
1057 $sql .=
", ".($this->demand_reason_id > 0 ? ((int) $this->demand_reason_id) :
"null");
1058 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1059 $sql .=
", ".($this->fk_delivery_address > 0 ? ((int) $this->fk_delivery_address) :
'NULL');
1060 $sql .=
", ".(!empty($this->shipping_method_id) && $this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1061 $sql .=
", ".(!empty($this->warehouse_id) && $this->warehouse_id > 0 ? ((int) $this->warehouse_id) :
'NULL');
1062 $sql .=
", ".(int) $this->fk_incoterms;
1063 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
1064 $sql .=
", ".(int) $this->entity;
1065 $sql .=
", ".($this->module_source ?
"'".$this->db->escape($this->module_source).
"'" :
"null");
1066 $sql .=
", ".((!is_null($this->pos_source) && $this->pos_source !=
'') ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
1067 $sql .=
", ".(int) $this->fk_multicurrency;
1068 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1069 $sql .=
", ".(float) $this->multicurrency_tx;
1070 $sql .=
", '".$this->db->escape($this->import_key).
"'";
1073 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1074 $resql = $this->db->query($sql);
1076 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commande');
1079 $fk_parent_line = 0;
1080 $num = count($this->lines);
1085 for ($i = 0; $i < $num; $i++) {
1086 $line = $this->lines[$i];
1090 if (!is_object($line)) {
1092 foreach ($line as $key => $val) {
1093 $lineobj->$key = $val;
1096 $this->lines[$i] = $line;
1100 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1101 $fk_parent_line = 0;
1105 $vatrate = $line->tva_tx;
1106 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', (
string) $vatrate)) {
1107 $vatrate .=
' ('.$line->vat_src_code.
')';
1111 $originid = $line->origin_id;
1112 $origintype = empty($line->origin_type) ? $line->origin : $line->origin_type;
1114 $originid = $line->id;
1115 $origintype = $this->element;
1119 if (empty($line->ref_ext)) {
1120 $line->ref_ext =
'';
1128 $line->localtax1_tx,
1129 $line->localtax2_tx,
1131 $line->remise_percent,
1133 $line->fk_remise_except,
1138 $line->product_type,
1140 $line->special_code,
1142 $line->fk_fournprice,
1145 $line->array_options,
1147 (
string) $origintype,
1155 if ($result != self::STOCK_NOT_ENOUGH_FOR_ORDER) {
1156 $this->error = $this->db->lasterror();
1157 $this->errors[] = $this->error;
1160 $this->db->rollback();
1164 if ($result > 0 && $line->product_type == 9) {
1165 $fk_parent_line = $result;
1172 $initialref =
'(PROV'.$this->id.
')';
1173 if (!empty($this->
ref)) {
1174 $initialref = $this->ref;
1177 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
" SET ref='".$this->db->escape($initialref).
"' WHERE rowid=".((int) $this->
id);
1178 if ($this->db->query($sql)) {
1179 $this->
ref = $initialref;
1181 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1182 $this->linked_objects = $this->linkedObjectsIds;
1186 if (!empty($this->linked_objects) && is_array($this->linked_objects)) {
1187 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1188 if (is_array($tmp_origin_id)) {
1189 foreach ($tmp_origin_id as $origin_id) {
1192 $this->error = $this->db->lasterror();
1197 $origin_id = $tmp_origin_id;
1200 $this->error = $this->db->lasterror();
1207 if (!$error &&
getDolGlobalString(
'MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN') && !empty($this->origin) && !empty($this->origin_id)) {
1208 $originforcontact = empty($this->origin_type) ? $this->origin : $this->origin_type;
1209 $originidforcontact = $this->origin_id;
1210 if ($originforcontact ==
'shipping') {
1211 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1213 $exp->fetch($this->origin_id);
1214 $exp->fetchObjectLinked();
1215 if (count($exp->linkedObjectsIds[
'commande']) > 0) {
1216 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1217 $originforcontact =
'commande';
1218 if (is_object($value)) {
1219 $originidforcontact = $value->id;
1221 $originidforcontact = $value;
1228 $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";
1229 $sqlcontact .=
" WHERE element_id = ".((int) $originidforcontact).
" AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = '".$this->db->escape($originforcontact).
"'";
1231 $resqlcontact = $this->db->query($sqlcontact);
1232 if ($resqlcontact) {
1233 while ($objcontact = $this->db->fetch_object($resqlcontact)) {
1235 $this->
add_contact($objcontact->fk_socpeople, $objcontact->code, $objcontact->source);
1249 if (!$error && !$notrigger) {
1251 $result = $this->call_trigger(
'ORDER_CREATE', $user);
1259 $this->db->commit();
1262 $this->db->rollback();
1266 $this->error = $this->db->lasterror();
1267 $this->db->rollback();
1274 $this->error = $this->db->lasterror();
1275 $this->db->rollback();
1290 global $user, $hookmanager;
1297 foreach ($this->lines as $line) {
1298 $line->fetch_optionals();
1302 $objFrom = clone $this;
1305 if (!empty($socid) && $socid != $this->socid) {
1306 $objsoc =
new Societe($this->db);
1308 if ($objsoc->fetch($socid) > 0) {
1309 $this->socid = $objsoc->id;
1310 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1311 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent :
'0');
1312 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1313 $this->fk_project = 0;
1314 $this->fk_delivery_address = 0;
1326 $this->user_author_id = $user->id;
1327 $this->user_validation_id = 0;
1329 $this->date_commande =
dol_now();
1330 $this->date_creation =
'';
1331 $this->date_validation =
'';
1333 $this->ref_client =
'';
1334 $this->ref_customer =
'';
1338 $num = count($this->lines);
1339 for ($i = 0; $i < $num; $i++) {
1340 $this->lines[$i]->ref_ext =
'';
1344 $this->context[
'createfromclone'] =
'createfromclone';
1345 $result = $this->
create($user);
1359 if ($this->socid == $objFrom->socid) {
1368 if (is_object($hookmanager)) {
1369 $parameters = array(
'objFrom' => $objFrom);
1371 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1379 unset($this->context[
'createfromclone']);
1383 $this->db->commit();
1386 $this->db->rollback();
1401 global $conf, $hookmanager;
1403 require_once DOL_DOCUMENT_ROOT .
'/multicurrency/class/multicurrency.class.php';
1404 require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
1408 $this->date_commande =
dol_now();
1413 for ($i = 0; $i < $num; $i++) {
1416 $line->libelle =
$object->lines[$i]->libelle;
1417 $line->label =
$object->lines[$i]->label;
1418 $line->desc =
$object->lines[$i]->desc;
1419 $line->price =
$object->lines[$i]->price;
1420 $line->subprice =
$object->lines[$i]->subprice;
1421 $line->vat_src_code =
$object->lines[$i]->vat_src_code;
1422 $line->tva_tx =
$object->lines[$i]->tva_tx;
1423 $line->localtax1_tx =
$object->lines[$i]->localtax1_tx;
1424 $line->localtax2_tx =
$object->lines[$i]->localtax2_tx;
1425 $line->qty =
$object->lines[$i]->qty;
1426 $line->fk_remise_except =
$object->lines[$i]->fk_remise_except;
1427 $line->remise_percent =
$object->lines[$i]->remise_percent;
1428 $line->fk_product =
$object->lines[$i]->fk_product;
1429 $line->info_bits =
$object->lines[$i]->info_bits;
1430 $line->product_type =
$object->lines[$i]->product_type;
1431 $line->rang =
$object->lines[$i]->rang;
1432 $line->special_code =
$object->lines[$i]->special_code;
1433 $line->fk_parent_line =
$object->lines[$i]->fk_parent_line;
1434 $line->fk_unit =
$object->lines[$i]->fk_unit;
1436 $line->date_start =
$object->lines[$i]->date_start;
1437 $line->date_end =
$object->lines[$i]->date_end;
1439 $line->fk_fournprice =
$object->lines[$i]->fk_fournprice;
1441 $line->pa_ht = $marginInfos[0];
1442 $line->marge_tx = $marginInfos[1];
1443 $line->marque_tx = $marginInfos[2];
1445 $line->origin =
$object->element;
1446 $line->origin_id =
$object->lines[$i]->id;
1449 $object->lines[$i]->fetch_optionals();
1450 foreach (
$object->lines[$i]->array_options as $options_key => $value) {
1451 $line->array_options[$options_key] = $value;
1454 $this->lines[$i] = $line;
1457 $this->entity =
$object->entity;
1458 $this->socid =
$object->socid;
1459 $this->fk_project =
$object->fk_project;
1460 $this->cond_reglement_id =
$object->cond_reglement_id;
1461 $this->deposit_percent =
$object->deposit_percent;
1462 $this->mode_reglement_id =
$object->mode_reglement_id;
1463 $this->fk_account =
$object->fk_account;
1464 $this->availability_id =
$object->availability_id;
1465 $this->demand_reason_id =
$object->demand_reason_id;
1466 $this->delivery_date =
$object->delivery_date;
1467 $this->shipping_method_id =
$object->shipping_method_id;
1468 $this->warehouse_id =
$object->warehouse_id;
1469 $this->fk_delivery_address =
$object->fk_delivery_address;
1470 $this->contact_id =
$object->contact_id;
1471 $this->ref_client =
$object->ref_client;
1472 $this->ref_customer =
$object->ref_client;
1475 $this->note_private =
$object->note_private;
1476 $this->note_public =
$object->note_public;
1479 $this->origin =
$object->element;
1480 $this->origin_id =
$object->id;
1484 if (!empty(
$object->multicurrency_code)) {
1485 $this->multicurrency_code =
$object->multicurrency_code;
1488 $this->multicurrency_tx =
$object->multicurrency_tx;
1491 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1493 $this->fk_multicurrency = $tmparray[0];
1494 $this->multicurrency_tx = $tmparray[1];
1498 if (empty($this->fk_multicurrency)) {
1499 $this->multicurrency_code = $conf->currency;
1500 $this->fk_multicurrency = 0;
1501 $this->multicurrency_tx = 1;
1509 $element_extrafields = $e->fetch_name_optionals_label($this->table_element);
1511 foreach (
$object->array_options as $options_key => $value) {
1512 if (array_key_exists(str_replace(
'options_',
'', $options_key), $element_extrafields)) {
1513 $this->array_options[$options_key] = $value;
1517 $this->linked_objects[$this->origin] = $this->origin_id;
1518 if (isset(
$object->other_linked_objects) && is_array(
$object->other_linked_objects) && !empty(
$object->other_linked_objects)) {
1519 $this->linked_objects = array_merge($this->linked_objects,
$object->other_linked_objects);
1522 $ret = $this->
create($user);
1526 $hookmanager->initHooks(array(
'orderdao'));
1528 $parameters = array(
'objFrom' =>
$object);
1530 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1540 $this->
valid($user);
1592 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)
1594 global
$mysoc, $langs, $user;
1596 $logtext =
"::addline commandeid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent";
1597 $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";
1598 $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";
1599 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
1601 if ($this->
status == self::STATUS_DRAFT) {
1602 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1606 if (empty($remise_percent)) {
1607 $remise_percent = 0;
1612 if (empty($info_bits)) {
1618 if (empty($txtva)) {
1621 if (empty($txlocaltax1)) {
1624 if (empty($txlocaltax2)) {
1627 if (empty($fk_parent_line) || $fk_parent_line < 0) {
1628 $fk_parent_line = 0;
1630 if (empty($this->fk_multicurrency)) {
1631 $this->fk_multicurrency = 0;
1633 if (empty($ref_ext)) {
1637 $remise_percent = (float)
price2num($remise_percent);
1640 $pu_ht_devise =
price2num($pu_ht_devise);
1643 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
1648 if ($price_base_type ==
'HT') {
1653 $label = trim($label);
1654 $desc = trim($desc);
1661 if ($date_start && $date_end && $date_start > $date_end) {
1662 $langs->load(
"errors");
1663 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1669 $product_type = $type;
1670 if (!empty($fk_product) && $fk_product > 0) {
1671 $product =
new Product($this->db);
1672 $result = $product->fetch($fk_product);
1673 $product_type = $product->type;
1675 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product->isStockManaged()) {
1677 $productChildrenNb = 0;
1679 $productChildrenNb = $product->hasFatherOrChild(1);
1681 if ($productChildrenNb > 0) {
1683 $product_stock =
null;
1684 $product->loadStockForVirtualProduct(
'warehouseopen', $qty);
1685 foreach ($product->stock_warehouse as $componentStockWarehouse) {
1686 if ($product_stock ===
null) {
1687 $product_stock = $componentStockWarehouse->real;
1689 $product_stock = min($product_stock, $componentStockWarehouse->real);
1692 if ($product_stock ===
null) {
1696 $product_stock = $product->stock_reel;
1699 if ($product_stock < $qty) {
1700 $langs->load(
"errors");
1701 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
1702 $this->errors[] = $this->error;
1703 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
1704 $this->db->rollback();
1717 $tmpproduct =
new Product($this->db);
1718 $result = $tmpproduct->fetch($fk_product);
1719 if (abs((
float) $qty) < $tmpproduct->packaging) {
1720 $qty = (float) $tmpproduct->packaging;
1721 setEventMessages($langs->trans(
'QtyRecalculatedWithPackaging'),
null,
'warnings');
1723 if (!empty($tmpproduct->packaging) && (
float)
price2num(fmod((
float) $qty, (
float) $tmpproduct->packaging),
'MS')) {
1724 $coeff = intval(abs((
float) $qty) / $tmpproduct->packaging) + 1;
1725 $qty =
price2num((
float) $tmpproduct->packaging * $coeff,
'MS');
1726 setEventMessages($langs->trans(
'QtyRecalculatedWithPackaging'),
null,
'warnings');
1734 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1735 $vat_src_code = $reg[1];
1736 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1739 $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);
1749 $total_ht = $tabprice[0];
1750 $total_tva = $tabprice[1];
1751 $total_ttc = $tabprice[2];
1752 $total_localtax1 = $tabprice[9];
1753 $total_localtax2 = $tabprice[10];
1754 $pu_ht = $tabprice[3];
1757 $multicurrency_total_ht = $tabprice[16];
1758 $multicurrency_total_tva = $tabprice[17];
1759 $multicurrency_total_ttc = $tabprice[18];
1760 $pu_ht_devise = $tabprice[19];
1765 if (empty($ranktouse) || $ranktouse == -1) {
1766 $rangmax = $this->
line_max($fk_parent_line);
1767 $ranktouse = $rangmax + 1;
1773 $this->line->context = $this->context;
1775 $this->line->fk_commande = $this->id;
1776 $this->line->label = $label;
1777 $this->line->desc = $desc;
1778 $this->line->qty = (float) $qty;
1779 $this->line->ref_ext = $ref_ext;
1781 $this->line->vat_src_code = $vat_src_code;
1782 $this->line->tva_tx = $txtva;
1783 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
1784 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
1785 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
1786 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
1787 $this->line->fk_product = $fk_product;
1788 $this->line->product_type = $product_type;
1789 $this->line->fk_remise_except = $fk_remise_except;
1790 $this->line->remise_percent = $remise_percent;
1791 $this->line->subprice = (float) $pu_ht;
1792 $this->line->rang = $ranktouse;
1793 $this->line->info_bits = $info_bits;
1794 $this->line->total_ht = (float) $total_ht;
1795 $this->line->total_tva = (float) $total_tva;
1796 $this->line->total_localtax1 = (float) $total_localtax1;
1797 $this->line->total_localtax2 = (float) $total_localtax2;
1798 $this->line->total_ttc = (float) $total_ttc;
1799 $this->line->special_code = $special_code;
1800 if (empty($qty) && empty($special_code)) {
1801 $this->line->special_code = 3;
1803 $this->line->origin = $origin;
1804 $this->line->origin_id = $origin_id;
1805 $this->line->fk_parent_line = $fk_parent_line;
1806 $this->line->fk_unit = $fk_unit;
1808 $this->line->date_start = $date_start;
1809 $this->line->date_end = $date_end;
1811 $this->line->fk_fournprice = $fk_fournprice;
1812 $this->line->pa_ht = $pa_ht;
1815 $this->line->fk_multicurrency = $this->fk_multicurrency;
1816 $this->line->multicurrency_code = $this->multicurrency_code;
1817 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
1818 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
1819 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
1820 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
1822 if (is_array($array_options) && count($array_options) > 0) {
1823 $this->line->array_options = $array_options;
1826 $result = $this->line->insert($user);
1829 if (empty($noupdateafterinsertline)) {
1834 if (!isset($this->context[
'createfromclone'])) {
1835 if (!empty($fk_parent_line)) {
1838 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
1840 foreach ($this->lines as $tmpline) {
1841 if ($tmpline->rang >= $ranktouse) {
1842 if (!empty($tmpline->id)) {
1849 $this->lines[] = $this->line;
1851 foreach ($this->lines as $line) {
1852 if ($line->id == $origin_id) {
1853 $this->line->extraparams = $line->extraparams;
1854 $this->line->setExtraParameters();
1859 $this->db->commit();
1860 return $this->line->id;
1862 $this->db->rollback();
1867 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
1868 $this->db->rollback();
1872 dol_syslog(get_class($this).
"::addline status of order must be Draft to allow use of ->addline()", LOG_ERR);
1892 public function add_product($idproduct, $qty, $remise_percent = 0.0, $date_start =
'', $date_end =
'')
1901 if ($idproduct > 0) {
1902 $prod =
new Product($this->db);
1903 $prod->fetch($idproduct);
1907 if (empty($tva_tx)) {
1917 $price = $prod->multiprices[$this->thirdparty->price_level];
1918 $price_ttc = $prod->multiprices_ttc[$this->thirdparty->price_level];
1920 $price = $prod->price;
1921 $price_ttc = $prod->price_ttc;
1926 $line->context = $this->context;
1928 $line->fk_product = $idproduct;
1929 $line->desc = $prod->description;
1931 $line->subprice = $price;
1932 $line->subprice_ttc = $price_ttc;
1933 $line->remise_percent = $remise_percent;
1934 $line->vat_src_code = $vat_src_code;
1935 $line->tva_tx = $tva_tx;
1936 $line->localtax1_tx = $localtax1_tx;
1937 $line->localtax2_tx = $localtax2_tx;
1939 $line->product_ref = $prod->ref;
1940 $line->product_label = $prod->label;
1941 $line->product_desc = $prod->description;
1942 $line->fk_unit = $prod->fk_unit;
1946 $line->date_start = $date_start;
1949 $line->date_end = $date_end;
1952 $this->lines[] = $line;
1984 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
1987 if (empty($id) && empty($ref) && empty($ref_ext)) {
1991 $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';
1992 $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';
1993 $sql .=
', c.fk_account';
1994 $sql .=
', c.date_commande, c.date_valid, c.tms';
1995 $sql .=
', c.date_livraison as delivery_date';
1996 $sql .=
', c.fk_shipping_method';
1997 $sql .=
', c.fk_warehouse';
1998 $sql .=
', c.fk_projet as fk_project, c.source, c.facture as billed';
1999 $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';
2000 $sql .=
', c.fk_incoterms, c.location_incoterms';
2001 $sql .=
", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
2002 $sql .=
", c.module_source, c.pos_source";
2003 $sql .=
", i.libelle as label_incoterms";
2004 $sql .=
', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
2005 $sql .=
', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
2006 $sql .=
', ca.code as availability_code, ca.label as availability_label';
2007 $sql .=
', dr.code as demand_reason_code';
2008 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
2009 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid';
2010 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON c.fk_mode_reglement = p.id';
2011 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON c.fk_availability = ca.rowid';
2012 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON c.fk_input_reason = dr.rowid';
2013 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
2016 $sql .=
" WHERE c.rowid = ".((int) $id);
2018 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2022 $sql .=
" AND c.ref = '".$this->db->escape($ref).
"'";
2025 $sql .=
" AND c.ref_ext = '".$this->db->escape($ref_ext).
"'";
2028 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
2029 $result = $this->db->query($sql);
2031 $obj = $this->db->fetch_object($result);
2033 $this->
id = $obj->rowid;
2034 $this->entity = $obj->entity;
2036 $this->
ref = $obj->ref;
2037 $this->ref_client = $obj->ref_client;
2038 $this->ref_customer = $obj->ref_client;
2039 $this->ref_ext = $obj->ref_ext;
2041 $this->socid = $obj->fk_soc;
2042 $this->thirdparty =
null;
2044 $this->fk_project = $obj->fk_project;
2045 $this->project =
null;
2047 $this->statut = $obj->status;
2048 $this->
status = $obj->status;
2050 $this->user_author_id = $obj->fk_user_author;
2051 $this->user_creation_id = $obj->fk_user_author;
2052 $this->user_validation_id = $obj->fk_user_valid;
2053 $this->user_modification_id = $obj->fk_user_modif;
2054 $this->total_ht = $obj->total_ht;
2055 $this->total_tva = $obj->total_tva;
2056 $this->total_localtax1 = $obj->total_localtax1;
2057 $this->total_localtax2 = $obj->total_localtax2;
2058 $this->total_ttc = $obj->total_ttc;
2059 $this->
date = $this->db->jdate($obj->date_commande);
2060 $this->date_commande = $this->db->jdate($obj->date_commande);
2061 $this->date_creation = $this->db->jdate($obj->date_creation);
2062 $this->date_validation = $this->db->jdate($obj->date_valid);
2063 $this->date_modification = $this->db->jdate($obj->tms);
2064 $this->source = $obj->source;
2065 $this->billed = $obj->billed;
2066 $this->note = $obj->note_private;
2067 $this->note_private = $obj->note_private;
2068 $this->note_public = $obj->note_public;
2069 $this->model_pdf = $obj->model_pdf;
2070 $this->last_main_doc = $obj->last_main_doc;
2071 $this->mode_reglement_id = $obj->fk_mode_reglement;
2072 $this->mode_reglement_code = $obj->mode_reglement_code;
2073 $this->mode_reglement = $obj->mode_reglement_libelle;
2074 $this->cond_reglement_id = $obj->fk_cond_reglement;
2075 $this->cond_reglement_code = $obj->cond_reglement_code;
2076 $this->cond_reglement = $obj->cond_reglement_libelle;
2077 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
2078 $this->deposit_percent = $obj->deposit_percent;
2079 $this->fk_account = $obj->fk_account;
2080 $this->availability_id = $obj->fk_availability;
2081 $this->availability_code = $obj->availability_code;
2083 $this->demand_reason_id = $obj->fk_input_reason;
2084 $this->demand_reason_code = $obj->demand_reason_code;
2085 $this->delivery_date = $this->db->jdate($obj->delivery_date);
2086 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
2087 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
2088 $this->fk_delivery_address = $obj->fk_delivery_address;
2089 $this->module_source = $obj->module_source;
2090 $this->pos_source = $obj->pos_source;
2093 $this->fk_incoterms = $obj->fk_incoterms;
2094 $this->location_incoterms = $obj->location_incoterms;
2095 $this->label_incoterms = $obj->label_incoterms;
2098 $this->fk_multicurrency = $obj->fk_multicurrency;
2099 $this->multicurrency_code = $obj->multicurrency_code;
2100 $this->multicurrency_tx = $obj->multicurrency_tx;
2101 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
2102 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
2103 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2105 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
2107 $this->lines = array();
2113 $this->db->free($result);
2122 $this->error =
'Order with id '.$id.
' not found sql='.$sql;
2126 $this->error = $this->db->error();
2144 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2145 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
2150 $result = $remise->fetch($idremise);
2153 if ($remise->fk_facture) {
2154 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
2155 $this->db->rollback();
2161 $line->fk_commande = $this->id;
2162 $line->fk_remise_except = $remise->id;
2163 $line->desc = $remise->description;
2164 $line->vat_src_code = $remise->vat_src_code;
2165 $line->tva_tx = $remise->tva_tx;
2166 $line->subprice = -(float) $remise->amount_ht;
2167 $line->price = -(float) $remise->amount_ht;
2168 $line->fk_product = 0;
2170 $line->remise_percent = 0;
2172 $line->info_bits = 2;
2174 $line->total_ht = -(float) $remise->amount_ht;
2175 $line->total_tva = -(float) $remise->amount_tva;
2176 $line->total_ttc = -(float) $remise->amount_ttc;
2178 $result = $line->insert();
2182 $this->db->commit();
2185 $this->db->rollback();
2190 $this->db->rollback();
2194 $this->db->rollback();
2208 public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
2211 $this->lines = array();
2213 $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,';
2214 $sql .=
' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.fk_remise_except, l.remise_percent, l.subprice, l.subprice_ttc, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.rang, l.info_bits, l.special_code,';
2215 $sql .=
' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
2216 $sql .=
' l.fk_unit, l.extraparams,';
2217 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_subprice_ttc, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2218 $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,';
2219 $sql .=
' p.customcode, p.fk_country as country_id, c.code as country_code,';
2220 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units, p.packaging';
2221 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element_line.
' as l';
2222 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (p.rowid = l.fk_product)';
2223 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_country as c ON c.rowid = p.fk_country';
2224 $sql .=
' WHERE l.fk_commande = '.((int) $this->
id);
2225 if ($only_product) {
2226 $sql .=
' AND p.fk_product_type = 0';
2228 $sql .=
' ORDER BY l.rang, l.rowid';
2230 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
2231 $result = $this->db->query($sql);
2233 $num = $this->db->num_rows($result);
2237 $objp = $this->db->fetch_object($result);
2241 $line->rowid = $objp->rowid;
2242 $line->id = $objp->rowid;
2243 $line->fk_commande = $objp->fk_commande;
2244 $line->commande_id = $objp->fk_commande;
2245 $line->label = $objp->custom_label;
2246 $line->desc = $objp->description;
2247 $line->description = $objp->description;
2248 $line->product_type = $objp->product_type;
2249 $line->qty = $objp->qty;
2250 $line->ref_ext = $objp->ref_ext;
2252 $line->vat_src_code = $objp->vat_src_code;
2253 $line->tva_tx = $objp->tva_tx;
2254 $line->localtax1_tx = $objp->localtax1_tx;
2255 $line->localtax2_tx = $objp->localtax2_tx;
2256 $line->localtax1_type = $objp->localtax1_type;
2257 $line->localtax2_type = $objp->localtax2_type;
2258 $line->total_ht = $objp->total_ht;
2259 $line->total_ttc = $objp->total_ttc;
2260 $line->total_tva = $objp->total_tva;
2261 $line->total_localtax1 = $objp->total_localtax1;
2262 $line->total_localtax2 = $objp->total_localtax2;
2263 $line->subprice = (float) $objp->subprice;
2264 $line->subprice_ttc = (float) $objp->subprice_ttc;
2265 $line->fk_remise_except = $objp->fk_remise_except;
2266 $line->remise_percent = $objp->remise_percent;
2267 $line->price = $objp->price;
2268 $line->fk_product = $objp->fk_product;
2269 $line->fk_fournprice = $objp->fk_fournprice;
2270 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
2271 $line->pa_ht = $marginInfos[0];
2272 $line->marge_tx = $marginInfos[1];
2273 $line->marque_tx = $marginInfos[2];
2274 $line->rang = $objp->rang;
2275 $line->info_bits = $objp->info_bits;
2276 $line->special_code = $objp->special_code;
2277 $line->fk_parent_line = $objp->fk_parent_line;
2279 $line->ref = $objp->product_ref;
2280 $line->libelle = $objp->product_label;
2282 $line->product_ref = $objp->product_ref;
2283 $line->product_label = $objp->product_label;
2284 $line->product_tosell = $objp->product_tosell;
2285 $line->product_tobuy = $objp->product_tobuy;
2286 $line->product_desc = $objp->product_desc;
2287 $line->product_tobatch = $objp->product_tobatch;
2288 $line->product_barcode = $objp->product_barcode;
2289 $line->product_custom_code = $objp->customcode;
2290 $line->product_custom_country_id = $objp->country_id;
2291 $line->product_custom_country_code = $objp->country_code;
2293 $line->fk_product_type = $objp->fk_product_type;
2294 $line->fk_unit = $objp->fk_unit;
2296 $line->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
2298 $line->weight = $objp->weight;
2299 $line->weight_units = $objp->weight_units;
2300 $line->volume = $objp->volume;
2301 $line->volume_units = $objp->volume_units;
2302 $line->packaging = $objp->packaging;
2304 $line->date_start = $this->db->jdate($objp->date_start);
2305 $line->date_end = $this->db->jdate($objp->date_end);
2308 $line->fk_multicurrency = $objp->fk_multicurrency;
2309 $line->multicurrency_code = $objp->multicurrency_code;
2310 $line->multicurrency_subprice = $objp->multicurrency_subprice;
2311 $line->multicurrency_subprice_ttc = $objp->multicurrency_subprice_ttc;
2312 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
2313 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
2314 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2316 $line->fetch_optionals();
2319 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
2320 $tmpproduct =
new Product($this->db);
2321 $tmpproduct->fetch($objp->fk_product);
2322 $tmpproduct->getMultiLangs();
2324 $line->multilangs = $tmpproduct->multilangs;
2327 $this->lines[$i] = $line;
2332 $this->db->free($result);
2336 $this->error = $this->db->error();
2350 foreach ($this->lines as $line) {
2351 if ($line->product_type == 0) {
2366 foreach ($this->lines as $line) {
2367 if ($line->product_type == 1) {
2383 $sql =
'SELECT COUNT(DISTINCT ed.fk_expedition) as nb';
2384 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2385 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2387 $sql .=
' ed.fk_elementdet = cd.rowid';
2388 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2391 dol_syslog(get_class($this).
"::getNbOfShipments", LOG_DEBUG);
2392 $resql = $this->db->query($sql);
2394 $obj = $this->db->fetch_object($resql);
2396 $nb = (int) $obj->nb;
2399 $this->db->free($resql);
2402 $this->error = $this->db->lasterror();
2417 $this->expeditions = array();
2419 $sql =
'SELECT cd.rowid, cd.fk_product,';
2420 $sql .=
' sum(ed.qty) as qty';
2421 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2422 if ($filtre_statut >= 0) {
2423 $sql .=
' '.MAIN_DB_PREFIX.
'expedition as e,';
2425 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2427 if ($filtre_statut >= 0) {
2428 $sql .=
' ed.fk_expedition = e.rowid AND';
2430 $sql .=
' ed.fk_elementdet = cd.rowid';
2431 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2432 if ($fk_product > 0) {
2433 $sql .=
' AND cd.fk_product = '.((int) $fk_product);
2435 if ($filtre_statut >= 0) {
2436 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
2438 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
2441 dol_syslog(get_class($this).
"::loadExpeditions", LOG_DEBUG);
2442 $resql = $this->db->query($sql);
2444 $num = $this->db->num_rows($resql);
2447 $obj = $this->db->fetch_object($resql);
2448 $this->expeditions[$obj->rowid] = $obj->qty;
2451 $this->db->free($resql);
2454 $this->error = $this->db->lasterror();
2466 $sql =
'SELECT count(*)';
2467 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expedition as e';
2468 $sql .=
', '.MAIN_DB_PREFIX.
'element_element as el';
2469 $sql .=
' WHERE el.fk_source = '.((int) $this->
id);
2470 $sql .=
" AND el.sourcetype = 'commande'";
2471 $sql .=
" AND el.fk_target = e.rowid";
2472 $sql .=
" AND el.targettype = 'shipping'";
2474 $resql = $this->db->query($sql);
2476 $row = $this->db->fetch_row($resql);
2495 if ($this->
status == self::STATUS_DRAFT) {
2501 $line->context = $this->context;
2504 $line->fetch($lineid);
2506 if ($id > 0 && $line->fk_commande != $id) {
2507 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
2512 $staticline = clone $line;
2513 $line->oldline = $staticline;
2515 if ($line->delete($user) > 0) {
2519 $this->db->commit();
2522 $this->db->rollback();
2523 $this->error = $this->db->lasterror();
2527 $this->db->rollback();
2532 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
2551 dol_syslog(get_class($this).
"::set_remise is deprecated, use setDiscount instead", LOG_NOTICE);
2553 return $this->
setDiscount($user, $remise, $notrigger);
2566 $remise = trim((
string) $remise) ? trim((
string) $remise) : 0;
2568 if ($user->hasRight(
'commande',
'creer')) {
2575 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2576 $sql .=
' SET remise_percent = '.((float) $remise);
2577 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_DRAFT);
2580 $resql = $this->db->query($sql);
2582 $this->errors[] = $this->db->error();
2587 $this->oldcopy = clone $this;
2588 $this->remise_percent = $remise;
2592 if (!$notrigger && empty($error)) {
2594 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2602 $this->db->commit();
2605 foreach ($this->errors as $errmsg) {
2606 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2607 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2609 $this->db->rollback();
2630 if ($user->hasRight(
'commande',
'creer')) {
2635 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2636 $sql .=
" SET date_commande = ".($date ?
"'".$this->db->idate($date).
"'" :
'null');
2637 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = ".((int) self::STATUS_DRAFT);
2640 $resql = $this->db->query($sql);
2642 $this->errors[] = $this->db->error();
2647 $this->oldcopy = clone $this;
2648 $this->
date = $date;
2651 if (!$notrigger && empty($error)) {
2653 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2661 $this->db->commit();
2664 foreach ($this->errors as $errmsg) {
2665 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2666 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2668 $this->db->rollback();
2702 if ($user->hasRight(
'commande',
'creer')) {
2707 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2708 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2709 $sql .=
" WHERE rowid = ".((int) $this->
id);
2712 $resql = $this->db->query($sql);
2714 $this->errors[] = $this->db->error();
2719 $this->oldcopy = clone $this;
2720 $this->delivery_date = $delivery_date;
2723 if (!$notrigger && empty($error)) {
2725 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2733 $this->db->commit();
2736 foreach ($this->errors as $errmsg) {
2737 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2738 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2740 $this->db->rollback();
2762 public function liste_array($shortlist = 0, $draft = 0, $excluser =
null, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'c.date_commande', $sortorder =
'DESC')
2769 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2770 $sql .=
" c.rowid as cid, c.ref";
2771 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2772 $sql .=
", sc.fk_soc, sc.fk_user";
2774 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.$this->table_element.
" as c";
2775 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2776 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
2778 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2779 $sql .=
" AND c.fk_soc = s.rowid";
2780 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2781 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2784 $sql .=
" AND s.rowid = ".((int) $socid);
2787 $sql .=
" AND c.fk_statut = ".self::STATUS_DRAFT;
2789 if (is_object($excluser)) {
2790 $sql .=
" AND c.fk_user_author <> ".((int) $excluser->id);
2792 $sql .= $this->db->order($sortfield, $sortorder);
2793 $sql .= $this->db->plimit($limit, $offset);
2795 $result = $this->db->query($sql);
2797 $numc = $this->db->num_rows($result);
2800 while ($i < $numc) {
2801 $obj = $this->db->fetch_object($result);
2803 if ($shortlist == 1) {
2804 $ga[$obj->cid] = $obj->ref;
2805 } elseif ($shortlist == 2) {
2806 $ga[$obj->cid] = $obj->ref.
' ('.$obj->name.
')';
2808 $ga[$i][
'id'] = $obj->cid;
2809 $ga[$i][
'ref'] = $obj->ref;
2810 $ga[$i][
'name'] = $obj->name;
2833 dol_syslog(
'Commande::availability('.$availability_id.
')');
2834 if ($this->
status >= self::STATUS_DRAFT) {
2839 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2840 $sql .=
' SET fk_availability = '.((int) $availability_id);
2841 $sql .=
' WHERE rowid='.((int) $this->
id);
2844 $resql = $this->db->query($sql);
2846 $this->errors[] = $this->db->error();
2851 $this->oldcopy = clone $this;
2852 $this->availability_id = $availability_id;
2855 if (!$notrigger && empty($error)) {
2857 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2865 $this->db->commit();
2868 foreach ($this->errors as $errmsg) {
2869 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2870 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2872 $this->db->rollback();
2876 $error_str =
'Command status do not meet requirement '.$this->status;
2878 $this->error = $error_str;
2879 $this->errors[] = $this->error;
2897 dol_syslog(
'Commande::demand_reason('.$demand_reason_id.
')');
2898 if ($this->
status >= self::STATUS_DRAFT) {
2903 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2904 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
2905 $sql .=
' WHERE rowid='.((int) $this->
id);
2908 $resql = $this->db->query($sql);
2910 $this->errors[] = $this->db->error();
2915 $this->oldcopy = clone $this;
2916 $this->demand_reason_id = $demand_reason_id;
2919 if (!$notrigger && empty($error)) {
2921 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2929 $this->db->commit();
2932 foreach ($this->errors as $errmsg) {
2933 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2934 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2936 $this->db->rollback();
2940 $error_str =
'order status do not meet requirement '.$this->status;
2942 $this->error = $error_str;
2943 $this->errors[] = $this->error;
2960 if ($user->hasRight(
'commande',
'creer')) {
2965 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET';
2966 $sql .=
' ref_client = '.(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2967 $sql .=
' WHERE rowid = '.((int) $this->
id);
2969 dol_syslog(__METHOD__.
' this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2970 $resql = $this->db->query($sql);
2972 $this->errors[] = $this->db->error();
2977 $this->oldcopy = clone $this;
2978 $this->ref_client = $ref_client;
2979 $this->ref_customer = $ref_client;
2982 if (!$notrigger && empty($error)) {
2984 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2991 $this->db->commit();
2994 foreach ($this->errors as $errmsg) {
2995 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2996 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2998 $this->db->rollback();
3017 if ($this->billed) {
3023 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 1';
3026 dol_syslog(get_class($this).
"::classifyBilled", LOG_DEBUG);
3027 if ($this->db->query($sql)) {
3028 $this->oldcopy = clone $this;
3031 if (!$notrigger && empty($error)) {
3033 $result = $this->call_trigger(
'ORDER_CLASSIFY_BILLED', $user);
3041 $this->db->commit();
3044 foreach ($this->errors as $errmsg) {
3045 dol_syslog(get_class($this).
"::classifyBilled ".$errmsg, LOG_ERR);
3046 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3048 $this->db->rollback();
3052 $this->error = $this->db->error();
3053 $this->db->rollback();
3071 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 0';
3074 dol_syslog(get_class($this).
"::classifyUnBilled", LOG_DEBUG);
3075 if ($this->db->query($sql)) {
3076 $this->oldcopy = clone $this;
3079 if (!$notrigger && empty($error)) {
3081 $result = $this->call_trigger(
'ORDER_CLASSIFY_UNBILLED', $user);
3091 $this->db->commit();
3094 foreach ($this->errors as $errmsg) {
3095 dol_syslog(get_class($this).
"::classifyUnBilled ".$errmsg, LOG_ERR);
3096 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3098 $this->db->rollback();
3102 $this->error = $this->db->error();
3103 $this->db->rollback();
3139 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)
3141 global
$mysoc, $langs, $user;
3143 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");
3144 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3151 if (empty($info_bits)) {
3154 if (empty($txtva)) {
3157 if (empty($txlocaltax1)) {
3160 if (empty($txlocaltax2)) {
3163 if (empty($remise_percent)) {
3164 $remise_percent = 0;
3166 if (empty($qty) && empty($special_code)) {
3169 if (!empty($qty) && $special_code == 3) {
3172 if (empty($ref_ext)) {
3176 if ($date_start && $date_end && $date_start > $date_end) {
3177 $langs->load(
"errors");
3178 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
3182 $remise_percent = (float)
price2num($remise_percent);
3186 $pu_ht_devise =
price2num($pu_ht_devise);
3187 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
3190 $txlocaltax1 = (float)
price2num($txlocaltax1);
3191 $txlocaltax2 = (float)
price2num($txlocaltax2);
3205 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
3206 $vat_src_code = $reg[1];
3207 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
3210 $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);
3212 $total_ht = $tabprice[0];
3213 $total_tva = $tabprice[1];
3214 $total_ttc = $tabprice[2];
3215 $total_localtax1 = $tabprice[9];
3216 $total_localtax2 = $tabprice[10];
3217 $pu_ht = $tabprice[3];
3218 $pu_tva = $tabprice[4];
3219 $pu_ttc = $tabprice[5];
3222 $multicurrency_total_ht = $tabprice[16];
3223 $multicurrency_total_tva = $tabprice[17];
3224 $multicurrency_total_ttc = $tabprice[18];
3225 $pu_ht_devise = $tabprice[19];
3229 $line->fetch($rowid);
3230 $line->fetch_optionals();
3232 if (!empty($line->fk_product)) {
3233 $product =
new Product($this->db);
3234 $result = $product->fetch($line->fk_product);
3235 $product_type = $product->type;
3237 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product->isStockManaged()) {
3239 $productChildrenNb = 0;
3241 $productChildrenNb = $product->hasFatherOrChild(1);
3243 if ($productChildrenNb > 0) {
3245 $product_stock =
null;
3246 $product->loadStockForVirtualProduct(
'warehouseopen', $qty);
3247 foreach ($product->stock_warehouse as $componentStockWarehouse) {
3248 if ($product_stock ===
null) {
3249 $product_stock = $componentStockWarehouse->real;
3251 $product_stock = min($product_stock, $componentStockWarehouse->real);
3254 if ($product_stock ===
null) {
3258 $product_stock = $product->stock_reel;
3261 if ($product_stock < $qty) {
3262 $langs->load(
"errors");
3263 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', (
string) $product->ref);
3264 $this->errors[] = $this->error;
3266 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
3268 $this->db->rollback();
3274 $staticline = clone $line;
3276 $line->oldline = $staticline;
3277 $this->line = $line;
3278 $this->line->context = $this->context;
3279 $this->line->rang = $rang;
3282 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
3283 $rangmax = $this->
line_max($fk_parent_line);
3284 $this->line->rang = $rangmax + 1;
3288 if (abs((
float) $qty) < $this->line->packaging) {
3289 $qty = $this->line->packaging;
3290 setEventMessage($langs->trans(
'QtyRecalculatedWithPackaging'),
'warnings');
3292 if (!empty($this->line->packaging)
3293 && is_numeric($this->line->packaging)
3294 && (
float) $this->line->packaging > 0
3295 && (
float)
price2num(fmod((
float) $qty, (
float) $this->line->packaging),
'MS')) {
3298 $coeff = intval(abs((
float) $qty) / $this->line->packaging) + 1;
3299 $qty =
price2num((
float) $this->line->packaging * $coeff,
'MS');
3300 setEventMessage($langs->trans(
'QtyRecalculatedWithPackaging'),
'warnings');
3305 $this->line->id = $rowid;
3306 $this->line->label = $label;
3307 $this->line->desc = $desc;
3308 $this->line->qty = $qty;
3309 $this->line->ref_ext = $ref_ext;
3311 $this->line->vat_src_code = $vat_src_code;
3312 $this->line->tva_tx = $txtva;
3313 $this->line->localtax1_tx = $txlocaltax1;
3314 $this->line->localtax2_tx = $txlocaltax2;
3315 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
3316 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
3317 $this->line->remise_percent = $remise_percent;
3318 $this->line->subprice = (float) $pu_ht;
3319 $this->line->info_bits = $info_bits;
3320 $this->line->special_code = $special_code;
3321 $this->line->total_ht = (float) $total_ht;
3322 $this->line->total_tva = (float) $total_tva;
3323 $this->line->total_localtax1 = (float) $total_localtax1;
3324 $this->line->total_localtax2 = (float) $total_localtax2;
3325 $this->line->total_ttc = (float) $total_ttc;
3326 $this->line->date_start = $date_start;
3327 $this->line->date_end = $date_end;
3328 $this->line->product_type = $type;
3329 $this->line->fk_parent_line = $fk_parent_line;
3330 $this->line->skip_update_total = $skip_update_total;
3331 $this->line->fk_unit = $fk_unit;
3333 $this->line->fk_fournprice = $fk_fournprice;
3334 $this->line->pa_ht = $pa_ht;
3337 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
3338 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
3339 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
3340 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
3342 if (is_array($array_options) && count($array_options) > 0) {
3344 foreach ($array_options as $key => $value) {
3345 $this->line->array_options[$key] = $array_options[$key];
3349 $result = $this->line->update($user, $notrigger);
3352 if (!empty($fk_parent_line)) {
3359 $this->db->commit();
3364 $this->db->rollback();
3368 $this->error = get_class($this).
"::updateline Order status makes operation forbidden";
3369 $this->errors = array(
'OrderStatusMakeOperationForbidden');
3386 if (isset($this->
ref)) {
3387 $this->
ref = trim($this->
ref);
3389 if (isset($this->ref_client)) {
3390 $this->ref_client = trim($this->ref_client);
3392 if (isset($this->ref_customer)) {
3393 $this->ref_customer = trim($this->ref_customer);
3395 if (isset($this->note) || isset($this->note_private)) {
3396 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
3398 if (isset($this->note_public)) {
3399 $this->note_public = trim($this->note_public);
3401 if (isset($this->model_pdf)) {
3402 $this->model_pdf = trim($this->model_pdf);
3404 if (isset($this->import_key)) {
3405 $this->import_key = trim($this->import_key);
3407 $delivery_date = $this->delivery_date;
3413 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
3415 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
3416 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
3417 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
3418 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
3419 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
3420 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
3421 $sql .=
" total_tva=".(isset($this->total_tva) ? (float) $this->total_tva :
"null").
",";
3422 $sql .=
" localtax1=".(isset($this->total_localtax1) ? (float) $this->total_localtax1 :
"null").
",";
3423 $sql .=
" localtax2=".(isset($this->total_localtax2) ? (float) $this->total_localtax2 :
"null").
",";
3424 $sql .=
" total_ht=".(isset($this->total_ht) ? (float) $this->total_ht :
"null").
",";
3425 $sql .=
" total_ttc=".(isset($this->total_ttc) ? (float) $this->total_ttc :
"null").
",";
3426 $sql .=
" fk_statut=".(isset($this->
status) ? (int) $this->
status :
"null").
",";
3427 $sql .=
" fk_user_modif=".(isset($user->id) ? (int) $user->id :
"null").
",";
3428 $sql .=
" fk_user_valid=".((isset($this->user_validation_id) && $this->user_validation_id > 0) ? (
int) $this->user_validation_id :
"null").
",";
3429 $sql .=
" fk_projet=".(isset($this->fk_project) ? (int) $this->fk_project :
"null").
",";
3430 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? (int) $this->cond_reglement_id :
"null").
",";
3431 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
"null").
",";
3432 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
3433 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
3434 $sql .=
" fk_shipping_method=".(isset($this->shipping_method_id) ? (int) $this->shipping_method_id :
"null").
",";
3435 $sql .=
" fk_account=".($this->fk_account > 0 ? (int) $this->fk_account :
"null").
",";
3436 $sql .=
" fk_input_reason=".($this->demand_reason_id > 0 ? (int) $this->demand_reason_id :
"null").
",";
3437 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
3438 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
3439 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
3440 $sql .=
" fk_warehouse=".($this->warehouse_id > 0 ? (int) $this->warehouse_id :
"null").
",";
3441 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null").
",";
3442 $sql .=
" module_source = ".(isset($this->module_source) ?
"'".$this->db->escape($this->module_source).
"'" :
"null").
",";
3443 $sql .=
" pos_source = ".(isset($this->pos_source) ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
3444 $sql .=
" WHERE rowid=".((int) $this->
id);
3448 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3449 $resql = $this->db->query($sql);
3452 $this->errors[] =
"Error ".$this->db->lasterror();
3462 if (!$error && !$notrigger) {
3464 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
3473 foreach ($this->errors as $errmsg) {
3474 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
3475 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3477 $this->db->rollback();
3480 $this->db->commit();
3492 public function delete($user, $notrigger = 0)
3494 global $conf, $langs;
3495 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3499 dol_syslog(get_class($this).
"::delete ".$this->
id, LOG_DEBUG);
3505 $result = $this->call_trigger(
'ORDER_DELETE', $user);
3514 $this->errors[] = $langs->trans(
'SomeShipmentExists');
3520 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"categorie_order";
3521 $sql .=
" WHERE fk_order = ".((int) $this->
id);
3523 $result = $this->db->query($sql);
3526 $this->errors[] = $this->db->lasterror();
3531 if (!$error && !empty($this->table_element_line)) {
3532 $tabletodelete = $this->table_element_line;
3533 $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).
")";
3534 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3535 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3537 $this->error = $this->db->lasterror();
3538 $this->errors[] = $this->error;
3539 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3564 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3570 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3571 $res = $this->db->query($sql);
3574 $this->error = $this->db->lasterror();
3575 $this->errors[] = $this->error;
3576 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3592 if ($conf->commande->multidir_output[$this->entity] && !empty($this->
ref)) {
3593 $dir = $conf->commande->multidir_output[$this->entity].
"/".$ref;
3594 $file = $dir.
"/".$ref.
".pdf";
3595 if (file_exists($file)) {
3599 $this->error =
'ErrorFailToDeleteFile';
3600 $this->errors[] = $this->error;
3601 $this->db->rollback();
3605 if (file_exists($dir)) {
3608 $this->error =
'ErrorFailToDeleteDir';
3609 $this->errors[] = $this->error;
3610 $this->db->rollback();
3618 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3619 $this->db->commit();
3622 $this->db->rollback();
3639 global $conf, $langs, $hookmanager;
3643 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht";
3644 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as c";
3645 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
3646 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc";
3647 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3650 $sql .= $clause.
" c.entity IN (".
getEntity(
'commande').
")";
3652 if ($mode ==
'toship') {
3654 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
")";
3656 if ($mode ==
'tobill') {
3658 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
", " . self::STATUS_CLOSED .
") AND c.facture = 0";
3660 if ($mode ==
'shippedtobill') {
3662 $sql .=
" AND c.fk_statut IN (" . self::STATUS_CLOSED .
") AND c.facture = 0";
3665 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3668 $parameters = array(
'socid' => $user->socid);
3669 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $this);
3670 $sql .= $hookmanager->resPrint;
3671 $resql = $this->db->query($sql);
3674 $label = $labelShort = $url =
'';
3675 if ($mode ==
'toship') {
3676 $delay_warning = $conf->commande->client->warning_delay / 60 / 60 / 24;
3677 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-2&mainmenu=commercial&leftmenu=orders';
3678 $label = $langs->transnoentitiesnoconv(
"OrdersToProcess");
3679 $labelShort = $langs->transnoentitiesnoconv(
"Opened");
3681 if ($mode ==
'tobill') {
3682 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3683 $label = $langs->trans(
"OrdersToBill");
3684 $labelShort = $langs->trans(
"ToBill");
3686 if ($mode ==
'shippedtobill') {
3687 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3688 $label = $langs->trans(
"OrdersToBill");
3689 $labelShort = $langs->trans(
"StatusOrderDelivered").
' '.$langs->trans(
"and").
' '.$langs->trans(
"ToBill");
3694 $response->warning_delay = $delay_warning;
3695 $response->label = $label;
3696 $response->labelShort = $labelShort;
3697 $response->url = $url;
3698 $response->url_late = DOL_URL_ROOT.
'/commande/list.php?search_option=late&mainmenu=commercial&leftmenu=orders';
3701 $generic_commande =
new Commande($this->db);
3703 while ($obj = $this->db->fetch_object($resql)) {
3704 $response->nbtodo++;
3705 $response->total += $obj->total_ht;
3707 $generic_commande->status = $obj->fk_statut;
3708 $generic_commande->date = $this->db->jdate($obj->date_commande);
3709 $generic_commande->delivery_date = $this->db->jdate($obj->delivery_date);
3711 if ($mode ==
'toship' && $generic_commande->hasDelay()) {
3712 $response->nbtodolate++;
3718 $this->error = $this->db->error();
3732 $label = $langs->trans(
'OrderSource'.$this->source);
3734 if ($label ==
'OrderSource') {
3761 public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
3764 global $langs, $hookmanager;
3767 if (empty($donotshowbilled)) {
3768 $billedtext .= ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3770 $billedtextlong = ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3774 $paramsBadge = array(
'badgeParams' => array(
'attr' => array(
3775 'data-status-element' => $this->element,
3776 'data-billed' => (
int) $billed,
3777 'data-status' => (
int) $status
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 $paramsBadge[
'tooltip'] = $labelTooltip;
3813 $parameters = array(
3814 'status' => $status,
3816 'billed' => $billed,
3817 'donotshowbilled' => $donotshowbilled,
3818 'paramsBadge' => & $paramsBadge
3821 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3824 return $hookmanager->resPrint;
3827 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode,
'', $paramsBadge);
3839 global $conf, $langs, $user;
3841 $langs->load(
'orders');
3843 $nofetch = !empty($params[
'nofetch']);
3846 return [
'optimize' => $langs->trans(
"Order")];
3849 if ($user->hasRight(
'commande',
'lire')) {
3850 $datas[
'picto'] =
img_picto(
'', $this->picto,
'', 0, 0, 0,
'',
'paddingrightonly').
'<u>'.$langs->trans(
"Order").
'</u>';
3851 if (isset($this->
status)) {
3852 $datas[
'status'] =
' '.$this->getLibStatut(5);
3854 $datas[
'Ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3856 $langs->load(
'companies');
3857 if (empty($this->thirdparty)) {
3860 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3862 $datas[
'RefCustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.(empty($this->ref_customer) ? (empty($this->ref_client) ?
'' : $this->ref_client) : $this->ref_customer);
3864 $langs->load(
'project');
3865 if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
3867 if ($res > 0 && $this->project instanceof
Project) {
3868 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0,
'1');
3872 if (!empty($this->total_ht)) {
3873 $datas[
'AmountHT'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
3875 if (!empty($this->total_tva)) {
3876 $datas[
'VAT'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
3878 if (!empty($this->total_ttc)) {
3879 $datas[
'AmountTTC'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
3881 if (!empty($this->
date)) {
3882 $datas[
'Date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->
date,
'day');
3884 if (!empty($this->delivery_date)) {
3885 $datas[
'DeliveryDate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3905 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target =
'')
3907 global $conf, $langs, $user, $hookmanager;
3909 if (!empty($conf->dol_no_mouse_hover)) {
3915 if (
isModEnabled(
"shipping") && ($option ==
'1' || $option ==
'2')) {
3916 $baseurl = DOL_URL_ROOT .
'/expedition/shipment.php';
3918 $baseurl = DOL_URL_ROOT .
'/commande/card.php';
3920 $query = [
'id' => $this->id];
3921 if (!$user->hasRight(
'commande',
'lire')) {
3925 if ($option !==
'nolink') {
3927 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3928 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3929 $add_save_lastsearch_values = 1;
3931 if ($add_save_lastsearch_values) {
3932 $query = array_merge($query, [
'save_lastsearch_values' => 1]);
3942 'objecttype' => $this->element,
3943 'option' => $option,
3946 $classfortooltip =
'classfortooltip';
3949 $classfortooltip =
'classforajaxtooltip';
3950 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3957 if (empty($notooltip) && $user->hasRight(
'commande',
'lire')) {
3959 $label = $langs->trans(
"Order");
3960 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
3962 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
3963 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3965 $target_value = array(
'_self',
'_blank',
'_parent',
'_top');
3966 if (in_array($target, $target_value)) {
3967 $linkclose .=
' target="'.dol_escape_htmltag($target).
'"';
3971 $linkstart =
'<a href="'.$url.
'"';
3972 $linkstart .= $linkclose.
'>';
3975 if ($option ===
'nolink') {
3980 $result .= $linkstart;
3982 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
3984 if ($withpicto != 2) {
3985 $result .= $this->ref;
3987 $result .= $linkend;
3989 if ($addlinktonotes) {
3990 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
3993 $result .=
' <span class="note inline-block">';
3994 $result .=
'<a href="'.DOL_URL_ROOT.
'/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
3999 $result .=
'</span>';
4004 $hookmanager->initHooks(array($this->element .
'dao'));
4005 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
4006 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
4008 $result = $hookmanager->resPrint;
4010 $result .= $hookmanager->resPrint;
4024 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem,';
4025 $sql .=
' date_valid as datev,';
4026 $sql .=
' date_cloture as datecloture,';
4027 $sql .=
' fk_user_author, fk_user_valid, fk_user_cloture';
4028 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
4029 $sql .=
' WHERE c.rowid = '.((int) $id);
4030 $result = $this->db->query($sql);
4032 if ($this->db->num_rows($result)) {
4033 $obj = $this->db->fetch_object($result);
4034 $this->
id = $obj->rowid;
4035 if ($obj->fk_user_author) {
4036 $this->user_creation_id = $obj->fk_user_author;
4038 if ($obj->fk_user_valid) {
4039 $this->user_validation_id = $obj->fk_user_valid;
4041 if ($obj->fk_user_cloture) {
4042 $this->user_closing_id = $obj->fk_user_cloture;
4045 $this->date_creation = $this->db->jdate($obj->datec);
4046 $this->date_modification = $this->db->jdate($obj->datem);
4047 $this->date_validation = $this->db->jdate($obj->datev);
4048 $this->date_cloture = $this->db->jdate($obj->datecloture);
4051 $this->db->free($result);
4068 global $conf, $langs;
4070 dol_syslog(get_class($this).
"::initAsSpecimen");
4075 $sql =
"SELECT rowid";
4076 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
4077 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
4078 if (array_key_exists(
'tosell', $param)) {
4079 $sql .=
" AND tosell = ".((int) $param[
'tosell']);
4081 $sql .= $this->db->plimit(100);
4083 $resql = $this->db->query($sql);
4085 $num_prods = $this->db->num_rows($resql);
4087 while ($i < $num_prods) {
4089 $row = $this->db->fetch_row($resql);
4090 $prodids[$i] = $row[0];
4096 $this->
ref =
'SPECIMEN';
4097 $this->specimen = 1;
4098 $this->entity = $conf->entity;
4100 $this->
date = time();
4101 $this->date_lim_reglement = $this->
date + 3600 * 24 * 30;
4102 $this->cond_reglement_code =
'RECEP';
4103 $this->mode_reglement_code =
'CHQ';
4104 $this->availability_code =
'DSP';
4105 $this->demand_reason_code =
'SRC_00';
4107 $this->note_public =
'This is a comment (public)';
4108 $this->note_private =
'This is a comment (private)';
4110 $this->multicurrency_tx = 1;
4111 $this->multicurrency_code = $conf->currency;
4113 $this->
status = $this::STATUS_DRAFT;
4119 while ($xnbp < $nbp) {
4122 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
4124 $line->subprice = 100;
4128 $line->total_ht = 50;
4129 $line->total_ttc = 60;
4130 $line->total_tva = 10;
4131 $line->remise_percent = 50;
4133 $line->total_ht = 100;
4134 $line->total_ttc = 120;
4135 $line->total_tva = 20;
4136 $line->remise_percent = 0;
4138 if ($num_prods > 0) {
4139 $prodid = mt_rand(1, $num_prods);
4140 $line->fk_product = $prodids[$prodid];
4141 $line->product_ref =
'SPECIMEN';
4144 $this->lines[$xnbp] = $line;
4146 $this->total_ht += $line->total_ht;
4147 $this->total_tva += $line->total_tva;
4148 $this->total_ttc += $line->total_ttc;
4164 global $user, $hookmanager;
4166 $this->nb = array();
4169 $sql =
"SELECT count(c.rowid) as nb";
4170 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as c";
4171 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON c.fk_soc = s.rowid";
4172 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
4173 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
4174 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
4177 $sql .=
" ".$clause.
" c.entity IN (".
getEntity(
'commande').
")";
4179 $parameters = array();
4180 $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $this);
4181 $sql .= $hookmanager->resPrint;
4182 $resql = $this->db->query($sql);
4184 while ($obj = $this->db->fetch_object($resql)) {
4185 $this->nb[
"orders"] = $obj->nb;
4187 $this->db->free($resql);
4191 $this->error = $this->db->error();
4217 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
4221 $langs->load(
"orders");
4222 $outputlangs->load(
"products");
4225 $modele =
'einstein';
4227 if (!empty($this->model_pdf)) {
4228 $modele = $this->model_pdf;
4234 $modelpath =
"core/modules/commande/doc/";
4236 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4289 return max($this->
date, $this->delivery_date) < ($now - $conf->commande->client->warning_delay);
4299 global $conf, $langs;
4301 if (empty($this->delivery_date)) {
4304 $text = $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
4306 $text .=
' '.($conf->commande->client->warning_delay > 0 ?
'+' :
'-').
' '.round(abs($conf->commande->client->warning_delay) / 3600 / 24, 1).
' '.$langs->trans(
"days").
' < '.$langs->trans(
"Today");
if(! $sortfield) if(! $sortorder) $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.
initAsSpecimen($param=array())
Initialise an instance with random values.
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.
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.
cloture($user, $notrigger=0)
Close order.
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.
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.
cancel($user, $idwarehouse=-1)
Cancel an order If stock is decremented on order validation, we must reincrement it.
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)
checkActiveProductInLines($status='onsale')
Check if all products have the right status (on sale, on buy) called during validation of propal,...
deleteExtraFields()
Delete all extra fields values for the current object.
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.
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.
dol_now($mode='gmt')
Return date for now.
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.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
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_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
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_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular VAT rate, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
getMarginInfos($pv_ht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $pa_ht)
Return an array with margins information of a line.
calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocaltax1_rate, $uselocaltax2_rate, $remise_percent_global, $price_base_type, $info_bits, $type, $seller=null, $localtaxes_array=[], $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.
if(getDolGlobalString( 'TAKEPOS_SHOW_CUSTOMER')) print $langs trans('Date')." left Label right Qty right Price right TotalHT right TotalTTC right right right right right right right right right centpercent right TotalHT right n right VAT right n right TotalVAT right n No sujeto a RE IRPF right TotalLT1 right n right TotalLT2 right n right TotalTTC right n takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency takeposcustomercurrency right TotalTTC takeposcustomercurrency right takeposcustomercurrency n right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date