38include_once DOL_DOCUMENT_ROOT.
'/core/class/commonorder.class.php';
39require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobjectline.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
42require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
54 public $element =
'commande';
59 public $table_element =
'commande';
64 public $table_element_line =
'commandedet';
69 public $class_element_line =
'OrderLine';
74 public $fk_element =
'fk_commande';
79 public $picto =
'order';
85 public $ismultientitymanaged = 1;
90 public $isextrafieldmanaged = 1;
96 public $restrictiononfksoc = 1;
116 public $ref_customer;
137 public $date_lim_reglement;
141 public $cond_reglement_code;
146 public $cond_reglement_doc;
151 public $deposit_percent;
161 public $mode_reglement;
166 public $mode_reglement_id;
171 public $mode_reglement_code;
177 public $availability_id;
183 public $availability_code;
189 public $availability;
194 public $demand_reason_id;
199 public $demand_reason_code;
211 public $date_commande;
216 public $delivery_date;
221 public $fk_remise_except;
233 public $warehouse_id;
235 public $extraparams = array();
237 public $linked_objects = array();
242 public $user_author_id;
257 public $lines = array();
273 public $online_payment_url;
305 public $fields = array(
306 'rowid' =>array(
'type'=>
'integer',
'label'=>
'TechnicalID',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>10),
307 'entity' =>array(
'type'=>
'integer',
'label'=>
'Entity',
'default'=>1,
'enabled'=>1,
'visible'=>-2,
'notnull'=>1,
'position'=>20,
'index'=>1),
308 'ref' =>array(
'type'=>
'varchar(30)',
'label'=>
'Ref',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'showoncombobox'=>1,
'position'=>25),
309 'ref_ext' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefExt',
'enabled'=>1,
'visible'=>0,
'position'=>26),
310 'ref_client' =>array(
'type'=>
'varchar(255)',
'label'=>
'RefCustomer',
'enabled'=>1,
'visible'=>-1,
'position'=>28),
311 'fk_soc' =>array(
'type'=>
'integer:Societe:societe/class/societe.class.php',
'label'=>
'ThirdParty',
'enabled'=>
'isModEnabled("societe")',
'visible'=>-1,
'notnull'=>1,
'position'=>20),
312 'fk_projet' =>array(
'type'=>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label'=>
'Project',
'enabled'=>
"isModEnabled('project')",
'visible'=>-1,
'position'=>25),
313 'date_commande' =>array(
'type'=>
'date',
'label'=>
'Date',
'enabled'=>1,
'visible'=>1,
'position'=>60,
'csslist'=>
'nowraponall'),
314 'date_valid' =>array(
'type'=>
'datetime',
'label'=>
'DateValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>62,
'csslist'=>
'nowraponall'),
315 'date_cloture' =>array(
'type'=>
'datetime',
'label'=>
'DateClosing',
'enabled'=>1,
'visible'=>-1,
'position'=>65,
'csslist'=>
'nowraponall'),
316 'fk_user_valid' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserValidation',
'enabled'=>1,
'visible'=>-1,
'position'=>85),
317 'fk_user_cloture' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserClosing',
'enabled'=>1,
'visible'=>-1,
'position'=>90),
318 'source' =>array(
'type'=>
'smallint(6)',
'label'=>
'Source',
'enabled'=>1,
'visible'=>-1,
'position'=>95),
319 'total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'VAT',
'enabled'=>1,
'visible'=>-1,
'position'=>125,
'isameasure'=>1),
320 'localtax1' =>array(
'type'=>
'double(24,8)',
'label'=>
'LocalTax1',
'enabled'=>1,
'visible'=>-1,
'position'=>130,
'isameasure'=>1),
321 'localtax2' =>array(
'type'=>
'double(24,8)',
'label'=>
'LocalTax2',
'enabled'=>1,
'visible'=>-1,
'position'=>135,
'isameasure'=>1),
322 'total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalHT',
'enabled'=>1,
'visible'=>-1,
'position'=>140,
'isameasure'=>1),
323 'total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'TotalTTC',
'enabled'=>1,
'visible'=>-1,
'position'=>145,
'isameasure'=>1),
324 'note_private' =>array(
'type'=>
'html',
'label'=>
'NotePrivate',
'enabled'=>1,
'visible'=>0,
'position'=>150),
325 'note_public' =>array(
'type'=>
'html',
'label'=>
'NotePublic',
'enabled'=>1,
'visible'=>0,
'position'=>155),
326 'model_pdf' =>array(
'type'=>
'varchar(255)',
'label'=>
'PDFTemplate',
'enabled'=>1,
'visible'=>0,
'position'=>160),
327 'fk_account' =>array(
'type'=>
'integer',
'label'=>
'BankAccount',
'enabled'=>
'isModEnabled("banque")',
'visible'=>-1,
'position'=>170),
328 'fk_currency' =>array(
'type'=>
'varchar(3)',
'label'=>
'MulticurrencyID',
'enabled'=>1,
'visible'=>-1,
'position'=>175),
329 'fk_cond_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentTerm',
'enabled'=>1,
'visible'=>-1,
'position'=>180),
330 'deposit_percent' =>array(
'type'=>
'varchar(63)',
'label'=>
'DepositPercent',
'enabled'=>1,
'visible'=>-1,
'position'=>181),
331 'fk_mode_reglement' =>array(
'type'=>
'integer',
'label'=>
'PaymentMode',
'enabled'=>1,
'visible'=>-1,
'position'=>185),
332 'date_livraison' =>array(
'type'=>
'date',
'label'=>
'DateDeliveryPlanned',
'enabled'=>1,
'visible'=>-1,
'position'=>190,
'csslist'=>
'nowraponall'),
333 'fk_shipping_method' =>array(
'type'=>
'integer',
'label'=>
'ShippingMethod',
'enabled'=>1,
'visible'=>-1,
'position'=>195),
334 'fk_warehouse' =>array(
'type'=>
'integer:Entrepot:product/stock/class/entrepot.class.php',
'label'=>
'Fk warehouse',
'enabled'=>
'isModEnabled("stock")',
'visible'=>-1,
'position'=>200),
335 'fk_availability' =>array(
'type'=>
'integer',
'label'=>
'Availability',
'enabled'=>1,
'visible'=>-1,
'position'=>205),
336 'fk_input_reason' =>array(
'type'=>
'integer',
'label'=>
'InputReason',
'enabled'=>1,
'visible'=>-1,
'position'=>210),
338 'extraparams' =>array(
'type'=>
'varchar(255)',
'label'=>
'Extraparams',
'enabled'=>1,
'visible'=>-1,
'position'=>225),
339 'fk_incoterms' =>array(
'type'=>
'integer',
'label'=>
'IncotermCode',
'enabled'=>
'$conf->incoterm->enabled',
'visible'=>-1,
'position'=>230),
340 'location_incoterms' =>array(
'type'=>
'varchar(255)',
'label'=>
'IncotermLabel',
'enabled'=>
'$conf->incoterm->enabled',
'visible'=>-1,
'position'=>235),
341 'fk_multicurrency' =>array(
'type'=>
'integer',
'label'=>
'Fk multicurrency',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>240),
342 'multicurrency_code' =>array(
'type'=>
'varchar(255)',
'label'=>
'MulticurrencyCurrency',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>245),
343 'multicurrency_tx' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyRate',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>250,
'isameasure'=>1),
344 'multicurrency_total_ht' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountHT',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>255,
'isameasure'=>1),
345 'multicurrency_total_tva' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountVAT',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>260,
'isameasure'=>1),
346 'multicurrency_total_ttc' =>array(
'type'=>
'double(24,8)',
'label'=>
'MulticurrencyAmountTTC',
'enabled'=>
'isModEnabled("multicurrency")',
'visible'=>-1,
'position'=>265,
'isameasure'=>1),
347 'last_main_doc' =>array(
'type'=>
'varchar(255)',
'label'=>
'LastMainDoc',
'enabled'=>1,
'visible'=>-1,
'position'=>270),
348 'module_source' =>array(
'type'=>
'varchar(32)',
'label'=>
'POSModule',
'enabled'=>1,
'visible'=>-1,
'position'=>275),
349 'pos_source' =>array(
'type'=>
'varchar(32)',
'label'=>
'POSTerminal',
'enabled'=>1,
'visible'=>-1,
'position'=>280),
350 'fk_user_author' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserAuthor',
'enabled'=>1,
'visible'=>-1,
'position'=>300),
351 'fk_user_modif' =>array(
'type'=>
'integer:User:user/class/user.class.php',
'label'=>
'UserModif',
'enabled'=>1,
'visible'=>-2,
'notnull'=>-1,
'position'=>302),
352 'date_creation' =>array(
'type'=>
'datetime',
'label'=>
'DateCreation',
'enabled'=>1,
'visible'=>-2,
'position'=>304,
'csslist'=>
'nowraponall'),
353 'tms' =>array(
'type'=>
'timestamp',
'label'=>
'DateModification',
'enabled'=>1,
'visible'=>-1,
'notnull'=>1,
'position'=>306),
354 'import_key' =>array(
'type'=>
'varchar(14)',
'label'=>
'ImportId',
'enabled'=>1,
'visible'=>-2,
'position'=>400),
355 'fk_statut' =>array(
'type'=>
'smallint(6)',
'label'=>
'Status',
'enabled'=>1,
'visible'=>-1,
'position'=>500),
380 const STATUS_ACCEPTED = 2;
407 global $langs, $conf;
408 $langs->load(
"order");
414 $classname = $conf->global->COMMANDE_ADDON;
417 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
418 foreach ($dirmodels as $reldir) {
422 $mybool |= @include_once $dir.$file;
425 if ($mybool ===
false) {
430 $obj =
new $classname();
431 $numref = $obj->getNextValue($soc, $this);
436 $this->error = $obj->error;
441 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_COMMANDE_ADDON_NotDefined");
455 public function valid($user, $idwarehouse = 0, $notrigger = 0)
457 global $conf, $langs;
459 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
464 if ($this->
statut == self::STATUS_VALIDATED) {
465 dol_syslog(get_class($this).
"::valid action abandonned: already validated", LOG_WARNING);
469 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
470 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
471 $this->error =
'NotEnoughPermissions';
472 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
482 $soc->fetch($this->socid);
485 $result = $soc->setAsCustomer();
488 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
496 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
497 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
498 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
499 $sql .=
" date_valid='".$this->db->idate($now).
"',";
500 $sql .=
" fk_user_valid = ".($user->id > 0 ? (int) $user->id :
"null").
",";
501 $sql .=
" fk_user_modif = ".((int) $user->id);
502 $sql .=
" WHERE rowid = ".((int) $this->
id);
504 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
505 $resql = $this->db->query($sql);
508 $this->error = $this->db->lasterror();
514 if ($result >= 0 && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
515 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
516 $langs->load(
"agenda");
519 $cpt = count($this->lines);
520 for ($i = 0; $i < $cpt; $i++) {
521 if ($this->lines[$i]->fk_product > 0) {
523 $mouvP->origin = &$this;
524 $mouvP->setOrigin($this->element, $this->
id);
526 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"OrderValidatedInDolibarr", $num));
529 $this->error = $mouvP->error;
539 if (!$error && !$notrigger) {
549 $this->oldref = $this->ref;
552 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
554 $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).
"'";
555 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
556 $resql = $this->db->query($sql);
559 $this->error = $this->db->lasterror();
561 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'commande/".$this->db->escape($this->newref).
"'";
562 $sql .=
" WHERE filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
563 $resql = $this->db->query($sql);
566 $this->error = $this->db->lasterror();
572 $dirsource = $conf->commande->multidir_output[$this->entity].
'/'.$oldref;
573 $dirdest = $conf->commande->multidir_output[$this->entity].
'/'.$newref;
574 if (!$error && file_exists($dirsource)) {
575 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
577 if (@rename($dirsource, $dirdest)) {
580 $listoffiles =
dol_dir_list($conf->commande->multidir_output[$this->entity].
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
581 foreach ($listoffiles as $fileentry) {
582 $dirsource = $fileentry[
'name'];
583 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
584 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
585 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
586 @rename($dirsource, $dirdest);
604 $this->db->rollback();
620 global $conf, $langs;
625 if ($this->
statut <= self::STATUS_DRAFT) {
629 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
630 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
631 $this->error =
'Permission denied';
639 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
640 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT.
",";
641 $sql .=
" fk_user_modif = ".((int) $user->id);
642 $sql .=
" WHERE rowid = ".((int) $this->
id);
644 if ($this->db->query($sql)) {
646 $this->oldcopy = clone $this;
650 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
653 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
654 $langs->load(
"agenda");
656 $num = count($this->lines);
657 for ($i = 0; $i < $num; $i++) {
658 if ($this->lines[$i]->fk_product > 0) {
660 $mouvP->origin = &$this;
661 $mouvP->setOrigin($this->element, $this->
id);
663 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderBackToDraftInDolibarr", $this->ref));
666 $this->error = $mouvP->error;
675 $result = $this->
call_trigger(
'ORDER_UNVALIDATE', $user);
686 $this->db->rollback();
690 $this->error = $this->db->error();
691 $this->db->rollback();
710 if ($this->
statut != self::STATUS_CANCELED && $this->
statut != self::STATUS_CLOSED) {
711 dol_syslog(get_class($this).
"::set_reopen order has not status closed", LOG_WARNING);
717 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
718 $sql .=
' SET fk_statut='.self::STATUS_VALIDATED.
', facture=0,';
719 $sql .=
" fk_user_modif = ".((int) $user->id);
720 $sql .=
" WHERE rowid = ".((int) $this->
id);
722 dol_syslog(get_class($this).
"::set_reopen", LOG_DEBUG);
723 $resql = $this->db->query($sql);
733 $this->error = $this->db->lasterror();
744 foreach ($this->errors as $errmsg) {
745 dol_syslog(get_class($this).
"::set_reopen ".$errmsg, LOG_ERR);
746 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
748 $this->db->rollback();
760 public function cloture($user, $notrigger = 0)
766 $usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->commande->creer))
767 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && !empty($user->rights->commande->order_advance->close)));
770 if ($this->
statut == self::STATUS_CLOSED) {
777 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
778 $sql .=
' SET fk_statut = '.self::STATUS_CLOSED.
',';
779 $sql .=
' fk_user_cloture = '.((int) $user->id).
',';
780 $sql .=
" date_cloture = '".$this->db->idate($now).
"',";
781 $sql .=
" fk_user_modif = ".((int) $user->id);
784 if ($this->db->query($sql)) {
800 $this->db->rollback();
804 $this->error = $this->db->lasterror();
806 $this->db->rollback();
820 public function cancel($idwarehouse = -1)
822 global $conf, $user, $langs;
828 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
829 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
",";
830 $sql .=
" fk_user_modif = ".((int) $user->id);
831 $sql .=
" WHERE rowid = ".((int) $this->
id);
832 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
834 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
835 if ($this->db->query($sql)) {
837 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
838 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
839 $langs->load(
"agenda");
841 $num = count($this->lines);
842 for ($i = 0; $i < $num; $i++) {
843 if ($this->lines[$i]->fk_product > 0) {
845 $mouvP->setOrigin($this->element, $this->
id);
847 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderCanceledInDolibarr", $this->ref));
850 $this->error = $mouvP->error;
871 foreach ($this->errors as $errmsg) {
872 dol_syslog(get_class($this).
"::cancel ".$errmsg, LOG_ERR);
873 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
875 $this->db->rollback();
879 $this->error = $this->db->error();
880 $this->db->rollback();
893 public function create($user, $notrigger = 0)
895 global $conf, $langs, $mysoc;
901 $date = ($this->date_commande ? $this->date_commande : $this->date);
902 $delivery_date = $this->delivery_date;
905 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
910 if (empty($this->fk_multicurrency)) {
911 $this->multicurrency_code = $conf->currency;
912 $this->fk_multicurrency = 0;
913 $this->multicurrency_tx = 1;
916 dol_syslog(get_class($this).
"::create user=".$user->id);
919 if (!empty($this->
ref)) {
922 $this->error =
'ErrorRefAlreadyExists';
923 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
924 $this->db->rollback();
930 $result = $soc->fetch($this->socid);
932 $this->error =
"Failed to fetch company";
933 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
937 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Source"));
938 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
946 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"commande (";
947 $sql .=
" ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client";
948 $sql .=
", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address";
949 $sql .=
", fk_shipping_method";
950 $sql .=
", fk_warehouse";
951 $sql .=
", fk_incoterms, location_incoterms";
952 $sql .=
", entity, module_source, pos_source";
953 $sql .=
", fk_multicurrency";
954 $sql .=
", multicurrency_code";
955 $sql .=
", multicurrency_tx";
957 $sql .=
" VALUES ('(PROV)', ".((int) $this->socid).
", '".$this->db->idate($now).
"', ".((int) $user->id);
958 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
959 $sql .=
", '".$this->db->idate($date).
"'";
960 $sql .=
", ".($this->source >= 0 && $this->source !=
'' ? $this->db->escape($this->source) :
'null');
961 $sql .=
", '".$this->db->escape($this->note_private).
"'";
962 $sql .=
", '".$this->db->escape($this->note_public).
"'";
963 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
964 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
965 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
966 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
967 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
"null");
968 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
969 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
970 $sql .=
", ".($this->availability_id > 0 ? ((int) $this->availability_id) :
"null");
971 $sql .=
", ".($this->demand_reason_id > 0 ? ((int) $this->demand_reason_id) :
"null");
972 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
973 $sql .=
", ".($this->fk_delivery_address > 0 ? ((int) $this->fk_delivery_address) :
'NULL');
974 $sql .=
", ".(!empty($this->shipping_method_id) && $this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
975 $sql .=
", ".(!empty($this->warehouse_id) && $this->warehouse_id > 0 ? ((int) $this->warehouse_id) :
'NULL');
976 $sql .=
", ".(int) $this->fk_incoterms;
977 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
978 $sql .=
", ".setEntity($this);
979 $sql .=
", ".($this->module_source ?
"'".$this->db->escape($this->module_source).
"'" :
"null");
980 $sql .=
", ".($this->pos_source !=
'' ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
981 $sql .=
", ".(int) $this->fk_multicurrency;
982 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
983 $sql .=
", ".(float) $this->multicurrency_tx;
986 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
987 $resql = $this->db->query($sql);
989 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commande');
993 $num = count($this->lines);
998 for ($i = 0; $i < $num; $i++) {
999 $line = $this->lines[$i];
1003 if (!is_object($line)) {
1004 $line = (object) $line;
1008 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1009 $fk_parent_line = 0;
1013 $vatrate = $line->tva_tx;
1014 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', $vatrate)) {
1015 $vatrate .=
' ('.$line->vat_src_code.
')';
1019 $originid = $line->origin_id;
1020 $origintype = $line->origin;
1022 $originid = $line->id;
1023 $origintype = $this->element;
1027 if (empty($line->ref_ext)) {
1028 $line->ref_ext =
'';
1036 $line->localtax1_tx,
1037 $line->localtax2_tx,
1039 $line->remise_percent,
1041 $line->fk_remise_except,
1046 $line->product_type,
1048 $line->special_code,
1050 $line->fk_fournprice,
1053 $line->array_options,
1062 if ($result != self::STOCK_NOT_ENOUGH_FOR_ORDER) {
1063 $this->error = $this->db->lasterror();
1064 $this->errors[] = $this->error;
1067 $this->db->rollback();
1071 if ($result > 0 && $line->product_type == 9) {
1072 $fk_parent_line = $result;
1079 $initialref =
'(PROV'.$this->id.
')';
1080 if (!empty($this->
ref)) {
1081 $initialref = $this->ref;
1084 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"commande SET ref='".$this->db->escape($initialref).
"' WHERE rowid=".((int) $this->
id);
1085 if ($this->db->query($sql)) {
1086 $this->
ref = $initialref;
1088 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1089 $this->linked_objects = $this->linkedObjectsIds;
1093 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1094 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1095 if (is_array($tmp_origin_id)) {
1096 foreach ($tmp_origin_id as $origin_id) {
1099 $this->error = $this->db->lasterror();
1104 $origin_id = $tmp_origin_id;
1107 $this->error = $this->db->lasterror();
1114 if (!$error && $this->
id &&
getDolGlobalString(
'MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN') && !empty($this->origin) && !empty($this->origin_id)) {
1115 $originforcontact = $this->origin;
1116 $originidforcontact = $this->origin_id;
1117 if ($originforcontact ==
'shipping') {
1118 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1120 $exp->fetch($this->origin_id);
1121 $exp->fetchObjectLinked();
1122 if (count($exp->linkedObjectsIds[
'commande']) > 0) {
1123 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1124 $originforcontact =
'commande';
1125 if (is_object($value)) {
1126 $originidforcontact = $value->id;
1128 $originidforcontact = $value;
1135 $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";
1136 $sqlcontact .=
" WHERE element_id = ".((int) $originidforcontact).
" AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = '".$this->db->escape($originforcontact).
"'";
1138 $resqlcontact = $this->db->query($sqlcontact);
1139 if ($resqlcontact) {
1140 while ($objcontact = $this->db->fetch_object($resqlcontact)) {
1142 $this->
add_contact($objcontact->fk_socpeople, $objcontact->code, $objcontact->source);
1156 if (!$error && !$notrigger) {
1166 $this->db->commit();
1169 $this->db->rollback();
1173 $this->error = $this->db->lasterror();
1174 $this->db->rollback();
1181 $this->error = $this->db->lasterror();
1182 $this->db->rollback();
1197 global $conf, $user, $hookmanager;
1204 foreach ($this->lines as $line) {
1205 $line->fetch_optionals();
1209 $objFrom = clone $this;
1212 if (!empty($socid) && $socid != $this->socid) {
1213 $objsoc =
new Societe($this->db);
1215 if ($objsoc->fetch($socid) > 0) {
1216 $this->socid = $objsoc->id;
1217 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1218 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent :
null);
1219 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1220 $this->fk_project = 0;
1221 $this->fk_delivery_address = 0;
1232 $this->user_author_id = $user->id;
1233 $this->user_validation_id = 0;
1235 $this->date_commande =
dol_now();
1236 $this->date_creation =
'';
1237 $this->date_validation =
'';
1239 $this->ref_client =
'';
1240 $this->ref_customer =
'';
1244 $num = count($this->lines);
1245 for ($i = 0; $i < $num; $i++) {
1246 $this->lines[$i]->ref_ext =
'';
1250 $this->context[
'createfromclone'] =
'createfromclone';
1251 $result = $this->
create($user);
1265 if ($this->socid == $objFrom->socid) {
1274 if (is_object($hookmanager)) {
1275 $parameters = array(
'objFrom'=>$objFrom);
1277 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1285 unset($this->context[
'createfromclone']);
1289 $this->db->commit();
1292 $this->db->rollback();
1307 global $conf, $hookmanager;
1314 $this->date_commande =
dol_now();
1318 $num = count($object->lines);
1319 for ($i = 0; $i < $num; $i++) {
1322 $line->libelle = $object->lines[$i]->libelle;
1323 $line->label = $object->lines[$i]->label;
1324 $line->desc = $object->lines[$i]->desc;
1325 $line->price = $object->lines[$i]->price;
1326 $line->subprice = $object->lines[$i]->subprice;
1327 $line->vat_src_code = $object->lines[$i]->vat_src_code;
1328 $line->tva_tx = $object->lines[$i]->tva_tx;
1329 $line->localtax1_tx = $object->lines[$i]->localtax1_tx;
1330 $line->localtax2_tx = $object->lines[$i]->localtax2_tx;
1331 $line->qty = $object->lines[$i]->qty;
1332 $line->fk_remise_except = $object->lines[$i]->fk_remise_except;
1333 $line->remise_percent = $object->lines[$i]->remise_percent;
1334 $line->fk_product = $object->lines[$i]->fk_product;
1335 $line->info_bits = $object->lines[$i]->info_bits;
1336 $line->product_type = $object->lines[$i]->product_type;
1337 $line->rang = $object->lines[$i]->rang;
1338 $line->special_code = $object->lines[$i]->special_code;
1339 $line->fk_parent_line = $object->lines[$i]->fk_parent_line;
1340 $line->fk_unit = $object->lines[$i]->fk_unit;
1342 $line->date_start = $object->lines[$i]->date_start;
1343 $line->date_end = $object->lines[$i]->date_end;
1345 $line->fk_fournprice = $object->lines[$i]->fk_fournprice;
1346 $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);
1347 $line->pa_ht = $marginInfos[0];
1348 $line->marge_tx = $marginInfos[1];
1349 $line->marque_tx = $marginInfos[2];
1351 $line->origin = $object->element;
1352 $line->origin_id = $object->lines[$i]->id;
1355 $object->lines[$i]->fetch_optionals();
1356 foreach ($object->lines[$i]->array_options as $options_key => $value) {
1357 $line->array_options[$options_key] = $value;
1360 $this->lines[$i] = $line;
1363 $this->entity = $object->entity;
1364 $this->socid = $object->socid;
1365 $this->fk_project = $object->fk_project;
1366 $this->cond_reglement_id = $object->cond_reglement_id;
1367 $this->deposit_percent = $object->deposit_percent;
1368 $this->mode_reglement_id = $object->mode_reglement_id;
1369 $this->fk_account = $object->fk_account;
1370 $this->availability_id = $object->availability_id;
1371 $this->demand_reason_id = $object->demand_reason_id;
1372 $this->delivery_date = $object->delivery_date;
1373 $this->shipping_method_id = $object->shipping_method_id;
1374 $this->warehouse_id = $object->warehouse_id;
1375 $this->fk_delivery_address = $object->fk_delivery_address;
1376 $this->contact_id = $object->contact_id;
1377 $this->ref_client = $object->ref_client;
1378 $this->ref_customer = $object->ref_client;
1381 $this->note_private = $object->note_private;
1382 $this->note_public = $object->note_public;
1385 $this->origin = $object->element;
1386 $this->origin_id = $object->id;
1389 if (!empty($conf->multicurrency->enabled)) {
1390 if (!empty($object->multicurrency_code)) {
1391 $this->multicurrency_code = $object->multicurrency_code;
1393 if (
getDolGlobalString(
'MULTICURRENCY_USE_ORIGIN_TX') && !empty($object->multicurrency_tx)) {
1394 $this->multicurrency_tx = $object->multicurrency_tx;
1397 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1399 $this->fk_multicurrency = $tmparray[0];
1400 $this->multicurrency_tx = $tmparray[1];
1404 if (empty($this->fk_multicurrency)) {
1405 $this->multicurrency_code = $conf->currency;
1406 $this->fk_multicurrency = 0;
1407 $this->multicurrency_tx = 1;
1412 $object->fetch_optionals();
1415 $element_extrafields = $e->fetch_name_optionals_label($this->table_element);
1417 foreach ($object->array_options as $options_key => $value) {
1418 if (array_key_exists(str_replace(
'options_',
'', $options_key), $element_extrafields)) {
1419 $this->array_options[$options_key] = $value;
1423 $this->linked_objects[$this->origin] = $this->origin_id;
1424 if (isset($object->other_linked_objects) && is_array($object->other_linked_objects) && !empty($object->other_linked_objects)) {
1425 $this->linked_objects = array_merge($this->linked_objects, $object->other_linked_objects);
1428 $ret = $this->
create($user);
1432 $hookmanager->initHooks(array(
'orderdao'));
1434 $parameters = array(
'objFrom'=>$object);
1436 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1446 $this->
valid($user);
1498 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)
1500 global $mysoc, $conf, $langs, $user;
1502 $logtext =
"::addline commandeid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent";
1503 $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";
1504 $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";
1505 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
1507 if ($this->
statut == self::STATUS_DRAFT) {
1508 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1518 if (empty($info_bits)) {
1524 if (empty($txtva)) {
1527 if (empty($txlocaltax1)) {
1530 if (empty($txlocaltax2)) {
1533 if (empty($fk_parent_line) || $fk_parent_line < 0) {
1534 $fk_parent_line = 0;
1536 if (empty($this->fk_multicurrency)) {
1537 $this->fk_multicurrency = 0;
1539 if (empty($ref_ext)) {
1546 $pu_ht_devise =
price2num($pu_ht_devise);
1549 if (!preg_match(
'/\((.*)\)/', $txtva)) {
1554 if ($price_base_type ==
'HT') {
1559 $label = trim($label);
1560 $desc = trim($desc);
1567 if ($date_start && $date_end && $date_start > $date_end) {
1568 $langs->load(
"errors");
1569 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1575 $product_type = $type;
1576 if (!empty($fk_product) && $fk_product > 0) {
1577 $product =
new Product($this->db);
1578 $result = $product->fetch($fk_product);
1579 $product_type = $product->type;
1581 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
1582 $langs->load(
"errors");
1583 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
1584 $this->errors[] = $this->error;
1585 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
1586 $this->db->rollback();
1600 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1601 $vat_src_code = $reg[1];
1602 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1605 $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);
1615 $total_ht = $tabprice[0];
1616 $total_tva = $tabprice[1];
1617 $total_ttc = $tabprice[2];
1618 $total_localtax1 = $tabprice[9];
1619 $total_localtax2 = $tabprice[10];
1620 $pu_ht = $tabprice[3];
1623 $multicurrency_total_ht = $tabprice[16];
1624 $multicurrency_total_tva = $tabprice[17];
1625 $multicurrency_total_ttc = $tabprice[18];
1626 $pu_ht_devise = $tabprice[19];
1630 if ($ranktouse == -1) {
1631 $rangmax = $this->
line_max($fk_parent_line);
1632 $ranktouse = $rangmax + 1;
1641 $price = $pu - $remise;
1647 $this->line->context = $this->context;
1649 $this->line->fk_commande = $this->id;
1650 $this->line->label = $label;
1651 $this->line->desc = $desc;
1652 $this->line->qty = $qty;
1653 $this->line->ref_ext = $ref_ext;
1655 $this->line->vat_src_code = $vat_src_code;
1656 $this->line->tva_tx = $txtva;
1657 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
1658 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
1659 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
1660 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
1661 $this->line->fk_product = $fk_product;
1662 $this->line->product_type = $product_type;
1663 $this->line->fk_remise_except = $fk_remise_except;
1665 $this->line->subprice = $pu_ht;
1666 $this->line->rang = $ranktouse;
1667 $this->line->info_bits = $info_bits;
1668 $this->line->total_ht = $total_ht;
1669 $this->line->total_tva = $total_tva;
1670 $this->line->total_localtax1 = $total_localtax1;
1671 $this->line->total_localtax2 = $total_localtax2;
1672 $this->line->total_ttc = $total_ttc;
1673 $this->line->special_code = $special_code;
1674 $this->line->origin = $origin;
1675 $this->line->origin_id = $origin_id;
1676 $this->line->fk_parent_line = $fk_parent_line;
1677 $this->line->fk_unit = $fk_unit;
1679 $this->line->date_start = $date_start;
1680 $this->line->date_end = $date_end;
1682 $this->line->fk_fournprice = $fk_fournprice;
1683 $this->line->pa_ht = $pa_ht;
1686 $this->line->fk_multicurrency = $this->fk_multicurrency;
1687 $this->line->multicurrency_code = $this->multicurrency_code;
1688 $this->line->multicurrency_subprice = $pu_ht_devise;
1689 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
1690 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
1691 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
1694 $this->line->price = $price;
1696 if (is_array($array_options) && count($array_options) > 0) {
1697 $this->line->array_options = $array_options;
1700 $result = $this->line->insert($user);
1703 if (!empty($fk_parent_line)) {
1705 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
1706 $linecount = count($this->lines);
1707 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
1713 if (empty($noupdateafterinsertline)) {
1718 $this->db->commit();
1719 return $this->line->id;
1721 $this->db->rollback();
1725 $this->error = $this->line->error;
1726 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
1727 $this->db->rollback();
1731 dol_syslog(get_class($this).
"::addline status of order must be Draft to allow use of ->addline()", LOG_ERR);
1754 global $conf, $mysoc;
1760 if ($idproduct > 0) {
1761 $prod =
new Product($this->db);
1762 $prod->fetch($idproduct);
1766 if (empty($tva_tx)) {
1771 $localtax1_tx =
get_localtax($tva_tx, 1, $this->thirdparty, $mysoc, $tva_npr);
1772 $localtax2_tx =
get_localtax($tva_tx, 2, $this->thirdparty, $mysoc, $tva_npr);
1775 if ($conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
1776 $price = $prod->multiprices[$this->thirdparty->price_level];
1778 $price = $prod->price;
1783 $line->context = $this->context;
1785 $line->fk_product = $idproduct;
1786 $line->desc = $prod->description;
1788 $line->subprice = $price;
1790 $line->vat_src_code = $vat_src_code;
1791 $line->tva_tx = $tva_tx;
1792 $line->localtax1_tx = $localtax1_tx;
1793 $line->localtax2_tx = $localtax2_tx;
1795 $line->product_ref = $prod->ref;
1796 $line->product_label = $prod->label;
1797 $line->product_desc = $prod->description;
1798 $line->fk_unit = $prod->fk_unit;
1802 $line->date_start = $date_start;
1805 $line->date_end = $date_end;
1808 $this->lines[] = $line;
1841 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
1844 if (empty($id) && empty($ref) && empty($ref_ext)) {
1848 $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';
1849 $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';
1850 $sql .=
', c.fk_account';
1851 $sql .=
', c.date_commande, c.date_valid, c.tms';
1852 $sql .=
', c.date_livraison as delivery_date';
1853 $sql .=
', c.fk_shipping_method';
1854 $sql .=
', c.fk_warehouse';
1855 $sql .=
', c.fk_projet as fk_project, c.source, c.facture as billed';
1856 $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';
1857 $sql .=
', c.fk_incoterms, c.location_incoterms';
1858 $sql .=
", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
1859 $sql .=
", c.module_source, c.pos_source";
1860 $sql .=
", i.libelle as label_incoterms";
1861 $sql .=
', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
1862 $sql .=
', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
1863 $sql .=
', ca.code as availability_code, ca.label as availability_label';
1864 $sql .=
', dr.code as demand_reason_code';
1865 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commande as c';
1866 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid';
1867 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON c.fk_mode_reglement = p.id';
1868 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON c.fk_availability = ca.rowid';
1869 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON c.fk_input_reason = dr.rowid';
1870 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
1873 $sql .=
" WHERE c.rowid=".((int) $id);
1875 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
1879 $sql .=
" AND c.ref='".$this->db->escape($ref).
"'";
1882 $sql .=
" AND c.ref_ext='".$this->db->escape($ref_ext).
"'";
1885 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1886 $result = $this->db->query($sql);
1888 $obj = $this->db->fetch_object($result);
1890 $this->
id = $obj->rowid;
1891 $this->entity = $obj->entity;
1893 $this->
ref = $obj->ref;
1894 $this->ref_client = $obj->ref_client;
1895 $this->ref_customer = $obj->ref_client;
1896 $this->ref_ext = $obj->ref_ext;
1898 $this->socid = $obj->fk_soc;
1899 $this->thirdparty =
null;
1901 $this->fk_project = $obj->fk_project;
1902 $this->project =
null;
1904 $this->
statut = $obj->fk_statut;
1905 $this->
status = $obj->fk_statut;
1907 $this->user_author_id = $obj->fk_user_author;
1908 $this->user_creation_id = $obj->fk_user_author;
1909 $this->user_validation_id = $obj->fk_user_valid;
1910 $this->user_modification_id = $obj->fk_user_modif;
1911 $this->total_ht = $obj->total_ht;
1912 $this->total_tva = $obj->total_tva;
1913 $this->total_localtax1 = $obj->total_localtax1;
1914 $this->total_localtax2 = $obj->total_localtax2;
1915 $this->total_ttc = $obj->total_ttc;
1916 $this->date = $this->db->jdate($obj->date_commande);
1917 $this->date_commande = $this->db->jdate($obj->date_commande);
1918 $this->date_creation = $this->db->jdate($obj->date_creation);
1919 $this->date_validation = $this->db->jdate($obj->date_valid);
1920 $this->date_modification = $this->db->jdate($obj->tms);
1921 $this->source = $obj->source;
1922 $this->billed = $obj->billed;
1923 $this->note = $obj->note_private;
1924 $this->note_private = $obj->note_private;
1925 $this->note_public = $obj->note_public;
1926 $this->model_pdf = $obj->model_pdf;
1927 $this->last_main_doc = $obj->last_main_doc;
1928 $this->mode_reglement_id = $obj->fk_mode_reglement;
1929 $this->mode_reglement_code = $obj->mode_reglement_code;
1930 $this->mode_reglement = $obj->mode_reglement_libelle;
1931 $this->cond_reglement_id = $obj->fk_cond_reglement;
1932 $this->cond_reglement_code = $obj->cond_reglement_code;
1933 $this->cond_reglement = $obj->cond_reglement_libelle;
1934 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1935 $this->deposit_percent = $obj->deposit_percent;
1936 $this->fk_account = $obj->fk_account;
1937 $this->availability_id = $obj->fk_availability;
1938 $this->availability_code = $obj->availability_code;
1940 $this->demand_reason_id = $obj->fk_input_reason;
1941 $this->demand_reason_code = $obj->demand_reason_code;
1942 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1943 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1944 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
1945 $this->fk_delivery_address = $obj->fk_delivery_address;
1946 $this->module_source = $obj->module_source;
1947 $this->pos_source = $obj->pos_source;
1950 $this->fk_incoterms = $obj->fk_incoterms;
1951 $this->location_incoterms = $obj->location_incoterms;
1952 $this->label_incoterms = $obj->label_incoterms;
1955 $this->fk_multicurrency = $obj->fk_multicurrency;
1956 $this->multicurrency_code = $obj->multicurrency_code;
1957 $this->multicurrency_tx = $obj->multicurrency_tx;
1958 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1959 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1960 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1962 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
1964 $this->lines = array();
1970 $this->db->free($result);
1979 $this->error =
'Order with id '.$id.
' not found sql='.$sql;
1983 $this->error = $this->db->error();
2001 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2002 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
2007 $result = $remise->fetch($idremise);
2010 if ($remise->fk_facture) {
2011 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
2012 $this->db->rollback();
2018 $line->fk_commande = $this->id;
2019 $line->fk_remise_except = $remise->id;
2020 $line->desc = $remise->description;
2021 $line->vat_src_code = $remise->vat_src_code;
2022 $line->tva_tx = $remise->tva_tx;
2023 $line->subprice = -$remise->amount_ht;
2024 $line->price = -$remise->amount_ht;
2025 $line->fk_product = 0;
2027 $line->remise_percent = 0;
2029 $line->info_bits = 2;
2031 $line->total_ht = -$remise->amount_ht;
2032 $line->total_tva = -$remise->amount_tva;
2033 $line->total_ttc = -$remise->amount_ttc;
2035 $result = $line->insert();
2039 $this->db->commit();
2042 $this->db->rollback();
2046 $this->error = $line->error;
2047 $this->errors = $line->errors;
2048 $this->db->rollback();
2052 $this->db->rollback();
2066 public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
2069 global $langs, $conf;
2071 $this->lines = array();
2073 $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,';
2074 $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,';
2075 $sql .=
' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
2076 $sql .=
' l.fk_unit,';
2077 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2078 $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,';
2079 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units';
2080 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commandedet as l';
2081 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (p.rowid = l.fk_product)';
2082 $sql .=
' WHERE l.fk_commande = '.((int) $this->
id);
2083 if ($only_product) {
2084 $sql .=
' AND p.fk_product_type = 0';
2086 $sql .=
' ORDER BY l.rang, l.rowid';
2088 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
2089 $result = $this->db->query($sql);
2091 $num = $this->db->num_rows($result);
2095 $objp = $this->db->fetch_object($result);
2099 $line->rowid = $objp->rowid;
2100 $line->id = $objp->rowid;
2101 $line->fk_commande = $objp->fk_commande;
2102 $line->commande_id = $objp->fk_commande;
2103 $line->label = $objp->custom_label;
2104 $line->desc = $objp->description;
2105 $line->description = $objp->description;
2106 $line->product_type = $objp->product_type;
2107 $line->qty = $objp->qty;
2108 $line->ref_ext = $objp->ref_ext;
2110 $line->vat_src_code = $objp->vat_src_code;
2111 $line->tva_tx = $objp->tva_tx;
2112 $line->localtax1_tx = $objp->localtax1_tx;
2113 $line->localtax2_tx = $objp->localtax2_tx;
2114 $line->localtax1_type = $objp->localtax1_type;
2115 $line->localtax2_type = $objp->localtax2_type;
2116 $line->total_ht = $objp->total_ht;
2117 $line->total_ttc = $objp->total_ttc;
2118 $line->total_tva = $objp->total_tva;
2119 $line->total_localtax1 = $objp->total_localtax1;
2120 $line->total_localtax2 = $objp->total_localtax2;
2121 $line->subprice = $objp->subprice;
2122 $line->fk_remise_except = $objp->fk_remise_except;
2123 $line->remise_percent = $objp->remise_percent;
2124 $line->price = $objp->price;
2125 $line->fk_product = $objp->fk_product;
2126 $line->fk_fournprice = $objp->fk_fournprice;
2127 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
2128 $line->pa_ht = $marginInfos[0];
2129 $line->marge_tx = $marginInfos[1];
2130 $line->marque_tx = $marginInfos[2];
2131 $line->rang = $objp->rang;
2132 $line->info_bits = $objp->info_bits;
2133 $line->special_code = $objp->special_code;
2134 $line->fk_parent_line = $objp->fk_parent_line;
2136 $line->ref = $objp->product_ref;
2137 $line->libelle = $objp->product_label;
2139 $line->product_ref = $objp->product_ref;
2140 $line->product_label = $objp->product_label;
2141 $line->product_tosell = $objp->product_tosell;
2142 $line->product_tobuy = $objp->product_tobuy;
2143 $line->product_desc = $objp->product_desc;
2144 $line->product_tobatch = $objp->product_tobatch;
2145 $line->product_barcode = $objp->product_barcode;
2147 $line->fk_product_type = $objp->fk_product_type;
2148 $line->fk_unit = $objp->fk_unit;
2150 $line->weight = $objp->weight;
2151 $line->weight_units = $objp->weight_units;
2152 $line->volume = $objp->volume;
2153 $line->volume_units = $objp->volume_units;
2155 $line->date_start = $this->db->jdate($objp->date_start);
2156 $line->date_end = $this->db->jdate($objp->date_end);
2159 $line->fk_multicurrency = $objp->fk_multicurrency;
2160 $line->multicurrency_code = $objp->multicurrency_code;
2161 $line->multicurrency_subprice = $objp->multicurrency_subprice;
2162 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
2163 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
2164 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2166 $line->fetch_optionals();
2169 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
2170 $tmpproduct =
new Product($this->db);
2171 $tmpproduct->fetch($objp->fk_product);
2172 $tmpproduct->getMultiLangs();
2174 $line->multilangs = $tmpproduct->multilangs;
2177 $this->lines[$i] = $line;
2182 $this->db->free($result);
2186 $this->error = $this->db->error();
2200 foreach ($this->lines as $line) {
2201 if ($line->product_type == 0) {
2216 foreach ($this->lines as $line) {
2217 if ($line->product_type == 1) {
2233 $sql =
'SELECT COUNT(DISTINCT ed.fk_expedition) as nb';
2234 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2235 $sql .=
' '.MAIN_DB_PREFIX.
'commandedet as cd';
2237 $sql .=
' ed.fk_origin_line = cd.rowid';
2238 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2241 dol_syslog(get_class($this).
"::getNbOfShipments", LOG_DEBUG);
2242 $resql = $this->db->query($sql);
2244 $obj = $this->db->fetch_object($resql);
2249 $this->db->free($resql);
2252 $this->error = $this->db->lasterror();
2267 $this->expeditions = array();
2269 $sql =
'SELECT cd.rowid, cd.fk_product,';
2270 $sql .=
' sum(ed.qty) as qty';
2271 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2272 if ($filtre_statut >= 0) {
2273 $sql .=
' '.MAIN_DB_PREFIX.
'expedition as e,';
2275 $sql .=
' '.MAIN_DB_PREFIX.
'commandedet as cd';
2277 if ($filtre_statut >= 0) {
2278 $sql .=
' ed.fk_expedition = e.rowid AND';
2280 $sql .=
' ed.fk_origin_line = cd.rowid';
2281 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2282 if ($fk_product > 0) {
2283 $sql .=
' AND cd.fk_product = '.((int) $fk_product);
2285 if ($filtre_statut >= 0) {
2286 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
2288 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
2291 dol_syslog(get_class($this).
"::loadExpeditions", LOG_DEBUG);
2292 $resql = $this->db->query($sql);
2294 $num = $this->db->num_rows($resql);
2297 $obj = $this->db->fetch_object($resql);
2298 $this->expeditions[$obj->rowid] = $obj->qty;
2301 $this->db->free($resql);
2304 $this->error = $this->db->lasterror();
2316 $sql =
'SELECT count(*)';
2317 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expedition as e';
2318 $sql .=
', '.MAIN_DB_PREFIX.
'element_element as el';
2319 $sql .=
' WHERE el.fk_source = '.((int) $this->
id);
2320 $sql .=
" AND el.sourcetype = 'commande'";
2321 $sql .=
" AND el.fk_target = e.rowid";
2322 $sql .=
" AND el.targettype = 'shipping'";
2324 $resql = $this->db->query($sql);
2326 $row = $this->db->fetch_row($resql);
2384 if ($this->
statut == self::STATUS_DRAFT) {
2390 $line->context = $this->context;
2393 $line->fetch($lineid);
2395 if ($id > 0 && $line->fk_commande != $id) {
2396 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
2401 $staticline = clone $line;
2402 $line->oldline = $staticline;
2404 if ($line->delete($user) > 0) {
2408 $this->db->commit();
2411 $this->db->rollback();
2412 $this->error = $this->db->lasterror();
2416 $this->db->rollback();
2417 $this->error = $line->error;
2421 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
2440 dol_syslog(get_class($this).
"::set_remise is deprecated, use setDiscount instead", LOG_NOTICE);
2441 return $this->
setDiscount($user, $remise, $notrigger);
2455 $remise = trim($remise) ? trim($remise) : 0;
2457 if ($user->hasRight(
'commande',
'creer')) {
2464 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
2465 $sql .=
' SET remise_percent = '.((float) $remise);
2466 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_DRAFT);
2469 $resql = $this->db->query($sql);
2471 $this->errors[] = $this->db->error();
2476 $this->oldcopy = clone $this;
2477 $this->remise_percent = $remise;
2481 if (!$notrigger && empty($error)) {
2491 $this->db->commit();
2494 foreach ($this->errors as $errmsg) {
2495 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2496 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2498 $this->db->rollback();
2586 if ($user->hasRight(
'commande',
'creer')) {
2591 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
2592 $sql .=
" SET date_commande = ".($date ?
"'".$this->db->idate($date).
"'" :
'null');
2593 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = ".((int) self::STATUS_DRAFT);
2596 $resql = $this->db->query($sql);
2598 $this->errors[] = $this->db->error();
2603 $this->oldcopy = clone $this;
2604 $this->date = $date;
2607 if (!$notrigger && empty($error)) {
2617 $this->db->commit();
2620 foreach ($this->errors as $errmsg) {
2621 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2622 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2624 $this->db->rollback();
2658 if ($user->hasRight(
'commande',
'creer')) {
2663 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande";
2664 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2665 $sql .=
" WHERE rowid = ".((int) $this->
id);
2668 $resql = $this->db->query($sql);
2670 $this->errors[] = $this->db->error();
2675 $this->oldcopy = clone $this;
2676 $this->delivery_date = $delivery_date;
2679 if (!$notrigger && empty($error)) {
2689 $this->db->commit();
2692 foreach ($this->errors as $errmsg) {
2693 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2694 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2696 $this->db->rollback();
2718 public function liste_array($shortlist = 0, $draft = 0, $excluser =
null, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'c.date_commande', $sortorder =
'DESC')
2725 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2726 $sql .=
" c.rowid as cid, c.ref";
2727 if (!$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2728 $sql .=
", sc.fk_soc, sc.fk_user";
2730 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.
"commande as c";
2731 if (!$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2732 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
2734 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2735 $sql .=
" AND c.fk_soc = s.rowid";
2736 if (!$user->hasRight(
'societe',
'client',
'voir') && !$socid) {
2737 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2740 $sql .=
" AND s.rowid = ".((int) $socid);
2743 $sql .=
" AND c.fk_statut = ".self::STATUS_DRAFT;
2745 if (is_object($excluser)) {
2746 $sql .=
" AND c.fk_user_author <> ".((int) $excluser->id);
2748 $sql .= $this->db->order($sortfield, $sortorder);
2749 $sql .= $this->db->plimit($limit, $offset);
2751 $result = $this->db->query($sql);
2753 $numc = $this->db->num_rows($result);
2756 while ($i < $numc) {
2757 $obj = $this->db->fetch_object($result);
2759 if ($shortlist == 1) {
2760 $ga[$obj->cid] = $obj->ref;
2761 } elseif ($shortlist == 2) {
2762 $ga[$obj->cid] = $obj->ref.
' ('.$obj->name.
')';
2764 $ga[$i][
'id'] = $obj->cid;
2765 $ga[$i][
'ref'] = $obj->ref;
2766 $ga[$i][
'name'] = $obj->name;
2789 dol_syslog(
'Commande::availability('.$availability_id.
')');
2790 if ($this->
statut >= self::STATUS_DRAFT) {
2795 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
2796 $sql .=
' SET fk_availability = '.((int) $availability_id);
2797 $sql .=
' WHERE rowid='.((int) $this->
id);
2800 $resql = $this->db->query($sql);
2802 $this->errors[] = $this->db->error();
2807 $this->oldcopy = clone $this;
2808 $this->availability_id = $availability_id;
2811 if (!$notrigger && empty($error)) {
2821 $this->db->commit();
2824 foreach ($this->errors as $errmsg) {
2825 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2826 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2828 $this->db->rollback();
2832 $error_str =
'Command status do not meet requirement '.$this->statut;
2834 $this->error = $error_str;
2835 $this->errors[] = $this->error;
2853 dol_syslog(
'Commande::demand_reason('.$demand_reason_id.
')');
2854 if ($this->
statut >= self::STATUS_DRAFT) {
2859 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande';
2860 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
2861 $sql .=
' WHERE rowid='.((int) $this->
id);
2864 $resql = $this->db->query($sql);
2866 $this->errors[] = $this->db->error();
2871 $this->oldcopy = clone $this;
2872 $this->demand_reason_id = $demand_reason_id;
2875 if (!$notrigger && empty($error)) {
2885 $this->db->commit();
2888 foreach ($this->errors as $errmsg) {
2889 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2890 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2892 $this->db->rollback();
2896 $error_str =
'order status do not meet requirement '.$this->statut;
2898 $this->error = $error_str;
2899 $this->errors[] = $this->error;
2916 if ($user->hasRight(
'commande',
'creer')) {
2921 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande SET';
2922 $sql .=
' ref_client = '.(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2923 $sql .=
' WHERE rowid = '.((int) $this->
id);
2925 dol_syslog(__METHOD__.
' this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2926 $resql = $this->db->query($sql);
2928 $this->errors[] = $this->db->error();
2933 $this->oldcopy = clone $this;
2934 $this->ref_client = $ref_client;
2935 $this->ref_customer = $ref_client;
2938 if (!$notrigger && empty($error)) {
2947 $this->db->commit();
2950 foreach ($this->errors as $errmsg) {
2951 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2952 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2954 $this->db->rollback();
2973 if ($this->billed) {
2979 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande SET facture = 1';
2982 dol_syslog(get_class($this).
"::classifyBilled", LOG_DEBUG);
2983 if ($this->db->query($sql)) {
2985 $this->oldcopy = clone $this;
2989 if (!$notrigger && empty($error)) {
2991 $result = $this->
call_trigger(
'ORDER_CLASSIFY_BILLED', $user);
2999 $this->db->commit();
3002 foreach ($this->errors as $errmsg) {
3003 dol_syslog(get_class($this).
"::classifyBilled ".$errmsg, LOG_ERR);
3004 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3006 $this->db->rollback();
3010 $this->error = $this->db->error();
3011 $this->db->rollback();
3029 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'commande SET facture = 0';
3032 dol_syslog(get_class($this).
"::classifyUnBilled", LOG_DEBUG);
3033 if ($this->db->query($sql)) {
3035 $this->oldcopy = clone $this;
3039 if (!$notrigger && empty($error)) {
3041 $result = $this->
call_trigger(
'ORDER_CLASSIFY_UNBILLED', $user);
3051 $this->db->commit();
3054 foreach ($this->errors as $errmsg) {
3055 dol_syslog(get_class($this).
"::classifyUnBilled ".$errmsg, LOG_ERR);
3056 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3058 $this->db->rollback();
3062 $this->error = $this->db->error();
3063 $this->db->rollback();
3099 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)
3101 global $conf, $mysoc, $langs, $user;
3103 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");
3104 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3111 if (empty($info_bits)) {
3114 if (empty($txtva)) {
3117 if (empty($txlocaltax1)) {
3120 if (empty($txlocaltax2)) {
3126 if (empty($special_code) || $special_code == 3) {
3129 if (empty($ref_ext)) {
3133 if ($date_start && $date_end && $date_start > $date_end) {
3134 $langs->load(
"errors");
3135 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
3143 $pu_ht_devise =
price2num($pu_ht_devise);
3144 if (!preg_match(
'/\((.*)\)/', $txtva)) {
3162 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
3163 $vat_src_code = $reg[1];
3164 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
3167 $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);
3169 $total_ht = $tabprice[0];
3170 $total_tva = $tabprice[1];
3171 $total_ttc = $tabprice[2];
3172 $total_localtax1 = $tabprice[9];
3173 $total_localtax2 = $tabprice[10];
3174 $pu_ht = $tabprice[3];
3175 $pu_tva = $tabprice[4];
3176 $pu_ttc = $tabprice[5];
3179 $multicurrency_total_ht = $tabprice[16];
3180 $multicurrency_total_tva = $tabprice[17];
3181 $multicurrency_total_ttc = $tabprice[18];
3182 $pu_ht_devise = $tabprice[19];
3186 if ($price_base_type ==
'TTC') {
3187 $subprice = $pu_ttc;
3194 $price = ($pu - $remise);
3199 $line->fetch($rowid);
3200 $line->fetch_optionals();
3202 if (!empty($line->fk_product)) {
3203 $product =
new Product($this->db);
3204 $result = $product->fetch($line->fk_product);
3205 $product_type = $product->type;
3207 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
3208 $langs->load(
"errors");
3209 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
3210 $this->errors[] = $this->error;
3212 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
3214 $this->db->rollback();
3219 $staticline = clone $line;
3221 $line->oldline = $staticline;
3222 $this->line = $line;
3223 $this->line->context = $this->context;
3224 $this->line->rang = $rang;
3227 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
3228 $rangmax = $this->
line_max($fk_parent_line);
3229 $this->line->rang = $rangmax + 1;
3232 $this->line->id = $rowid;
3233 $this->line->label = $label;
3234 $this->line->desc = $desc;
3235 $this->line->qty = $qty;
3236 $this->line->ref_ext = $ref_ext;
3238 $this->line->vat_src_code = $vat_src_code;
3239 $this->line->tva_tx = $txtva;
3240 $this->line->localtax1_tx = $txlocaltax1;
3241 $this->line->localtax2_tx = $txlocaltax2;
3242 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
3243 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
3245 $this->line->subprice = $pu_ht;
3246 $this->line->info_bits = $info_bits;
3247 $this->line->special_code = $special_code;
3248 $this->line->total_ht = $total_ht;
3249 $this->line->total_tva = $total_tva;
3250 $this->line->total_localtax1 = $total_localtax1;
3251 $this->line->total_localtax2 = $total_localtax2;
3252 $this->line->total_ttc = $total_ttc;
3253 $this->line->date_start = $date_start;
3254 $this->line->date_end = $date_end;
3255 $this->line->product_type = $type;
3256 $this->line->fk_parent_line = $fk_parent_line;
3257 $this->line->skip_update_total = $skip_update_total;
3258 $this->line->fk_unit = $fk_unit;
3260 $this->line->fk_fournprice = $fk_fournprice;
3261 $this->line->pa_ht = $pa_ht;
3264 $this->line->multicurrency_subprice = $pu_ht_devise;
3265 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
3266 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
3267 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
3270 $this->line->price = $price;
3272 if (is_array($array_options) && count($array_options) > 0) {
3274 foreach ($array_options as $key => $value) {
3275 $this->line->array_options[$key] = $array_options[$key];
3279 $result = $this->line->update($user, $notrigger);
3282 if (!empty($fk_parent_line)) {
3289 $this->db->commit();
3292 $this->error = $this->line->error;
3294 $this->db->rollback();
3298 $this->error = get_class($this).
"::updateline Order status makes operation forbidden";
3299 $this->errors = array(
'OrderStatusMakeOperationForbidden');
3318 if (isset($this->
ref)) {
3319 $this->
ref = trim($this->
ref);
3321 if (isset($this->ref_client)) {
3322 $this->ref_client = trim($this->ref_client);
3324 if (isset($this->ref_customer)) {
3325 $this->ref_customer = trim($this->ref_customer);
3327 if (isset($this->note) || isset($this->note_private)) {
3328 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
3330 if (isset($this->note_public)) {
3331 $this->note_public = trim($this->note_public);
3333 if (isset($this->model_pdf)) {
3334 $this->model_pdf = trim($this->model_pdf);
3336 if (isset($this->import_key)) {
3337 $this->import_key = trim($this->import_key);
3339 $delivery_date = $this->delivery_date;
3345 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commande SET";
3347 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
3348 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
3349 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
3350 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
3351 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
3352 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
3353 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
3354 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
3355 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
3356 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
3357 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
3358 $sql .=
" fk_statut=".(isset($this->
statut) ? $this->
statut :
"null").
",";
3359 $sql .=
" fk_user_modif=".(isset($user->id) ? $user->id :
"null").
",";
3360 $sql .=
" fk_user_valid=".((isset($this->user_validation_id) && $this->user_validation_id > 0) ? $this->user_validation_id :
"null").
",";
3361 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
3362 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
3363 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ? strval($this->deposit_percent) :
"null").
",";
3364 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
3365 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
3366 $sql .=
" fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id :
"null").
",";
3367 $sql .=
" fk_account=".($this->fk_account > 0 ? $this->fk_account :
"null").
",";
3368 $sql .=
" fk_input_reason=".($this->demand_reason_id > 0 ? $this->demand_reason_id :
"null").
",";
3369 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
3370 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
3371 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
3372 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
3374 $sql .=
" WHERE rowid=".((int) $this->
id);
3378 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3379 $resql = $this->db->query($sql);
3382 $this->errors[] =
"Error ".$this->db->lasterror();
3392 if (!$error && !$notrigger) {
3403 foreach ($this->errors as $errmsg) {
3404 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
3405 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3407 $this->db->rollback();
3410 $this->db->commit();
3422 public function delete($user, $notrigger = 0)
3424 global $conf, $langs;
3425 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3429 dol_syslog(get_class($this).
"::delete ".$this->
id, LOG_DEBUG);
3444 $this->errors[] = $langs->trans(
'SomeShipmentExists');
3449 if (!$error && !empty($this->table_element_line)) {
3450 $tabletodelete = $this->table_element_line;
3451 $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).
")";
3452 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3453 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3455 $this->error = $this->db->lasterror();
3456 $this->errors[] = $this->error;
3457 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3482 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3488 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3489 $res = $this->db->query($sql);
3492 $this->error = $this->db->lasterror();
3493 $this->errors[] = $this->error;
3494 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3510 if ($conf->commande->multidir_output[$this->entity] && !empty($this->
ref)) {
3511 $dir = $conf->commande->multidir_output[$this->entity].
"/".$ref;
3512 $file = $dir.
"/".$ref.
".pdf";
3513 if (file_exists($file)) {
3517 $this->error =
'ErrorFailToDeleteFile';
3518 $this->errors[] = $this->error;
3519 $this->db->rollback();
3523 if (file_exists($dir)) {
3526 $this->error =
'ErrorFailToDeleteDir';
3527 $this->errors[] = $this->error;
3528 $this->db->rollback();
3536 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3537 $this->db->commit();
3540 $this->db->rollback();
3557 global $conf, $langs;
3561 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht";
3562 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande as c";
3563 if (!$user->hasRight(
'societe',
'client',
'voir') && !$user->socid) {
3564 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc";
3565 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3568 $sql .= $clause.
" c.entity IN (".
getEntity(
'commande').
")";
3570 if ($mode ==
'toship') {
3572 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
")";
3574 if ($mode ==
'tobill') {
3576 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
", " . self::STATUS_CLOSED .
") AND c.facture = 0";
3578 if ($mode ==
'shippedtobill') {
3580 $sql .=
" AND c.fk_statut IN (" . self::STATUS_CLOSED .
") AND c.facture = 0";
3583 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3586 $resql = $this->db->query($sql);
3589 $label = $labelShort = $url =
'';
3590 if ($mode ==
'toship') {
3591 $delay_warning = $conf->commande->client->warning_delay / 60 / 60 / 24;
3592 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-2&mainmenu=commercial&leftmenu=orders';
3593 $label = $langs->transnoentitiesnoconv(
"OrdersToProcess");
3594 $labelShort = $langs->transnoentitiesnoconv(
"Opened");
3596 if ($mode ==
'tobill') {
3597 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3598 $label = $langs->trans(
"OrdersToBill");
3599 $labelShort = $langs->trans(
"ToBill");
3601 if ($mode ==
'shippedtobill') {
3602 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3603 $label = $langs->trans(
"OrdersToBill");
3604 $labelShort = $langs->trans(
"StatusOrderDelivered").
' '.$langs->trans(
"and").
' '.$langs->trans(
"ToBill");
3609 $response->warning_delay = $delay_warning;
3610 $response->label = $label;
3611 $response->labelShort = $labelShort;
3612 $response->url = $url;
3613 $response->url_late = DOL_URL_ROOT.
'/commande/list.php?search_option=late&mainmenu=commercial&leftmenu=orders';
3616 $generic_commande =
new Commande($this->db);
3618 while ($obj = $this->db->fetch_object($resql)) {
3619 $response->nbtodo++;
3620 $response->total += $obj->total_ht;
3622 $generic_commande->statut = $obj->fk_statut;
3623 $generic_commande->date_commande = $this->db->jdate($obj->date_commande);
3624 $generic_commande->date = $this->db->jdate($obj->date_commande);
3625 $generic_commande->delivery_date = $this->db->jdate($obj->delivery_date);
3627 if ($mode ==
'toship' && $generic_commande->hasDelay()) {
3628 $response->nbtodolate++;
3634 $this->error = $this->db->error();
3648 $label = $langs->trans(
'OrderSource'.$this->source);
3650 if ($label ==
'OrderSource') {
3677 public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
3680 global $langs, $hookmanager;
3683 if (empty($donotshowbilled)) {
3684 $billedtext .= ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3689 if ($status == self::STATUS_CANCELED) {
3690 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderCanceled');
3691 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderCanceledShort');
3692 $statusType =
'status9';
3693 } elseif ($status == self::STATUS_DRAFT) {
3694 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDraft');
3695 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDraftShort');
3696 $statusType =
'status0';
3697 } elseif ($status == self::STATUS_VALIDATED) {
3698 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderValidated').$billedtext;
3699 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderValidatedShort').$billedtext;
3700 $statusType =
'status1';
3701 } elseif ($status == self::STATUS_SHIPMENTONPROCESS) {
3702 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderSent').$billedtext;
3703 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderSentShort').$billedtext;
3704 $labelTooltip = $langs->transnoentitiesnoconv(
"StatusOrderSent");
3705 if (!empty($this->delivery_date)) {
3706 $labelTooltip .=
' - '.$langs->transnoentitiesnoconv(
"DateDeliveryPlanned").dol_print_date($this->delivery_date,
'day').$billedtext;
3708 $statusType =
'status4';
3709 } elseif ($status == self::STATUS_CLOSED) {
3710 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDelivered').$billedtext;
3711 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDeliveredShort').$billedtext;
3712 $statusType =
'status6';
3714 $labelStatus = $langs->transnoentitiesnoconv(
'Unknown');
3715 $labelStatusShort =
'';
3720 $parameters = array(
3721 'status' => $status,
3723 'billed' => $billed,
3724 'donotshowbilled' => $donotshowbilled
3727 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3730 return $hookmanager->resPrint;
3733 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode,
'', array(
'tooltip' => $labelTooltip));
3744 global $conf, $langs, $user;
3746 $langs->load(
'orders');
3748 $nofetch = !empty($params[
'nofetch']);
3751 return [
'optimize' => $langs->trans(
"Order")];
3754 if ($user->hasRight(
'commande',
'lire')) {
3755 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"Order").
'</u>';
3756 if (isset($this->
statut)) {
3757 $datas[
'status'] =
' '.$this->getLibStatut(5);
3759 $datas[
'Ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3761 $langs->load(
'companies');
3762 if (empty($this->thirdparty)) {
3765 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3767 $datas[
'RefCustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.(empty($this->ref_customer) ? (empty($this->ref_client) ?
'' : $this->ref_client) : $this->ref_customer);
3769 $langs->load(
'project');
3770 if (empty($this->project)) {
3773 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0, 1);
3777 if (!empty($this->total_ht)) {
3778 $datas[
'AmountHT'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
3780 if (!empty($this->total_tva)) {
3781 $datas[
'VAT'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
3783 if (!empty($this->total_ttc)) {
3784 $datas[
'AmountTTC'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
3786 if (!empty($this->date)) {
3787 $datas[
'Date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
3789 if (!empty($this->delivery_date)) {
3790 $datas[
'DeliveryDate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3810 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target =
'')
3812 global $conf, $langs, $user, $hookmanager;
3814 if (!empty($conf->dol_no_mouse_hover)) {
3820 if (isModEnabled(
"expedition") && ($option ==
'1' || $option ==
'2')) {
3821 $url = DOL_URL_ROOT.
'/expedition/shipment.php?id='.$this->id;
3823 $url = DOL_URL_ROOT.
'/commande/card.php?id='.$this->id;
3826 if (!$user->hasRight(
'commande',
'lire')) {
3830 if ($option !==
'nolink') {
3832 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3833 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3834 $add_save_lastsearch_values = 1;
3836 if ($add_save_lastsearch_values) {
3837 $url .=
'&save_lastsearch_values=1';
3846 'objecttype' => $this->element,
3847 'option' => $option,
3850 $classfortooltip =
'classfortooltip';
3853 $classfortooltip =
'classforajaxtooltip';
3854 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3861 if (empty($notooltip) && $user->hasRight(
'commande',
'lire')) {
3863 $label = $langs->trans(
"Order");
3864 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
3866 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
3867 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3869 $target_value = array(
'_self',
'_blank',
'_parent',
'_top');
3870 if (in_array($target, $target_value)) {
3871 $linkclose .=
' target="'.dol_escape_htmltag($target).
'"';
3875 $linkstart =
'<a href="'.$url.
'"';
3876 $linkstart .= $linkclose.
'>';
3879 if ($option ===
'nolink') {
3884 $result .= $linkstart;
3886 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
3888 if ($withpicto != 2) {
3889 $result .= $this->ref;
3891 $result .= $linkend;
3893 if ($addlinktonotes) {
3894 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
3897 $result .=
' <span class="note inline-block">';
3898 $result .=
'<a href="'.DOL_URL_ROOT.
'/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
3903 $result .=
'</span>';
3908 $hookmanager->initHooks(array($this->element .
'dao'));
3909 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
3910 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
3912 $result = $hookmanager->resPrint;
3914 $result .= $hookmanager->resPrint;
3928 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem,';
3929 $sql .=
' date_valid as datev,';
3930 $sql .=
' date_cloture as datecloture,';
3931 $sql .=
' fk_user_author, fk_user_valid, fk_user_cloture';
3932 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commande as c';
3933 $sql .=
' WHERE c.rowid = '.((int) $id);
3934 $result = $this->db->query($sql);
3936 if ($this->db->num_rows($result)) {
3937 $obj = $this->db->fetch_object($result);
3938 $this->
id = $obj->rowid;
3939 if ($obj->fk_user_author) {
3940 $this->user_creation_id = $obj->fk_user_author;
3942 if ($obj->fk_user_valid) {
3943 $this->user_validation_id = $obj->fk_user_valid;
3945 if ($obj->fk_user_cloture) {
3946 $this->user_closing_id = $obj->fk_user_cloture;
3949 $this->date_creation = $this->db->jdate($obj->datec);
3950 $this->date_modification = $this->db->jdate($obj->datem);
3951 $this->date_validation = $this->db->jdate($obj->datev);
3952 $this->date_cloture = $this->db->jdate($obj->datecloture);
3955 $this->db->free($result);
3971 global $conf, $langs;
3973 dol_syslog(get_class($this).
"::initAsSpecimen");
3978 $sql =
"SELECT rowid";
3979 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
3980 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
3981 $sql .= $this->db->plimit(100);
3983 $resql = $this->db->query($sql);
3985 $num_prods = $this->db->num_rows($resql);
3987 while ($i < $num_prods) {
3989 $row = $this->db->fetch_row($resql);
3990 $prodids[$i] = $row[0];
3996 $this->
ref =
'SPECIMEN';
3997 $this->specimen = 1;
3998 $this->entity = $conf->entity;
4000 $this->date = time();
4001 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
4002 $this->cond_reglement_code =
'RECEP';
4003 $this->mode_reglement_code =
'CHQ';
4004 $this->availability_code =
'DSP';
4005 $this->demand_reason_code =
'SRC_00';
4007 $this->note_public =
'This is a comment (public)';
4008 $this->note_private =
'This is a comment (private)';
4010 $this->multicurrency_tx = 1;
4011 $this->multicurrency_code = $conf->currency;
4016 while ($xnbp < $nbp) {
4019 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
4021 $line->subprice = 100;
4025 $line->total_ht = 50;
4026 $line->total_ttc = 60;
4027 $line->total_tva = 10;
4028 $line->remise_percent = 50;
4030 $line->total_ht = 100;
4031 $line->total_ttc = 120;
4032 $line->total_tva = 20;
4033 $line->remise_percent = 0;
4035 if ($num_prods > 0) {
4036 $prodid = mt_rand(1, $num_prods);
4037 $line->fk_product = $prodids[$prodid];
4038 $line->product_ref =
'SPECIMEN';
4041 $this->lines[$xnbp] = $line;
4043 $this->total_ht += $line->total_ht;
4044 $this->total_tva += $line->total_tva;
4045 $this->total_ttc += $line->total_ttc;
4063 $this->nb = array();
4066 $sql =
"SELECT count(co.rowid) as nb";
4067 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande as co";
4068 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON co.fk_soc = s.rowid";
4069 if (!$user->hasRight(
'societe',
'client',
'voir') && !$user->socid) {
4070 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
4071 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
4074 $sql .=
" ".$clause.
" co.entity IN (".
getEntity(
'commande').
")";
4076 $resql = $this->db->query($sql);
4078 while ($obj = $this->db->fetch_object($resql)) {
4079 $this->nb[
"orders"] = $obj->nb;
4081 $this->db->free($resql);
4085 $this->error = $this->db->error();
4111 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
4113 global $conf, $langs;
4115 $langs->load(
"orders");
4116 $outputlangs->load(
"products");
4119 $modele =
'einstein';
4121 if (!empty($this->model_pdf)) {
4122 $modele = $this->model_pdf;
4124 $modele = $conf->global->COMMANDE_ADDON_PDF;
4128 $modelpath =
"core/modules/commande/doc/";
4130 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4183 return max($this->date, $this->delivery_date) < ($now - $conf->commande->client->warning_delay);
4193 global $conf, $langs;
4195 if (empty($this->delivery_date)) {
4196 $text = $langs->trans(
"OrderDate").
' '.
dol_print_date($this->date,
'day');
4198 $text = $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
4200 $text .=
' '.($conf->commande->client->warning_delay > 0 ?
'+' :
'-').
' '.round(abs($conf->commande->client->warning_delay) / 3600 / 24, 1).
' '.$langs->trans(
"days").
' < '.$langs->trans(
"Today");
4215 public $element =
'commandedet';
4217 public $table_element =
'commandedet';
4225 public $fk_commande;
4233 public $commande_id;
4235 public $fk_parent_line;
4247 public $fk_remise_except;
4253 public $fk_fournprice;
4273 public $skip_update_total;
4294 $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,';
4295 $sql .=
' cd.remise, cd.remise_percent, cd.fk_remise_except, cd.subprice, cd.ref_ext,';
4296 $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,';
4297 $sql .=
' cd.fk_unit,';
4298 $sql .=
' cd.fk_multicurrency, cd.multicurrency_code, cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc,';
4299 $sql .=
' p.ref as product_ref, p.label as product_label, p.description as product_desc, p.tobatch as product_tobatch,';
4300 $sql .=
' cd.date_start, cd.date_end, cd.vat_src_code';
4301 $sql .=
' FROM '.MAIN_DB_PREFIX.
'commandedet as cd';
4302 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON cd.fk_product = p.rowid';
4303 $sql .=
' WHERE cd.rowid = '.((int) $rowid);
4304 $result = $this->db->query($sql);
4306 $objp = $this->db->fetch_object($result);
4309 $this->error =
'OrderLine with id '. $rowid .
' not found sql='.$sql;
4313 $this->
rowid = $objp->rowid;
4314 $this->
id = $objp->rowid;
4315 $this->fk_commande = $objp->fk_commande;
4316 $this->fk_parent_line = $objp->fk_parent_line;
4317 $this->label = $objp->custom_label;
4318 $this->desc = $objp->description;
4319 $this->qty = $objp->qty;
4320 $this->
price = $objp->price;
4321 $this->subprice = $objp->subprice;
4322 $this->ref_ext = $objp->ref_ext;
4323 $this->vat_src_code = $objp->vat_src_code;
4324 $this->tva_tx = $objp->tva_tx;
4325 $this->localtax1_tx = $objp->localtax1_tx;
4326 $this->localtax2_tx = $objp->localtax2_tx;
4327 $this->remise = $objp->remise;
4328 $this->remise_percent = $objp->remise_percent;
4329 $this->fk_remise_except = $objp->fk_remise_except;
4330 $this->fk_product = $objp->fk_product;
4331 $this->product_type = $objp->product_type;
4332 $this->info_bits = $objp->info_bits;
4333 $this->special_code = $objp->special_code;
4334 $this->total_ht = $objp->total_ht;
4335 $this->total_tva = $objp->total_tva;
4336 $this->total_localtax1 = $objp->total_localtax1;
4337 $this->total_localtax2 = $objp->total_localtax2;
4338 $this->total_ttc = $objp->total_ttc;
4339 $this->fk_fournprice = $objp->fk_fournprice;
4340 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $this->fk_fournprice, $objp->pa_ht);
4341 $this->pa_ht = $marginInfos[0];
4342 $this->marge_tx = $marginInfos[1];
4343 $this->marque_tx = $marginInfos[2];
4344 $this->special_code = $objp->special_code;
4345 $this->rang = $objp->rang;
4347 $this->
ref = $objp->product_ref;
4349 $this->product_ref = $objp->product_ref;
4350 $this->product_label = $objp->product_label;
4351 $this->product_desc = $objp->product_desc;
4352 $this->product_tobatch = $objp->product_tobatch;
4353 $this->fk_unit = $objp->fk_unit;
4355 $this->date_start = $this->db->jdate($objp->date_start);
4356 $this->date_end = $this->db->jdate($objp->date_end);
4358 $this->fk_multicurrency = $objp->fk_multicurrency;
4359 $this->multicurrency_code = $objp->multicurrency_code;
4360 $this->multicurrency_subprice = $objp->multicurrency_subprice;
4361 $this->multicurrency_total_ht = $objp->multicurrency_total_ht;
4362 $this->multicurrency_total_tva = $objp->multicurrency_total_tva;
4363 $this->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
4367 $this->db->free($result);
4371 $this->error = $this->db->lasterror();
4383 public function delete(
User $user, $notrigger = 0)
4385 global $conf, $langs;
4389 if (empty($this->
id) && !empty($this->
rowid)) {
4390 $this->
id = $this->rowid;
4394 $sqlCheckShipmentLine =
"SELECT";
4395 $sqlCheckShipmentLine .=
" ed.rowid";
4396 $sqlCheckShipmentLine .=
" FROM " . MAIN_DB_PREFIX .
"expeditiondet ed";
4397 $sqlCheckShipmentLine .=
" WHERE ed.fk_origin_line = " . ((int) $this->
id);
4399 $resqlCheckShipmentLine = $this->db->query($sqlCheckShipmentLine);
4400 if (!$resqlCheckShipmentLine) {
4402 $this->error = $this->db->lasterror();
4403 $this->errors[] = $this->error;
4405 $langs->load(
'errors');
4406 $num = $this->db->num_rows($resqlCheckShipmentLine);
4409 $objCheckShipmentLine = $this->db->fetch_object($resqlCheckShipmentLine);
4410 $this->error = $langs->trans(
'ErrorRecordAlreadyExists') .
' : ' . $langs->trans(
'ShipmentLine') .
' ' . $objCheckShipmentLine->rowid;
4411 $this->errors[] = $this->error;
4413 $this->db->free($resqlCheckShipmentLine);
4416 dol_syslog(__METHOD__ .
'Error ; ' . $this->error, LOG_ERR);
4424 $result = $this->
call_trigger(
'LINEORDER_DELETE', $user);
4432 $sql =
'DELETE FROM ' . MAIN_DB_PREFIX .
"commandedet WHERE rowid = " . ((int) $this->
id);
4435 $resql = $this->db->query($sql);
4437 $this->error = $this->db->lasterror();
4447 dol_syslog(get_class($this) .
"::delete error -4 " . $this->error, LOG_ERR);
4452 $this->db->commit();
4456 foreach ($this->errors as $errmsg) {
4457 dol_syslog(get_class($this) .
"::delete " . $errmsg, LOG_ERR);
4458 $this->error .= ($this->error ?
', ' . $errmsg : $errmsg);
4460 $this->db->rollback();
4471 public function insert($user =
null, $notrigger = 0)
4475 $pa_ht_isemptystring = (empty($this->pa_ht) && $this->pa_ht ==
'');
4477 dol_syslog(get_class($this).
"::insert rang=".$this->rang);
4480 if (empty($this->tva_tx)) {
4483 if (empty($this->localtax1_tx)) {
4484 $this->localtax1_tx = 0;
4486 if (empty($this->localtax2_tx)) {
4487 $this->localtax2_tx = 0;
4489 if (empty($this->localtax1_type)) {
4490 $this->localtax1_type = 0;
4492 if (empty($this->localtax2_type)) {
4493 $this->localtax2_type = 0;
4495 if (empty($this->total_localtax1)) {
4496 $this->total_localtax1 = 0;
4498 if (empty($this->total_localtax2)) {
4499 $this->total_localtax2 = 0;
4501 if (empty($this->rang)) {
4504 if (empty($this->remise_percent)) {
4505 $this->remise_percent = 0;
4507 if (empty($this->info_bits)) {
4508 $this->info_bits = 0;
4510 if (empty($this->special_code)) {
4511 $this->special_code = 0;
4513 if (empty($this->fk_parent_line)) {
4514 $this->fk_parent_line = 0;
4516 if (empty($this->pa_ht)) {
4519 if (empty($this->ref_ext)) {
4520 $this->ref_ext =
'';
4524 if ($this->pa_ht == 0 && $pa_ht_isemptystring) {
4525 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
4529 $this->pa_ht = $result;
4534 if ($this->product_type < 0) {
4541 $sql =
'INSERT INTO '.MAIN_DB_PREFIX.
'commandedet';
4542 $sql .=
' (fk_commande, fk_parent_line, label, description, qty, ref_ext,';
4543 $sql .=
' vat_src_code, tva_tx, localtax1_tx, localtax2_tx, localtax1_type, localtax2_type,';
4544 $sql .=
' fk_product, product_type, remise_percent, subprice, price, fk_remise_except,';
4545 $sql .=
' special_code, rang, fk_product_fournisseur_price, buy_price_ht,';
4546 $sql .=
' info_bits, total_ht, total_tva, total_localtax1, total_localtax2, total_ttc, date_start, date_end,';
4547 $sql .=
' fk_unit,';
4548 $sql .=
' fk_multicurrency, multicurrency_code, multicurrency_subprice, multicurrency_total_ht, multicurrency_total_tva, multicurrency_total_ttc';
4550 $sql .=
" VALUES (".$this->fk_commande.
",";
4551 $sql .=
" ".($this->fk_parent_line > 0 ?
"'".$this->db->escape($this->fk_parent_line).
"'" :
"null").
",";
4552 $sql .=
" ".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null").
",";
4553 $sql .=
" '".$this->db->escape($this->desc).
"',";
4554 $sql .=
" '".price2num($this->qty).
"',";
4555 $sql .=
" '".$this->db->escape($this->ref_ext).
"',";
4556 $sql .=
" ".(empty($this->vat_src_code) ?
"''" :
"'".$this->db->escape($this->vat_src_code).
"'").
",";
4557 $sql .=
" '".price2num($this->tva_tx).
"',";
4558 $sql .=
" '".price2num($this->localtax1_tx).
"',";
4559 $sql .=
" '".price2num($this->localtax2_tx).
"',";
4560 $sql .=
" '".$this->db->escape($this->localtax1_type).
"',";
4561 $sql .=
" '".$this->db->escape($this->localtax2_type).
"',";
4562 $sql .=
' '.((!empty($this->fk_product) && $this->fk_product > 0) ? $this->fk_product :
"null").
',';
4563 $sql .=
" '".$this->db->escape($this->product_type).
"',";
4564 $sql .=
" '".price2num($this->remise_percent).
"',";
4565 $sql .=
" ".(price2num($this->subprice) !==
'' ?
price2num($this->subprice) :
"null").
",";
4566 $sql .=
" ".($this->price !=
'' ?
"'".price2num($this->
price).
"'" :
"null").
",";
4567 $sql .=
' '.(!empty($this->fk_remise_except) ? $this->fk_remise_except :
"null").
',';
4568 $sql .=
' '.((int) $this->special_code).
',';
4569 $sql .=
' '.((int) $this->rang).
',';
4570 $sql .=
' '.(!empty($this->fk_fournprice) ? $this->fk_fournprice :
"null").
',';
4571 $sql .=
' '.price2num($this->pa_ht).
',';
4572 $sql .=
" ".((int) $this->info_bits).
",";
4573 $sql .=
" ".price2num($this->total_ht,
'MT').
",";
4574 $sql .=
" ".price2num($this->total_tva,
'MT').
",";
4575 $sql .=
" ".price2num($this->total_localtax1,
'MT').
",";
4576 $sql .=
" ".price2num($this->total_localtax2,
'MT').
",";
4577 $sql .=
" ".price2num($this->total_ttc,
'MT').
",";
4578 $sql .=
" ".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null").
',';
4579 $sql .=
" ".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null").
',';
4580 $sql .=
' '.(!$this->fk_unit ?
'NULL' : ((int) $this->fk_unit));
4581 $sql .=
", ".(!empty($this->fk_multicurrency) ? ((int) $this->fk_multicurrency) :
'NULL');
4582 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
4583 $sql .=
", ".price2num($this->multicurrency_subprice,
'CU');
4584 $sql .=
", ".price2num($this->multicurrency_total_ht,
'CT');
4585 $sql .=
", ".price2num($this->multicurrency_total_tva,
'CT');
4586 $sql .=
", ".price2num($this->multicurrency_total_ttc,
'CT');
4589 dol_syslog(get_class($this).
"::insert", LOG_DEBUG);
4590 $resql = $this->db->query($sql);
4592 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commandedet');
4593 $this->
rowid = $this->id;
4602 if (!$error && !$notrigger) {
4604 $result = $this->
call_trigger(
'LINEORDER_INSERT', $user);
4612 $this->db->commit();
4616 foreach ($this->errors as $errmsg) {
4617 dol_syslog(get_class($this).
"::insert ".$errmsg, LOG_ERR);
4618 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
4620 $this->db->rollback();
4623 $this->error = $this->db->error();
4624 $this->db->rollback();
4640 $pa_ht_isemptystring = (empty($this->pa_ht) && $this->pa_ht ==
'');
4643 if (empty($this->tva_tx)) {
4646 if (empty($this->localtax1_tx)) {
4647 $this->localtax1_tx = 0;
4649 if (empty($this->localtax2_tx)) {
4650 $this->localtax2_tx = 0;
4652 if (empty($this->localtax1_type)) {
4653 $this->localtax1_type = 0;
4655 if (empty($this->localtax2_type)) {
4656 $this->localtax2_type = 0;
4658 if (empty($this->qty)) {
4661 if (empty($this->total_localtax1)) {
4662 $this->total_localtax1 = 0;
4664 if (empty($this->total_localtax2)) {
4665 $this->total_localtax2 = 0;
4667 if (empty($this->marque_tx)) {
4668 $this->marque_tx = 0;
4670 if (empty($this->marge_tx)) {
4671 $this->marge_tx = 0;
4673 if (empty($this->remise_percent)) {
4674 $this->remise_percent = 0;
4676 if (empty($this->remise)) {
4679 if (empty($this->info_bits)) {
4680 $this->info_bits = 0;
4682 if (empty($this->special_code)) {
4683 $this->special_code = 0;
4685 if (empty($this->product_type)) {
4686 $this->product_type = 0;
4688 if (empty($this->fk_parent_line)) {
4689 $this->fk_parent_line = 0;
4691 if (empty($this->pa_ht)) {
4694 if (empty($this->ref_ext)) {
4695 $this->ref_ext =
'';
4699 if ($this->pa_ht == 0 && $pa_ht_isemptystring) {
4700 $result = $this->
defineBuyPrice($this->subprice, $this->remise_percent, $this->fk_product);
4704 $this->pa_ht = $result;
4711 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commandedet SET";
4712 $sql .=
" description='".$this->db->escape($this->desc).
"'";
4713 $sql .=
" , label=".(!empty($this->label) ?
"'".$this->db->escape($this->label).
"'" :
"null");
4714 $sql .=
" , vat_src_code=".(!empty($this->vat_src_code) ?
"'".$this->db->escape($this->vat_src_code).
"'" :
"''");
4715 $sql .=
" , tva_tx=".price2num($this->tva_tx);
4716 $sql .=
" , localtax1_tx=".price2num($this->localtax1_tx);
4717 $sql .=
" , localtax2_tx=".price2num($this->localtax2_tx);
4718 $sql .=
" , localtax1_type='".$this->db->escape($this->localtax1_type).
"'";
4719 $sql .=
" , localtax2_type='".$this->db->escape($this->localtax2_type).
"'";
4720 $sql .=
" , qty=".price2num($this->qty);
4721 $sql .=
" , ref_ext='".$this->db->escape($this->ref_ext).
"'";
4722 $sql .=
" , subprice=".price2num($this->subprice);
4723 $sql .=
" , remise_percent=".price2num($this->remise_percent);
4724 $sql .=
" , price=".price2num($this->
price);
4725 $sql .=
" , remise=".price2num($this->remise);
4726 if (empty($this->skip_update_total)) {
4727 $sql .=
" , total_ht=".price2num($this->total_ht);
4728 $sql .=
" , total_tva=".price2num($this->total_tva);
4729 $sql .=
" , total_ttc=".price2num($this->total_ttc);
4730 $sql .=
" , total_localtax1=".price2num($this->total_localtax1);
4731 $sql .=
" , total_localtax2=".price2num($this->total_localtax2);
4733 $sql .=
" , fk_product_fournisseur_price=".(!empty($this->fk_fournprice) ? $this->fk_fournprice :
"null");
4734 $sql .=
" , buy_price_ht='".price2num($this->pa_ht).
"'";
4735 $sql .=
" , info_bits=".((int) $this->info_bits);
4736 $sql .=
" , special_code=".((int) $this->special_code);
4737 $sql .=
" , date_start=".(!empty($this->date_start) ?
"'".$this->db->idate($this->date_start).
"'" :
"null");
4738 $sql .=
" , date_end=".(!empty($this->date_end) ?
"'".$this->db->idate($this->date_end).
"'" :
"null");
4739 $sql .=
" , product_type=".$this->product_type;
4740 $sql .=
" , fk_parent_line=".(!empty($this->fk_parent_line) ? $this->fk_parent_line :
"null");
4741 if (!empty($this->rang)) {
4742 $sql .=
", rang=".((int) $this->rang);
4744 $sql .=
" , fk_unit=".(!$this->fk_unit ?
'NULL' : $this->fk_unit);
4747 $sql .=
" , multicurrency_subprice=".price2num($this->multicurrency_subprice);
4748 $sql .=
" , multicurrency_total_ht=".price2num($this->multicurrency_total_ht);
4749 $sql .=
" , multicurrency_total_tva=".price2num($this->multicurrency_total_tva);
4750 $sql .=
" , multicurrency_total_ttc=".price2num($this->multicurrency_total_ttc);
4752 $sql .=
" WHERE rowid = ".((int) $this->
rowid);
4754 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
4755 $resql = $this->db->query($sql);
4758 $this->
id = $this->rowid;
4765 if (!$error && !$notrigger) {
4767 $result = $this->
call_trigger(
'LINEORDER_MODIFY', $user);
4775 $this->db->commit();
4779 foreach ($this->errors as $errmsg) {
4780 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
4781 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
4783 $this->db->rollback();
4786 $this->error = $this->db->error();
4787 $this->db->rollback();
4805 if (empty($this->total_localtax1)) {
4806 $this->total_localtax1 = 0;
4808 if (empty($this->total_localtax2)) {
4809 $this->total_localtax2 = 0;
4813 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"commandedet SET";
4814 $sql .=
" total_ht='".price2num($this->total_ht).
"'";
4815 $sql .=
",total_tva='".price2num($this->total_tva).
"'";
4816 $sql .=
",total_localtax1='".price2num($this->total_localtax1).
"'";
4817 $sql .=
",total_localtax2='".price2num($this->total_localtax2).
"'";
4818 $sql .=
",total_ttc='".price2num($this->total_ttc).
"'";
4819 $sql .=
" WHERE rowid = ".((int) $this->
rowid);
4821 dol_syslog(
"OrderLine::update_total", LOG_DEBUG);
4823 $resql = $this->db->query($sql);
4825 $this->db->commit();
4828 $this->error = $this->db->error();
4829 $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.