37include_once DOL_DOCUMENT_ROOT.
'/core/class/commonorder.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
41require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
53 public $element =
'commande';
58 public $table_element =
'commande';
63 public $table_element_line =
'commandedet';
68 public $class_element_line =
'OrderLine';
73 public $fk_element =
'fk_commande';
78 public $picto =
'order';
84 public $ismultientitymanaged = 1;
89 public $isextrafieldmanaged = 1;
95 public $restrictiononfksoc = 1;
115 public $ref_customer;
136 public $date_lim_reglement;
140 public $cond_reglement_code;
145 public $cond_reglement_doc;
150 public $deposit_percent;
160 public $mode_reglement;
165 public $mode_reglement_id;
170 public $mode_reglement_code;
176 public $availability_id;
182 public $availability_code;
188 public $availability;
193 public $demand_reason_id;
198 public $demand_reason_code;
210 public $date_commande;
215 public $delivery_date;
220 public $fk_remise_except;
232 public $warehouse_id;
234 public $extraparams = array();
236 public $linked_objects = array();
241 public $user_author_id;
256 public $lines = array();
272 public $online_payment_url;
304 public $fields = array(
305 'rowid' =>array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>10),
306 'entity' =>array(
'type'=>
'integer',
'label'=>
'Entity',
'default'=>1,
'enabled'=>1,
'visible'=>-2,
'notnull'=>1,
'position'=>20,
'index'=>1),
307 'ref' =>array(
'type'=>
'varchar(30)',
'label'=>
'Ref',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'showoncombobox'=>1,
'position'=>25),
308 'ref_ext' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefExt',
'enabled'=>1,
'visible'=>0,
'position'=>26),
309 'ref_client' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefCustomer',
'enabled'=>1,
'visible'=>-1,
'position'=>28),
310 'fk_soc' =>array(
'type'=>
'integer:Societe:societe/class/societe.class.php',
'label'=>
'ThirdParty',
'enabled'=>
'isModEnabled("societe")',
'visible'=>-1,
'notnull'=>1,
'position'=>20),
311 'fk_projet' =>array(
'type'=>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label'=>
'Project',
'enabled'=>
"isModEnabled('project')",
'visible'=>-1,
'position'=>25),
312 'date_commande' =>array(
'type'=>
'date',
'label'=>
'Date',
'enabled'=>1,
'visible'=>1,
'position'=>60,
'csslist'=>
'nowraponall'),
313 'date_valid' =>array(
'type'=>
'datetime',
'label'=>
'DateValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>62,
'csslist'=>
'nowraponall'),
314 'date_cloture' =>array(
'type'=>
'datetime',
'label'=>
'DateClosing',
'enabled'=>1,
'visible'=>-1,
'position'=>65,
'csslist'=>
'nowraponall'),
315 'fk_user_valid' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>85),
316 'fk_user_cloture' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserClosing',
'enabled'=>1,
'visible'=>-1,
'position'=>90),
317 'source' =>array(
'type'=>
'smallint(6)',
'label'=>
'Source',
'enabled'=>1,
'visible'=>-1,
'position'=>95),
318 'total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'VAT',
'enabled'=>1,
'visible'=>-1,
'position'=>125,
'isameasure'=>1),
319 'localtax1' =>array(
'type'=>
'double(24,8)',
'label'=>
'LocalTax1',
'enabled'=>1,
'visible'=>-1,
'position'=>130,
'isameasure'=>1),
320 'localtax2' =>array(
'type'=>
'double(24,8)',
'label'=>
'LocalTax2',
'enabled'=>1,
'visible'=>-1,
'position'=>135,
'isameasure'=>1),
321 'total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalHT',
'enabled'=>1,
'visible'=>-1,
'position'=>140,
'isameasure'=>1),
322 'total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalTTC',
'enabled'=>1,
'visible'=>-1,
'position'=>145,
'isameasure'=>1),
323 'note_private' =>array(
'type'=>
'html',
'label'=>
'NotePrivate',
'enabled'=>1,
'visible'=>0,
'position'=>150),
324 'note_public' =>array(
'type'=>
'html',
'label'=>
'NotePublic',
'enabled'=>1,
'visible'=>0,
'position'=>155),
325 'model_pdf' =>array(
'type'=>
'varchar(255)',
'label'=>
'PDFTemplate',
'enabled'=>1,
'visible'=>0,
'position'=>160),
326 'fk_account' =>array(
'type'=>
'integer',
'label'=>
'BankAccount',
'enabled'=>
'isModEnabled("banque")',
'visible'=>-1,
'position'=>170),
327 'fk_currency' =>array(
'type'=>
'varchar(3)',
'label'=>
'MulticurrencyID',
'enabled'=>1,
'visible'=>-1,
'position'=>175),
328 'fk_cond_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentTerm',
'enabled'=>1,
'visible'=>-1,
'position'=>180),
329 'deposit_percent' =>array(
'type'=>
'varchar(63)',
'label'=>
'DepositPercent',
'enabled'=>1,
'visible'=>-1,
'position'=>181),
330 'fk_mode_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentMode',
'enabled'=>1,
'visible'=>-1,
'position'=>185),
331 'date_livraison' =>array(
'type'=>
'date',
'label'=>
'DateDeliveryPlanned',
'enabled'=>1,
'visible'=>-1,
'position'=>190,
'csslist'=>
'nowraponall'),
332 'fk_shipping_method' =>array(
'type'=>
'integer',
'label'=>
'ShippingMethod',
'enabled'=>1,
'visible'=>-1,
'position'=>195),
333 'fk_warehouse' =>array(
'type'=>
'integer:Entrepot:product/stock/class/entrepot.class.php',
'label'=>
'Fk warehouse',
'enabled'=>
'isModEnabled("stock")',
'visible'=>-1,
'position'=>200),
334 'fk_availability' =>array(
'type'=>
'integer',
'label'=>
'Availability',
'enabled'=>1,
'visible'=>-1,
'position'=>205),
335 'fk_input_reason' =>array(
'type'=>
'integer',
'label'=>
'InputReason',
'enabled'=>1,
'visible'=>-1,
'position'=>210),
337 'extraparams' =>array(
'type'=>
'varchar(255)',
'label'=>
'Extraparams',
'enabled'=>1,
'visible'=>-1,
'position'=>225),
338 'fk_incoterms' =>array(
'type'=>
'integer',
'label'=>
'IncotermCode',
'enabled'=>
'$conf->incoterm->enabled',
'visible'=>-1,
'position'=>230),
339 'location_incoterms' =>array(
'type'=>
'varchar(255)',
'label'=>
'IncotermLabel',
'enabled'=>
'$conf->incoterm->enabled',
'visible'=>-1,
'position'=>235),
340 'fk_multicurrency' =>array(
'type'=>
'integer',
'label'=>
'Fk multicurrency',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>240),
341 'multicurrency_code' =>array(
'type'=>
'varchar(255)',
'label'=>
'MulticurrencyCurrency',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>245),
342 'multicurrency_tx' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyRate',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>250,
'isameasure'=>1),
343 'multicurrency_total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountHT',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>255,
'isameasure'=>1),
344 'multicurrency_total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountVAT',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>260,
'isameasure'=>1),
345 'multicurrency_total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountTTC',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>265,
'isameasure'=>1),
346 'last_main_doc' =>array(
'type'=>
'varchar(255)',
'label'=>
'LastMainDoc',
'enabled'=>1,
'visible'=>-1,
'position'=>270),
347 'module_source' =>array(
'type'=>
'varchar(32)',
'label'=>
'POSModule',
'enabled'=>1,
'visible'=>-1,
'position'=>275),
348 'pos_source' =>array(
'type'=>
'varchar(32)',
'label'=>
'POSTerminal',
'enabled'=>1,
'visible'=>-1,
'position'=>280),
349 'fk_user_author' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserAuthor',
'enabled'=>1,
'visible'=>-1,
'position'=>300),
350 'fk_user_modif' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>1,
'visible'=>-2,
'notnull'=>-1,
'position'=>302),
351 'date_creation' =>array(
'type'=>
'datetime',
'label'=>
'DateCreation',
'enabled'=>1,
'visible'=>-2,
'position'=>304,
'csslist'=>
'nowraponall'),
352 'tms' =>array(
'type'=>
'timestamp',
'label'=>
'DateModification',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>306),
353 'import_key' =>array(
'type'=>
'varchar(14)',
'label'=>
'ImportId',
'enabled'=>1,
'visible'=>-2,
'position'=>400),
354 'fk_statut' =>array(
'type'=>
'smallint(6)',
'label'=>
'Status',
'enabled'=>1,
'visible'=>-1,
'position'=>500),
379 const STATUS_ACCEPTED = 2;
406 global $langs, $conf;
407 $langs->load(
"order");
413 $classname = $conf->global->COMMANDE_ADDON;
416 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
417 foreach ($dirmodels as $reldir) {
421 $mybool |= @include_once $dir.$file;
424 if ($mybool ===
false) {
429 $obj =
new $classname();
430 $numref = $obj->getNextValue($soc, $this);
435 $this->error = $obj->error;
440 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_COMMANDE_ADDON_NotDefined");
454 public function valid($user, $idwarehouse = 0, $notrigger = 0)
456 global $conf, $langs;
458 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
463 if ($this->
statut == self::STATUS_VALIDATED) {
464 dol_syslog(get_class($this).
"::valid action abandonned: already validated", LOG_WARNING);
468 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
469 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
470 $this->error =
'NotEnoughPermissions';
471 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
481 $soc->fetch($this->socid);
484 $result = $soc->setAsCustomer();
487 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
495 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
496 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
497 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
498 $sql .=
" date_valid='".$this->db->idate($now).
"',";
499 $sql .=
" fk_user_valid = ".($user->id > 0 ? (int) $user->id :
"null").
",";
500 $sql .=
" fk_user_modif = ".((int) $user->id);
501 $sql .=
" WHERE rowid = ".((int) $this->
id);
503 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
504 $resql = $this->db->query($sql);
507 $this->error = $this->db->lasterror();
513 if ($result >= 0 && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
514 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
515 $langs->load(
"agenda");
518 $cpt = count($this->lines);
519 for ($i = 0; $i < $cpt; $i++) {
520 if ($this->lines[$i]->fk_product > 0) {
522 $mouvP->origin = &$this;
523 $mouvP->setOrigin($this->element, $this->
id);
525 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"OrderValidatedInDolibarr", $num));
528 $this->error = $mouvP->error;
538 if (!$error && !$notrigger) {
548 $this->oldref = $this->ref;
551 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
553 $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).
"'";
554 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
555 $resql = $this->db->query($sql);
558 $this->error = $this->db->lasterror();
560 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'commande/".$this->db->escape($this->newref).
"'";
561 $sql .=
" WHERE filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
562 $resql = $this->db->query($sql);
565 $this->error = $this->db->lasterror();
571 $dirsource = $conf->commande->multidir_output[$this->entity].
'/'.$oldref;
572 $dirdest = $conf->commande->multidir_output[$this->entity].
'/'.$newref;
573 if (!$error && file_exists($dirsource)) {
574 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
576 if (@rename($dirsource, $dirdest)) {
579 $listoffiles =
dol_dir_list($conf->commande->multidir_output[$this->entity].
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
580 foreach ($listoffiles as $fileentry) {
581 $dirsource = $fileentry[
'name'];
582 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
583 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
584 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
585 @rename($dirsource, $dirdest);
603 $this->db->rollback();
619 global $conf, $langs;
624 if ($this->
statut <= self::STATUS_DRAFT) {
628 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
629 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
630 $this->error =
'Permission denied';
638 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
639 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT.
",";
640 $sql .=
" fk_user_modif = ".((int) $user->id);
641 $sql .=
" WHERE rowid = ".((int) $this->
id);
643 if ($this->db->query($sql)) {
645 $this->oldcopy = clone $this;
649 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
652 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
653 $langs->load(
"agenda");
655 $num = count($this->lines);
656 for ($i = 0; $i < $num; $i++) {
657 if ($this->lines[$i]->fk_product > 0) {
659 $mouvP->origin = &$this;
660 $mouvP->setOrigin($this->element, $this->
id);
662 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderBackToDraftInDolibarr", $this->ref));
665 $this->error = $mouvP->error;
674 $result = $this->
call_trigger(
'ORDER_UNVALIDATE', $user);
685 $this->db->rollback();
689 $this->error = $this->db->error();
690 $this->db->rollback();
709 if ($this->
statut != self::STATUS_CANCELED && $this->
statut != self::STATUS_CLOSED) {
710 dol_syslog(get_class($this).
"::set_reopen order has not status closed", LOG_WARNING);
716 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
717 $sql .=
' SET fk_statut='.self::STATUS_VALIDATED.
', facture=0,';
718 $sql .=
" fk_user_modif = ".((int) $user->id);
719 $sql .=
" WHERE rowid = ".((int) $this->
id);
721 dol_syslog(get_class($this).
"::set_reopen", LOG_DEBUG);
722 $resql = $this->db->query($sql);
732 $this->error = $this->db->lasterror();
743 foreach ($this->errors as $errmsg) {
744 dol_syslog(get_class($this).
"::set_reopen ".$errmsg, LOG_ERR);
745 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
747 $this->db->rollback();
759 public function cloture($user, $notrigger = 0)
765 $usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->commande->creer))
766 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->commande->order_advance->close)));
769 if ($this->
statut == self::STATUS_CLOSED) {
776 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
777 $sql .=
' SET fk_statut = '.self::STATUS_CLOSED.
',';
778 $sql .=
' fk_user_cloture = '.((int) $user->id).
',';
779 $sql .=
" date_cloture = '".$this->db->idate($now).
"',";
780 $sql .=
" fk_user_modif = ".((int) $user->id);
783 if ($this->db->query($sql)) {
799 $this->db->rollback();
803 $this->error = $this->db->lasterror();
805 $this->db->rollback();
819 public function cancel($idwarehouse = -1)
821 global $conf, $user, $langs;
827 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
828 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
",";
829 $sql .=
" fk_user_modif = ".((int) $user->id);
830 $sql .=
" WHERE rowid = ".((int) $this->
id);
831 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
833 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
834 if ($this->db->query($sql)) {
836 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
837 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
838 $langs->load(
"agenda");
840 $num = count($this->lines);
841 for ($i = 0; $i < $num; $i++) {
842 if ($this->lines[$i]->fk_product > 0) {
844 $mouvP->setOrigin($this->element, $this->
id);
846 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderCanceledInDolibarr", $this->ref));
849 $this->error = $mouvP->error;
870 foreach ($this->errors as $errmsg) {
871 dol_syslog(get_class($this).
"::cancel ".$errmsg, LOG_ERR);
872 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
874 $this->db->rollback();
878 $this->error = $this->db->error();
879 $this->db->rollback();
892 public function create($user, $notrigger = 0)
894 global $conf, $langs, $mysoc;
900 $date = ($this->date_commande ? $this->date_commande : $this->date);
901 $delivery_date = $this->delivery_date;
904 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
909 if (empty($this->fk_multicurrency)) {
910 $this->multicurrency_code = $conf->currency;
911 $this->fk_multicurrency = 0;
912 $this->multicurrency_tx = 1;
915 dol_syslog(get_class($this).
"::create user=".$user->id);
918 if (!empty($this->
ref)) {
921 $this->error =
'ErrorRefAlreadyExists';
922 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
923 $this->db->rollback();
929 $result = $soc->fetch($this->socid);
931 $this->error =
"Failed to fetch company";
932 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
936 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Source"));
937 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
945 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"commande (";
946 $sql .=
" ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client";
947 $sql .=
", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address";
948 $sql .=
", fk_shipping_method";
949 $sql .=
", fk_warehouse";
950 $sql .=
", fk_incoterms, location_incoterms";
951 $sql .=
", entity, module_source, pos_source";
952 $sql .=
", fk_multicurrency";
953 $sql .=
", multicurrency_code";
954 $sql .=
", multicurrency_tx";
956 $sql .=
" VALUES ('(PROV)', ".((int) $this->socid).
", '".$this->db->idate($now).
"', ".((int) $user->id);
957 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
958 $sql .=
", '".$this->db->idate($date).
"'";
959 $sql .=
", ".($this->source >= 0 && $this->source !=
'' ? $this->db->escape($this->source) :
'null');
960 $sql .=
", '".$this->db->escape($this->note_private).
"'";
961 $sql .=
", '".$this->db->escape($this->note_public).
"'";
962 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
963 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
964 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
965 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
966 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
"null");
967 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
968 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
969 $sql .=
", ".($this->availability_id > 0 ? ((int) $this->availability_id) :
"null");
970 $sql .=
", ".($this->demand_reason_id > 0 ? ((int) $this->demand_reason_id) :
"null");
971 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
972 $sql .=
", ".($this->fk_delivery_address > 0 ? ((int) $this->fk_delivery_address) :
'NULL');
973 $sql .=
", ".(!empty($this->shipping_method_id) && $this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
974 $sql .=
", ".(!empty($this->warehouse_id) && $this->warehouse_id > 0 ? ((int) $this->warehouse_id) :
'NULL');
975 $sql .=
", ".(int) $this->fk_incoterms;
976 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
977 $sql .=
", ".setEntity($this);
978 $sql .=
", ".($this->module_source ?
"'".$this->db->escape($this->module_source).
"'" :
"null");
979 $sql .=
", ".($this->pos_source !=
'' ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
980 $sql .=
", ".(int) $this->fk_multicurrency;
981 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
982 $sql .=
", ".(float) $this->multicurrency_tx;
985 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
986 $resql = $this->db->query($sql);
988 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commande');
992 $num = count($this->lines);
997 for ($i = 0; $i < $num; $i++) {
998 $line = $this->lines[$i];
1002 if (!is_object($line)) {
1003 $line = (object) $line;
1007 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1008 $fk_parent_line = 0;
1012 $vatrate = $line->tva_tx;
1013 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', $vatrate)) {
1014 $vatrate .=
' ('.$line->vat_src_code.
')';
1018 $originid = $line->origin_id;
1019 $origintype = $line->origin;
1021 $originid = $line->id;
1022 $origintype = $this->element;
1026 if (empty($line->ref_ext)) {
1027 $line->ref_ext =
'';
1035 $line->localtax1_tx,
1036 $line->localtax2_tx,
1038 $line->remise_percent,
1040 $line->fk_remise_except,
1045 $line->product_type,
1047 $line->special_code,
1049 $line->fk_fournprice,
1052 $line->array_options,
1061 if ($result != self::STOCK_NOT_ENOUGH_FOR_ORDER) {
1062 $this->error = $this->db->lasterror();
1063 $this->errors[] = $this->error;
1066 $this->db->rollback();
1070 if ($result > 0 && $line->product_type == 9) {
1071 $fk_parent_line = $result;
1078 $initialref =
'(PROV'.$this->id.
')';
1079 if (!empty($this->
ref)) {
1080 $initialref = $this->ref;
1083 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"commande SET ref='".$this->db->escape($initialref).
"' WHERE rowid=".((int) $this->
id);
1084 if ($this->db->query($sql)) {
1085 $this->
ref = $initialref;
1087 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1088 $this->linked_objects = $this->linkedObjectsIds;
1092 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1093 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1094 if (is_array($tmp_origin_id)) {
1095 foreach ($tmp_origin_id as $origin_id) {
1098 $this->error = $this->db->lasterror();
1103 $origin_id = $tmp_origin_id;
1106 $this->error = $this->db->lasterror();
1113 if (!$error && $this->
id &&
getDolGlobalString(
'MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN') && !empty($this->origin) && !empty($this->origin_id)) {
1114 $originforcontact = $this->origin;
1115 $originidforcontact = $this->origin_id;
1116 if ($originforcontact ==
'shipping') {
1117 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1119 $exp->fetch($this->origin_id);
1120 $exp->fetchObjectLinked();
1121 if (count($exp->linkedObjectsIds[
'commande']) > 0) {
1122 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1123 $originforcontact =
'commande';
1124 if (is_object($value)) {
1125 $originidforcontact = $value->id;
1127 $originidforcontact = $value;
1134 $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";
1135 $sqlcontact .=
" WHERE element_id = ".((int) $originidforcontact).
" AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = '".$this->db->escape($originforcontact).
"'";
1137 $resqlcontact = $this->db->query($sqlcontact);
1138 if ($resqlcontact) {
1139 while ($objcontact = $this->db->fetch_object($resqlcontact)) {
1141 $this->
add_contact($objcontact->fk_socpeople, $objcontact->code, $objcontact->source);
1155 if (!$error && !$notrigger) {
1165 $this->db->commit();
1168 $this->db->rollback();
1172 $this->error = $this->db->lasterror();
1173 $this->db->rollback();
1180 $this->error = $this->db->lasterror();
1181 $this->db->rollback();
1196 global $conf, $user, $hookmanager;
1203 foreach ($this->lines as $line) {
1204 $line->fetch_optionals();
1208 $objFrom = clone $this;
1211 if (!empty($socid) && $socid != $this->socid) {
1212 $objsoc =
new Societe($this->db);
1214 if ($objsoc->fetch($socid) > 0) {
1215 $this->socid = $objsoc->id;
1216 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1217 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent :
null);
1218 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1219 $this->fk_project = 0;
1220 $this->fk_delivery_address = 0;
1231 $this->user_author_id = $user->id;
1232 $this->user_validation_id = 0;
1234 $this->date_commande =
dol_now();
1235 $this->date_creation =
'';
1236 $this->date_validation =
'';
1238 $this->ref_client =
'';
1239 $this->ref_customer =
'';
1243 $num = count($this->lines);
1244 for ($i = 0; $i < $num; $i++) {
1245 $this->lines[$i]->ref_ext =
'';
1249 $this->context[
'createfromclone'] =
'createfromclone';
1250 $result = $this->
create($user);
1264 if ($this->socid == $objFrom->socid) {
1273 if (is_object($hookmanager)) {
1274 $parameters = array(
'objFrom'=>$objFrom);
1276 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1284 unset($this->context[
'createfromclone']);
1288 $this->db->commit();
1291 $this->db->rollback();
1306 global $conf, $hookmanager;
1313 $this->date_commande =
dol_now();
1317 $num = count($object->lines);
1318 for ($i = 0; $i < $num; $i++) {
1321 $line->libelle = $object->lines[$i]->libelle;
1322 $line->label = $object->lines[$i]->label;
1323 $line->desc = $object->lines[$i]->desc;
1324 $line->price = $object->lines[$i]->price;
1325 $line->subprice = $object->lines[$i]->subprice;
1326 $line->vat_src_code = $object->lines[$i]->vat_src_code;
1327 $line->tva_tx = $object->lines[$i]->tva_tx;
1328 $line->localtax1_tx = $object->lines[$i]->localtax1_tx;
1329 $line->localtax2_tx = $object->lines[$i]->localtax2_tx;
1330 $line->qty = $object->lines[$i]->qty;
1331 $line->fk_remise_except = $object->lines[$i]->fk_remise_except;
1332 $line->remise_percent = $object->lines[$i]->remise_percent;
1333 $line->fk_product = $object->lines[$i]->fk_product;
1334 $line->info_bits = $object->lines[$i]->info_bits;
1335 $line->product_type = $object->lines[$i]->product_type;
1336 $line->rang = $object->lines[$i]->rang;
1337 $line->special_code = $object->lines[$i]->special_code;
1338 $line->fk_parent_line = $object->lines[$i]->fk_parent_line;
1339 $line->fk_unit = $object->lines[$i]->fk_unit;
1341 $line->date_start = $object->lines[$i]->date_start;
1342 $line->date_end = $object->lines[$i]->date_end;
1344 $line->fk_fournprice = $object->lines[$i]->fk_fournprice;
1345 $marginInfos =
getMarginInfos($object->lines[$i]->subprice, $object->lines[$i]->remise_percent, $object->lines[$i]->tva_tx, $object->lines[$i]->localtax1_tx, $object->lines[$i]->localtax2_tx, $object->lines[$i]->fk_fournprice, $object->lines[$i]->pa_ht);
1346 $line->pa_ht = $marginInfos[0];
1347 $line->marge_tx = $marginInfos[1];
1348 $line->marque_tx = $marginInfos[2];
1350 $line->origin = $object->element;
1351 $line->origin_id = $object->lines[$i]->id;
1354 $object->lines[$i]->fetch_optionals();
1355 foreach ($object->lines[$i]->array_options as $options_key => $value) {
1356 $line->array_options[$options_key] = $value;
1359 $this->lines[$i] = $line;
1362 $this->entity = $object->entity;
1363 $this->socid = $object->socid;
1364 $this->fk_project = $object->fk_project;
1365 $this->cond_reglement_id = $object->cond_reglement_id;
1366 $this->deposit_percent = $object->deposit_percent;
1367 $this->mode_reglement_id = $object->mode_reglement_id;
1368 $this->fk_account = $object->fk_account;
1369 $this->availability_id = $object->availability_id;
1370 $this->demand_reason_id = $object->demand_reason_id;
1371 $this->delivery_date = $object->delivery_date;
1372 $this->shipping_method_id = $object->shipping_method_id;
1373 $this->warehouse_id = $object->warehouse_id;
1374 $this->fk_delivery_address = $object->fk_delivery_address;
1375 $this->contact_id = $object->contact_id;
1376 $this->ref_client = $object->ref_client;
1377 $this->ref_customer = $object->ref_client;
1380 $this->note_private = $object->note_private;
1381 $this->note_public = $object->note_public;
1384 $this->origin = $object->element;
1385 $this->origin_id = $object->id;
1388 if (!empty($conf->multicurrency->enabled)) {
1389 if (!empty($object->multicurrency_code)) {
1390 $this->multicurrency_code = $object->multicurrency_code;
1392 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($object->multicurrency_tx)) {
1393 $this->multicurrency_tx = $object->multicurrency_tx;
1396 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1398 $this->fk_multicurrency = $tmparray[0];
1399 $this->multicurrency_tx = $tmparray[1];
1403 if (empty($this->fk_multicurrency)) {
1404 $this->multicurrency_code = $conf->currency;
1405 $this->fk_multicurrency = 0;
1406 $this->multicurrency_tx = 1;
1411 $object->fetch_optionals();
1414 $element_extrafields = $e->fetch_name_optionals_label($this->table_element);
1416 foreach ($object->array_options as $options_key => $value) {
1417 if (array_key_exists(str_replace(
'options_',
'', $options_key), $element_extrafields)) {
1418 $this->array_options[$options_key] = $value;
1422 $this->linked_objects[$this->origin] = $this->origin_id;
1423 if (isset($object->other_linked_objects) && is_array($object->other_linked_objects) && !empty($object->other_linked_objects)) {
1424 $this->linked_objects = array_merge($this->linked_objects, $object->other_linked_objects);
1427 $ret = $this->
create($user);
1431 $hookmanager->initHooks(array(
'orderdao'));
1433 $parameters = array(
'objFrom'=>$object);
1435 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1445 $this->
valid($user);
1497 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)
1499 global $mysoc, $conf, $langs, $user;
1501 $logtext =
"::addline commandeid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent";
1502 $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";
1503 $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";
1504 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
1506 if ($this->
statut == self::STATUS_DRAFT) {
1507 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1517 if (empty($info_bits)) {
1523 if (empty($txtva)) {
1526 if (empty($txlocaltax1)) {
1529 if (empty($txlocaltax2)) {
1532 if (empty($fk_parent_line) || $fk_parent_line < 0) {
1533 $fk_parent_line = 0;
1535 if (empty($this->fk_multicurrency)) {
1536 $this->fk_multicurrency = 0;
1538 if (empty($ref_ext)) {
1545 $pu_ht_devise =
price2num($pu_ht_devise);
1548 if (!preg_match(
'/\((.*)\)/', $txtva)) {
1553 if ($price_base_type ==
'HT') {
1558 $label = trim($label);
1559 $desc = trim($desc);
1566 if ($date_start && $date_end && $date_start > $date_end) {
1567 $langs->load(
"errors");
1568 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1574 $product_type = $type;
1575 if (!empty($fk_product) && $fk_product > 0) {
1576 $product =
new Product($this->db);
1577 $result = $product->fetch($fk_product);
1578 $product_type = $product->type;
1580 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
1581 $langs->load(
"errors");
1582 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
1583 $this->errors[] = $this->error;
1584 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
1585 $this->db->rollback();
1599 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1600 $vat_src_code = $reg[1];
1601 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1604 $tabprice =
calcul_price_total($qty, $pu,
$remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $product_type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
1614 $total_ht = $tabprice[0];
1615 $total_tva = $tabprice[1];
1616 $total_ttc = $tabprice[2];
1617 $total_localtax1 = $tabprice[9];
1618 $total_localtax2 = $tabprice[10];
1619 $pu_ht = $tabprice[3];
1622 $multicurrency_total_ht = $tabprice[16];
1623 $multicurrency_total_tva = $tabprice[17];
1624 $multicurrency_total_ttc = $tabprice[18];
1625 $pu_ht_devise = $tabprice[19];
1629 if ($ranktouse == -1) {
1630 $rangmax = $this->
line_max($fk_parent_line);
1631 $ranktouse = $rangmax + 1;
1640 $price = $pu - $remise;
1646 $this->line->context = $this->context;
1648 $this->line->fk_commande = $this->id;
1649 $this->line->label = $label;
1650 $this->line->desc = $desc;
1651 $this->line->qty = $qty;
1652 $this->line->ref_ext = $ref_ext;
1654 $this->line->vat_src_code = $vat_src_code;
1655 $this->line->tva_tx = $txtva;
1656 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
1657 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
1658 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
1659 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
1660 $this->line->fk_product = $fk_product;
1661 $this->line->product_type = $product_type;
1662 $this->line->fk_remise_except = $fk_remise_except;
1664 $this->line->subprice = $pu_ht;
1665 $this->line->rang = $ranktouse;
1666 $this->line->info_bits = $info_bits;
1667 $this->line->total_ht = $total_ht;
1668 $this->line->total_tva = $total_tva;
1669 $this->line->total_localtax1 = $total_localtax1;
1670 $this->line->total_localtax2 = $total_localtax2;
1671 $this->line->total_ttc = $total_ttc;
1672 $this->line->special_code = $special_code;
1673 $this->line->origin = $origin;
1674 $this->line->origin_id = $origin_id;
1675 $this->line->fk_parent_line = $fk_parent_line;
1676 $this->line->fk_unit = $fk_unit;
1678 $this->line->date_start = $date_start;
1679 $this->line->date_end = $date_end;
1681 $this->line->fk_fournprice = $fk_fournprice;
1682 $this->line->pa_ht = $pa_ht;
1685 $this->line->fk_multicurrency = $this->fk_multicurrency;
1686 $this->line->multicurrency_code = $this->multicurrency_code;
1687 $this->line->multicurrency_subprice = $pu_ht_devise;
1688 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
1689 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
1690 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
1693 $this->line->price = $price;
1695 if (is_array($array_options) && count($array_options) > 0) {
1696 $this->line->array_options = $array_options;
1699 $result = $this->line->insert($user);
1702 if (!empty($fk_parent_line)) {
1704 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
1705 $linecount = count($this->lines);
1706 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
1712 if (empty($noupdateafterinsertline)) {
1717 $this->db->commit();
1718 return $this->line->id;
1720 $this->db->rollback();
1724 $this->error = $this->line->error;
1725 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
1726 $this->db->rollback();
1730 dol_syslog(get_class($this).
"::addline status of order must be Draft to allow use of ->addline()", LOG_ERR);
1753 global $conf, $mysoc;
1759 if ($idproduct > 0) {
1760 $prod =
new Product($this->db);
1761 $prod->fetch($idproduct);
1765 if (empty($tva_tx)) {
1770 $localtax1_tx =
get_localtax($tva_tx, 1, $this->thirdparty, $mysoc, $tva_npr);
1771 $localtax2_tx =
get_localtax($tva_tx, 2, $this->thirdparty, $mysoc, $tva_npr);
1774 if ($conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
1775 $price = $prod->multiprices[$this->thirdparty->price_level];
1777 $price = $prod->price;
1782 $line->context = $this->context;
1784 $line->fk_product = $idproduct;
1785 $line->desc = $prod->description;
1787 $line->subprice = $price;
1789 $line->vat_src_code = $vat_src_code;
1790 $line->tva_tx = $tva_tx;
1791 $line->localtax1_tx = $localtax1_tx;
1792 $line->localtax2_tx = $localtax2_tx;
1794 $line->product_ref = $prod->ref;
1795 $line->product_label = $prod->label;
1796 $line->product_desc = $prod->description;
1797 $line->fk_unit = $prod->fk_unit;
1801 $line->date_start = $date_start;
1804 $line->date_end = $date_end;
1807 $this->lines[] = $line;
1840 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
1843 if (empty($id) && empty($ref) && empty($ref_ext)) {
1847 $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';
1848 $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';
1849 $sql .=
', c.fk_account';
1850 $sql .=
', c.date_commande, c.date_valid, c.tms';
1851 $sql .=
', c.date_livraison as delivery_date';
1852 $sql .=
', c.fk_shipping_method';
1853 $sql .=
', c.fk_warehouse';
1854 $sql .=
', c.fk_projet as fk_project, c.source, c.facture as billed';
1855 $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';
1856 $sql .=
', c.fk_incoterms, c.location_incoterms';
1857 $sql .=
", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
1858 $sql .=
", c.module_source, c.pos_source";
1859 $sql .=
", i.libelle as label_incoterms";
1860 $sql .=
', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
1861 $sql .=
', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
1862 $sql .=
', ca.code as availability_code, ca.label as availability_label';
1863 $sql .=
', dr.code as demand_reason_code';
1864 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commande as c';
1865 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid';
1866 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON c.fk_mode_reglement = p.id';
1867 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON c.fk_availability = ca.rowid';
1868 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON c.fk_input_reason = dr.rowid';
1869 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
1872 $sql .=
" WHERE c.rowid=".((int) $id);
1874 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
1878 $sql .=
" AND c.ref='".$this->db->escape($ref).
"'";
1881 $sql .=
" AND c.ref_ext='".$this->db->escape($ref_ext).
"'";
1884 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1885 $result = $this->db->query($sql);
1887 $obj = $this->db->fetch_object($result);
1889 $this->
id = $obj->rowid;
1890 $this->entity = $obj->entity;
1892 $this->
ref = $obj->ref;
1893 $this->ref_client = $obj->ref_client;
1894 $this->ref_customer = $obj->ref_client;
1895 $this->ref_ext = $obj->ref_ext;
1897 $this->socid = $obj->fk_soc;
1898 $this->thirdparty =
null;
1900 $this->fk_project = $obj->fk_project;
1901 $this->project =
null;
1903 $this->
statut = $obj->fk_statut;
1904 $this->
status = $obj->fk_statut;
1906 $this->user_author_id = $obj->fk_user_author;
1907 $this->user_creation_id = $obj->fk_user_author;
1908 $this->user_validation_id = $obj->fk_user_valid;
1909 $this->user_modification_id = $obj->fk_user_modif;
1910 $this->total_ht = $obj->total_ht;
1911 $this->total_tva = $obj->total_tva;
1912 $this->total_localtax1 = $obj->total_localtax1;
1913 $this->total_localtax2 = $obj->total_localtax2;
1914 $this->total_ttc = $obj->total_ttc;
1915 $this->date = $this->db->jdate($obj->date_commande);
1916 $this->date_commande = $this->db->jdate($obj->date_commande);
1917 $this->date_creation = $this->db->jdate($obj->date_creation);
1918 $this->date_validation = $this->db->jdate($obj->date_valid);
1919 $this->date_modification = $this->db->jdate($obj->tms);
1920 $this->source = $obj->source;
1921 $this->billed = $obj->billed;
1922 $this->note = $obj->note_private;
1923 $this->note_private = $obj->note_private;
1924 $this->note_public = $obj->note_public;
1925 $this->model_pdf = $obj->model_pdf;
1926 $this->last_main_doc = $obj->last_main_doc;
1927 $this->mode_reglement_id = $obj->fk_mode_reglement;
1928 $this->mode_reglement_code = $obj->mode_reglement_code;
1929 $this->mode_reglement = $obj->mode_reglement_libelle;
1930 $this->cond_reglement_id = $obj->fk_cond_reglement;
1931 $this->cond_reglement_code = $obj->cond_reglement_code;
1932 $this->cond_reglement = $obj->cond_reglement_libelle;
1933 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1934 $this->deposit_percent = $obj->deposit_percent;
1935 $this->fk_account = $obj->fk_account;
1936 $this->availability_id = $obj->fk_availability;
1937 $this->availability_code = $obj->availability_code;
1939 $this->demand_reason_id = $obj->fk_input_reason;
1940 $this->demand_reason_code = $obj->demand_reason_code;
1941 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1942 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1943 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
1944 $this->fk_delivery_address = $obj->fk_delivery_address;
1945 $this->module_source = $obj->module_source;
1946 $this->pos_source = $obj->pos_source;
1949 $this->fk_incoterms = $obj->fk_incoterms;
1950 $this->location_incoterms = $obj->location_incoterms;
1951 $this->label_incoterms = $obj->label_incoterms;
1954 $this->fk_multicurrency = $obj->fk_multicurrency;
1955 $this->multicurrency_code = $obj->multicurrency_code;
1956 $this->multicurrency_tx = $obj->multicurrency_tx;
1957 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1958 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1959 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1961 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
1963 $this->lines = array();
1969 $this->db->free($result);
1978 $this->error =
'Order with id '.$id.
' not found sql='.$sql;
1982 $this->error = $this->db->error();
2000 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2001 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
2006 $result = $remise->fetch($idremise);
2009 if ($remise->fk_facture) {
2010 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
2011 $this->db->rollback();
2017 $line->fk_commande = $this->id;
2018 $line->fk_remise_except = $remise->id;
2019 $line->desc = $remise->description;
2020 $line->vat_src_code = $remise->vat_src_code;
2021 $line->tva_tx = $remise->tva_tx;
2022 $line->subprice = -$remise->amount_ht;
2023 $line->price = -$remise->amount_ht;
2024 $line->fk_product = 0;
2026 $line->remise_percent = 0;
2028 $line->info_bits = 2;
2030 $line->total_ht = -$remise->amount_ht;
2031 $line->total_tva = -$remise->amount_tva;
2032 $line->total_ttc = -$remise->amount_ttc;
2034 $result = $line->insert();
2038 $this->db->commit();
2041 $this->db->rollback();
2045 $this->error = $line->error;
2046 $this->errors = $line->errors;
2047 $this->db->rollback();
2051 $this->db->rollback();
2065 public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
2068 global $langs, $conf;
2070 $this->lines = array();
2072 $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,';
2073 $sql .=
' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.fk_remise_except, l.remise_percent, l.subprice, l.fk_product_fournisseur_price as fk_fournprice, l.buy_price_ht as pa_ht, l.rang, l.info_bits, l.special_code,';
2074 $sql .=
' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
2075 $sql .=
' l.fk_unit,';
2076 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2077 $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,';
2078 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units';
2079 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commandedet as l';
2080 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (p.rowid = l.fk_product)';
2081 $sql .=
' WHERE l.fk_commande = '.((int) $this->
id);
2082 if ($only_product) {
2083 $sql .=
' AND p.fk_product_type = 0';
2085 $sql .=
' ORDER BY l.rang, l.rowid';
2087 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
2088 $result = $this->db->query($sql);
2090 $num = $this->db->num_rows($result);
2094 $objp = $this->db->fetch_object($result);
2098 $line->rowid = $objp->rowid;
2099 $line->id = $objp->rowid;
2100 $line->fk_commande = $objp->fk_commande;
2101 $line->commande_id = $objp->fk_commande;
2102 $line->label = $objp->custom_label;
2103 $line->desc = $objp->description;
2104 $line->description = $objp->description;
2105 $line->product_type = $objp->product_type;
2106 $line->qty = $objp->qty;
2107 $line->ref_ext = $objp->ref_ext;
2109 $line->vat_src_code = $objp->vat_src_code;
2110 $line->tva_tx = $objp->tva_tx;
2111 $line->localtax1_tx = $objp->localtax1_tx;
2112 $line->localtax2_tx = $objp->localtax2_tx;
2113 $line->localtax1_type = $objp->localtax1_type;
2114 $line->localtax2_type = $objp->localtax2_type;
2115 $line->total_ht = $objp->total_ht;
2116 $line->total_ttc = $objp->total_ttc;
2117 $line->total_tva = $objp->total_tva;
2118 $line->total_localtax1 = $objp->total_localtax1;
2119 $line->total_localtax2 = $objp->total_localtax2;
2120 $line->subprice = $objp->subprice;
2121 $line->fk_remise_except = $objp->fk_remise_except;
2122 $line->remise_percent = $objp->remise_percent;
2123 $line->price = $objp->price;
2124 $line->fk_product = $objp->fk_product;
2125 $line->fk_fournprice = $objp->fk_fournprice;
2126 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
2127 $line->pa_ht = $marginInfos[0];
2128 $line->marge_tx = $marginInfos[1];
2129 $line->marque_tx = $marginInfos[2];
2130 $line->rang = $objp->rang;
2131 $line->info_bits = $objp->info_bits;
2132 $line->special_code = $objp->special_code;
2133 $line->fk_parent_line = $objp->fk_parent_line;
2135 $line->ref = $objp->product_ref;
2136 $line->libelle = $objp->product_label;
2138 $line->product_ref = $objp->product_ref;
2139 $line->product_label = $objp->product_label;
2140 $line->product_tosell = $objp->product_tosell;
2141 $line->product_tobuy = $objp->product_tobuy;
2142 $line->product_desc = $objp->product_desc;
2143 $line->product_tobatch = $objp->product_tobatch;
2144 $line->product_barcode = $objp->product_barcode;
2146 $line->fk_product_type = $objp->fk_product_type;
2147 $line->fk_unit = $objp->fk_unit;
2149 $line->weight = $objp->weight;
2150 $line->weight_units = $objp->weight_units;
2151 $line->volume = $objp->volume;
2152 $line->volume_units = $objp->volume_units;
2154 $line->date_start = $this->db->jdate($objp->date_start);
2155 $line->date_end = $this->db->jdate($objp->date_end);
2158 $line->fk_multicurrency = $objp->fk_multicurrency;
2159 $line->multicurrency_code = $objp->multicurrency_code;
2160 $line->multicurrency_subprice = $objp->multicurrency_subprice;
2161 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
2162 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
2163 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2165 $line->fetch_optionals();
2168 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
2169 $tmpproduct =
new Product($this->db);
2170 $tmpproduct->fetch($objp->fk_product);
2171 $tmpproduct->getMultiLangs();
2173 $line->multilangs = $tmpproduct->multilangs;
2176 $this->lines[$i] = $line;
2181 $this->db->free($result);
2185 $this->error = $this->db->error();
2199 foreach ($this->lines as $line) {
2200 if ($line->product_type == 0) {
2215 foreach ($this->lines as $line) {
2216 if ($line->product_type == 1) {
2232 $sql =
'SELECT COUNT(DISTINCT ed.fk_expedition) as nb';
2233 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2234 $sql .=
' '.MAIN_DB_PREFIX.
'commandedet as cd';
2236 $sql .=
' ed.fk_origin_line = cd.rowid';
2237 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2240 dol_syslog(get_class($this).
"::getNbOfShipments", LOG_DEBUG);
2241 $resql = $this->db->query($sql);
2243 $obj = $this->db->fetch_object($resql);
2248 $this->db->free($resql);
2251 $this->error = $this->db->lasterror();
2266 $this->expeditions = array();
2268 $sql =
'SELECT cd.rowid, cd.fk_product,';
2269 $sql .=
' sum(ed.qty) as qty';
2270 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2271 if ($filtre_statut >= 0) {
2272 $sql .=
' '.MAIN_DB_PREFIX.
'expedition as e,';
2274 $sql .=
' '.MAIN_DB_PREFIX.
'commandedet as cd';
2276 if ($filtre_statut >= 0) {
2277 $sql .=
' ed.fk_expedition = e.rowid AND';
2279 $sql .=
' ed.fk_origin_line = cd.rowid';
2280 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2281 if ($fk_product > 0) {
2282 $sql .=
' AND cd.fk_product = '.((int) $fk_product);
2284 if ($filtre_statut >= 0) {
2285 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
2287 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
2290 dol_syslog(get_class($this).
"::loadExpeditions", LOG_DEBUG);
2291 $resql = $this->db->query($sql);
2293 $num = $this->db->num_rows($resql);
2296 $obj = $this->db->fetch_object($resql);
2297 $this->expeditions[$obj->rowid] = $obj->qty;
2300 $this->db->free($resql);
2303 $this->error = $this->db->lasterror();
2315 $sql =
'SELECT count(*)';
2316 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expedition as e';
2317 $sql .=
', '.MAIN_DB_PREFIX.
'element_element as el';
2318 $sql .=
' WHERE el.fk_source = '.((int) $this->
id);
2319 $sql .=
" AND el.sourcetype = 'commande'";
2320 $sql .=
" AND el.fk_target = e.rowid";
2321 $sql .=
" AND el.targettype = 'shipping'";
2323 $resql = $this->db->query($sql);
2325 $row = $this->db->fetch_row($resql);
2383 if ($this->
statut == self::STATUS_DRAFT) {
2389 $line->context = $this->context;
2392 $line->fetch($lineid);
2394 if ($id > 0 && $line->fk_commande != $id) {
2395 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
2400 $staticline = clone $line;
2401 $line->oldline = $staticline;
2403 if ($line->delete($user) > 0) {
2407 $this->db->commit();
2410 $this->db->rollback();
2411 $this->error = $this->db->lasterror();
2415 $this->db->rollback();
2416 $this->error = $line->error;
2420 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
2439 dol_syslog(get_class($this).
"::set_remise is deprecated, use setDiscount instead", LOG_NOTICE);
2440 return $this->
setDiscount($user, $remise, $notrigger);
2454 $remise = trim($remise) ? trim($remise) : 0;
2456 if ($user->hasRight(
'commande',
'creer')) {
2463 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
2464 $sql .=
' SET remise_percent = '.((float) $remise);
2465 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_DRAFT);
2468 $resql = $this->db->query($sql);
2470 $this->errors[] = $this->db->error();
2475 $this->oldcopy = clone $this;
2476 $this->remise_percent = $remise;
2480 if (!$notrigger && empty($error)) {
2490 $this->db->commit();
2493 foreach ($this->errors as $errmsg) {
2494 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2495 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2497 $this->db->rollback();
2585 if ($user->hasRight(
'commande',
'creer')) {
2590 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
2591 $sql .=
" SET date_commande = ".($date ?
"'".$this->db->idate($date).
"'" :
'null');
2592 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = ".((int) self::STATUS_DRAFT);
2595 $resql = $this->db->query($sql);
2597 $this->errors[] = $this->db->error();
2602 $this->oldcopy = clone $this;
2603 $this->date = $date;
2606 if (!$notrigger && empty($error)) {
2616 $this->db->commit();
2619 foreach ($this->errors as $errmsg) {
2620 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2621 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2623 $this->db->rollback();
2657 if ($user->hasRight(
'commande',
'creer')) {
2662 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
2663 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2664 $sql .=
" WHERE rowid = ".((int) $this->
id);
2667 $resql = $this->db->query($sql);
2669 $this->errors[] = $this->db->error();
2674 $this->oldcopy = clone $this;
2675 $this->delivery_date = $delivery_date;
2678 if (!$notrigger && empty($error)) {
2688 $this->db->commit();
2691 foreach ($this->errors as $errmsg) {
2692 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2693 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2695 $this->db->rollback();
2717 public function liste_array($shortlist = 0, $draft = 0, $excluser =
null, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'c.date_commande', $sortorder =
'DESC')
2724 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2725 $sql .=
" c.rowid as cid, c.ref";
2726 if (!$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2727 $sql .=
", sc.fk_soc, sc.fk_user";
2729 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"commande as c";
2730 if (!$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2731 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
2733 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2734 $sql .=
" AND c.fk_soc = s.rowid";
2735 if (!$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2736 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2739 $sql .=
" AND s.rowid = ".((int) $socid);
2742 $sql .=
" AND c.fk_statut = ".self::STATUS_DRAFT;
2744 if (is_object($excluser)) {
2745 $sql .=
" AND c.fk_user_author <> ".((int) $excluser->id);
2747 $sql .= $this->db->order($sortfield, $sortorder);
2748 $sql .= $this->db->plimit($limit, $offset);
2750 $result = $this->db->query($sql);
2752 $numc = $this->db->num_rows($result);
2755 while ($i < $numc) {
2756 $obj = $this->db->fetch_object($result);
2758 if ($shortlist == 1) {
2759 $ga[$obj->cid] = $obj->ref;
2760 } elseif ($shortlist == 2) {
2761 $ga[$obj->cid] = $obj->ref.
' ('.$obj->name.
')';
2763 $ga[$i][
'id'] = $obj->cid;
2764 $ga[$i][
'ref'] = $obj->ref;
2765 $ga[$i][
'name'] = $obj->name;
2788 dol_syslog(
'Commande::availability('.$availability_id.
')');
2789 if ($this->
statut >= self::STATUS_DRAFT) {
2794 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
2795 $sql .=
' SET fk_availability = '.((int) $availability_id);
2796 $sql .=
' WHERE rowid='.((int) $this->
id);
2799 $resql = $this->db->query($sql);
2801 $this->errors[] = $this->db->error();
2806 $this->oldcopy = clone $this;
2807 $this->availability_id = $availability_id;
2810 if (!$notrigger && empty($error)) {
2820 $this->db->commit();
2823 foreach ($this->errors as $errmsg) {
2824 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2825 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2827 $this->db->rollback();
2831 $error_str =
'Command status do not meet requirement '.$this->statut;
2833 $this->error = $error_str;
2834 $this->errors[] = $this->error;
2852 dol_syslog(
'Commande::demand_reason('.$demand_reason_id.
')');
2853 if ($this->
statut >= self::STATUS_DRAFT) {
2858 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
2859 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
2860 $sql .=
' WHERE rowid='.((int) $this->
id);
2863 $resql = $this->db->query($sql);
2865 $this->errors[] = $this->db->error();
2870 $this->oldcopy = clone $this;
2871 $this->demand_reason_id = $demand_reason_id;
2874 if (!$notrigger && empty($error)) {
2884 $this->db->commit();
2887 foreach ($this->errors as $errmsg) {
2888 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2889 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2891 $this->db->rollback();
2895 $error_str =
'order status do not meet requirement '.$this->statut;
2897 $this->error = $error_str;
2898 $this->errors[] = $this->error;
2915 if ($user->hasRight(
'commande',
'creer')) {
2920 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande SET';
2921 $sql .=
' ref_client = '.(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2922 $sql .=
' WHERE rowid = '.((int) $this->
id);
2924 dol_syslog(__METHOD__.
' this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2925 $resql = $this->db->query($sql);
2927 $this->errors[] = $this->db->error();
2932 $this->oldcopy = clone $this;
2933 $this->ref_client = $ref_client;
2934 $this->ref_customer = $ref_client;
2937 if (!$notrigger && empty($error)) {
2946 $this->db->commit();
2949 foreach ($this->errors as $errmsg) {
2950 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2951 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2953 $this->db->rollback();
2972 if ($this->billed) {
2978 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande SET facture = 1';
2981 dol_syslog(get_class($this).
"::classifyBilled", LOG_DEBUG);
2982 if ($this->db->query($sql)) {
2984 $this->oldcopy = clone $this;
2988 if (!$notrigger && empty($error)) {
2990 $result = $this->
call_trigger(
'ORDER_CLASSIFY_BILLED', $user);
2998 $this->db->commit();
3001 foreach ($this->errors as $errmsg) {
3002 dol_syslog(get_class($this).
"::classifyBilled ".$errmsg, LOG_ERR);
3003 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3005 $this->db->rollback();
3009 $this->error = $this->db->error();
3010 $this->db->rollback();
3028 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande SET facture = 0';
3031 dol_syslog(get_class($this).
"::classifyUnBilled", LOG_DEBUG);
3032 if ($this->db->query($sql)) {
3034 $this->oldcopy = clone $this;
3038 if (!$notrigger && empty($error)) {
3040 $result = $this->
call_trigger(
'ORDER_CLASSIFY_UNBILLED', $user);
3050 $this->db->commit();
3053 foreach ($this->errors as $errmsg) {
3054 dol_syslog(get_class($this).
"::classifyUnBilled ".$errmsg, LOG_ERR);
3055 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3057 $this->db->rollback();
3061 $this->error = $this->db->error();
3062 $this->db->rollback();
3098 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)
3100 global $conf, $mysoc, $langs, $user;
3102 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");
3103 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3110 if (empty($info_bits)) {
3113 if (empty($txtva)) {
3116 if (empty($txlocaltax1)) {
3119 if (empty($txlocaltax2)) {
3125 if (empty($special_code) || $special_code == 3) {
3128 if (empty($ref_ext)) {
3132 if ($date_start && $date_end && $date_start > $date_end) {
3133 $langs->load(
"errors");
3134 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
3142 $pu_ht_devise =
price2num($pu_ht_devise);
3143 if (!preg_match(
'/\((.*)\)/', $txtva)) {
3161 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
3162 $vat_src_code = $reg[1];
3163 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
3166 $tabprice =
calcul_price_total($qty, $pu,
$remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type, 100, $this->multicurrency_tx, $pu_ht_devise);
3168 $total_ht = $tabprice[0];
3169 $total_tva = $tabprice[1];
3170 $total_ttc = $tabprice[2];
3171 $total_localtax1 = $tabprice[9];
3172 $total_localtax2 = $tabprice[10];
3173 $pu_ht = $tabprice[3];
3174 $pu_tva = $tabprice[4];
3175 $pu_ttc = $tabprice[5];
3178 $multicurrency_total_ht = $tabprice[16];
3179 $multicurrency_total_tva = $tabprice[17];
3180 $multicurrency_total_ttc = $tabprice[18];
3181 $pu_ht_devise = $tabprice[19];
3185 if ($price_base_type ==
'TTC') {
3186 $subprice = $pu_ttc;
3193 $price = ($pu - $remise);
3198 $line->fetch($rowid);
3199 $line->fetch_optionals();
3201 if (!empty($line->fk_product)) {
3202 $product =
new Product($this->db);
3203 $result = $product->fetch($line->fk_product);
3204 $product_type = $product->type;
3206 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
3207 $langs->load(
"errors");
3208 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
3209 $this->errors[] = $this->error;
3211 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
3213 $this->db->rollback();
3218 $staticline = clone $line;
3220 $line->oldline = $staticline;
3221 $this->line = $line;
3222 $this->line->context = $this->context;
3223 $this->line->rang = $rang;
3226 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
3227 $rangmax = $this->
line_max($fk_parent_line);
3228 $this->line->rang = $rangmax + 1;
3231 $this->line->id = $rowid;
3232 $this->line->label = $label;
3233 $this->line->desc = $desc;
3234 $this->line->qty = $qty;
3235 $this->line->ref_ext = $ref_ext;
3237 $this->line->vat_src_code = $vat_src_code;
3238 $this->line->tva_tx = $txtva;
3239 $this->line->localtax1_tx = $txlocaltax1;
3240 $this->line->localtax2_tx = $txlocaltax2;
3241 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
3242 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
3244 $this->line->subprice = $subprice;
3245 $this->line->info_bits = $info_bits;
3246 $this->line->special_code = $special_code;
3247 $this->line->total_ht = $total_ht;
3248 $this->line->total_tva = $total_tva;
3249 $this->line->total_localtax1 = $total_localtax1;
3250 $this->line->total_localtax2 = $total_localtax2;
3251 $this->line->total_ttc = $total_ttc;
3252 $this->line->date_start = $date_start;
3253 $this->line->date_end = $date_end;
3254 $this->line->product_type = $type;
3255 $this->line->fk_parent_line = $fk_parent_line;
3256 $this->line->skip_update_total = $skip_update_total;
3257 $this->line->fk_unit = $fk_unit;
3259 $this->line->fk_fournprice = $fk_fournprice;
3260 $this->line->pa_ht = $pa_ht;
3263 $this->line->multicurrency_subprice = $pu_ht_devise;
3264 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
3265 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
3266 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
3269 $this->line->price = $price;
3271 if (is_array($array_options) && count($array_options) > 0) {
3273 foreach ($array_options as $key => $value) {
3274 $this->line->array_options[$key] = $array_options[$key];
3278 $result = $this->line->update($user, $notrigger);
3281 if (!empty($fk_parent_line)) {
3288 $this->db->commit();
3291 $this->error = $this->line->error;
3293 $this->db->rollback();
3297 $this->error = get_class($this).
"::updateline Order status makes operation forbidden";
3298 $this->errors = array(
'OrderStatusMakeOperationForbidden');
3317 if (isset($this->
ref)) {
3318 $this->
ref = trim($this->
ref);
3320 if (isset($this->ref_client)) {
3321 $this->ref_client = trim($this->ref_client);
3323 if (isset($this->ref_customer)) {
3324 $this->ref_customer = trim($this->ref_customer);
3326 if (isset($this->note) || isset($this->note_private)) {
3327 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
3329 if (isset($this->note_public)) {
3330 $this->note_public = trim($this->note_public);
3332 if (isset($this->model_pdf)) {
3333 $this->model_pdf = trim($this->model_pdf);
3335 if (isset($this->import_key)) {
3336 $this->import_key = trim($this->import_key);
3338 $delivery_date = $this->delivery_date;
3344 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande SET";
3346 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
3347 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
3348 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
3349 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
3350 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
3351 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
3352 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
3353 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
3354 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
3355 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
3356 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
3357 $sql .=
" fk_statut=".(isset($this->
statut) ? $this->
statut :
"null").
",";
3358 $sql .=
" fk_user_modif=".(isset($user->id) ? $user->id :
"null").
",";
3359 $sql .=
" fk_user_valid=".((isset($this->user_validation_id) && $this->user_validation_id > 0) ? $this->user_validation_id :
"null").
",";
3360 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
3361 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
3362 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ? strval($this->deposit_percent) :
"null").
",";
3363 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
3364 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
3365 $sql .=
" fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id :
"null").
",";
3366 $sql .=
" fk_account=".($this->fk_account > 0 ? $this->fk_account :
"null").
",";
3367 $sql .=
" fk_input_reason=".($this->demand_reason_id > 0 ? $this->demand_reason_id :
"null").
",";
3368 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
3369 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
3370 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
3371 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
3373 $sql .=
" WHERE rowid=".((int) $this->
id);
3377 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3378 $resql = $this->db->query($sql);
3381 $this->errors[] =
"Error ".$this->db->lasterror();
3391 if (!$error && !$notrigger) {
3402 foreach ($this->errors as $errmsg) {
3403 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
3404 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3406 $this->db->rollback();
3409 $this->db->commit();
3421 public function delete($user, $notrigger = 0)
3423 global $conf, $langs;
3424 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3428 dol_syslog(get_class($this).
"::delete ".$this->
id, LOG_DEBUG);
3443 $this->errors[] = $langs->trans(
'SomeShipmentExists');
3448 if (!$error && !empty($this->table_element_line)) {
3449 $tabletodelete = $this->table_element_line;
3450 $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).
")";
3451 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3452 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3454 $this->error = $this->db->lasterror();
3455 $this->errors[] = $this->error;
3456 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3481 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3487 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3488 $res = $this->db->query($sql);
3491 $this->error = $this->db->lasterror();
3492 $this->errors[] = $this->error;
3493 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3509 if ($conf->commande->multidir_output[$this->entity] && !empty($this->
ref)) {
3510 $dir = $conf->commande->multidir_output[$this->entity].
"/".$ref;
3511 $file = $dir.
"/".$ref.
".pdf";
3512 if (file_exists($file)) {
3516 $this->error =
'ErrorFailToDeleteFile';
3517 $this->errors[] = $this->error;
3518 $this->db->rollback();
3522 if (file_exists($dir)) {
3525 $this->error =
'ErrorFailToDeleteDir';
3526 $this->errors[] = $this->error;
3527 $this->db->rollback();
3535 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3536 $this->db->commit();
3539 $this->db->rollback();
3556 global $conf, $langs;
3560 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht";
3561 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande as c";
3562 if (!$user->hasRight(
'societe',
'client',
'voir') && !$user->socid) {
3563 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc";
3564 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3567 $sql .= $clause.
" c.entity IN (".
getEntity(
'commande').
")";
3569 if ($mode ==
'toship') {
3571 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
")";
3573 if ($mode ==
'tobill') {
3575 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
", " . self::STATUS_CLOSED .
") AND c.facture = 0";
3577 if ($mode ==
'shippedtobill') {
3579 $sql .=
" AND c.fk_statut IN (" . self::STATUS_CLOSED .
") AND c.facture = 0";
3582 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3585 $resql = $this->db->query($sql);
3588 $label = $labelShort = $url =
'';
3589 if ($mode ==
'toship') {
3590 $delay_warning = $conf->commande->client->warning_delay / 60 / 60 / 24;
3591 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-2&mainmenu=commercial&leftmenu=orders';
3592 $label = $langs->transnoentitiesnoconv(
"OrdersToProcess");
3593 $labelShort = $langs->transnoentitiesnoconv(
"Opened");
3595 if ($mode ==
'tobill') {
3596 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3597 $label = $langs->trans(
"OrdersToBill");
3598 $labelShort = $langs->trans(
"ToBill");
3600 if ($mode ==
'shippedtobill') {
3601 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3602 $label = $langs->trans(
"OrdersToBill");
3603 $labelShort = $langs->trans(
"StatusOrderDelivered").
' '.$langs->trans(
"and").
' '.$langs->trans(
"ToBill");
3607 $response->warning_delay = $delay_warning;
3608 $response->label = $label;
3609 $response->labelShort = $labelShort;
3610 $response->url = $url;
3613 $generic_commande =
new Commande($this->db);
3615 while ($obj = $this->db->fetch_object($resql)) {
3616 $response->nbtodo++;
3617 $response->total += $obj->total_ht;
3619 $generic_commande->statut = $obj->fk_statut;
3620 $generic_commande->date_commande = $this->db->jdate($obj->date_commande);
3621 $generic_commande->date = $this->db->jdate($obj->date_commande);
3622 $generic_commande->delivery_date = $this->db->jdate($obj->delivery_date);
3624 if ($mode ==
'toship' && $generic_commande->hasDelay()) {
3625 $response->nbtodolate++;
3631 $this->error = $this->db->error();
3645 $label = $langs->trans(
'OrderSource'.$this->source);
3647 if ($label ==
'OrderSource') {
3674 public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
3677 global $langs, $hookmanager;
3680 if (empty($donotshowbilled)) {
3681 $billedtext .= ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3686 if ($status == self::STATUS_CANCELED) {
3687 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderCanceled');
3688 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderCanceledShort');
3689 $statusType =
'status9';
3690 } elseif ($status == self::STATUS_DRAFT) {
3691 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDraft');
3692 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDraftShort');
3693 $statusType =
'status0';
3694 } elseif ($status == self::STATUS_VALIDATED) {
3695 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderValidated').$billedtext;
3696 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderValidatedShort').$billedtext;
3697 $statusType =
'status1';
3698 } elseif ($status == self::STATUS_SHIPMENTONPROCESS) {
3699 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderSent').$billedtext;
3700 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderSentShort').$billedtext;
3701 $labelTooltip = $langs->transnoentitiesnoconv(
"StatusOrderSent");
3702 if (!empty($this->delivery_date)) {
3703 $labelTooltip .=
' - '.$langs->transnoentitiesnoconv(
"DateDeliveryPlanned").dol_print_date($this->delivery_date,
'day').$billedtext;
3705 $statusType =
'status4';
3706 } elseif ($status == self::STATUS_CLOSED) {
3707 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDelivered').$billedtext;
3708 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDeliveredShort').$billedtext;
3709 $statusType =
'status6';
3711 $labelStatus = $langs->transnoentitiesnoconv(
'Unknown');
3712 $labelStatusShort =
'';
3717 $parameters = array(
3718 'status' => $status,
3720 'billed' => $billed,
3721 'donotshowbilled' => $donotshowbilled
3724 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3727 return $hookmanager->resPrint;
3730 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode,
'', array(
'tooltip' => $labelTooltip));
3741 global $conf, $langs, $user;
3743 $langs->load(
'orders');
3745 $nofetch = !empty($params[
'nofetch']);
3748 return [
'optimize' => $langs->trans(
"Order")];
3751 if ($user->hasRight(
'commande',
'lire')) {
3752 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"Order").
'</u>';
3753 if (isset($this->
statut)) {
3754 $datas[
'status'] =
' '.$this->getLibStatut(5);
3756 $datas[
'Ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3758 $langs->load(
'companies');
3759 if (empty($this->thirdparty)) {
3762 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3764 $datas[
'RefCustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.(empty($this->ref_customer) ? (empty($this->ref_client) ?
'' : $this->ref_client) : $this->ref_customer);
3766 $langs->load(
'project');
3767 if (empty($this->project)) {
3770 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0, 1);
3774 if (!empty($this->total_ht)) {
3775 $datas[
'AmountHT'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
3777 if (!empty($this->total_tva)) {
3778 $datas[
'VAT'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
3780 if (!empty($this->total_ttc)) {
3781 $datas[
'AmountTTC'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
3783 if (!empty($this->date)) {
3784 $datas[
'Date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
3786 if (!empty($this->delivery_date)) {
3787 $datas[
'DeliveryDate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3807 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target =
'')
3809 global $conf, $langs, $user, $hookmanager;
3811 if (!empty($conf->dol_no_mouse_hover)) {
3817 if (isModEnabled(
"expedition") && ($option ==
'1' || $option ==
'2')) {
3818 $url = DOL_URL_ROOT.
'/expedition/shipment.php?id='.$this->id;
3820 $url = DOL_URL_ROOT.
'/commande/card.php?id='.$this->id;
3823 if (!$user->hasRight(
'commande',
'lire')) {
3827 if ($option !==
'nolink') {
3829 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3830 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3831 $add_save_lastsearch_values = 1;
3833 if ($add_save_lastsearch_values) {
3834 $url .=
'&save_lastsearch_values=1';
3843 'objecttype' => $this->element,
3844 'option' => $option,
3847 $classfortooltip =
'classfortooltip';
3850 $classfortooltip =
'classforajaxtooltip';
3851 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3858 if (empty($notooltip) && $user->hasRight(
'commande',
'lire')) {
3860 $label = $langs->trans(
"Order");
3861 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
3863 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
3864 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3866 $target_value = array(
'_self',
'_blank',
'_parent',
'_top');
3867 if (in_array($target, $target_value)) {
3868 $linkclose .=
' target="'.dol_escape_htmltag($target).
'"';
3872 $linkstart =
'<a href="'.$url.
'"';
3873 $linkstart .= $linkclose.
'>';
3876 if ($option ===
'nolink') {
3881 $result .= $linkstart;
3883 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
3885 if ($withpicto != 2) {
3886 $result .= $this->ref;
3888 $result .= $linkend;
3890 if ($addlinktonotes) {
3891 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
3894 $result .=
' <span class="note inline-block">';
3895 $result .=
'<a href="'.DOL_URL_ROOT.
'/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
3900 $result .=
'</span>';
3905 $hookmanager->initHooks(array($this->element .
'dao'));
3906 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
3907 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
3909 $result = $hookmanager->resPrint;
3911 $result .= $hookmanager->resPrint;
3925 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem,';
3926 $sql .=
' date_valid as datev,';
3927 $sql .=
' date_cloture as datecloture,';
3928 $sql .=
' fk_user_author, fk_user_valid, fk_user_cloture';
3929 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commande as c';
3930 $sql .=
' WHERE c.rowid = '.((int) $id);
3931 $result = $this->db->query($sql);
3933 if ($this->db->num_rows($result)) {
3934 $obj = $this->db->fetch_object($result);
3935 $this->
id = $obj->rowid;
3936 if ($obj->fk_user_author) {
3937 $this->user_creation_id = $obj->fk_user_author;
3939 if ($obj->fk_user_valid) {
3940 $this->user_validation_id = $obj->fk_user_valid;
3942 if ($obj->fk_user_cloture) {
3943 $this->user_closing_id = $obj->fk_user_cloture;
3946 $this->date_creation = $this->db->jdate($obj->datec);
3947 $this->date_modification = $this->db->jdate($obj->datem);
3948 $this->date_validation = $this->db->jdate($obj->datev);
3949 $this->date_cloture = $this->db->jdate($obj->datecloture);
3952 $this->db->free($result);
3968 global $conf, $langs;
3970 dol_syslog(get_class($this).
"::initAsSpecimen");
3975 $sql =
"SELECT rowid";
3976 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
3977 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
3978 $sql .= $this->db->plimit(100);
3980 $resql = $this->db->query($sql);
3982 $num_prods = $this->db->num_rows($resql);
3984 while ($i < $num_prods) {
3986 $row = $this->db->fetch_row($resql);
3987 $prodids[$i] = $row[0];
3993 $this->
ref =
'SPECIMEN';
3994 $this->specimen = 1;
3995 $this->entity = $conf->entity;
3997 $this->date = time();
3998 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
3999 $this->cond_reglement_code =
'RECEP';
4000 $this->mode_reglement_code =
'CHQ';
4001 $this->availability_code =
'DSP';
4002 $this->demand_reason_code =
'SRC_00';
4004 $this->note_public =
'This is a comment (public)';
4005 $this->note_private =
'This is a comment (private)';
4007 $this->multicurrency_tx = 1;
4008 $this->multicurrency_code = $conf->currency;
4013 while ($xnbp < $nbp) {
4016 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
4018 $line->subprice = 100;
4022 $line->total_ht = 50;
4023 $line->total_ttc = 60;
4024 $line->total_tva = 10;
4025 $line->remise_percent = 50;
4027 $line->total_ht = 100;
4028 $line->total_ttc = 120;
4029 $line->total_tva = 20;
4030 $line->remise_percent = 0;
4032 if ($num_prods > 0) {
4033 $prodid = mt_rand(1, $num_prods);
4034 $line->fk_product = $prodids[$prodid];
4035 $line->product_ref =
'SPECIMEN';
4038 $this->lines[$xnbp] = $line;
4040 $this->total_ht += $line->total_ht;
4041 $this->total_tva += $line->total_tva;
4042 $this->total_ttc += $line->total_ttc;
4060 $this->nb = array();
4063 $sql =
"SELECT count(co.rowid) as nb";
4064 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande as co";
4065 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON co.fk_soc = s.rowid";
4066 if (!$user->hasRight(
'societe',
'client',
'voir') && !$user->socid) {
4067 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
4068 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
4071 $sql .=
" ".$clause.
" co.entity IN (".
getEntity(
'commande').
")";
4073 $resql = $this->db->query($sql);
4075 while ($obj = $this->db->fetch_object($resql)) {
4076 $this->nb[
"orders"] = $obj->nb;
4078 $this->db->free($resql);
4082 $this->error = $this->db->error();
4108 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
4110 global $conf, $langs;
4112 $langs->load(
"orders");
4113 $outputlangs->load(
"products");
4116 $modele =
'einstein';
4118 if (!empty($this->model_pdf)) {
4119 $modele = $this->model_pdf;
4121 $modele = $conf->global->COMMANDE_ADDON_PDF;
4125 $modelpath =
"core/modules/commande/doc/";
4127 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4180 return max($this->date, $this->delivery_date) < ($now - $conf->commande->client->warning_delay);
4190 global $conf, $langs;
4192 if (empty($this->delivery_date)) {
4193 $text = $langs->trans(
"OrderDate").
' '.
dol_print_date($this->date,
'day');
4195 $text = $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
4197 $text .=
' '.($conf->commande->client->warning_delay > 0 ?
'+' :
'-').
' '.round(abs($conf->commande->client->warning_delay) / 3600 / 24, 1).
' '.$langs->trans(
"days").
' < '.$langs->trans(
"Today");
4212 public $element =
'commandedet';
4214 public $table_element =
'commandedet';
4222 public $fk_commande;
4230 public $commande_id;
4232 public $fk_parent_line;
4244 public $fk_remise_except;
4250 public $fk_fournprice;
4270 public $skip_update_total;
4291 $sql =
'SELECT cd.rowid, cd.fk_commande, cd.fk_parent_line, cd.fk_product, cd.product_type, cd.label as custom_label, cd.description, cd.price, cd.qty, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx,';
4292 $sql .=
' cd.remise, cd.remise_percent, cd.fk_remise_except, cd.subprice, cd.ref_ext,';
4293 $sql .=
' cd.info_bits, cd.total_ht, cd.total_tva, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.fk_product_fournisseur_price as fk_fournprice, cd.buy_price_ht as pa_ht, cd.rang, cd.special_code,';
4294 $sql .=
' cd.fk_unit,';
4295 $sql .=
' cd.fk_multicurrency, cd.multicurrency_code, cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc,';
4296 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc, p.tobatch as product_tobatch,';
4297 $sql .=
' cd.date_start, cd.date_end, cd.vat_src_code';
4298 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commandedet as cd';
4299 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON cd.fk_product = p.rowid';
4300 $sql .=
' WHERE cd.rowid = '.((int) $rowid);
4301 $result = $this->db->query($sql);
4303 $objp = $this->db->fetch_object($result);
4306 $this->error =
'OrderLine with id '. $rowid .
' not found sql='.$sql;
4310 $this->
rowid = $objp->rowid;
4311 $this->
id = $objp->rowid;
4312 $this->fk_commande = $objp->fk_commande;
4313 $this->fk_parent_line = $objp->fk_parent_line;
4314 $this->label = $objp->custom_label;
4315 $this->desc = $objp->description;
4316 $this->qty = $objp->qty;
4317 $this->
price = $objp->price;
4318 $this->subprice = $objp->subprice;
4319 $this->ref_ext = $objp->ref_ext;
4320 $this->vat_src_code = $objp->vat_src_code;
4321 $this->tva_tx = $objp->tva_tx;
4322 $this->localtax1_tx = $objp->localtax1_tx;
4323 $this->localtax2_tx = $objp->localtax2_tx;
4324 $this->remise = $objp->remise;
4325 $this->remise_percent = $objp->remise_percent;
4326 $this->fk_remise_except = $objp->fk_remise_except;
4327 $this->fk_product = $objp->fk_product;
4328 $this->product_type = $objp->product_type;
4329 $this->info_bits = $objp->info_bits;
4330 $this->special_code = $objp->special_code;
4331 $this->total_ht = $objp->total_ht;
4332 $this->total_tva = $objp->total_tva;
4333 $this->total_localtax1 = $objp->total_localtax1;
4334 $this->total_localtax2 = $objp->total_localtax2;
4335 $this->total_ttc = $objp->total_ttc;
4336 $this->fk_fournprice = $objp->fk_fournprice;
4337 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
4338 $this->pa_ht = $marginInfos[0];
4339 $this->marge_tx = $marginInfos[1];
4340 $this->marque_tx = $marginInfos[2];
4341 $this->special_code = $objp->special_code;
4342 $this->rang = $objp->rang;
4344 $this->
ref = $objp->product_ref;
4346 $this->product_ref = $objp->product_ref;
4347 $this->product_label = $objp->product_label;
4348 $this->product_desc = $objp->product_desc;
4349 $this->product_tobatch = $objp->product_tobatch;
4350 $this->fk_unit = $objp->fk_unit;
4352 $this->date_start = $this->db->jdate($objp->date_start);
4353 $this->date_end = $this->db->jdate($objp->date_end);
4355 $this->fk_multicurrency = $objp->fk_multicurrency;
4356 $this->multicurrency_code = $objp->multicurrency_code;
4357 $this->multicurrency_subprice = $objp->multicurrency_subprice;
4358 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
4359 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
4360 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
4364 $this->db->free($result);
4368 $this->error = $this->db->lasterror();
4380 public function delete(
User $user, $notrigger = 0)
4382 global $conf, $langs;
4386 if (empty($this->
id) && !empty($this->
rowid)) {
4387 $this->
id = $this->rowid;
4391 $sqlCheckShipmentLine =
"SELECT";
4392 $sqlCheckShipmentLine .=
" ed.rowid";
4393 $sqlCheckShipmentLine .=
" FROM " . MAIN_DB_PREFIX .
"expeditiondet ed";
4394 $sqlCheckShipmentLine .=
" WHERE ed.fk_origin_line = " . ((int) $this->
id);
4396 $resqlCheckShipmentLine = $this->db->query($sqlCheckShipmentLine);
4397 if (!$resqlCheckShipmentLine) {
4399 $this->error = $this->db->lasterror();
4400 $this->errors[] = $this->error;
4402 $langs->load(
'errors');
4403 $num = $this->db->num_rows($resqlCheckShipmentLine);
4406 $objCheckShipmentLine = $this->db->fetch_object($resqlCheckShipmentLine);
4407 $this->error = $langs->trans(
'ErrorRecordAlreadyExists') .
' : ' . $langs->trans(
'ShipmentLine') .
' ' . $objCheckShipmentLine->rowid;
4408 $this->errors[] = $this->error;
4410 $this->db->free($resqlCheckShipmentLine);
4413 dol_syslog(__METHOD__ .
'Error ; ' . $this->error, LOG_ERR);
4421 $result = $this->
call_trigger(
'LINEORDER_DELETE', $user);
4429 $sql =
'DELETE FROM ' . MAIN_DB_PREFIX .
"commandedet WHERE rowid = " . ((int) $this->
id);
4432 $resql = $this->db->query($sql);
4434 $this->error = $this->db->lasterror();
4444 dol_syslog(get_class($this) .
"::delete error -4 " . $this->error, LOG_ERR);
4449 $this->db->commit();
4453 foreach ($this->errors as $errmsg) {
4454 dol_syslog(get_class($this) .
"::delete " . $errmsg, LOG_ERR);
4455 $this->error .= ($this->error ?
', ' . $errmsg : $errmsg);
4457 $this->db->rollback();
4468 public function insert($user =
null, $notrigger = 0)
4472 $pa_ht_isemptystring = (empty($this->pa_ht) && $this->pa_ht ==
'');
4474 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
4477 if (empty($this->tva_tx)) {
4480 if (empty($this->localtax1_tx)) {
4481 $this->localtax1_tx = 0;
4483 if (empty($this->localtax2_tx)) {
4484 $this->localtax2_tx = 0;
4486 if (empty($this->localtax1_type)) {
4487 $this->localtax1_type = 0;
4489 if (empty($this->localtax2_type)) {
4490 $this->localtax2_type = 0;
4492 if (empty($this->total_localtax1)) {
4493 $this->total_localtax1 = 0;
4495 if (empty($this->total_localtax2)) {
4496 $this->total_localtax2 = 0;
4498 if (empty($this->rang)) {
4501 if (empty($this->remise_percent)) {
4502 $this->remise_percent = 0;
4504 if (empty($this->info_bits)) {
4505 $this->info_bits = 0;
4507 if (empty($this->special_code)) {
4508 $this->special_code = 0;
4510 if (empty($this->fk_parent_line)) {
4511 $this->fk_parent_line = 0;
4513 if (empty($this->pa_ht)) {
4516 if (empty($this->ref_ext)) {
4517 $this->ref_ext =
'';
4521 if ($this->pa_ht == 0 && $pa_ht_isemptystring) {
4522 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
4526 $this->pa_ht = $result;
4531 if ($this->product_type < 0) {
4538 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'commandedet';
4539 $sql .=
' (fk_commande, fk_parent_line, label, description, qty, ref_ext,';
4540 $sql .=
' vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
4541 $sql .=
' fk_product, product_type, remise_percent, subprice, price, fk_remise_except,';
4542 $sql .=
' special_code, rang, fk_product_fournisseur_price, buy_price_ht,';
4543 $sql .=
' info_bits, total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, date_start, date_end,';
4544 $sql .=
' fk_unit,';
4545 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
4547 $sql .=
" VALUES (".$this->fk_commande.
",";
4548 $sql .=
" ".($this->fk_parent_line > 0 ?
"'".$this->db->escape($this->fk_parent_line).
"'" :
"null").
",";
4549 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
4550 $sql .=
" '".$this->db->escape($this->desc).
"',";
4551 $sql .=
" '".price2num($this->qty).
"',";
4552 $sql .=
" '".$this->db->escape($this->ref_ext).
"',";
4553 $sql .=
" ".(empty($this->vat_src_code) ?
"''" :
"'".$this->db->escape($this->vat_src_code).
"'").
",";
4554 $sql .=
" '".price2num($this->tva_tx).
"',";
4555 $sql .=
" '".price2num($this->localtax1_tx).
"',";
4556 $sql .=
" '".price2num($this->localtax2_tx).
"',";
4557 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
4558 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
4559 $sql .=
' '.((!empty($this->fk_product) && $this->fk_product > 0) ? $this->fk_product :
"null").
',';
4560 $sql .=
" '".$this->db->escape($this->product_type).
"',";
4561 $sql .=
" '".price2num($this->remise_percent).
"',";
4562 $sql .=
" ".(price2num($this->subprice) !==
'' ?
price2num($this->subprice) :
"null").
",";
4563 $sql .=
" ".($this->price !=
'' ?
"'".price2num($this->
price).
"'" :
"null").
",";
4564 $sql .=
' '.(!empty($this->fk_remise_except) ? $this->fk_remise_except :
"null").
',';
4565 $sql .=
' '.((int) $this->special_code).
',';
4566 $sql .=
' '.((int) $this->rang).
',';
4567 $sql .=
' '.(!empty($this->fk_fournprice) ? $this->fk_fournprice :
"null").
',';
4568 $sql .=
' '.price2num($this->pa_ht).
',';
4569 $sql .=
" ".((int) $this->info_bits).
",";
4570 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
4571 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
4572 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
4573 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
4574 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
4575 $sql .=
" ".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
',';
4576 $sql .=
" ".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
',';
4577 $sql .=
' '.(!$this->fk_unit ?
'NULL' : ((int) $this->fk_unit));
4578 $sql .=
", ".(!empty($this->fk_multicurrency) ? ((int) $this->fk_multicurrency) :
'NULL');
4579 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
4580 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
4581 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
4582 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
4583 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
4586 dol_syslog(get_class($this).
"::insert", LOG_DEBUG);
4587 $resql = $this->db->query($sql);
4589 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commandedet');
4590 $this->
rowid = $this->id;
4599 if (!$error && !$notrigger) {
4601 $result = $this->
call_trigger(
'LINEORDER_INSERT', $user);
4609 $this->db->commit();
4613 foreach ($this->errors as $errmsg) {
4614 dol_syslog(get_class($this).
"::insert ".$errmsg, LOG_ERR);
4615 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
4617 $this->db->rollback();
4620 $this->error = $this->db->error();
4621 $this->db->rollback();
4637 $pa_ht_isemptystring = (empty($this->pa_ht) && $this->pa_ht ==
'');
4640 if (empty($this->tva_tx)) {
4643 if (empty($this->localtax1_tx)) {
4644 $this->localtax1_tx = 0;
4646 if (empty($this->localtax2_tx)) {
4647 $this->localtax2_tx = 0;
4649 if (empty($this->localtax1_type)) {
4650 $this->localtax1_type = 0;
4652 if (empty($this->localtax2_type)) {
4653 $this->localtax2_type = 0;
4655 if (empty($this->qty)) {
4658 if (empty($this->total_localtax1)) {
4659 $this->total_localtax1 = 0;
4661 if (empty($this->total_localtax2)) {
4662 $this->total_localtax2 = 0;
4664 if (empty($this->marque_tx)) {
4665 $this->marque_tx = 0;
4667 if (empty($this->marge_tx)) {
4668 $this->marge_tx = 0;
4670 if (empty($this->remise_percent)) {
4671 $this->remise_percent = 0;
4673 if (empty($this->remise)) {
4676 if (empty($this->info_bits)) {
4677 $this->info_bits = 0;
4679 if (empty($this->special_code)) {
4680 $this->special_code = 0;
4682 if (empty($this->product_type)) {
4683 $this->product_type = 0;
4685 if (empty($this->fk_parent_line)) {
4686 $this->fk_parent_line = 0;
4688 if (empty($this->pa_ht)) {
4691 if (empty($this->ref_ext)) {
4692 $this->ref_ext =
'';
4696 if ($this->pa_ht == 0 && $pa_ht_isemptystring) {
4697 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
4701 $this->pa_ht = $result;
4708 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commandedet SET";
4709 $sql .=
" description='".$this->db->escape($this->desc).
"'";
4710 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
4711 $sql .=
" , vat_src_code=".(!empty($this->vat_src_code) ?
"'".$this->db->escape($this->vat_src_code).
"'" :
"''");
4712 $sql .=
" , tva_tx=".price2num($this->tva_tx);
4713 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
4714 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
4715 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
4716 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
4717 $sql .=
" , qty=".price2num($this->qty);
4718 $sql .=
" , ref_ext='".$this->db->escape($this->ref_ext).
"'";
4719 $sql .=
" , subprice=".price2num($this->subprice);
4720 $sql .=
" , remise_percent=".price2num($this->remise_percent);
4721 $sql .=
" , price=".price2num($this->
price);
4722 $sql .=
" , remise=".price2num($this->remise);
4723 if (empty($this->skip_update_total)) {
4724 $sql .=
" , total_ht=".price2num($this->total_ht);
4725 $sql .=
" , total_tva=".price2num($this->total_tva);
4726 $sql .=
" , total_ttc=".price2num($this->total_ttc);
4727 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
4728 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
4730 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ? $this->fk_fournprice :
"null");
4731 $sql .=
" , buy_price_ht='".price2num($this->pa_ht).
"'";
4732 $sql .=
" , info_bits=".((int) $this->info_bits);
4733 $sql .=
" , special_code=".((int) $this->special_code);
4734 $sql .=
" , date_start=".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
4735 $sql .=
" , date_end=".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
4736 $sql .=
" , product_type=".$this->product_type;
4737 $sql .=
" , fk_parent_line=".(!empty($this->fk_parent_line) ? $this->fk_parent_line :
"null");
4738 if (!empty($this->rang)) {
4739 $sql .=
", rang=".((int) $this->rang);
4741 $sql .=
" , fk_unit=".(!$this->fk_unit ?
'NULL' : $this->fk_unit);
4744 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
4745 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
4746 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
4747 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
4749 $sql .=
" WHERE rowid = ".((int) $this->
rowid);
4751 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
4752 $resql = $this->db->query($sql);
4755 $this->
id = $this->rowid;
4762 if (!$error && !$notrigger) {
4764 $result = $this->
call_trigger(
'LINEORDER_MODIFY', $user);
4772 $this->db->commit();
4776 foreach ($this->errors as $errmsg) {
4777 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
4778 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
4780 $this->db->rollback();
4783 $this->error = $this->db->error();
4784 $this->db->rollback();
4802 if (empty($this->total_localtax1)) {
4803 $this->total_localtax1 = 0;
4805 if (empty($this->total_localtax2)) {
4806 $this->total_localtax2 = 0;
4810 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commandedet SET";
4811 $sql .=
" total_ht='".price2num($this->total_ht).
"'";
4812 $sql .=
",total_tva='".price2num($this->total_tva).
"'";
4813 $sql .=
",total_localtax1='".price2num($this->total_localtax1).
"'";
4814 $sql .=
",total_localtax2='".price2num($this->total_localtax2).
"'";
4815 $sql .=
",total_ttc='".price2num($this->total_ttc).
"'";
4816 $sql .=
" WHERE rowid = ".((int) $this->
rowid);
4818 dol_syslog(
"OrderLine::update_total", LOG_DEBUG);
4820 $resql = $this->db->query($sql);
4822 $this->db->commit();
4825 $this->error = $this->db->error();
4826 $this->db->rollback();
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Class to manage customers orders.
getNbOfServicesLines()
Return number of line with type service.
getNbOfShipments()
Count number of shipments for this order.
deleteline($user=null, $lineid=0, $id=0)
Return a array with the pending stock by product.
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.
load_state_board()
Charge indicateurs this->nb de tableau de bord.
showDelay()
Show the customer delayed info.
set_date($user, $date, $notrigger=0)
Set a fixed amount discount.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
fetch_lines($only_product=0, $loadalsotranslation=0)
Load array lines.
$pos_source
key of pos source ('0', '1', ...)
createFromClone(User $user, $socid=0)
Load an object from its id and create a new one in database.
const STATUS_SHIPMENTONPROCESS
Shipment on process.
LibStatut($status, $billed, $mode, $donotshowbilled=0)
Return label of status.
getLibStatut($mode)
Return status label of Order.
hasDelay()
Is the sales order delayed?
const STATUS_CLOSED
Closed (Sent, billed or not)
valid($user, $idwarehouse=0, $notrigger=0)
Validate order.
getLabelSource()
Return source label of order.
set_remise($user, $remise, $notrigger=0)
Applique une remise relative.
const STATUS_CANCELED
Canceled status.
getNomUrl($withpicto=0, $option='', $max=0, $short=0, $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0, $target='')
Return clicable 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.
getNextNumRef($soc)
Returns the reference to the following non used Order depending on the active numbering module define...
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 order Note that this->ref can be set or empty.
demand_reason($demand_reason_id, $notrigger=0)
Update order demand_reason.
const STATUS_DRAFT
Draft status.
const STOCK_NOT_ENOUGH_FOR_ORDER
ERR Not enough stock.
initAsSpecimen()
Initialise an instance with random values.
insert_discount($idremise)
Adding line of fixed discount in the order in DB.
getNbOfProductsLines()
Return number of line with type product.
update(User $user, $notrigger=0)
Update database.
$module_source
key of module source when order generated from a dedicated module ('cashdesk', 'takepos',...
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.
cancel($idwarehouse=-1)
Cancel an order If stock is decremented on order validation, we must reincrement it.
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 informations 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.
countNbOfShipments()
Returns an array with expeditions lines number.
liste_array($shortlist=0, $draft=0, $excluser=null, $socid=0, $limit=0, $offset=0, $sortfield='c.date_commande', $sortorder='DESC')
Return list of orders (eventuelly filtered on a user) into an array.
fetch($id, $ref='', $ref_ext='', $notused='')
Get object from database.
set_date_livraison($user, $delivery_date, $notrigger=0)
Set delivery date.
add_product($idproduct, $qty, $remise_percent=0.0, $date_start='', $date_end='')
Add line into array $this->client must be loaded.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
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.
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
defineBuyPrice($unitPrice=0.0, $discountPercent=0.0, $fk_product=0)
Get buy price to use for margin calculation.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setErrorsFromObject($object)
setErrorsFromObject
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check an object id/ref exists If you don't need/want to instantiate object and just need to know if o...
updateRangOfLine($rowid, $rang)
Update position of line (rang)
fetch_project()
Load the project with id $this->fk_project into this->project.
update_price($exclspec=0, $roundingadjust='none', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
deleteExtraFields()
Delete all extra fields values for the current object.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
delete_linked_contact($source='', $code='')
Delete all links between an object $this and all its contacts in llx_element_contact.
call_trigger($triggerName, $user)
Call trigger based on this instance.
add_contact($fk_socpeople, $type_contact, $source='external', $notrigger=0)
Add a link between element $this->element and a contact.
Superclass for orders classes.
Superclass for orders classes.
Class to manage absolute discounts.
Class to manage Dolibarr database access.
Class to manage shipments.
Class to manage stock movements.
static getIdFromCode($dbs, $code)
Get id of currency from code.
static getIdAndTxFromCode($dbs, $code, $date_document='')
Get id and rate of currency from code.
Class to manage order lines.
insert($user=null, $notrigger=0)
Insert line into database.
update(User $user, $notrigger=0)
Update the line object into db.
update_total()
Update DB line fields total_xxx Used by migration.
__construct($db)
Constructor.
fetch($rowid)
Load line order.
Class to manage products or services.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_delete_preview($object)
Delete all preview files linked to object instance.
dol_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 '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs='', $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
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...
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e rowid
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall right right takeposterminal SELECT e e e e e statut
getMarginInfos($pvht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $paht)
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='', $localtaxes_array='', $progress=100, $multicurrency_tx=1, $pu_devise=0, $multicurrency_code='')
Calculate totals (net, vat, ...) of a line.