40require_once DOL_DOCUMENT_ROOT.
'/core/class/commonorder.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/commande/class/orderline.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
44require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
45require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/subtotals/class/commonsubtotal.class.php';
59 public $element =
'commande';
65 public $TRIGGER_PREFIX =
'ORDER';
70 public $table_element =
'commande';
75 public $table_element_line =
'commandedet';
80 public $class_element_line =
'OrderLine';
85 public $fk_element =
'fk_commande';
90 public $picto =
'order';
96 public $restrictiononfksoc = 1;
121 public $ref_customer;
149 public $date_lim_reglement;
153 public $cond_reglement_code;
158 public $cond_reglement_doc;
165 public $deposit_percent;
175 public $mode_reglement;
180 public $mode_reglement_id;
185 public $mode_reglement_code;
191 public $availability_id;
197 public $availability_code;
203 public $availability;
208 public $demand_reason_id;
213 public $demand_reason_code;
225 public $date_commande;
230 public $delivery_date;
235 public $fk_remise_except;
241 public $remise_percent;
252 public $signed_status = 0;
257 public $warehouse_id;
262 public $extraparams = array();
267 public $user_author_id;
277 public $lines = array();
283 public $module_source;
297 public $online_payment_url;
330 public $fields = array(
331 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
332 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 20,
'index' => 1),
333 'ref' => array(
'type' =>
'varchar(30)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 25),
334 'ref_ext' => array(
'type' =>
'varchar(255)',
'label' =>
'RefExt',
'enabled' => 1,
'visible' => 0,
'position' => 26),
335 'ref_client' => array(
'type' =>
'varchar(255)',
'label' =>
'RefCustomer',
'enabled' => 1,
'visible' => -1,
'position' => 28),
336 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php',
'label' =>
'ThirdParty',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'notnull' => 1,
'position' => 20),
337 'fk_projet' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label' =>
'Project',
'enabled' =>
"isModEnabled('project')",
'visible' => -1,
'position' => 25),
338 'date_commande' => array(
'type' =>
'date',
'label' =>
'Date',
'enabled' => 1,
'visible' => 1,
'position' => 60,
'csslist' =>
'nowraponall'),
339 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -1,
'position' => 62,
'csslist' =>
'nowraponall'),
340 'date_cloture' => array(
'type' =>
'datetime',
'label' =>
'DateClosing',
'enabled' => 1,
'visible' => -1,
'position' => 65,
'csslist' =>
'nowraponall'),
341 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'enabled' => 1,
'visible' => -1,
'position' => 85),
342 'fk_user_cloture' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserClosing',
'enabled' => 1,
'visible' => -1,
'position' => 90),
343 'source' => array(
'type' =>
'smallint(6)',
'label' =>
'Source',
'enabled' => 1,
'visible' => -1,
'position' => 95),
344 'total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'VAT',
'enabled' => 1,
'visible' => -1,
'position' => 125,
'isameasure' => 1),
345 'localtax1' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax1',
'enabled' => 1,
'visible' => -1,
'position' => 130,
'isameasure' => 1),
346 'localtax2' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax2',
'enabled' => 1,
'visible' => -1,
'position' => 135,
'isameasure' => 1),
347 'total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalHT',
'enabled' => 1,
'visible' => -1,
'position' => 140,
'isameasure' => 1),
348 'total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalTTC',
'enabled' => 1,
'visible' => -1,
'position' => 145,
'isameasure' => 1),
349 'signed_status' => array(
'type' =>
'smallint(6)',
'label' =>
'SignedStatus',
'enabled' => 1,
'visible' => -1,
'position' => 146,
'arrayofkeyval' => array(0 =>
'NoSignature', 1 =>
'SignedSender', 2 =>
'SignedReceiver', 9 =>
'SignedAll')),
350 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 150),
351 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 155),
352 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'PDFTemplate',
'enabled' => 1,
'visible' => 0,
'position' => 160),
353 'fk_account' => array(
'type' =>
'integer',
'label' =>
'BankAccount',
'enabled' =>
'isModEnabled("bank")',
'visible' => -1,
'position' => 170),
354 'fk_currency' => array(
'type' =>
'varchar(3)',
'label' =>
'MulticurrencyID',
'enabled' => 1,
'visible' => -1,
'position' => 175),
355 'fk_cond_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentTerm',
'enabled' => 1,
'visible' => -1,
'position' => 180),
356 'deposit_percent' => array(
'type' =>
'varchar(63)',
'label' =>
'DepositPercent',
'enabled' => 1,
'visible' => -1,
'position' => 181),
357 'fk_mode_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentMode',
'enabled' => 1,
'visible' => -1,
'position' => 185),
358 'date_livraison' => array(
'type' =>
'date',
'label' =>
'DateDeliveryPlanned',
'enabled' => 1,
'visible' => -1,
'position' => 190,
'csslist' =>
'nowraponall'),
359 'fk_shipping_method' => array(
'type' =>
'integer',
'label' =>
'ShippingMethod',
'enabled' => 1,
'visible' => -1,
'position' => 195),
360 'fk_warehouse' => array(
'type' =>
'integer:Entrepot:product/stock/class/entrepot.class.php',
'label' =>
'DefaultWarehouse',
'enabled' =>
'isModEnabled("stock")',
'visible' => -1,
'position' => 200,
'nodepth' => 1),
361 'fk_availability' => array(
'type' =>
'integer',
'label' =>
'Availability',
'enabled' => 1,
'visible' => -1,
'position' => 205),
362 'fk_input_reason' => array(
'type' =>
'integer',
'label' =>
'InputReason',
'enabled' => 1,
'visible' => -1,
'position' => 210),
364 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 225),
365 'fk_incoterms' => array(
'type' =>
'integer',
'label' =>
'IncotermCode',
'enabled' =>
'isModEnabled("incoterm")',
'visible' => -1,
'position' => 230),
366 'location_incoterms' => array(
'type' =>
'varchar(255)',
'label' =>
'IncotermLabel',
'enabled' =>
'isModEnabled("incoterm")',
'visible' => -1,
'position' => 235),
367 'fk_multicurrency' => array(
'type' =>
'integer',
'label' =>
'Fk multicurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 240),
368 'multicurrency_code' => array(
'type' =>
'varchar(255)',
'label' =>
'MulticurrencyCurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 245),
369 'multicurrency_tx' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyRate',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 250,
'isameasure' => 1),
370 'multicurrency_total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountHT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 255,
'isameasure' => 1),
371 'multicurrency_total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountVAT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 260,
'isameasure' => 1),
372 'multicurrency_total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountTTC',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 265,
'isameasure' => 1),
373 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'LastMainDoc',
'enabled' => 1,
'visible' => -1,
'position' => 270),
374 'module_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSModule',
'enabled' => 1,
'visible' => -1,
'position' => 275),
375 'pos_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSTerminal',
'enabled' => 1,
'visible' => -1,
'position' => 280),
376 'fk_user_author' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'visible' => -1,
'position' => 300),
377 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'notnull' => -1,
'position' => 302),
378 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'position' => 304,
'csslist' =>
'nowraponall'),
379 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 306),
380 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 400),
381 'fk_statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Status',
'enabled' => 1,
'visible' => -1,
'position' => 500),
421 const STATUS_NO_SIGNATURE = 0;
426 const STATUS_SIGNED_SENDER = 1;
431 const STATUS_SIGNED_RECEIVER = 2;
436 const STATUS_SIGNED_ALL = 9;
448 $this->ismultientitymanaged = 1;
449 $this->isextrafieldmanaged = 1;
451 $this->fields[
'ref_ext'][
'visible'] =
getDolGlobalInt(
'MAIN_LIST_SHOW_REF_EXT');
461 public function getNextNumRef($soc)
463 global $langs,
$conf;
464 $langs->load(
"order");
473 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
474 foreach ($dirmodels as $reldir) {
478 $mybool = ((bool) @include_once $dir.$file) || $mybool;
486 $obj =
new $classname();
488 '@phan-var-force ModeleNumRefCommandes $obj';
490 $numref = $obj->getNextValue($soc, $this);
495 $this->error = $obj->error;
500 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_COMMANDE_ADDON_NotDefined");
514 public function valid($user, $idwarehouse = 0, $notrigger = 0)
516 global
$conf, $langs;
518 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
523 if ($this->
status == self::STATUS_VALIDATED) {
524 dol_syslog(get_class($this).
"::valid action abandoned: already validated", LOG_WARNING);
528 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
529 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
530 $this->error =
'NotEnoughPermissions';
531 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
534 if (empty($this->socid)) {
535 $this->error =
'ErrorWrongParameters';
539 dol_syslog(get_class($this).
"::valid checkActiveProductInLines ".$this->error, LOG_INFO);
548 $soc->fetch($this->socid);
551 $result = $soc->setAsCustomer();
554 if (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref)) {
555 $num = $this->getNextNumRef($soc);
562 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
563 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
564 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
565 $sql .=
" date_valid = '".$this->db->idate($now).
"',";
566 $sql .=
" fk_user_valid = ".($user->id > 0 ? (int) $user->id :
"null").
",";
567 $sql .=
" fk_user_modif = ".((int) $user->id);
568 $sql .=
" WHERE rowid = ".((int) $this->
id);
570 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
571 $resql = $this->db->query($sql);
574 $this->error = $this->db->lasterror();
581 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
582 $langs->load(
"agenda");
585 $cpt = count($this->lines);
586 for ($i = 0; $i < $cpt; $i++) {
587 if ($this->lines[$i]->fk_product > 0) {
589 $mouvP->origin = &$this;
590 $mouvP->setOrigin($this->element, $this->
id);
592 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"OrderValidatedInDolibarr", $num));
605 if (!$error && !$notrigger) {
607 $result = $this->call_trigger(
'ORDER_VALIDATE', $user);
615 $this->oldref = $this->ref;
618 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
620 $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).
"'";
621 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
622 $resql = $this->db->query($sql);
625 $this->error = $this->db->lasterror();
627 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'commande/".$this->db->escape($this->newref).
"'";
628 $sql .=
" WHERE filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
629 $resql = $this->db->query($sql);
632 $this->error = $this->db->lasterror();
640 if (!$error && file_exists($dirsource)) {
641 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
643 if (@rename($dirsource, $dirdest)) {
646 $listoffiles =
dol_dir_list($dirdest.
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
647 foreach ($listoffiles as $fileentry) {
648 $dirsource = $fileentry[
'name'];
649 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
650 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
651 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
652 @rename($dirsource, $dirdest);
670 $this->db->rollback();
695 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
696 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
697 $this->error =
'Permission denied';
705 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
706 $sql .=
" SET fk_statut = ".((int) self::STATUS_DRAFT).
",";
707 $sql .=
" fk_user_modif = ".((int) $user->id);
708 $sql .=
" WHERE rowid = ".((int) $this->
id);
710 if ($this->db->query($sql)) {
711 $this->oldcopy = clone $this;
717 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
718 $langs->load(
"agenda");
720 $num = count($this->lines);
721 for ($i = 0; $i < $num; $i++) {
722 if ($this->lines[$i]->fk_product > 0) {
724 $mouvP->origin = &$this;
725 $mouvP->setOrigin($this->element, $this->
id);
727 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderBackToDraftInDolibarr", $this->ref));
739 $result = $this->call_trigger(
'ORDER_UNVALIDATE', $user);
751 $this->db->rollback();
755 $this->error = $this->db->error();
756 $this->db->rollback();
775 if ($this->
status != self::STATUS_CANCELED && $this->
status != self::STATUS_CLOSED) {
776 dol_syslog(get_class($this).
"::set_reopen order has not status closed", LOG_WARNING);
782 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
783 $sql .=
' SET fk_statut='.self::STATUS_VALIDATED.
', facture=0,';
784 $sql .=
" fk_user_modif = ".((int) $user->id);
785 $sql .=
" WHERE rowid = ".((int) $this->
id);
787 dol_syslog(get_class($this).
"::set_reopen", LOG_DEBUG);
788 $resql = $this->db->query($sql);
791 $result = $this->call_trigger(
'ORDER_REOPEN', $user);
798 $this->error = $this->db->lasterror();
810 foreach ($this->errors as $errmsg) {
811 dol_syslog(get_class($this).
"::set_reopen ".$errmsg, LOG_ERR);
812 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
814 $this->db->rollback();
826 public function cloture($user, $notrigger = 0)
830 $usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
831 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'close')));
834 if ($this->
status == self::STATUS_CLOSED) {
841 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
842 $sql .=
' SET fk_statut = '.self::STATUS_CLOSED.
',';
843 $sql .=
' fk_user_cloture = '.((int) $user->id).
',';
844 $sql .=
" date_cloture = '".$this->db->idate($now).
"',";
845 $sql .=
" fk_user_modif = ".((int) $user->id);
848 if ($this->db->query($sql)) {
851 $result = $this->call_trigger(
'ORDER_CLOSE', $user);
865 $this->db->rollback();
869 $this->error = $this->db->lasterror();
871 $this->db->rollback();
891 require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
892 return parent::setCategoriesCommon($categories, Categorie::TYPE_ORDER);
903 public function cancel($user, $idwarehouse = -1)
905 global $user, $langs;
911 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
912 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
",";
913 $sql .=
" fk_user_modif = ".((int) $user->id);
914 $sql .=
" WHERE rowid = ".((int) $this->
id);
915 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
917 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
918 if ($this->db->query($sql)) {
921 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
922 $langs->load(
"agenda");
924 $num = count($this->lines);
925 for ($i = 0; $i < $num; $i++) {
926 if ($this->lines[$i]->fk_product > 0) {
928 $mouvP->setOrigin($this->element, $this->
id);
930 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderCanceledInDolibarr", $this->ref));
942 $result = $this->call_trigger(
'ORDER_CANCEL', $user);
955 foreach ($this->errors as $errmsg) {
956 dol_syslog(get_class($this).
"::cancel ".$errmsg, LOG_ERR);
957 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
959 $this->db->rollback();
963 $this->error = $this->db->error();
964 $this->db->rollback();
977 public function create($user, $notrigger = 0)
984 if (empty($this->socid)) {
985 $this->error =
'ErrorWrongParameters';
990 $date = ($this->date_commande ? $this->date_commande : $this->date);
991 $this->import_key = trim((
string) $this->import_key);
992 $delivery_date = $this->delivery_date;
995 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1000 if (empty($this->fk_multicurrency)) {
1001 $this->multicurrency_code =
$conf->currency;
1002 $this->fk_multicurrency = 0;
1003 $this->multicurrency_tx = 1;
1008 dol_syslog(get_class($this).
"::create user=".$user->id);
1011 if (!empty($this->
ref)) {
1014 $this->error =
'ErrorRefAlreadyExists';
1015 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
1016 $this->db->rollback();
1021 $soc =
new Societe($this->db);
1022 $result = $soc->fetch($this->socid);
1024 $this->error =
"Failed to fetch company";
1025 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1029 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Source"));
1030 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
1034 $this->date_creation =
dol_now();
1038 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$this->table_element.
" (";
1039 $sql .=
" ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client";
1040 $sql .=
", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address";
1041 $sql .=
", fk_shipping_method";
1042 $sql .=
", fk_warehouse";
1043 $sql .=
", fk_incoterms, location_incoterms";
1044 $sql .=
", entity, module_source, pos_source";
1045 $sql .=
", fk_multicurrency";
1046 $sql .=
", multicurrency_code";
1047 $sql .=
", multicurrency_tx";
1048 $sql .=
", import_key";
1050 $sql .=
" VALUES ('(PROV)', ".((int) $this->socid).
", '".$this->db->idate($this->date_creation).
"', ".($user->id > 0 ? ((int) $user->id) :
"null");
1051 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
1052 $sql .=
", '".$this->db->idate($date).
"'";
1053 $sql .=
", ".($this->source >= 0 && $this->source !=
'' ? $this->db->escape((
string) $this->source) :
'null');
1054 $sql .=
", '".$this->db->escape($this->note_private).
"'";
1055 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1056 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
1057 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
1058 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1059 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
1060 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape((
string) $this->deposit_percent).
"'" :
"null");
1061 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
1062 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1063 $sql .=
", ".($this->availability_id > 0 ? ((int) $this->availability_id) :
"null");
1064 $sql .=
", ".($this->demand_reason_id > 0 ? ((int) $this->demand_reason_id) :
"null");
1065 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1066 $sql .=
", ".($this->fk_delivery_address > 0 ? ((int) $this->fk_delivery_address) :
'NULL');
1067 $sql .=
", ".(!empty($this->shipping_method_id) && $this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1068 $sql .=
", ".(!empty($this->warehouse_id) && $this->warehouse_id > 0 ? ((int) $this->warehouse_id) :
'NULL');
1069 $sql .=
", ".(int) $this->fk_incoterms;
1070 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
1071 $sql .=
", ".(int) $this->entity;
1072 $sql .=
", ".($this->module_source ?
"'".$this->db->escape($this->module_source).
"'" :
"null");
1073 $sql .=
", ".((!is_null($this->pos_source) && $this->pos_source !=
'') ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
1074 $sql .=
", ".(int) $this->fk_multicurrency;
1075 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1076 $sql .=
", ".(float) $this->multicurrency_tx;
1077 $sql .=
", '".$this->db->escape($this->import_key).
"'";
1080 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1081 $resql = $this->db->query($sql);
1083 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commande');
1086 $fk_parent_line = 0;
1087 $num = count($this->lines);
1092 for ($i = 0; $i < $num; $i++) {
1093 $line = $this->lines[$i];
1097 if (!is_object($line)) {
1099 foreach ($line as $key => $val) {
1100 $lineobj->$key = $val;
1103 $this->lines[$i] = $line;
1107 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1108 $fk_parent_line = 0;
1112 $vatrate = $line->tva_tx;
1113 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', (
string) $vatrate)) {
1114 $vatrate .=
' ('.$line->vat_src_code.
')';
1118 $originid = $line->origin_id;
1119 $origintype = empty($line->origin_type) ? $line->origin : $line->origin_type;
1121 $originid = $line->id;
1122 $origintype = $this->element;
1126 if (empty($line->ref_ext)) {
1127 $line->ref_ext =
'';
1135 $line->localtax1_tx,
1136 $line->localtax2_tx,
1138 $line->remise_percent,
1140 $line->fk_remise_except,
1145 $line->product_type,
1147 $line->special_code,
1149 $line->fk_fournprice,
1152 $line->array_options,
1154 (
string) $origintype,
1162 if ($result != self::STOCK_NOT_ENOUGH_FOR_ORDER) {
1163 $this->error = $this->db->lasterror();
1164 $this->errors[] = $this->error;
1167 $this->db->rollback();
1171 if ($result > 0 && $line->product_type == 9) {
1172 $fk_parent_line = $result;
1179 $initialref =
'(PROV'.$this->id.
')';
1180 if (!empty($this->
ref)) {
1181 $initialref = $this->ref;
1184 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
" SET ref='".$this->db->escape($initialref).
"' WHERE rowid=".((int) $this->
id);
1185 if ($this->db->query($sql)) {
1186 $this->
ref = $initialref;
1188 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1189 $this->linked_objects = $this->linkedObjectsIds;
1193 if (!empty($this->linked_objects) && is_array($this->linked_objects)) {
1194 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1195 if (is_array($tmp_origin_id)) {
1196 foreach ($tmp_origin_id as $origin_id) {
1199 $this->error = $this->db->lasterror();
1204 $origin_id = $tmp_origin_id;
1207 $this->error = $this->db->lasterror();
1214 if (!$error &&
getDolGlobalString(
'MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN') && !empty($this->origin) && !empty($this->origin_id)) {
1215 $originforcontact = empty($this->origin_type) ? $this->origin : $this->origin_type;
1216 $originidforcontact = $this->origin_id;
1217 if ($originforcontact ==
'shipping') {
1218 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1220 $exp->fetch($this->origin_id);
1221 $exp->fetchObjectLinked();
1222 if (count($exp->linkedObjectsIds[
'commande']) > 0) {
1223 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1224 $originforcontact =
'commande';
1225 if (is_object($value)) {
1226 $originidforcontact = $value->id;
1228 $originidforcontact = $value;
1235 $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";
1236 $sqlcontact .=
" WHERE element_id = ".((int) $originidforcontact).
" AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = '".$this->db->escape($originforcontact).
"'";
1238 $resqlcontact = $this->db->query($sqlcontact);
1239 if ($resqlcontact) {
1240 while ($objcontact = $this->db->fetch_object($resqlcontact)) {
1242 $this->
add_contact($objcontact->fk_socpeople, $objcontact->code, $objcontact->source);
1256 if (!$error && !$notrigger) {
1258 $result = $this->call_trigger(
'ORDER_CREATE', $user);
1266 $this->db->commit();
1269 $this->db->rollback();
1273 $this->error = $this->db->lasterror();
1274 $this->db->rollback();
1281 $this->error = $this->db->lasterror();
1282 $this->db->rollback();
1297 global $user, $hookmanager;
1304 foreach ($this->lines as $line) {
1305 $line->fetch_optionals();
1309 $objFrom = clone $this;
1312 if (!empty($socid) && $socid != $this->socid) {
1313 $objsoc =
new Societe($this->db);
1315 if ($objsoc->fetch($socid) > 0) {
1316 $this->socid = $objsoc->id;
1317 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1318 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent : 0);
1319 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1320 $this->fk_project = 0;
1321 $this->fk_delivery_address = 0;
1333 $this->user_author_id = $user->id;
1334 $this->user_validation_id = 0;
1336 $this->date_commande =
dol_now();
1337 $this->date_creation =
'';
1338 $this->date_validation =
'';
1340 $this->ref_client =
'';
1341 $this->ref_customer =
'';
1345 $num = count($this->lines);
1346 for ($i = 0; $i < $num; $i++) {
1347 $this->lines[$i]->ref_ext =
'';
1351 $this->context[
'createfromclone'] =
'createfromclone';
1352 $result = $this->
create($user);
1366 if ($this->socid == $objFrom->socid) {
1375 if (is_object($hookmanager)) {
1376 $parameters = array(
'objFrom' => $objFrom);
1378 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1386 unset($this->context[
'createfromclone']);
1390 $this->db->commit();
1393 $this->db->rollback();
1408 global
$conf, $hookmanager, $langs;
1410 require_once DOL_DOCUMENT_ROOT .
'/multicurrency/class/multicurrency.class.php';
1411 require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
1415 $this->date_commande =
dol_now();
1420 for ($i = 0; $i < $num; $i++) {
1423 $line->libelle =
$object->lines[$i]->libelle;
1424 $line->label =
$object->lines[$i]->label;
1425 $line->desc =
$object->lines[$i]->desc;
1426 $line->price =
$object->lines[$i]->price;
1427 $line->subprice =
$object->lines[$i]->subprice;
1428 $line->vat_src_code =
$object->lines[$i]->vat_src_code;
1429 $line->tva_tx =
$object->lines[$i]->tva_tx;
1430 $line->localtax1_tx =
$object->lines[$i]->localtax1_tx;
1431 $line->localtax2_tx =
$object->lines[$i]->localtax2_tx;
1432 $line->qty =
$object->lines[$i]->qty;
1433 $line->fk_remise_except =
$object->lines[$i]->fk_remise_except;
1434 $line->remise_percent =
$object->lines[$i]->remise_percent;
1435 $line->fk_product =
$object->lines[$i]->fk_product;
1436 $line->info_bits =
$object->lines[$i]->info_bits;
1437 $line->product_type =
$object->lines[$i]->product_type;
1438 $line->rang =
$object->lines[$i]->rang;
1439 $line->special_code =
$object->lines[$i]->special_code;
1440 $line->fk_parent_line =
$object->lines[$i]->fk_parent_line;
1441 $line->fk_unit =
$object->lines[$i]->fk_unit;
1443 $line->date_start =
$object->lines[$i]->date_start;
1444 $line->date_end =
$object->lines[$i]->date_end;
1446 $line->fk_fournprice =
$object->lines[$i]->fk_fournprice;
1448 $line->pa_ht = $marginInfos[0];
1449 $line->marge_tx = $marginInfos[1];
1450 $line->marque_tx = $marginInfos[2];
1452 $line->origin =
$object->element;
1453 $line->origin_id =
$object->lines[$i]->id;
1456 $object->lines[$i]->fetch_optionals();
1457 foreach (
$object->lines[$i]->array_options as $options_key => $value) {
1458 $line->array_options[$options_key] = $value;
1461 $this->lines[$i] = $line;
1464 $this->entity =
$object->entity;
1465 $this->socid =
$object->socid;
1466 $this->fk_project =
$object->fk_project;
1467 $this->cond_reglement_id =
$object->cond_reglement_id;
1468 $this->deposit_percent =
$object->deposit_percent;
1469 $this->mode_reglement_id =
$object->mode_reglement_id;
1470 $this->fk_account =
$object->fk_account;
1471 $this->fk_incoterms =
$object->fk_incoterms;
1472 $this->location_incoterms =
$object->location_incoterms;
1473 $this->availability_id =
$object->availability_id;
1474 $this->demand_reason_id =
$object->demand_reason_id;
1475 $this->delivery_date =
$object->delivery_date;
1476 $this->shipping_method_id =
$object->shipping_method_id;
1477 $this->warehouse_id =
$object->warehouse_id;
1478 $this->fk_delivery_address =
$object->fk_delivery_address;
1479 $this->contact_id =
$object->contact_id;
1480 $this->ref_client =
$object->ref_client;
1481 $this->ref_customer =
$object->ref_client;
1484 $this->note_private =
$object->note_private;
1485 $this->note_public =
$object->note_public;
1488 $this->origin =
$object->element;
1489 $this->origin_id =
$object->id;
1493 if (!empty(
$object->multicurrency_code)) {
1494 $this->multicurrency_code =
$object->multicurrency_code;
1497 $this->multicurrency_tx =
$object->multicurrency_tx;
1500 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1502 $this->fk_multicurrency = $tmparray[0];
1503 $this->multicurrency_tx = $tmparray[1];
1507 if (empty($this->fk_multicurrency)) {
1508 $this->multicurrency_code =
$conf->currency;
1509 $this->fk_multicurrency = 0;
1510 $this->multicurrency_tx = 1;
1518 $element_extrafields = $e->fetch_name_optionals_label($this->table_element);
1520 foreach (
$object->array_options as $options_key => $value) {
1521 if (array_key_exists(str_replace(
'options_',
'', $options_key), $element_extrafields)) {
1522 $this->array_options[$options_key] = $value;
1526 $this->linked_objects[$this->origin] = $this->origin_id;
1527 if (isset(
$object->other_linked_objects) && is_array(
$object->other_linked_objects) && !empty(
$object->other_linked_objects)) {
1528 $this->linked_objects = array_merge($this->linked_objects,
$object->other_linked_objects);
1531 $ret = $this->
create($user);
1535 $hookmanager->initHooks(array(
'orderdao'));
1537 $parameters = array(
'objFrom' =>
$object);
1539 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1549 $result = $this->
valid($user);
1551 $this->
fetch($this->
id);
1554 $outputlangs = $langs;
1555 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($this->thirdparty->default_lang)) {
1557 $outputlangs->setDefaultLang($this->thirdparty->default_lang);
1558 $outputlangs->loadLangs(array(
'main',
'orders'));
1613 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)
1615 global
$mysoc, $langs, $user;
1617 $logtext =
"::addline commandeid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent";
1618 $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";
1619 $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";
1620 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
1622 if ($this->
status == self::STATUS_DRAFT) {
1623 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1627 if (empty($remise_percent)) {
1628 $remise_percent = 0;
1633 if (empty($info_bits)) {
1639 if (empty($txtva)) {
1642 if (empty($txlocaltax1)) {
1645 if (empty($txlocaltax2)) {
1648 if (empty($fk_parent_line) || $fk_parent_line < 0) {
1649 $fk_parent_line = 0;
1651 if (empty($this->fk_multicurrency)) {
1652 $this->fk_multicurrency = 0;
1654 if (empty($ref_ext)) {
1658 $remise_percent = (float)
price2num($remise_percent);
1661 $pu_ht_devise =
price2num($pu_ht_devise);
1664 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
1669 if ($price_base_type ==
'HT') {
1674 $label = trim($label);
1675 $desc = trim($desc);
1683 $langs->load(
"errors");
1684 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1690 $product_type = $type;
1691 if (!empty($fk_product) && $fk_product > 0) {
1692 $product =
new Product($this->db);
1693 $result = $product->fetch($fk_product);
1694 $product_type = $product->type;
1696 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product->isStockManaged()) {
1698 $productChildrenNb = 0;
1700 $productChildrenNb = $product->hasFatherOrChild(1);
1702 if ($productChildrenNb > 0) {
1704 $product_stock =
null;
1705 $product->loadStockForVirtualProduct(
'warehouseopen', $qty);
1706 foreach ($product->stock_warehouse as $componentStockWarehouse) {
1707 if ($product_stock ===
null) {
1708 $product_stock = $componentStockWarehouse->real;
1710 $product_stock = min($product_stock, $componentStockWarehouse->real);
1713 if ($product_stock ===
null) {
1717 $product_stock = $product->stock_reel;
1720 if ($product_stock < $qty) {
1721 $langs->load(
"errors");
1722 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
1723 $this->errors[] = $this->error;
1724 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
1725 $this->db->rollback();
1737 $tmpproduct =
new Product($this->db);
1738 $result = $tmpproduct->fetch($fk_product);
1739 if (abs((
float) $qty) < $tmpproduct->packaging) {
1740 $qty = (float) $tmpproduct->packaging;
1741 setEventMessages($langs->trans(
'QtyRecalculatedWithPackaging'),
null,
'warnings');
1743 if (!empty($tmpproduct->packaging) && (
float)
price2num(fmod((
float) $qty, (
float) $tmpproduct->packaging),
'MS')) {
1744 $coeff = intval(abs((
float) $qty) / $tmpproduct->packaging) + 1;
1745 $qty =
price2num((
float) $tmpproduct->packaging * $coeff,
'MS');
1746 setEventMessages($langs->trans(
'QtyRecalculatedWithPackaging'),
null,
'warnings');
1754 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1755 $vat_src_code = $reg[1];
1756 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1759 $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);
1769 $total_ht = $tabprice[0];
1770 $total_tva = $tabprice[1];
1771 $total_ttc = $tabprice[2];
1772 $total_localtax1 = $tabprice[9];
1773 $total_localtax2 = $tabprice[10];
1774 $pu_ht = $tabprice[3];
1777 $multicurrency_total_ht = $tabprice[16];
1778 $multicurrency_total_tva = $tabprice[17];
1779 $multicurrency_total_ttc = $tabprice[18];
1780 $pu_ht_devise = $tabprice[19];
1785 if (empty($ranktouse) || $ranktouse == -1) {
1786 $rangmax = $this->
line_max($fk_parent_line);
1787 $ranktouse = $rangmax + 1;
1793 $this->line->context = $this->context;
1795 $this->line->fk_commande = $this->id;
1796 $this->line->label = $label;
1797 $this->line->desc = $desc;
1798 $this->line->qty = (float) $qty;
1799 $this->line->ref_ext = $ref_ext;
1801 $this->line->vat_src_code = $vat_src_code;
1802 $this->line->tva_tx = $txtva;
1803 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
1804 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
1805 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
1806 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
1807 $this->line->fk_product = $fk_product;
1808 $this->line->product_type = $product_type;
1809 $this->line->fk_remise_except = $fk_remise_except;
1810 $this->line->remise_percent = $remise_percent;
1811 $this->line->subprice = (float) $pu_ht;
1812 $this->line->rang = $ranktouse;
1813 $this->line->info_bits = $info_bits;
1814 $this->line->total_ht = (float) $total_ht;
1815 $this->line->total_tva = (float) $total_tva;
1816 $this->line->total_localtax1 = (float) $total_localtax1;
1817 $this->line->total_localtax2 = (float) $total_localtax2;
1818 $this->line->total_ttc = (float) $total_ttc;
1819 $this->line->special_code = $special_code;
1820 if (empty($qty) && empty($special_code)) {
1821 $this->line->special_code = 3;
1823 $this->line->origin = $origin;
1824 $this->line->origin_type = $origin;
1825 $this->line->origin_id = $origin_id;
1827 $this->line->fk_parent_line = $fk_parent_line;
1828 $this->line->fk_unit = $fk_unit;
1831 $this->line->date_end = $date_end;
1833 $this->line->fk_fournprice = $fk_fournprice;
1834 $this->line->pa_ht = $pa_ht;
1837 $this->line->fk_multicurrency = $this->fk_multicurrency;
1838 $this->line->multicurrency_code = $this->multicurrency_code;
1839 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
1840 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
1841 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
1842 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
1844 if (is_array($array_options) && count($array_options) > 0) {
1845 $this->line->array_options = $array_options;
1848 $result = $this->line->insert($user);
1851 if (empty($noupdateafterinsertline)) {
1856 if (!isset($this->context[
'createfromclone'])) {
1857 if (!empty($fk_parent_line)) {
1860 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
1862 foreach ($this->lines as $tmpline) {
1863 if ($tmpline->rang >= $ranktouse) {
1864 if (!empty($tmpline->id)) {
1871 $this->lines[] = $this->line;
1874 foreach ($this->lines as $tmpline) {
1875 if ($tmpline->id == $origin_id && $tmpline->element = $origin) {
1876 $this->line->extraparams = $tmpline->extraparams;
1877 $this->line->setExtraParameters();
1882 $this->db->commit();
1883 return $this->line->id;
1885 $this->db->rollback();
1890 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
1891 $this->db->rollback();
1895 dol_syslog(get_class($this).
"::addline status of order must be Draft to allow use of ->addline()", LOG_ERR);
1924 if ($idproduct > 0) {
1926 $prod->fetch($idproduct);
1930 if (empty($tva_tx)) {
1940 $price =
$prod->multiprices[$this->thirdparty->price_level];
1941 $price_ttc =
$prod->multiprices_ttc[$this->thirdparty->price_level];
1943 $price =
$prod->price;
1944 $price_ttc =
$prod->price_ttc;
1949 $line->context = $this->context;
1951 $line->fk_product = $idproduct;
1952 $line->desc =
$prod->description;
1954 $line->subprice = $price;
1955 $line->subprice_ttc = $price_ttc;
1956 $line->remise_percent = $remise_percent;
1957 $line->vat_src_code = $vat_src_code;
1958 $line->tva_tx = $tva_tx;
1959 $line->localtax1_tx = $localtax1_tx;
1960 $line->localtax2_tx = $localtax2_tx;
1962 $line->product_ref =
$prod->ref;
1963 $line->product_label =
$prod->label;
1964 $line->product_desc =
$prod->description;
1965 $line->fk_unit =
$prod->fk_unit;
1972 $line->date_end = $date_end;
1975 $this->lines[] = $line;
2007 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
2010 if (empty($id) && empty($ref) && empty($ref_ext)) {
2014 $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';
2015 $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';
2016 $sql .=
', c.fk_account';
2017 $sql .=
', c.date_commande, c.date_valid, c.tms';
2018 $sql .=
', c.date_livraison as delivery_date';
2019 $sql .=
', c.fk_shipping_method';
2020 $sql .=
', c.fk_warehouse';
2021 $sql .=
', c.fk_projet as fk_project, c.source, c.facture as billed';
2022 $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';
2023 $sql .=
', c.fk_incoterms, c.location_incoterms';
2024 $sql .=
", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
2025 $sql .=
", c.module_source, c.pos_source";
2026 $sql .=
", i.libelle as label_incoterms";
2027 $sql .=
', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
2028 $sql .=
', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
2029 $sql .=
', ca.code as availability_code, ca.label as availability_label';
2030 $sql .=
', dr.code as demand_reason_code';
2031 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
2032 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid';
2033 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON c.fk_mode_reglement = p.id';
2034 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON c.fk_availability = ca.rowid';
2035 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON c.fk_input_reason = dr.rowid';
2036 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
2039 $sql .=
" WHERE c.rowid = ".((int) $id);
2041 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2045 $sql .=
" AND c.ref = '".$this->db->escape($ref).
"'";
2048 $sql .=
" AND c.ref_ext = '".$this->db->escape($ref_ext).
"'";
2051 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
2052 $result = $this->db->query($sql);
2054 $obj = $this->db->fetch_object($result);
2056 $this->
id = $obj->rowid;
2057 $this->entity = $obj->entity;
2059 $this->
ref = $obj->ref;
2060 $this->ref_client = $obj->ref_client;
2061 $this->ref_customer = $obj->ref_client;
2062 $this->ref_ext = $obj->ref_ext;
2064 $this->socid = $obj->fk_soc;
2065 $this->thirdparty =
null;
2067 $this->fk_project = $obj->fk_project;
2068 $this->project =
null;
2070 $this->statut = $obj->status;
2071 $this->
status = $obj->status;
2073 $this->user_author_id = $obj->fk_user_author;
2074 $this->user_creation_id = $obj->fk_user_author;
2075 $this->user_validation_id = $obj->fk_user_valid;
2076 $this->user_modification_id = $obj->fk_user_modif;
2077 $this->total_ht = $obj->total_ht;
2078 $this->total_tva = $obj->total_tva;
2079 $this->total_localtax1 = $obj->total_localtax1;
2080 $this->total_localtax2 = $obj->total_localtax2;
2081 $this->total_ttc = $obj->total_ttc;
2082 $this->
date = $this->db->jdate($obj->date_commande);
2083 $this->date_commande = $this->db->jdate($obj->date_commande);
2084 $this->date_creation = $this->db->jdate($obj->date_creation);
2085 $this->date_validation = $this->db->jdate($obj->date_valid);
2086 $this->date_modification = $this->db->jdate($obj->tms);
2087 $this->source = $obj->source;
2088 $this->billed = $obj->billed;
2089 $this->note = $obj->note_private;
2090 $this->note_private = $obj->note_private;
2091 $this->note_public = $obj->note_public;
2092 $this->model_pdf = $obj->model_pdf;
2093 $this->last_main_doc = $obj->last_main_doc;
2094 $this->mode_reglement_id = $obj->fk_mode_reglement;
2095 $this->mode_reglement_code = $obj->mode_reglement_code;
2096 $this->mode_reglement = $obj->mode_reglement_libelle;
2097 $this->cond_reglement_id = $obj->fk_cond_reglement;
2098 $this->cond_reglement_code = $obj->cond_reglement_code;
2099 $this->cond_reglement = $obj->cond_reglement_libelle;
2100 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
2101 $this->deposit_percent = $obj->deposit_percent;
2102 $this->fk_account = $obj->fk_account;
2103 $this->availability_id = $obj->fk_availability;
2104 $this->availability_code = $obj->availability_code;
2106 $this->demand_reason_id = $obj->fk_input_reason;
2107 $this->demand_reason_code = $obj->demand_reason_code;
2108 $this->delivery_date = $this->db->jdate($obj->delivery_date);
2109 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
2110 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
2111 $this->fk_delivery_address = $obj->fk_delivery_address;
2112 $this->module_source = $obj->module_source;
2113 $this->pos_source = $obj->pos_source;
2116 $this->fk_incoterms = $obj->fk_incoterms;
2117 $this->location_incoterms = $obj->location_incoterms;
2118 $this->label_incoterms = $obj->label_incoterms;
2121 $this->fk_multicurrency = $obj->fk_multicurrency;
2122 $this->multicurrency_code = $obj->multicurrency_code;
2123 $this->multicurrency_tx = $obj->multicurrency_tx;
2124 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
2125 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
2126 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2128 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
2130 $this->lines = array();
2136 $this->db->free($result);
2145 $this->error =
'Order with id '.$id.
' not found sql='.$sql;
2149 $this->error = $this->db->error();
2167 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2168 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
2173 $result = $remise->fetch($idremise);
2176 if ($remise->fk_facture) {
2177 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
2178 $this->db->rollback();
2184 $line->fk_commande = $this->id;
2185 $line->fk_remise_except = $remise->id;
2186 $line->desc = $remise->description;
2187 $line->vat_src_code = $remise->vat_src_code;
2188 $line->tva_tx = $remise->tva_tx;
2189 $line->localtax1_tx = $remise->localtax1_tx;
2190 $line->localtax1_type = $remise->localtax1_type;
2191 $line->localtax2_tx = $remise->localtax1_tx;
2192 $line->localtax2_type = $remise->localtax1_type;
2193 $line->subprice = -(float) $remise->amount_ht;
2194 $line->price = -(float) $remise->amount_ht;
2195 $line->fk_product = 0;
2197 $line->remise_percent = 0;
2199 $line->info_bits = 2;
2201 $line->total_ht = -(float) $remise->amount_ht;
2202 $line->total_tva = -(float) $remise->amount_tva;
2203 $line->total_ttc = -(float) $remise->amount_ttc;
2204 $line->total_localtax1 = -(float) $remise->total_localtax1;
2205 $line->total_localtax2 = -(float) $remise->total_localtax2;
2207 $result = $line->insert();
2211 $this->db->commit();
2214 $this->db->rollback();
2219 $this->db->rollback();
2223 $this->db->rollback();
2237 public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
2240 $this->lines = array();
2242 $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,';
2243 $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,';
2244 $sql .=
' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
2245 $sql .=
' l.fk_unit, l.extraparams,';
2246 $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,';
2247 $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,';
2248 $sql .=
' p.customcode, p.fk_country as country_id, c.code as country_code,';
2249 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units, p.packaging';
2250 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element_line.
' as l';
2251 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (p.rowid = l.fk_product)';
2252 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_country as c ON c.rowid = p.fk_country';
2253 $sql .=
' WHERE l.fk_commande = '.((int) $this->
id);
2254 if ($only_product) {
2255 $sql .=
' AND p.fk_product_type = 0';
2257 $sql .=
' ORDER BY l.rang, l.rowid';
2259 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
2260 $result = $this->db->query($sql);
2262 $num = $this->db->num_rows($result);
2266 $objp = $this->db->fetch_object($result);
2270 $line->rowid = $objp->rowid;
2271 $line->id = $objp->rowid;
2272 $line->fk_commande = $objp->fk_commande;
2273 $line->commande_id = $objp->fk_commande;
2274 $line->label = $objp->custom_label;
2275 $line->desc = $objp->description;
2276 $line->description = $objp->description;
2277 $line->product_type = $objp->product_type;
2278 $line->qty = $objp->qty;
2279 $line->ref_ext = $objp->ref_ext;
2281 $line->vat_src_code = $objp->vat_src_code;
2282 $line->tva_tx = $objp->tva_tx;
2283 $line->localtax1_tx = $objp->localtax1_tx;
2284 $line->localtax2_tx = $objp->localtax2_tx;
2285 $line->localtax1_type = $objp->localtax1_type;
2286 $line->localtax2_type = $objp->localtax2_type;
2287 $line->total_ht = $objp->total_ht;
2288 $line->total_ttc = $objp->total_ttc;
2289 $line->total_tva = $objp->total_tva;
2290 $line->total_localtax1 = $objp->total_localtax1;
2291 $line->total_localtax2 = $objp->total_localtax2;
2292 $line->subprice = (float) $objp->subprice;
2293 $line->subprice_ttc = (float) $objp->subprice_ttc;
2294 $line->fk_remise_except = $objp->fk_remise_except;
2295 $line->remise_percent = $objp->remise_percent;
2296 $line->price = $objp->price;
2297 $line->fk_product = $objp->fk_product;
2298 $line->fk_fournprice = $objp->fk_fournprice;
2299 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
2300 $line->pa_ht = $marginInfos[0];
2301 $line->marge_tx = $marginInfos[1];
2302 $line->marque_tx = $marginInfos[2];
2303 $line->rang = $objp->rang;
2304 $line->info_bits = $objp->info_bits;
2305 $line->special_code = $objp->special_code;
2306 $line->fk_parent_line = $objp->fk_parent_line;
2308 $line->ref = $objp->product_ref;
2309 $line->libelle = $objp->product_label;
2311 $line->product_ref = $objp->product_ref;
2312 $line->product_label = $objp->product_label;
2313 $line->product_tosell = $objp->product_tosell;
2314 $line->product_tobuy = $objp->product_tobuy;
2315 $line->product_desc = $objp->product_desc;
2316 $line->product_tobatch = $objp->product_tobatch;
2317 $line->product_barcode = $objp->product_barcode;
2318 $line->product_custom_code = $objp->customcode;
2319 $line->product_custom_country_id = $objp->country_id;
2320 $line->product_custom_country_code = $objp->country_code;
2322 $line->fk_product_type = $objp->fk_product_type;
2323 $line->fk_unit = $objp->fk_unit;
2325 $line->extraparams = !empty($objp->extraparams) ? (array) json_decode($objp->extraparams,
true) : array();
2327 $line->weight = $objp->weight;
2328 $line->weight_units = $objp->weight_units;
2329 $line->volume = $objp->volume;
2330 $line->volume_units = $objp->volume_units;
2331 $line->packaging = $objp->packaging;
2333 $line->date_start = $this->db->jdate($objp->date_start);
2334 $line->date_end = $this->db->jdate($objp->date_end);
2337 $line->fk_multicurrency = $objp->fk_multicurrency;
2338 $line->multicurrency_code = $objp->multicurrency_code;
2339 $line->multicurrency_subprice = $objp->multicurrency_subprice;
2340 $line->multicurrency_subprice_ttc = $objp->multicurrency_subprice_ttc;
2341 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
2342 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
2343 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2345 $line->fetch_optionals();
2348 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
2349 $tmpproduct =
new Product($this->db);
2350 $tmpproduct->fetch($objp->fk_product);
2351 $tmpproduct->getMultiLangs();
2353 $line->multilangs = $tmpproduct->multilangs;
2356 $this->lines[$i] = $line;
2361 $this->db->free($result);
2365 $this->error = $this->db->error();
2379 foreach ($this->lines as $line) {
2380 if ($line->product_type == 0) {
2395 foreach ($this->lines as $line) {
2396 if ($line->product_type == 1) {
2412 $sql =
'SELECT COUNT(DISTINCT ed.fk_expedition) as nb';
2413 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2414 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2416 $sql .=
' ed.fk_elementdet = cd.rowid';
2417 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2420 dol_syslog(get_class($this).
"::getNbOfShipments", LOG_DEBUG);
2421 $resql = $this->db->query($sql);
2423 $obj = $this->db->fetch_object($resql);
2425 $nb = (int) $obj->nb;
2428 $this->db->free($resql);
2431 $this->error = $this->db->lasterror();
2446 $this->expeditions = array();
2448 $sql =
'SELECT cd.rowid, cd.fk_product,';
2449 $sql .=
' sum(ed.qty) as qty';
2450 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2451 if ($filtre_statut >= 0) {
2452 $sql .=
' '.MAIN_DB_PREFIX.
'expedition as e,';
2454 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2456 if ($filtre_statut >= 0) {
2457 $sql .=
' ed.fk_expedition = e.rowid AND';
2459 $sql .=
' ed.fk_elementdet = cd.rowid';
2460 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2461 if ($fk_product > 0) {
2462 $sql .=
' AND cd.fk_product = '.((int) $fk_product);
2464 if ($filtre_statut >= 0) {
2465 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
2467 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
2470 dol_syslog(get_class($this).
"::loadExpeditions", LOG_DEBUG);
2471 $resql = $this->db->query($sql);
2473 $num = $this->db->num_rows($resql);
2476 $obj = $this->db->fetch_object($resql);
2477 $this->expeditions[$obj->rowid] = $obj->qty;
2480 $this->db->free($resql);
2483 $this->error = $this->db->lasterror();
2495 $sql =
'SELECT count(*)';
2496 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expedition as e';
2497 $sql .=
', '.MAIN_DB_PREFIX.
'element_element as el';
2498 $sql .=
' WHERE el.fk_source = '.((int) $this->
id);
2499 $sql .=
" AND el.sourcetype = 'commande'";
2500 $sql .=
" AND el.fk_target = e.rowid";
2501 $sql .=
" AND el.targettype = 'shipping'";
2503 $resql = $this->db->query($sql);
2505 $row = $this->db->fetch_row($resql);
2524 if ($this->
status == self::STATUS_DRAFT) {
2530 $line->context = $this->context;
2533 $line->fetch($lineid);
2535 if ($id > 0 && $line->fk_commande != $id) {
2536 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
2541 $staticline = clone $line;
2542 $line->oldline = $staticline;
2544 if ($line->delete($user) > 0) {
2548 $this->db->commit();
2551 $this->db->rollback();
2552 $this->error = $this->db->lasterror();
2556 $this->db->rollback();
2561 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
2580 dol_syslog(get_class($this).
"::set_remise is deprecated, use setDiscount instead", LOG_NOTICE);
2582 return $this->
setDiscount($user, $remise, $notrigger);
2595 $remise = trim((
string) $remise) ? trim((
string) $remise) : 0;
2597 if ($user->hasRight(
'commande',
'creer')) {
2604 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2605 $sql .=
' SET remise_percent = '.((float) $remise);
2606 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_DRAFT);
2609 $resql = $this->db->query($sql);
2611 $this->errors[] = $this->db->error();
2616 $this->oldcopy = clone $this;
2617 $this->remise_percent = $remise;
2621 if (!$notrigger && empty($error)) {
2623 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2631 $this->db->commit();
2634 foreach ($this->errors as $errmsg) {
2635 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2636 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2638 $this->db->rollback();
2659 if ($user->hasRight(
'commande',
'creer')) {
2664 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2665 $sql .=
" SET date_commande = ".($date ?
"'".$this->db->idate($date).
"'" :
'null');
2666 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = ".((int) self::STATUS_DRAFT);
2669 $resql = $this->db->query($sql);
2671 $this->errors[] = $this->db->error();
2676 $this->oldcopy = clone $this;
2677 $this->
date = $date;
2680 if (!$notrigger && empty($error)) {
2682 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2690 $this->db->commit();
2693 foreach ($this->errors as $errmsg) {
2694 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2695 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2697 $this->db->rollback();
2731 if ($user->hasRight(
'commande',
'creer')) {
2736 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2737 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2738 $sql .=
" WHERE rowid = ".((int) $this->
id);
2741 $resql = $this->db->query($sql);
2743 $this->errors[] = $this->db->error();
2748 $this->oldcopy = clone $this;
2749 $this->delivery_date = $delivery_date;
2752 if (!$notrigger && empty($error)) {
2754 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2762 $this->db->commit();
2765 foreach ($this->errors as $errmsg) {
2766 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2767 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2769 $this->db->rollback();
2791 public function liste_array($shortlist = 0, $draft = 0, $excluser =
null, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'c.date_commande', $sortorder =
'DESC')
2798 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2799 $sql .=
" c.rowid as cid, c.ref";
2800 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2801 $sql .=
", sc.fk_soc, sc.fk_user";
2803 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.$this->table_element.
" as c";
2804 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2805 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
2807 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2808 $sql .=
" AND c.fk_soc = s.rowid";
2809 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
2810 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2813 $sql .=
" AND s.rowid = ".((int) $socid);
2816 $sql .=
" AND c.fk_statut = ".self::STATUS_DRAFT;
2818 if (is_object($excluser)) {
2819 $sql .=
" AND c.fk_user_author <> ".((int) $excluser->id);
2821 $sql .= $this->db->order($sortfield, $sortorder);
2822 $sql .= $this->db->plimit($limit, $offset);
2824 $result = $this->db->query($sql);
2826 $numc = $this->db->num_rows($result);
2829 while ($i < $numc) {
2830 $obj = $this->db->fetch_object($result);
2832 if ($shortlist == 1) {
2833 $ga[$obj->cid] = $obj->ref;
2834 } elseif ($shortlist == 2) {
2835 $ga[$obj->cid] = $obj->ref.
' ('.$obj->name.
')';
2837 $ga[$i][
'id'] = $obj->cid;
2838 $ga[$i][
'ref'] = $obj->ref;
2839 $ga[$i][
'name'] = $obj->name;
2862 dol_syslog(
'Commande::availability('.$availability_id.
')');
2863 if ($this->
status >= self::STATUS_DRAFT) {
2868 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2869 $sql .=
' SET fk_availability = '.((int) $availability_id);
2870 $sql .=
' WHERE rowid='.((int) $this->
id);
2873 $resql = $this->db->query($sql);
2875 $this->errors[] = $this->db->error();
2880 $this->oldcopy = clone $this;
2881 $this->availability_id = $availability_id;
2884 if (!$notrigger && empty($error)) {
2886 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2894 $this->db->commit();
2897 foreach ($this->errors as $errmsg) {
2898 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2899 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2901 $this->db->rollback();
2905 $error_str =
'Command status do not meet requirement '.$this->status;
2907 $this->error = $error_str;
2908 $this->errors[] = $this->error;
2926 dol_syslog(
'Commande::demand_reason('.$demand_reason_id.
')');
2927 if ($this->
status >= self::STATUS_DRAFT) {
2932 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2933 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
2934 $sql .=
' WHERE rowid='.((int) $this->
id);
2937 $resql = $this->db->query($sql);
2939 $this->errors[] = $this->db->error();
2944 $this->oldcopy = clone $this;
2945 $this->demand_reason_id = $demand_reason_id;
2948 if (!$notrigger && empty($error)) {
2950 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
2958 $this->db->commit();
2961 foreach ($this->errors as $errmsg) {
2962 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2963 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2965 $this->db->rollback();
2969 $error_str =
'order status do not meet requirement '.$this->status;
2971 $this->error = $error_str;
2972 $this->errors[] = $this->error;
2989 if ($user->hasRight(
'commande',
'creer')) {
2994 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET';
2995 $sql .=
' ref_client = '.(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2996 $sql .=
' WHERE rowid = '.((int) $this->
id);
2998 dol_syslog(__METHOD__.
' this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2999 $resql = $this->db->query($sql);
3001 $this->errors[] = $this->db->error();
3006 $this->oldcopy = clone $this;
3007 $this->ref_client = $ref_client;
3008 $this->ref_customer = $ref_client;
3011 if (!$notrigger && empty($error)) {
3013 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
3020 $this->db->commit();
3023 foreach ($this->errors as $errmsg) {
3024 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
3025 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3027 $this->db->rollback();
3046 if ($this->billed) {
3052 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 1';
3055 dol_syslog(get_class($this).
"::classifyBilled", LOG_DEBUG);
3056 if ($this->db->query($sql)) {
3057 $this->oldcopy = clone $this;
3060 if (!$notrigger && empty($error)) {
3062 $result = $this->call_trigger(
'ORDER_CLASSIFY_BILLED', $user);
3070 $this->db->commit();
3073 foreach ($this->errors as $errmsg) {
3074 dol_syslog(get_class($this).
"::classifyBilled ".$errmsg, LOG_ERR);
3075 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3077 $this->db->rollback();
3081 $this->error = $this->db->error();
3082 $this->db->rollback();
3100 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 0';
3103 dol_syslog(get_class($this).
"::classifyUnBilled", LOG_DEBUG);
3104 if ($this->db->query($sql)) {
3105 $this->oldcopy = clone $this;
3108 if (!$notrigger && empty($error)) {
3110 $result = $this->call_trigger(
'ORDER_CLASSIFY_UNBILLED', $user);
3120 $this->db->commit();
3123 foreach ($this->errors as $errmsg) {
3124 dol_syslog(get_class($this).
"::classifyUnBilled ".$errmsg, LOG_ERR);
3125 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3127 $this->db->rollback();
3131 $this->error = $this->db->error();
3132 $this->db->rollback();
3168 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)
3170 global
$mysoc, $langs, $user;
3172 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");
3173 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3180 if (empty($info_bits)) {
3183 if (empty($txtva)) {
3186 if (empty($txlocaltax1)) {
3189 if (empty($txlocaltax2)) {
3192 if (empty($remise_percent)) {
3193 $remise_percent = 0;
3195 if (empty($qty) && empty($special_code)) {
3198 if (!empty($qty) && $special_code == 3) {
3201 if (empty($ref_ext)) {
3206 $langs->load(
"errors");
3207 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
3211 $remise_percent = (float)
price2num($remise_percent);
3215 $pu_ht_devise =
price2num($pu_ht_devise);
3216 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
3219 $txlocaltax1 = (float)
price2num($txlocaltax1);
3220 $txlocaltax2 = (float)
price2num($txlocaltax2);
3233 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
3234 $vat_src_code = $reg[1];
3235 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
3238 $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);
3240 $total_ht = $tabprice[0];
3241 $total_tva = $tabprice[1];
3242 $total_ttc = $tabprice[2];
3243 $total_localtax1 = $tabprice[9];
3244 $total_localtax2 = $tabprice[10];
3245 $pu_ht = $tabprice[3];
3246 $pu_tva = $tabprice[4];
3247 $pu_ttc = $tabprice[5];
3250 $multicurrency_total_ht = $tabprice[16];
3251 $multicurrency_total_tva = $tabprice[17];
3252 $multicurrency_total_ttc = $tabprice[18];
3253 $pu_ht_devise = $tabprice[19];
3257 $line->fetch($rowid);
3258 $line->fetch_optionals();
3260 if (!empty($line->fk_product)) {
3261 $product =
new Product($this->db);
3262 $result = $product->fetch($line->fk_product);
3263 $product_type = $product->type;
3265 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product->isStockManaged()) {
3267 $productChildrenNb = 0;
3269 $productChildrenNb = $product->hasFatherOrChild(1);
3271 if ($productChildrenNb > 0) {
3273 $product_stock =
null;
3274 $product->loadStockForVirtualProduct(
'warehouseopen', $qty);
3275 foreach ($product->stock_warehouse as $componentStockWarehouse) {
3276 if ($product_stock ===
null) {
3277 $product_stock = $componentStockWarehouse->real;
3279 $product_stock = min($product_stock, $componentStockWarehouse->real);
3282 if ($product_stock ===
null) {
3286 $product_stock = $product->stock_reel;
3289 if ($product_stock < $qty) {
3290 $langs->load(
"errors");
3291 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', (
string) $product->ref);
3292 $this->errors[] = $this->error;
3294 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
3296 $this->db->rollback();
3302 $staticline = clone $line;
3304 $line->oldline = $staticline;
3305 $this->line = $line;
3306 $this->line->context = $this->context;
3307 $this->line->rang = $rang;
3310 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
3311 $rangmax = $this->
line_max($fk_parent_line);
3312 $this->line->rang = $rangmax + 1;
3316 if (abs((
float) $qty) < $this->line->packaging) {
3317 $qty = $this->line->packaging;
3318 setEventMessage($langs->trans(
'QtyRecalculatedWithPackaging'),
'warnings');
3320 if (!empty($this->line->packaging)
3321 && is_numeric($this->line->packaging)
3322 && (
float) $this->line->packaging > 0
3323 && (
float)
price2num(fmod((
float) $qty, (
float) $this->line->packaging),
'MS')) {
3326 $coeff = intval(abs((
float) $qty) / $this->line->packaging) + 1;
3327 $qty =
price2num((
float) $this->line->packaging * $coeff,
'MS');
3328 setEventMessage($langs->trans(
'QtyRecalculatedWithPackaging'),
'warnings');
3333 $this->line->id = $rowid;
3334 $this->line->label = $label;
3335 $this->line->desc = $desc;
3336 $this->line->qty = $qty;
3337 $this->line->ref_ext = $ref_ext;
3339 $this->line->vat_src_code = $vat_src_code;
3340 $this->line->tva_tx = $txtva;
3341 $this->line->localtax1_tx = $txlocaltax1;
3342 $this->line->localtax2_tx = $txlocaltax2;
3343 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
3344 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
3345 $this->line->remise_percent = $remise_percent;
3346 $this->line->subprice = (float) $pu_ht;
3347 $this->line->info_bits = $info_bits;
3348 $this->line->special_code = $special_code;
3349 $this->line->total_ht = (float) $total_ht;
3350 $this->line->total_tva = (float) $total_tva;
3351 $this->line->total_localtax1 = (float) $total_localtax1;
3352 $this->line->total_localtax2 = (float) $total_localtax2;
3353 $this->line->total_ttc = (float) $total_ttc;
3355 $this->line->date_end = $date_end;
3356 $this->line->product_type = $type;
3357 $this->line->fk_parent_line = $fk_parent_line;
3358 $this->line->skip_update_total = $skip_update_total;
3359 $this->line->fk_unit = $fk_unit;
3361 $this->line->fk_fournprice = $fk_fournprice;
3362 $this->line->pa_ht = $pa_ht;
3365 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
3366 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
3367 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
3368 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
3370 if (is_array($array_options) && count($array_options) > 0) {
3372 foreach ($array_options as $key => $value) {
3373 $this->line->array_options[$key] = $array_options[$key];
3377 $result = $this->line->update($user, $notrigger);
3380 if (!empty($fk_parent_line)) {
3387 $this->db->commit();
3392 $this->db->rollback();
3396 $this->error = get_class($this).
"::updateline Order status makes operation forbidden";
3397 $this->errors = array(
'OrderStatusMakeOperationForbidden');
3414 if (isset($this->
ref)) {
3415 $this->
ref = trim($this->
ref);
3417 if (isset($this->ref_client)) {
3418 $this->ref_client = trim($this->ref_client);
3420 if (isset($this->ref_customer)) {
3421 $this->ref_customer = trim($this->ref_customer);
3423 if (isset($this->note) || isset($this->note_private)) {
3424 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
3426 if (isset($this->note_public)) {
3427 $this->note_public = trim($this->note_public);
3429 if (isset($this->model_pdf)) {
3430 $this->model_pdf = trim($this->model_pdf);
3432 if (isset($this->import_key)) {
3433 $this->import_key = trim($this->import_key);
3435 $delivery_date = $this->delivery_date;
3441 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
3443 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
3444 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
3445 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
3446 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
3447 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
3448 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
3449 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
3450 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
3451 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
3452 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
3453 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
3454 $sql .=
" fk_statut=".(isset($this->
status) ? $this->
status :
"null").
",";
3455 $sql .=
" fk_user_modif=".(isset($user->id) ? $user->id :
"null").
",";
3456 $sql .=
" fk_user_valid=".((isset($this->user_validation_id) && $this->user_validation_id > 0) ? $this->user_validation_id :
"null").
",";
3457 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
3458 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
3459 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ? strval($this->deposit_percent) :
"null").
",";
3460 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
3461 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
3462 $sql .=
" fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id :
"null").
",";
3463 $sql .=
" fk_account=".($this->fk_account > 0 ? $this->fk_account :
"null").
",";
3464 $sql .=
" fk_input_reason=".($this->demand_reason_id > 0 ? $this->demand_reason_id :
"null").
",";
3465 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
3466 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
3467 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
3468 $sql .=
" fk_warehouse=".($this->warehouse_id > 0 ? $this->warehouse_id :
"null").
",";
3469 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null").
",";
3470 $sql .=
" module_source = ".(isset($this->module_source) ?
"'".$this->db->escape($this->module_source).
"'" :
"null").
",";
3471 $sql .=
" pos_source = ".(isset($this->pos_source) ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
3472 $sql .=
" WHERE rowid=".((int) $this->
id);
3476 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3477 $resql = $this->db->query($sql);
3480 $this->errors[] =
"Error ".$this->db->lasterror();
3490 if (!$error && !$notrigger) {
3492 $result = $this->call_trigger(
'ORDER_MODIFY', $user);
3501 foreach ($this->errors as $errmsg) {
3502 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
3503 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3505 $this->db->rollback();
3508 $this->db->commit();
3520 public function delete($user, $notrigger = 0)
3522 global
$conf, $langs;
3523 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3527 dol_syslog(get_class($this).
"::delete ".$this->
id, LOG_DEBUG);
3533 $result = $this->call_trigger(
'ORDER_DELETE', $user);
3542 $this->errors[] = $langs->trans(
'SomeShipmentExists');
3548 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"categorie_order";
3549 $sql .=
" WHERE fk_order = ".((int) $this->
id);
3551 $result = $this->db->query($sql);
3554 $this->errors[] = $this->db->lasterror();
3559 if (!$error && !empty($this->table_element_line)) {
3560 $tabletodelete = $this->table_element_line;
3561 $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).
")";
3562 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3563 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3565 $this->error = $this->db->lasterror();
3566 $this->errors[] = $this->error;
3567 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3592 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3598 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3599 $res = $this->db->query($sql);
3602 $this->error = $this->db->lasterror();
3603 $this->errors[] = $this->error;
3604 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3620 if ($conf->commande->multidir_output[$this->entity] && !empty($this->
ref)) {
3621 $dir =
$conf->commande->multidir_output[$this->entity].
"/".$ref;
3622 $file = $dir.
"/".$ref.
".pdf";
3623 if (file_exists($file)) {
3627 $this->error =
'ErrorFailToDeleteFile';
3628 $this->errors[] = $this->error;
3629 $this->db->rollback();
3633 if (file_exists($dir)) {
3636 $this->error =
'ErrorFailToDeleteDir';
3637 $this->errors[] = $this->error;
3638 $this->db->rollback();
3646 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3647 $this->db->commit();
3650 $this->db->rollback();
3667 global
$conf, $langs, $hookmanager;
3671 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht";
3672 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as c";
3673 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
3674 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc";
3675 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3678 $sql .= $clause.
" c.entity IN (".
getEntity(
'commande').
")";
3680 if ($mode ==
'toship') {
3682 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
")";
3684 if ($mode ==
'tobill') {
3686 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
", " . self::STATUS_CLOSED .
") AND c.facture = 0";
3688 if ($mode ==
'shippedtobill') {
3690 $sql .=
" AND c.fk_statut IN (" . self::STATUS_CLOSED .
") AND c.facture = 0";
3693 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3696 $parameters = array(
'socid' => $user->socid);
3697 $reshook = $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $this);
3698 $sql .= $hookmanager->resPrint;
3699 $resql = $this->db->query($sql);
3702 $label = $labelShort = $url =
'';
3703 if ($mode ==
'toship') {
3704 $delay_warning =
$conf->commande->client->warning_delay / 60 / 60 / 24;
3705 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-2&mainmenu=commercial&leftmenu=orders';
3706 $label = $langs->transnoentitiesnoconv(
"OrdersToProcess");
3707 $labelShort = $langs->transnoentitiesnoconv(
"Opened");
3709 if ($mode ==
'tobill') {
3710 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3711 $label = $langs->trans(
"OrdersToBill");
3712 $labelShort = $langs->trans(
"ToBill");
3714 if ($mode ==
'shippedtobill') {
3715 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3716 $label = $langs->trans(
"OrdersToBill");
3717 $labelShort = $langs->trans(
"StatusOrderDelivered").
' '.$langs->trans(
"and").
' '.$langs->trans(
"ToBill");
3722 $response->warning_delay = $delay_warning;
3723 $response->label = $label;
3724 $response->labelShort = $labelShort;
3725 $response->url = $url;
3726 $response->url_late = DOL_URL_ROOT.
'/commande/list.php?search_option=late&mainmenu=commercial&leftmenu=orders';
3729 $generic_commande =
new Commande($this->db);
3731 while ($obj = $this->db->fetch_object($resql)) {
3732 $response->nbtodo++;
3733 $response->total += $obj->total_ht;
3735 $generic_commande->status = $obj->fk_statut;
3736 $generic_commande->date = $this->db->jdate($obj->date_commande);
3737 $generic_commande->delivery_date = $this->db->jdate($obj->delivery_date);
3739 if ($mode ==
'toship' && $generic_commande->hasDelay()) {
3740 $response->nbtodolate++;
3746 $this->error = $this->db->error();
3760 $label = $langs->trans(
'OrderSource'.$this->source);
3762 if ($label ==
'OrderSource') {
3789 public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
3792 global $langs, $hookmanager;
3795 if (empty($donotshowbilled)) {
3796 $billedtext .= ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3798 $billedtextlong = ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3802 $paramsBadge = array(
'badgeParams' => array(
'attr' => array(
3803 'data-status-element' => $this->element,
3804 'data-billed' => (
int) $billed,
3805 'data-status' => (
int) $status
3808 if ($status == self::STATUS_CANCELED) {
3809 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderCanceled');
3810 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderCanceledShort');
3811 $statusType =
'status9';
3812 } elseif ($status == self::STATUS_DRAFT) {
3813 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDraft');
3814 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDraftShort');
3815 $statusType =
'status0';
3816 } elseif ($status == self::STATUS_VALIDATED) {
3817 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderValidated').$billedtextlong;
3818 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderValidatedShort').$billedtext;
3819 $statusType =
'status1';
3820 } elseif ($status == self::STATUS_SHIPMENTONPROCESS) {
3821 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderSent').$billedtextlong;
3822 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderSentShort').$billedtext;
3823 $labelTooltip = $langs->transnoentitiesnoconv(
"StatusOrderSent");
3824 if (!empty($this->delivery_date)) {
3825 $labelTooltip .=
' - '.$langs->transnoentitiesnoconv(
"DateDeliveryPlanned").dol_print_date($this->delivery_date,
'day').$billedtext;
3827 $statusType =
'status4';
3828 } elseif ($status == self::STATUS_CLOSED) {
3829 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDelivered').$billedtextlong;
3830 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDeliveredShort').$billedtext;
3831 $statusType =
'status6';
3833 $labelStatus = $langs->transnoentitiesnoconv(
'Unknown');
3834 $labelStatusShort =
'';
3839 $paramsBadge[
'tooltip'] = $labelTooltip;
3841 $parameters = array(
3842 'status' => $status,
3844 'billed' => $billed,
3845 'donotshowbilled' => $donotshowbilled,
3846 'paramsBadge' => & $paramsBadge
3849 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3852 return $hookmanager->resPrint;
3855 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode,
'', $paramsBadge);
3867 global
$conf, $langs, $user;
3869 $langs->load(
'orders');
3871 $nofetch = !empty($params[
'nofetch']);
3874 return [
'optimize' => $langs->trans(
"Order")];
3877 if ($user->hasRight(
'commande',
'lire')) {
3878 $datas[
'picto'] =
img_picto(
'', $this->picto,
'', 0, 0, 0,
'',
'paddingrightonly').
'<u>'.$langs->trans(
"Order").
'</u>';
3879 if (isset($this->
status)) {
3880 $datas[
'status'] =
' '.$this->getLibStatut(5);
3882 $datas[
'Ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3884 $langs->load(
'companies');
3885 if (empty($this->thirdparty)) {
3888 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3890 $datas[
'RefCustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.(empty($this->ref_customer) ? (empty($this->ref_client) ?
'' : $this->ref_client) : $this->ref_customer);
3892 $langs->load(
'project');
3893 if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
3895 if ($res > 0 && $this->project instanceof
Project) {
3896 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0,
'1');
3900 if (!empty($this->total_ht)) {
3901 $datas[
'AmountHT'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
$conf->currency);
3903 if (!empty($this->total_tva)) {
3904 $datas[
'VAT'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
$conf->currency);
3906 if (!empty($this->total_ttc)) {
3907 $datas[
'AmountTTC'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency);
3909 if (!empty($this->
date)) {
3910 $datas[
'Date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->
date,
'day');
3912 if (!empty($this->delivery_date)) {
3913 $datas[
'DeliveryDate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3933 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target =
'')
3935 global
$conf, $langs, $user, $hookmanager;
3937 if (!empty(
$conf->dol_no_mouse_hover)) {
3943 if (
isModEnabled(
"shipping") && ($option ==
'1' || $option ==
'2')) {
3944 $baseurl = DOL_URL_ROOT .
'/expedition/shipment.php';
3946 $baseurl = DOL_URL_ROOT .
'/commande/card.php';
3948 $query = [
'id' => $this->id];
3949 if (!$user->hasRight(
'commande',
'lire')) {
3953 if ($option !==
'nolink') {
3955 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3956 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3957 $add_save_lastsearch_values = 1;
3959 if ($add_save_lastsearch_values) {
3960 $query = array_merge($query, [
'save_lastsearch_values' => 1]);
3970 'objecttype' => $this->element,
3971 'option' => $option,
3974 $classfortooltip =
'classfortooltip';
3977 $classfortooltip =
'classforajaxtooltip';
3978 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3985 if (empty($notooltip) && $user->hasRight(
'commande',
'lire')) {
3987 $label = $langs->trans(
"Order");
3988 $linkclose .=
' alt="'.dolPrintHTMLForAttribute($label).
'"';
3990 $linkclose .= ($label ?
' title="'.dolPrintHTMLForAttribute($label).
'"' :
' title="tocomplete"');
3991 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3993 $target_value = array(
'_self',
'_blank',
'_parent',
'_top');
3994 if (in_array($target, $target_value)) {
3995 $linkclose .=
' target="'.dol_escape_htmltag($target).
'"';
3999 $linkstart =
'<a href="'.$url.
'"';
4000 $linkstart .= $linkclose.
'>';
4003 if ($option ===
'nolink') {
4008 $result .= $linkstart;
4010 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
4012 if ($withpicto != 2) {
4013 $result .= $this->ref;
4015 $result .= $linkend;
4017 if ($addlinktonotes) {
4018 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
4021 $result .=
' <span class="note inline-block">';
4022 $result .=
'<a href="'.DOL_URL_ROOT.
'/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
4027 $result .=
'</span>';
4032 $hookmanager->initHooks(array($this->element .
'dao'));
4033 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
4034 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
4036 $result = $hookmanager->resPrint;
4038 $result .= $hookmanager->resPrint;
4052 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem,';
4053 $sql .=
' date_valid as datev,';
4054 $sql .=
' date_cloture as datecloture,';
4055 $sql .=
' fk_user_author, fk_user_valid, fk_user_cloture';
4056 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
4057 $sql .=
' WHERE c.rowid = '.((int) $id);
4058 $result = $this->db->query($sql);
4060 if ($this->db->num_rows($result)) {
4061 $obj = $this->db->fetch_object($result);
4062 $this->
id = $obj->rowid;
4063 if ($obj->fk_user_author) {
4064 $this->user_creation_id = $obj->fk_user_author;
4066 if ($obj->fk_user_valid) {
4067 $this->user_validation_id = $obj->fk_user_valid;
4069 if ($obj->fk_user_cloture) {
4070 $this->user_closing_id = $obj->fk_user_cloture;
4073 $this->date_creation = $this->db->jdate($obj->datec);
4074 $this->date_modification = $this->db->jdate($obj->datem);
4075 $this->date_validation = $this->db->jdate($obj->datev);
4076 $this->date_cloture = $this->db->jdate($obj->datecloture);
4079 $this->db->free($result);
4096 global
$conf, $langs;
4098 dol_syslog(get_class($this).
"::initAsSpecimen");
4103 $sql =
"SELECT rowid";
4104 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
4105 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
4106 if (array_key_exists(
'tosell', $param)) {
4107 $sql .=
" AND tosell = ".((int) $param[
'tosell']);
4109 $sql .= $this->db->plimit(100);
4111 $resql = $this->db->query($sql);
4113 $num_prods = $this->db->num_rows($resql);
4115 while ($i < $num_prods) {
4117 $row = $this->db->fetch_row($resql);
4118 $prodids[$i] = $row[0];
4124 $this->
ref =
'SPECIMEN';
4125 $this->specimen = 1;
4126 $this->entity =
$conf->entity;
4128 $this->
date = time();
4129 $this->date_lim_reglement = $this->
date + 3600 * 24 * 30;
4130 $this->cond_reglement_code =
'RECEP';
4131 $this->mode_reglement_code =
'CHQ';
4132 $this->availability_code =
'DSP';
4133 $this->demand_reason_code =
'SRC_00';
4135 $this->note_public =
'This is a comment (public)';
4136 $this->note_private =
'This is a comment (private)';
4138 $this->multicurrency_tx = 1;
4139 $this->multicurrency_code =
$conf->currency;
4141 $this->
status = $this::STATUS_DRAFT;
4147 while ($xnbp < $nbp) {
4150 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
4152 $line->subprice = 100;
4156 $line->total_ht = 50;
4157 $line->total_ttc = 60;
4158 $line->total_tva = 10;
4159 $line->remise_percent = 50;
4161 $line->total_ht = 100;
4162 $line->total_ttc = 120;
4163 $line->total_tva = 20;
4164 $line->remise_percent = 0;
4166 if ($num_prods > 0) {
4167 $prodid = mt_rand(1, $num_prods);
4168 $line->fk_product = $prodids[$prodid];
4169 $line->product_ref =
'SPECIMEN';
4172 $this->lines[$xnbp] = $line;
4174 $this->total_ht += $line->total_ht;
4175 $this->total_tva += $line->total_tva;
4176 $this->total_ttc += $line->total_ttc;
4192 global $user, $hookmanager;
4194 $this->nb = array();
4197 $sql =
"SELECT count(c.rowid) as nb";
4198 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as c";
4199 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON c.fk_soc = s.rowid";
4200 if (empty($user->socid) && !$user->hasRight(
'societe',
'client',
'voir')) {
4201 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
4202 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
4205 $sql .=
" ".$clause.
" c.entity IN (".
getEntity(
'commande').
")";
4207 $parameters = array();
4208 $hookmanager->executeHooks(
'printFieldListWhere', $parameters, $this);
4209 $sql .= $hookmanager->resPrint;
4210 $resql = $this->db->query($sql);
4212 while ($obj = $this->db->fetch_object($resql)) {
4213 $this->nb[
"orders"] = $obj->nb;
4215 $this->db->free($resql);
4219 $this->error = $this->db->error();
4245 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
4249 $langs->load(
"orders");
4250 $outputlangs->load(
"products");
4253 $modele =
'einstein';
4255 if (!empty($this->model_pdf)) {
4256 $modele = $this->model_pdf;
4262 $modelpath =
"core/modules/commande/doc/";
4264 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4317 return max($this->
date, $this->delivery_date) < ($now -
$conf->commande->client->warning_delay);
4327 global
$conf, $langs;
4329 if (empty($this->delivery_date)) {
4332 $text = $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
4334 $text .=
' '.($conf->commande->client->warning_delay > 0 ?
'+' :
'-').
' '.round(abs(
$conf->commande->client->warning_delay) / 3600 / 24, 1).
' '.$langs->trans(
"days").
' < '.$langs->trans(
"Today");
4362 global
$conf, $langs;
4364 $langs->loadLangs(array(
'orders',
'sendings',
'stocks',
'products'));
4367 'has_product' =>
false,
4368 'shippable' =>
false,
4375 if ($this->
status == self::STATUS_DRAFT || $this->
status == self::STATUS_CLOSED) {
4380 $genericCommande = $this;
4381 $genericProduct =
new Product($this->db);
4384 $productstatcache = array();
4385 $productstatcachevirtual = array();
4388 $genericCommande->getLinesArray();
4389 $genericCommande->loadExpeditions();
4398 $genericProduct =
new Product($this->db);
4400 $numlines = count($genericCommande->lines);
4401 for ($lig = 0; $lig < $numlines; $lig++) {
4402 $orderLine = $genericCommande->lines[$lig];
4404 if (isset($genericCommande->expeditions[$orderLine->id])) {
4405 $reliquat = $orderLine->qty - $genericCommande->expeditions[$orderLine->id];
4407 $reliquat = $orderLine->qty;
4410 if ($orderLine->product_type == 0 && $orderLine->fk_product > 0) {
4413 if (empty($productstatcache[$orderLine->fk_product])) {
4414 $genericProduct->fetch($orderLine->fk_product);
4415 $genericProduct->load_stock(
'nobatch,warehouseopen');
4417 $productstatcache[$orderLine->fk_product][
'stockreel'] = $genericProduct->stock_reel;
4418 $productstatcachevirtual[$orderLine->fk_product][
'stockreel'] = $genericProduct->stock_theorique;
4421 $genericProduct->stock_reel = $productstatcache[$orderLine->fk_product][
'stockreel'];
4422 $genericProduct->stock_theorique = $productstatcachevirtual[$orderLine->fk_product][
'stockreel'];
4424 if ($reliquat > 0) {
4427 $textinfo .= $reliquat .
' x ' . $orderLine->product_ref .
' ' .
dol_trunc($orderLine->product_label, 20);
4428 $textinfo .=
' - ' . $langs->trans(
"Stock") .
': <span class="' . ($genericProduct->stock_reel >= $reliquat ?
'ok' :
'error') .
'">' . $genericProduct->stock_reel .
'</span>';
4429 $textinfo .=
' - ' . $langs->trans(
"VirtualStock") .
': <span class="' . ($genericProduct->stock_theorique >= $reliquat ?
'ok' :
'error') .
'">' . $genericProduct->stock_theorique .
'</span>';
4430 if ($reliquat != $orderLine->qty) {
4431 $textinfo .=
' <span class="opacitymedium">' . $langs->trans(
"QtyInOtherShipments") .
' ' . ($orderLine->qty - $reliquat) .
'</span>';
4433 $textinfo .=
'<br>';
4437 $stockordersupplier = 0;
4441 if (empty($productstatcache[$orderLine->fk_product][
'statsordercustomer'])) {
4442 $genericProduct->fetch($orderLine->fk_product);
4443 $genericProduct->load_stats_commande(0,
'1,2');
4444 $productstatcache[$orderLine->fk_product][
'statsordercustomer'] = $genericProduct->stats_commande[
'qty'];
4446 $genericProduct->stats_commande[
'qty'] = $productstatcache[$orderLine->fk_product][
'statsordercustomer'];
4447 $stockorder = $genericProduct->stats_commande[
'qty'];
4450 if (empty($productstatcache[$orderLine->fk_product][
'statsordersupplier'])) {
4451 $genericProduct->load_stats_commande_fournisseur(0,
'3');
4452 $productstatcache[$orderLine->fk_product][
'statsordersupplier'] = $genericProduct->stats_commande_fournisseur[
'qty'];
4454 $genericProduct->stats_commande_fournisseur[
'qty'] = $productstatcache[$orderLine->fk_product][
'statsordersupplier'];
4455 $stockordersupplier = $genericProduct->stats_commande_fournisseur[
'qty'];
4460 $textinfo .= $reliquat .
' x ' . $orderLine->ref .
' ' .
dol_trunc($orderLine->product_label, 20);
4461 $textinfo .=
' ' . $langs->trans(
"Available") .
' ' . $genericProduct->stock_reel .
'..' . $stockorder;
4463 if ($stockorder && $genericProduct->stock_reel < ($genericProduct->stock_reel - $stockorder + $reliquat)) {
4465 $textwarning .=
'<span class="warning">' . $langs->trans(
"Available") .
' ' . $genericProduct->stock_reel .
'..' . $stockorder .
'</span>';
4467 if ($reliquat > $genericProduct->stock_reel) {
4468 $textinfo .=
' <span class="warning">' . $langs->trans(
"Available") .
' ' . $genericProduct->stock_reel .
'</span>';
4470 $textinfo .=
' <span class="ok">' . $langs->trans(
"Available") .
' ' . $genericProduct->stock_reel .
'</span>';
4475 $textinfo .=
' ' . $langs->trans(
"SupplierOrder") .
' ' . $stockordersupplier;
4477 if ($reliquat != $orderLine->qty) {
4478 $textinfo .=
' <span class="opacitymedium">' . $langs->trans(
"QtyInOtherShipments") .
' ' . ($orderLine->qty - $reliquat) .
'</span>';
4480 $textinfo .=
'<br>';
4483 if ($reliquat > $genericProduct->stock_reel) {
4491 if (!$has_reliquat) {
4492 $texticon =
img_picto(
'',
'statut5',
'', 0, 0, 0,
'',
'paddingleft');
4493 $textinfo = $texticon .
' ' . $langs->trans(
"Shipped");
4494 $result[
'shippable'] =
true;
4495 } elseif ($notshippable) {
4496 $texticon =
img_picto(
'',
'dolly',
'', 0, 0, 0,
'',
'error paddingleft');
4497 $textinfo = $texticon .
' ' . $langs->trans(
"NonShippable") .
'<br>' . $textinfo;
4498 $result[
'shippable'] =
false;
4500 $texticon =
img_picto(
'',
'dolly',
'', 0, 0, 0,
'',
'green paddingleft');
4501 $textinfo = $texticon .
' ' . $langs->trans(
"Shippable") .
'<br>' . $textinfo;
4502 $result[
'shippable'] =
true;
4504 $result[
'has_product'] =
true;
4505 $result[
'texticon'] = $texticon;
4506 $result[
'textinfo'] = $textinfo;
4507 $result[
'warning'] = !empty($warning);
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.
getShippableInfos(array $options=array())
Compute shippable status and tooltip/icon for the order.
set_date_livraison($user, $delivery_date, $notrigger=0)
Set delivery date.
add_product($idproduct, $qty, $remise_percent=0.0, $date_start='', $date_end='')
Add line into array $this->client must be loaded.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
setSignedStatus(User $user, int $status=0, int $notrigger=0, $triggercode='')
Set signed status.
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 translations.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
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.
$date_start
Variables from include:
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.
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 '.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
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.
getMultidirOutput($object, $module='', $forobject=0, $mode='output')
Return the full path of the directory where a module (or an object of a module) stores its files.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dol_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...
dol_trunc($string, $size=40, $trunc='right', $stringencoding='UTF-8', $nodot=0, $display=0)
Truncate a string to a particular length adding '…' if string larger than length.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
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.
print $langs trans('Date')." left Ref 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 Paid right PaymentTypeShortLIQ right SELECT p pos_change as p datep as date