39include_once DOL_DOCUMENT_ROOT.
'/core/class/commonorder.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/commande/class/orderline.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/margin/lib/margins.lib.php';
43require_once DOL_DOCUMENT_ROOT.
'/multicurrency/class/multicurrency.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/societe/class/societe.class.php';
55 public $element =
'commande';
60 public $table_element =
'commande';
65 public $table_element_line =
'commandedet';
70 public $class_element_line =
'OrderLine';
75 public $fk_element =
'fk_commande';
80 public $picto =
'order';
86 public $restrictiononfksoc = 1;
106 public $ref_customer;
127 public $date_lim_reglement;
131 public $cond_reglement_code;
136 public $cond_reglement_doc;
143 public $deposit_percent;
153 public $mode_reglement;
158 public $mode_reglement_id;
163 public $mode_reglement_code;
169 public $availability_id;
175 public $availability_code;
181 public $availability;
186 public $demand_reason_id;
191 public $demand_reason_code;
203 public $date_commande;
208 public $delivery_date;
213 public $fk_remise_except;
219 public $remise_percent;
230 public $signed_status = 0;
235 public $warehouse_id;
240 public $extraparams = array();
242 public $linked_objects = array();
247 public $user_author_id;
257 public $lines = array();
263 public $module_source;
277 public $online_payment_url;
309 public $fields = array(
310 'rowid' => array(
'type' =>
'integer',
'label' =>
'TechnicalID',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 10),
311 'entity' => array(
'type' =>
'integer',
'label' =>
'Entity',
'default' =>
'1',
'enabled' => 1,
'visible' => -2,
'notnull' => 1,
'position' => 20,
'index' => 1),
312 'ref' => array(
'type' =>
'varchar(30)',
'label' =>
'Ref',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'showoncombobox' => 1,
'position' => 25),
313 'ref_ext' => array(
'type' =>
'varchar(255)',
'label' =>
'RefExt',
'enabled' => 1,
'visible' => 0,
'position' => 26),
314 'ref_client' => array(
'type' =>
'varchar(255)',
'label' =>
'RefCustomer',
'enabled' => 1,
'visible' => -1,
'position' => 28),
315 'fk_soc' => array(
'type' =>
'integer:Societe:societe/class/societe.class.php',
'label' =>
'ThirdParty',
'enabled' =>
'isModEnabled("societe")',
'visible' => -1,
'notnull' => 1,
'position' => 20),
316 'fk_projet' => array(
'type' =>
'integer:Project:projet/class/project.class.php:1:(fk_statut:=:1)',
'label' =>
'Project',
'enabled' =>
"isModEnabled('project')",
'visible' => -1,
'position' => 25),
317 'date_commande' => array(
'type' =>
'date',
'label' =>
'Date',
'enabled' => 1,
'visible' => 1,
'position' => 60,
'csslist' =>
'nowraponall'),
318 'date_valid' => array(
'type' =>
'datetime',
'label' =>
'DateValidation',
'enabled' => 1,
'visible' => -1,
'position' => 62,
'csslist' =>
'nowraponall'),
319 'date_cloture' => array(
'type' =>
'datetime',
'label' =>
'DateClosing',
'enabled' => 1,
'visible' => -1,
'position' => 65,
'csslist' =>
'nowraponall'),
320 'fk_user_valid' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserValidation',
'enabled' => 1,
'visible' => -1,
'position' => 85),
321 'fk_user_cloture' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserClosing',
'enabled' => 1,
'visible' => -1,
'position' => 90),
322 'source' => array(
'type' =>
'smallint(6)',
'label' =>
'Source',
'enabled' => 1,
'visible' => -1,
'position' => 95),
323 'total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'VAT',
'enabled' => 1,
'visible' => -1,
'position' => 125,
'isameasure' => 1),
324 'localtax1' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax1',
'enabled' => 1,
'visible' => -1,
'position' => 130,
'isameasure' => 1),
325 'localtax2' => array(
'type' =>
'double(24,8)',
'label' =>
'LocalTax2',
'enabled' => 1,
'visible' => -1,
'position' => 135,
'isameasure' => 1),
326 'total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalHT',
'enabled' => 1,
'visible' => -1,
'position' => 140,
'isameasure' => 1),
327 'total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'TotalTTC',
'enabled' => 1,
'visible' => -1,
'position' => 145,
'isameasure' => 1),
328 'signed_status' => array(
'type' =>
'smallint(6)',
'label' =>
'SignedStatus',
'enabled' => 1,
'visible' => -1,
'position' => 146,
'arrayofkeyval' => array(0 =>
'NoSignature', 1 =>
'SignedSender', 2 =>
'SignedReceiver', 9 =>
'SignedAll')),
329 'note_private' => array(
'type' =>
'html',
'label' =>
'NotePrivate',
'enabled' => 1,
'visible' => 0,
'position' => 150),
330 'note_public' => array(
'type' =>
'html',
'label' =>
'NotePublic',
'enabled' => 1,
'visible' => 0,
'position' => 155),
331 'model_pdf' => array(
'type' =>
'varchar(255)',
'label' =>
'PDFTemplate',
'enabled' => 1,
'visible' => 0,
'position' => 160),
332 'fk_account' => array(
'type' =>
'integer',
'label' =>
'BankAccount',
'enabled' =>
'isModEnabled("bank")',
'visible' => -1,
'position' => 170),
333 'fk_currency' => array(
'type' =>
'varchar(3)',
'label' =>
'MulticurrencyID',
'enabled' => 1,
'visible' => -1,
'position' => 175),
334 'fk_cond_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentTerm',
'enabled' => 1,
'visible' => -1,
'position' => 180),
335 'deposit_percent' => array(
'type' =>
'varchar(63)',
'label' =>
'DepositPercent',
'enabled' => 1,
'visible' => -1,
'position' => 181),
336 'fk_mode_reglement' => array(
'type' =>
'integer',
'label' =>
'PaymentMode',
'enabled' => 1,
'visible' => -1,
'position' => 185),
337 'date_livraison' => array(
'type' =>
'date',
'label' =>
'DateDeliveryPlanned',
'enabled' => 1,
'visible' => -1,
'position' => 190,
'csslist' =>
'nowraponall'),
338 'fk_shipping_method' => array(
'type' =>
'integer',
'label' =>
'ShippingMethod',
'enabled' => 1,
'visible' => -1,
'position' => 195),
339 'fk_warehouse' => array(
'type' =>
'integer:Entrepot:product/stock/class/entrepot.class.php',
'label' =>
'Fk warehouse',
'enabled' =>
'isModEnabled("stock")',
'visible' => -1,
'position' => 200),
340 'fk_availability' => array(
'type' =>
'integer',
'label' =>
'Availability',
'enabled' => 1,
'visible' => -1,
'position' => 205),
341 'fk_input_reason' => array(
'type' =>
'integer',
'label' =>
'InputReason',
'enabled' => 1,
'visible' => -1,
'position' => 210),
343 'extraparams' => array(
'type' =>
'varchar(255)',
'label' =>
'Extraparams',
'enabled' => 1,
'visible' => -1,
'position' => 225),
344 'fk_incoterms' => array(
'type' =>
'integer',
'label' =>
'IncotermCode',
'enabled' =>
'$conf->incoterm->enabled',
'visible' => -1,
'position' => 230),
345 'location_incoterms' => array(
'type' =>
'varchar(255)',
'label' =>
'IncotermLabel',
'enabled' =>
'$conf->incoterm->enabled',
'visible' => -1,
'position' => 235),
346 'fk_multicurrency' => array(
'type' =>
'integer',
'label' =>
'Fk multicurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 240),
347 'multicurrency_code' => array(
'type' =>
'varchar(255)',
'label' =>
'MulticurrencyCurrency',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 245),
348 'multicurrency_tx' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyRate',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 250,
'isameasure' => 1),
349 'multicurrency_total_ht' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountHT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 255,
'isameasure' => 1),
350 'multicurrency_total_tva' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountVAT',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 260,
'isameasure' => 1),
351 'multicurrency_total_ttc' => array(
'type' =>
'double(24,8)',
'label' =>
'MulticurrencyAmountTTC',
'enabled' =>
'isModEnabled("multicurrency")',
'visible' => -1,
'position' => 265,
'isameasure' => 1),
352 'last_main_doc' => array(
'type' =>
'varchar(255)',
'label' =>
'LastMainDoc',
'enabled' => 1,
'visible' => -1,
'position' => 270),
353 'module_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSModule',
'enabled' => 1,
'visible' => -1,
'position' => 275),
354 'pos_source' => array(
'type' =>
'varchar(32)',
'label' =>
'POSTerminal',
'enabled' => 1,
'visible' => -1,
'position' => 280),
355 'fk_user_author' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserAuthor',
'enabled' => 1,
'visible' => -1,
'position' => 300),
356 'fk_user_modif' => array(
'type' =>
'integer:User:user/class/user.class.php',
'label' =>
'UserModif',
'enabled' => 1,
'visible' => -2,
'notnull' => -1,
'position' => 302),
357 'date_creation' => array(
'type' =>
'datetime',
'label' =>
'DateCreation',
'enabled' => 1,
'visible' => -2,
'position' => 304,
'csslist' =>
'nowraponall'),
358 'tms' => array(
'type' =>
'timestamp',
'label' =>
'DateModification',
'enabled' => 1,
'visible' => -1,
'notnull' => 1,
'position' => 306),
359 'import_key' => array(
'type' =>
'varchar(14)',
'label' =>
'ImportId',
'enabled' => 1,
'visible' => -2,
'position' => 400),
360 'fk_statut' => array(
'type' =>
'smallint(6)',
'label' =>
'Status',
'enabled' => 1,
'visible' => -1,
'position' => 500),
400 const STATUS_NO_SIGNATURE = 0;
405 const STATUS_SIGNED_SENDER = 1;
410 const STATUS_SIGNED_RECEIVER = 2;
415 const STATUS_SIGNED_ALL = 9;
427 $this->ismultientitymanaged = 1;
428 $this->isextrafieldmanaged = 1;
440 global $langs, $conf;
441 $langs->load(
"order");
450 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
451 foreach ($dirmodels as $reldir) {
455 $mybool = ((bool) @include_once $dir.$file) || $mybool;
463 $obj =
new $classname();
464 '@phan-var-force ModeleNumRefCommandes $obj';
466 $numref = $obj->getNextValue($soc, $this);
471 $this->error = $obj->error;
476 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_COMMANDE_ADDON_NotDefined");
490 public function valid($user, $idwarehouse = 0, $notrigger = 0)
492 global $conf, $langs;
494 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
499 if ($this->statut == self::STATUS_VALIDATED) {
500 dol_syslog(get_class($this).
"::valid action abandoned: already validated", LOG_WARNING);
504 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
505 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
506 $this->error =
'NotEnoughPermissions';
507 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
517 $soc->fetch($this->socid);
520 $result = $soc->setAsCustomer();
523 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
531 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
532 $sql .=
" SET ref = '".$this->db->escape($num).
"',";
533 $sql .=
" fk_statut = ".self::STATUS_VALIDATED.
",";
534 $sql .=
" date_valid='".$this->db->idate($now).
"',";
535 $sql .=
" fk_user_valid = ".($user->id > 0 ? (int) $user->id :
"null").
",";
536 $sql .=
" fk_user_modif = ".((int) $user->id);
537 $sql .=
" WHERE rowid = ".((int) $this->
id);
539 dol_syslog(get_class($this).
"::valid", LOG_DEBUG);
540 $resql = $this->db->query($sql);
543 $this->error = $this->db->lasterror();
549 if ($result >= 0 && isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
550 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
551 $langs->load(
"agenda");
554 $cpt = count($this->lines);
555 for ($i = 0; $i < $cpt; $i++) {
556 if ($this->lines[$i]->fk_product > 0) {
558 $mouvP->origin = &$this;
559 $mouvP->setOrigin($this->element, $this->
id);
561 $result = $mouvP->livraison($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, $this->lines[$i]->subprice, $langs->trans(
"OrderValidatedInDolibarr", $num));
564 $this->error = $mouvP->error;
574 if (!$error && !$notrigger) {
584 $this->oldref = $this->ref;
587 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
589 $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).
"'";
590 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
591 $resql = $this->db->query($sql);
594 $this->error = $this->db->lasterror();
596 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filepath = 'commande/".$this->db->escape($this->newref).
"'";
597 $sql .=
" WHERE filepath = 'commande/".$this->db->escape($this->
ref).
"' and entity = ".$conf->entity;
598 $resql = $this->db->query($sql);
601 $this->error = $this->db->lasterror();
607 $dirsource = $conf->commande->multidir_output[$this->entity].
'/'.$oldref;
608 $dirdest = $conf->commande->multidir_output[$this->entity].
'/'.$newref;
609 if (!$error && file_exists($dirsource)) {
610 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
612 if (@rename($dirsource, $dirdest)) {
615 $listoffiles =
dol_dir_list($conf->commande->multidir_output[$this->entity].
'/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
616 foreach ($listoffiles as $fileentry) {
617 $dirsource = $fileentry[
'name'];
618 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
619 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
620 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
621 @rename($dirsource, $dirdest);
639 $this->db->rollback();
655 global $conf, $langs;
660 if ($this->statut <= self::STATUS_DRAFT && !
getDolGlobalInt(
'ORDER_REOPEN_TO_DRAFT')) {
664 if (!((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
665 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'validate')))) {
666 $this->error =
'Permission denied';
674 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
675 $sql .=
" SET fk_statut = ".self::STATUS_DRAFT.
",";
676 $sql .=
" fk_user_modif = ".((int) $user->id);
677 $sql .=
" WHERE rowid = ".((int) $this->
id);
679 if ($this->db->query($sql)) {
681 $this->oldcopy = clone $this;
685 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
688 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
689 $langs->load(
"agenda");
691 $num = count($this->lines);
692 for ($i = 0; $i < $num; $i++) {
693 if ($this->lines[$i]->fk_product > 0) {
695 $mouvP->origin = &$this;
696 $mouvP->setOrigin($this->element, $this->
id);
698 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderBackToDraftInDolibarr", $this->ref));
701 $this->error = $mouvP->error;
710 $result = $this->
call_trigger(
'ORDER_UNVALIDATE', $user);
721 $this->db->rollback();
725 $this->error = $this->db->error();
726 $this->db->rollback();
745 if ($this->statut != self::STATUS_CANCELED && $this->statut != self::STATUS_CLOSED) {
746 dol_syslog(get_class($this).
"::set_reopen order has not status closed", LOG_WARNING);
752 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
753 $sql .=
' SET fk_statut='.self::STATUS_VALIDATED.
', facture=0,';
754 $sql .=
" fk_user_modif = ".((int) $user->id);
755 $sql .=
" WHERE rowid = ".((int) $this->
id);
757 dol_syslog(get_class($this).
"::set_reopen", LOG_DEBUG);
758 $resql = $this->db->query($sql);
768 $this->error = $this->db->lasterror();
779 foreach ($this->errors as $errmsg) {
780 dol_syslog(get_class($this).
"::set_reopen ".$errmsg, LOG_ERR);
781 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
783 $this->db->rollback();
795 public function cloture($user, $notrigger = 0)
801 $usercanclose = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'creer'))
802 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'commande',
'order_advance',
'close')));
805 if ($this->statut == self::STATUS_CLOSED) {
812 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
813 $sql .=
' SET fk_statut = '.self::STATUS_CLOSED.
',';
814 $sql .=
' fk_user_cloture = '.((int) $user->id).
',';
815 $sql .=
" date_cloture = '".$this->db->idate($now).
"',";
816 $sql .=
" fk_user_modif = ".((int) $user->id);
819 if ($this->db->query($sql)) {
835 $this->db->rollback();
839 $this->error = $this->db->lasterror();
841 $this->db->rollback();
855 public function cancel($idwarehouse = -1)
857 global $conf, $user, $langs;
863 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
864 $sql .=
" SET fk_statut = ".self::STATUS_CANCELED.
",";
865 $sql .=
" fk_user_modif = ".((int) $user->id);
866 $sql .=
" WHERE rowid = ".((int) $this->
id);
867 $sql .=
" AND fk_statut = ".self::STATUS_VALIDATED;
869 dol_syslog(get_class($this).
"::cancel", LOG_DEBUG);
870 if ($this->db->query($sql)) {
872 if (isModEnabled(
'stock') &&
getDolGlobalInt(
'STOCK_CALCULATE_ON_VALIDATE_ORDER') == 1) {
873 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
874 $langs->load(
"agenda");
876 $num = count($this->lines);
877 for ($i = 0; $i < $num; $i++) {
878 if ($this->lines[$i]->fk_product > 0) {
880 $mouvP->setOrigin($this->element, $this->
id);
882 $result = $mouvP->reception($user, $this->lines[$i]->fk_product, $idwarehouse, $this->lines[$i]->qty, 0, $langs->trans(
"OrderCanceledInDolibarr", $this->ref));
885 $this->error = $mouvP->error;
906 foreach ($this->errors as $errmsg) {
907 dol_syslog(get_class($this).
"::cancel ".$errmsg, LOG_ERR);
908 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
910 $this->db->rollback();
914 $this->error = $this->db->error();
915 $this->db->rollback();
928 public function create($user, $notrigger = 0)
930 global $conf, $langs, $mysoc;
936 $date = ($this->date_commande ? $this->date_commande : $this->date);
937 $delivery_date = $this->delivery_date;
940 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
945 if (empty($this->fk_multicurrency)) {
946 $this->multicurrency_code = $conf->currency;
947 $this->fk_multicurrency = 0;
948 $this->multicurrency_tx = 1;
951 dol_syslog(get_class($this).
"::create user=".$user->id);
954 if (!empty($this->
ref)) {
957 $this->error =
'ErrorRefAlreadyExists';
958 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
959 $this->db->rollback();
965 $result = $soc->fetch($this->socid);
967 $this->error =
"Failed to fetch company";
968 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
972 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Source"));
973 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
981 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$this->table_element.
" (";
982 $sql .=
" ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client";
983 $sql .=
", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address";
984 $sql .=
", fk_shipping_method";
985 $sql .=
", fk_warehouse";
986 $sql .=
", fk_incoterms, location_incoterms";
987 $sql .=
", entity, module_source, pos_source";
988 $sql .=
", fk_multicurrency";
989 $sql .=
", multicurrency_code";
990 $sql .=
", multicurrency_tx";
992 $sql .=
" VALUES ('(PROV)', ".((int) $this->socid).
", '".$this->db->idate($now).
"', ".((int) $user->id);
993 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
994 $sql .=
", '".$this->db->idate($date).
"'";
995 $sql .=
", ".($this->source >= 0 && $this->source !=
'' ? $this->db->escape($this->source) :
'null');
996 $sql .=
", '".$this->db->escape($this->note_private).
"'";
997 $sql .=
", '".$this->db->escape($this->note_public).
"'";
998 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
999 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
1000 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1001 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
1002 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
"null");
1003 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
1004 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1005 $sql .=
", ".($this->availability_id > 0 ? ((int) $this->availability_id) :
"null");
1006 $sql .=
", ".($this->demand_reason_id > 0 ? ((int) $this->demand_reason_id) :
"null");
1007 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1008 $sql .=
", ".($this->fk_delivery_address > 0 ? ((int) $this->fk_delivery_address) :
'NULL');
1009 $sql .=
", ".(!empty($this->shipping_method_id) && $this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1010 $sql .=
", ".(!empty($this->warehouse_id) && $this->warehouse_id > 0 ? ((int) $this->warehouse_id) :
'NULL');
1011 $sql .=
", ".(int) $this->fk_incoterms;
1012 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
1013 $sql .=
", ".setEntity($this);
1014 $sql .=
", ".($this->module_source ?
"'".$this->db->escape($this->module_source).
"'" :
"null");
1015 $sql .=
", ".($this->pos_source !=
'' ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
1016 $sql .=
", ".(int) $this->fk_multicurrency;
1017 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1018 $sql .=
", ".(float) $this->multicurrency_tx;
1021 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1022 $resql = $this->db->query($sql);
1024 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commande');
1027 $fk_parent_line = 0;
1028 $num = count($this->lines);
1033 for ($i = 0; $i < $num; $i++) {
1034 $line = $this->lines[$i];
1038 if (!is_object($line)) {
1039 $line = (object) $line;
1043 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1044 $fk_parent_line = 0;
1048 $vatrate = $line->tva_tx;
1049 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', (
string) $vatrate)) {
1050 $vatrate .=
' ('.$line->vat_src_code.
')';
1054 $originid = $line->origin_id;
1055 $origintype = $line->origin;
1057 $originid = $line->id;
1058 $origintype = $this->element;
1062 if (empty($line->ref_ext)) {
1063 $line->ref_ext =
'';
1071 $line->localtax1_tx,
1072 $line->localtax2_tx,
1074 $line->remise_percent,
1076 $line->fk_remise_except,
1081 $line->product_type,
1083 $line->special_code,
1085 $line->fk_fournprice,
1088 $line->array_options,
1097 if ($result != self::STOCK_NOT_ENOUGH_FOR_ORDER) {
1098 $this->error = $this->db->lasterror();
1099 $this->errors[] = $this->error;
1102 $this->db->rollback();
1106 if ($result > 0 && $line->product_type == 9) {
1107 $fk_parent_line = $result;
1114 $initialref =
'(PROV'.$this->id.
')';
1115 if (!empty($this->
ref)) {
1116 $initialref = $this->ref;
1119 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
" SET ref='".$this->db->escape($initialref).
"' WHERE rowid=".((int) $this->
id);
1120 if ($this->db->query($sql)) {
1121 $this->
ref = $initialref;
1123 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1124 $this->linked_objects = $this->linkedObjectsIds;
1128 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1129 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1130 if (is_array($tmp_origin_id)) {
1131 foreach ($tmp_origin_id as $origin_id) {
1134 $this->error = $this->db->lasterror();
1139 $origin_id = $tmp_origin_id;
1142 $this->error = $this->db->lasterror();
1149 if (!$error && $this->
id &&
getDolGlobalString(
'MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN') && !empty($this->origin) && !empty($this->origin_id)) {
1150 $originforcontact = $this->origin;
1151 $originidforcontact = $this->origin_id;
1152 if ($originforcontact ==
'shipping') {
1153 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1155 $exp->fetch($this->origin_id);
1156 $exp->fetchObjectLinked();
1157 if (count($exp->linkedObjectsIds[
'commande']) > 0) {
1158 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1159 $originforcontact =
'commande';
1160 if (is_object($value)) {
1161 $originidforcontact = $value->id;
1163 $originidforcontact = $value;
1170 $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";
1171 $sqlcontact .=
" WHERE element_id = ".((int) $originidforcontact).
" AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = '".$this->db->escape($originforcontact).
"'";
1173 $resqlcontact = $this->db->query($sqlcontact);
1174 if ($resqlcontact) {
1175 while ($objcontact = $this->db->fetch_object($resqlcontact)) {
1177 $this->
add_contact($objcontact->fk_socpeople, $objcontact->code, $objcontact->source);
1191 if (!$error && !$notrigger) {
1201 $this->db->commit();
1204 $this->db->rollback();
1208 $this->error = $this->db->lasterror();
1209 $this->db->rollback();
1216 $this->error = $this->db->lasterror();
1217 $this->db->rollback();
1232 global $conf, $user, $hookmanager;
1239 foreach ($this->lines as $line) {
1240 $line->fetch_optionals();
1244 $objFrom = clone $this;
1247 if (!empty($socid) && $socid != $this->socid) {
1248 $objsoc =
new Societe($this->db);
1250 if ($objsoc->fetch($socid) > 0) {
1251 $this->socid = $objsoc->id;
1252 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1253 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent : 0);
1254 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1255 $this->fk_project = 0;
1256 $this->fk_delivery_address = 0;
1267 $this->user_author_id = $user->id;
1268 $this->user_validation_id = 0;
1270 $this->date_commande =
dol_now();
1271 $this->date_creation =
'';
1272 $this->date_validation =
'';
1274 $this->ref_client =
'';
1275 $this->ref_customer =
'';
1279 $num = count($this->lines);
1280 for ($i = 0; $i < $num; $i++) {
1281 $this->lines[$i]->ref_ext =
'';
1285 $this->context[
'createfromclone'] =
'createfromclone';
1286 $result = $this->
create($user);
1300 if ($this->socid == $objFrom->socid) {
1309 if (is_object($hookmanager)) {
1310 $parameters = array(
'objFrom' => $objFrom);
1312 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1320 unset($this->context[
'createfromclone']);
1324 $this->db->commit();
1327 $this->db->rollback();
1342 global $conf, $hookmanager;
1344 require_once DOL_DOCUMENT_ROOT .
'/multicurrency/class/multicurrency.class.php';
1345 require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
1349 $this->date_commande =
dol_now();
1354 for ($i = 0; $i < $num; $i++) {
1357 $line->libelle =
$object->lines[$i]->libelle;
1358 $line->label =
$object->lines[$i]->label;
1359 $line->desc =
$object->lines[$i]->desc;
1360 $line->price =
$object->lines[$i]->price;
1361 $line->subprice =
$object->lines[$i]->subprice;
1362 $line->vat_src_code =
$object->lines[$i]->vat_src_code;
1363 $line->tva_tx =
$object->lines[$i]->tva_tx;
1364 $line->localtax1_tx =
$object->lines[$i]->localtax1_tx;
1365 $line->localtax2_tx =
$object->lines[$i]->localtax2_tx;
1366 $line->qty =
$object->lines[$i]->qty;
1367 $line->fk_remise_except =
$object->lines[$i]->fk_remise_except;
1368 $line->remise_percent =
$object->lines[$i]->remise_percent;
1369 $line->fk_product =
$object->lines[$i]->fk_product;
1370 $line->info_bits =
$object->lines[$i]->info_bits;
1371 $line->product_type =
$object->lines[$i]->product_type;
1372 $line->rang =
$object->lines[$i]->rang;
1373 $line->special_code =
$object->lines[$i]->special_code;
1374 $line->fk_parent_line =
$object->lines[$i]->fk_parent_line;
1375 $line->fk_unit =
$object->lines[$i]->fk_unit;
1377 $line->date_start =
$object->lines[$i]->date_start;
1378 $line->date_end =
$object->lines[$i]->date_end;
1380 $line->fk_fournprice =
$object->lines[$i]->fk_fournprice;
1382 $line->pa_ht = $marginInfos[0];
1383 $line->marge_tx = $marginInfos[1];
1384 $line->marque_tx = $marginInfos[2];
1386 $line->origin =
$object->element;
1387 $line->origin_id =
$object->lines[$i]->id;
1390 $object->lines[$i]->fetch_optionals();
1391 foreach (
$object->lines[$i]->array_options as $options_key => $value) {
1392 $line->array_options[$options_key] = $value;
1395 $this->lines[$i] = $line;
1398 $this->entity =
$object->entity;
1399 $this->socid =
$object->socid;
1400 $this->fk_project =
$object->fk_project;
1401 $this->cond_reglement_id =
$object->cond_reglement_id;
1402 $this->deposit_percent =
$object->deposit_percent;
1403 $this->mode_reglement_id =
$object->mode_reglement_id;
1404 $this->fk_account =
$object->fk_account;
1405 $this->availability_id =
$object->availability_id;
1406 $this->demand_reason_id =
$object->demand_reason_id;
1407 $this->delivery_date =
$object->delivery_date;
1408 $this->shipping_method_id =
$object->shipping_method_id;
1409 $this->warehouse_id =
$object->warehouse_id;
1410 $this->fk_delivery_address =
$object->fk_delivery_address;
1411 $this->contact_id =
$object->contact_id;
1412 $this->ref_client =
$object->ref_client;
1413 $this->ref_customer =
$object->ref_client;
1416 $this->note_private =
$object->note_private;
1417 $this->note_public =
$object->note_public;
1420 $this->origin =
$object->element;
1421 $this->origin_id =
$object->id;
1424 if (isModEnabled(
'multicurrency')) {
1425 if (!empty(
$object->multicurrency_code)) {
1426 $this->multicurrency_code =
$object->multicurrency_code;
1429 $this->multicurrency_tx =
$object->multicurrency_tx;
1432 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1434 $this->fk_multicurrency = $tmparray[0];
1435 $this->multicurrency_tx = $tmparray[1];
1439 if (empty($this->fk_multicurrency)) {
1440 $this->multicurrency_code = $conf->currency;
1441 $this->fk_multicurrency = 0;
1442 $this->multicurrency_tx = 1;
1450 $element_extrafields = $e->fetch_name_optionals_label($this->table_element);
1452 foreach (
$object->array_options as $options_key => $value) {
1453 if (array_key_exists(str_replace(
'options_',
'', $options_key), $element_extrafields)) {
1454 $this->array_options[$options_key] = $value;
1458 $this->linked_objects[$this->origin] = $this->origin_id;
1459 if (isset(
$object->other_linked_objects) && is_array(
$object->other_linked_objects) && !empty(
$object->other_linked_objects)) {
1460 $this->linked_objects = array_merge($this->linked_objects,
$object->other_linked_objects);
1463 $ret = $this->
create($user);
1467 $hookmanager->initHooks(array(
'orderdao'));
1469 $parameters = array(
'objFrom' =>
$object);
1471 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1481 $this->
valid($user);
1533 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)
1535 global $mysoc, $conf, $langs, $user;
1537 $logtext =
"::addline commandeid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent";
1538 $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";
1539 $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";
1540 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
1542 if ($this->statut == self::STATUS_DRAFT) {
1543 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1547 if (empty($remise_percent)) {
1548 $remise_percent = 0;
1553 if (empty($info_bits)) {
1559 if (empty($txtva)) {
1562 if (empty($txlocaltax1)) {
1565 if (empty($txlocaltax2)) {
1568 if (empty($fk_parent_line) || $fk_parent_line < 0) {
1569 $fk_parent_line = 0;
1571 if (empty($this->fk_multicurrency)) {
1572 $this->fk_multicurrency = 0;
1574 if (empty($ref_ext)) {
1578 $remise_percent = (float)
price2num($remise_percent);
1581 $pu_ht_devise =
price2num($pu_ht_devise);
1584 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
1589 if ($price_base_type ==
'HT') {
1594 $label = trim($label);
1595 $desc = trim($desc);
1602 if ($date_start && $date_end && $date_start > $date_end) {
1603 $langs->load(
"errors");
1604 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1610 $product_type = $type;
1611 if (!empty($fk_product) && $fk_product > 0) {
1612 $product =
new Product($this->db);
1613 $result = $product->fetch($fk_product);
1614 $product_type = $product->type;
1616 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
1617 $langs->load(
"errors");
1618 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
1619 $this->errors[] = $this->error;
1620 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
1621 $this->db->rollback();
1635 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1636 $vat_src_code = $reg[1];
1637 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1640 $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);
1650 $total_ht = $tabprice[0];
1651 $total_tva = $tabprice[1];
1652 $total_ttc = $tabprice[2];
1653 $total_localtax1 = $tabprice[9];
1654 $total_localtax2 = $tabprice[10];
1655 $pu_ht = $tabprice[3];
1658 $multicurrency_total_ht = $tabprice[16];
1659 $multicurrency_total_tva = $tabprice[17];
1660 $multicurrency_total_ttc = $tabprice[18];
1661 $pu_ht_devise = $tabprice[19];
1665 if ($ranktouse == -1) {
1666 $rangmax = $this->
line_max($fk_parent_line);
1667 $ranktouse = $rangmax + 1;
1674 if ($remise_percent > 0) {
1675 $remise = round(((
float) $pu * $remise_percent / 100), 2);
1676 $price = (float) $pu - $remise;
1682 $this->line->context = $this->context;
1684 $this->line->fk_commande = $this->id;
1685 $this->line->label = $label;
1686 $this->line->desc = $desc;
1687 $this->line->qty = $qty;
1688 $this->line->ref_ext = $ref_ext;
1690 $this->line->vat_src_code = $vat_src_code;
1691 $this->line->tva_tx = $txtva;
1692 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
1693 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
1694 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
1695 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
1696 $this->line->fk_product = $fk_product;
1697 $this->line->product_type = $product_type;
1698 $this->line->fk_remise_except = $fk_remise_except;
1699 $this->line->remise_percent = $remise_percent;
1700 $this->line->subprice = $pu_ht;
1701 $this->line->rang = $ranktouse;
1702 $this->line->info_bits = $info_bits;
1703 $this->line->total_ht = $total_ht;
1704 $this->line->total_tva = $total_tva;
1705 $this->line->total_localtax1 = $total_localtax1;
1706 $this->line->total_localtax2 = $total_localtax2;
1707 $this->line->total_ttc = $total_ttc;
1708 $this->line->special_code = $special_code;
1709 $this->line->origin = $origin;
1710 $this->line->origin_id = $origin_id;
1711 $this->line->fk_parent_line = $fk_parent_line;
1712 $this->line->fk_unit = $fk_unit;
1714 $this->line->date_start = $date_start;
1715 $this->line->date_end = $date_end;
1717 $this->line->fk_fournprice = $fk_fournprice;
1718 $this->line->pa_ht = $pa_ht;
1721 $this->line->fk_multicurrency = $this->fk_multicurrency;
1722 $this->line->multicurrency_code = $this->multicurrency_code;
1723 $this->line->multicurrency_subprice = $pu_ht_devise;
1724 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
1725 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
1726 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
1729 $this->line->price = $price;
1731 if (is_array($array_options) && count($array_options) > 0) {
1732 $this->line->array_options = $array_options;
1735 $result = $this->line->insert($user);
1738 if (!empty($fk_parent_line)) {
1740 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
1741 $linecount = count($this->lines);
1742 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
1748 if (empty($noupdateafterinsertline)) {
1753 $this->db->commit();
1754 $this->lines[] = $this->line;
1755 return $this->line->id;
1757 $this->db->rollback();
1761 $this->error = $this->line->error;
1762 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
1763 $this->db->rollback();
1767 dol_syslog(get_class($this).
"::addline status of order must be Draft to allow use of ->addline()", LOG_ERR);
1787 public function add_product($idproduct, $qty, $remise_percent = 0.0, $date_start =
'', $date_end =
'')
1790 global $conf, $mysoc;
1796 if ($idproduct > 0) {
1797 $prod =
new Product($this->db);
1798 $prod->fetch($idproduct);
1802 if (empty($tva_tx)) {
1807 $localtax1_tx =
get_localtax($tva_tx, 1, $this->thirdparty, $mysoc, $tva_npr);
1808 $localtax2_tx =
get_localtax($tva_tx, 2, $this->thirdparty, $mysoc, $tva_npr);
1811 if ($conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
1812 $price = $prod->multiprices[$this->thirdparty->price_level];
1814 $price = $prod->price;
1819 $line->context = $this->context;
1821 $line->fk_product = $idproduct;
1822 $line->desc = $prod->description;
1824 $line->subprice = $price;
1825 $line->remise_percent = $remise_percent;
1826 $line->vat_src_code = $vat_src_code;
1827 $line->tva_tx = $tva_tx;
1828 $line->localtax1_tx = $localtax1_tx;
1829 $line->localtax2_tx = $localtax2_tx;
1831 $line->product_ref = $prod->ref;
1832 $line->product_label = $prod->label;
1833 $line->product_desc = $prod->description;
1834 $line->fk_unit = $prod->fk_unit;
1838 $line->date_start = $date_start;
1841 $line->date_end = $date_end;
1844 $this->lines[] = $line;
1877 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
1880 if (empty($id) && empty($ref) && empty($ref_ext)) {
1884 $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';
1885 $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';
1886 $sql .=
', c.fk_account';
1887 $sql .=
', c.date_commande, c.date_valid, c.tms';
1888 $sql .=
', c.date_livraison as delivery_date';
1889 $sql .=
', c.fk_shipping_method';
1890 $sql .=
', c.fk_warehouse';
1891 $sql .=
', c.fk_projet as fk_project, c.source, c.facture as billed';
1892 $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';
1893 $sql .=
', c.fk_incoterms, c.location_incoterms';
1894 $sql .=
", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
1895 $sql .=
", c.module_source, c.pos_source";
1896 $sql .=
", i.libelle as label_incoterms";
1897 $sql .=
', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
1898 $sql .=
', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
1899 $sql .=
', ca.code as availability_code, ca.label as availability_label';
1900 $sql .=
', dr.code as demand_reason_code';
1901 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
1902 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid';
1903 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON c.fk_mode_reglement = p.id';
1904 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON c.fk_availability = ca.rowid';
1905 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON c.fk_input_reason = dr.rowid';
1906 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
1909 $sql .=
" WHERE c.rowid=".((int) $id);
1911 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
1915 $sql .=
" AND c.ref='".$this->db->escape($ref).
"'";
1918 $sql .=
" AND c.ref_ext='".$this->db->escape($ref_ext).
"'";
1921 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1922 $result = $this->db->query($sql);
1924 $obj = $this->db->fetch_object($result);
1926 $this->
id = $obj->rowid;
1927 $this->entity = $obj->entity;
1929 $this->
ref = $obj->ref;
1930 $this->ref_client = $obj->ref_client;
1931 $this->ref_customer = $obj->ref_client;
1932 $this->ref_ext = $obj->ref_ext;
1934 $this->socid = $obj->fk_soc;
1935 $this->thirdparty =
null;
1937 $this->fk_project = $obj->fk_project;
1938 $this->project =
null;
1940 $this->statut = $obj->fk_statut;
1941 $this->
status = $obj->fk_statut;
1943 $this->user_author_id = $obj->fk_user_author;
1944 $this->user_creation_id = $obj->fk_user_author;
1945 $this->user_validation_id = $obj->fk_user_valid;
1946 $this->user_modification_id = $obj->fk_user_modif;
1947 $this->total_ht = $obj->total_ht;
1948 $this->total_tva = $obj->total_tva;
1949 $this->total_localtax1 = $obj->total_localtax1;
1950 $this->total_localtax2 = $obj->total_localtax2;
1951 $this->total_ttc = $obj->total_ttc;
1952 $this->date = $this->db->jdate($obj->date_commande);
1953 $this->date_commande = $this->db->jdate($obj->date_commande);
1954 $this->date_creation = $this->db->jdate($obj->date_creation);
1955 $this->date_validation = $this->db->jdate($obj->date_valid);
1956 $this->date_modification = $this->db->jdate($obj->tms);
1957 $this->source = $obj->source;
1958 $this->billed = $obj->billed;
1959 $this->note = $obj->note_private;
1960 $this->note_private = $obj->note_private;
1961 $this->note_public = $obj->note_public;
1962 $this->model_pdf = $obj->model_pdf;
1963 $this->last_main_doc = $obj->last_main_doc;
1964 $this->mode_reglement_id = $obj->fk_mode_reglement;
1965 $this->mode_reglement_code = $obj->mode_reglement_code;
1966 $this->mode_reglement = $obj->mode_reglement_libelle;
1967 $this->cond_reglement_id = $obj->fk_cond_reglement;
1968 $this->cond_reglement_code = $obj->cond_reglement_code;
1969 $this->cond_reglement = $obj->cond_reglement_libelle;
1970 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1971 $this->deposit_percent = $obj->deposit_percent;
1972 $this->fk_account = $obj->fk_account;
1973 $this->availability_id = $obj->fk_availability;
1974 $this->availability_code = $obj->availability_code;
1976 $this->demand_reason_id = $obj->fk_input_reason;
1977 $this->demand_reason_code = $obj->demand_reason_code;
1978 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1979 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1980 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
1981 $this->fk_delivery_address = $obj->fk_delivery_address;
1982 $this->module_source = $obj->module_source;
1983 $this->pos_source = $obj->pos_source;
1986 $this->fk_incoterms = $obj->fk_incoterms;
1987 $this->location_incoterms = $obj->location_incoterms;
1988 $this->label_incoterms = $obj->label_incoterms;
1991 $this->fk_multicurrency = $obj->fk_multicurrency;
1992 $this->multicurrency_code = $obj->multicurrency_code;
1993 $this->multicurrency_tx = $obj->multicurrency_tx;
1994 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1995 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1996 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1998 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
2000 $this->lines = array();
2006 $this->db->free($result);
2015 $this->error =
'Order with id '.$id.
' not found sql='.$sql;
2019 $this->error = $this->db->error();
2037 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2038 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
2043 $result = $remise->fetch($idremise);
2046 if ($remise->fk_facture) {
2047 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
2048 $this->db->rollback();
2054 $line->fk_commande = $this->id;
2055 $line->fk_remise_except = $remise->id;
2056 $line->desc = $remise->description;
2057 $line->vat_src_code = $remise->vat_src_code;
2058 $line->tva_tx = $remise->tva_tx;
2059 $line->subprice = -(float) $remise->amount_ht;
2060 $line->price = -(float) $remise->amount_ht;
2061 $line->fk_product = 0;
2063 $line->remise_percent = 0;
2065 $line->info_bits = 2;
2067 $line->total_ht = -(float) $remise->amount_ht;
2068 $line->total_tva = -(float) $remise->amount_tva;
2069 $line->total_ttc = -(float) $remise->amount_ttc;
2071 $result = $line->insert();
2075 $this->db->commit();
2078 $this->db->rollback();
2082 $this->error = $line->error;
2083 $this->errors = $line->errors;
2084 $this->db->rollback();
2088 $this->db->rollback();
2102 public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
2105 global $langs, $conf;
2107 $this->lines = array();
2109 $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,';
2110 $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,';
2111 $sql .=
' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
2112 $sql .=
' l.fk_unit,';
2113 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2114 $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,';
2115 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units';
2116 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element_line.
' as l';
2117 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (p.rowid = l.fk_product)';
2118 $sql .=
' WHERE l.fk_commande = '.((int) $this->
id);
2119 if ($only_product) {
2120 $sql .=
' AND p.fk_product_type = 0';
2122 $sql .=
' ORDER BY l.rang, l.rowid';
2124 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
2125 $result = $this->db->query($sql);
2127 $num = $this->db->num_rows($result);
2131 $objp = $this->db->fetch_object($result);
2135 $line->rowid = $objp->rowid;
2136 $line->id = $objp->rowid;
2137 $line->fk_commande = $objp->fk_commande;
2138 $line->commande_id = $objp->fk_commande;
2139 $line->label = $objp->custom_label;
2140 $line->desc = $objp->description;
2141 $line->description = $objp->description;
2142 $line->product_type = $objp->product_type;
2143 $line->qty = $objp->qty;
2144 $line->ref_ext = $objp->ref_ext;
2146 $line->vat_src_code = $objp->vat_src_code;
2147 $line->tva_tx = $objp->tva_tx;
2148 $line->localtax1_tx = $objp->localtax1_tx;
2149 $line->localtax2_tx = $objp->localtax2_tx;
2150 $line->localtax1_type = $objp->localtax1_type;
2151 $line->localtax2_type = $objp->localtax2_type;
2152 $line->total_ht = $objp->total_ht;
2153 $line->total_ttc = $objp->total_ttc;
2154 $line->total_tva = $objp->total_tva;
2155 $line->total_localtax1 = $objp->total_localtax1;
2156 $line->total_localtax2 = $objp->total_localtax2;
2157 $line->subprice = $objp->subprice;
2158 $line->fk_remise_except = $objp->fk_remise_except;
2159 $line->remise_percent = $objp->remise_percent;
2160 $line->price = $objp->price;
2161 $line->fk_product = $objp->fk_product;
2162 $line->fk_fournprice = $objp->fk_fournprice;
2163 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
2164 $line->pa_ht = $marginInfos[0];
2165 $line->marge_tx = $marginInfos[1];
2166 $line->marque_tx = $marginInfos[2];
2167 $line->rang = $objp->rang;
2168 $line->info_bits = $objp->info_bits;
2169 $line->special_code = $objp->special_code;
2170 $line->fk_parent_line = $objp->fk_parent_line;
2172 $line->ref = $objp->product_ref;
2173 $line->libelle = $objp->product_label;
2175 $line->product_ref = $objp->product_ref;
2176 $line->product_label = $objp->product_label;
2177 $line->product_tosell = $objp->product_tosell;
2178 $line->product_tobuy = $objp->product_tobuy;
2179 $line->product_desc = $objp->product_desc;
2180 $line->product_tobatch = $objp->product_tobatch;
2181 $line->product_barcode = $objp->product_barcode;
2183 $line->fk_product_type = $objp->fk_product_type;
2184 $line->fk_unit = $objp->fk_unit;
2186 $line->weight = $objp->weight;
2187 $line->weight_units = $objp->weight_units;
2188 $line->volume = $objp->volume;
2189 $line->volume_units = $objp->volume_units;
2191 $line->date_start = $this->db->jdate($objp->date_start);
2192 $line->date_end = $this->db->jdate($objp->date_end);
2195 $line->fk_multicurrency = $objp->fk_multicurrency;
2196 $line->multicurrency_code = $objp->multicurrency_code;
2197 $line->multicurrency_subprice = $objp->multicurrency_subprice;
2198 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
2199 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
2200 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2202 $line->fetch_optionals();
2205 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
2206 $tmpproduct =
new Product($this->db);
2207 $tmpproduct->fetch($objp->fk_product);
2208 $tmpproduct->getMultiLangs();
2210 $line->multilangs = $tmpproduct->multilangs;
2213 $this->lines[$i] = $line;
2218 $this->db->free($result);
2222 $this->error = $this->db->error();
2236 foreach ($this->lines as $line) {
2237 if ($line->product_type == 0) {
2252 foreach ($this->lines as $line) {
2253 if ($line->product_type == 1) {
2269 $sql =
'SELECT COUNT(DISTINCT ed.fk_expedition) as nb';
2270 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2271 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2273 $sql .=
' ed.fk_elementdet = cd.rowid';
2274 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2277 dol_syslog(get_class($this).
"::getNbOfShipments", LOG_DEBUG);
2278 $resql = $this->db->query($sql);
2280 $obj = $this->db->fetch_object($resql);
2285 $this->db->free($resql);
2288 $this->error = $this->db->lasterror();
2303 $this->expeditions = array();
2305 $sql =
'SELECT cd.rowid, cd.fk_product,';
2306 $sql .=
' sum(ed.qty) as qty';
2307 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2308 if ($filtre_statut >= 0) {
2309 $sql .=
' '.MAIN_DB_PREFIX.
'expedition as e,';
2311 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2313 if ($filtre_statut >= 0) {
2314 $sql .=
' ed.fk_expedition = e.rowid AND';
2316 $sql .=
' ed.fk_elementdet = cd.rowid';
2317 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2318 if ($fk_product > 0) {
2319 $sql .=
' AND cd.fk_product = '.((int) $fk_product);
2321 if ($filtre_statut >= 0) {
2322 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
2324 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
2327 dol_syslog(get_class($this).
"::loadExpeditions", LOG_DEBUG);
2328 $resql = $this->db->query($sql);
2330 $num = $this->db->num_rows($resql);
2333 $obj = $this->db->fetch_object($resql);
2334 $this->expeditions[$obj->rowid] = $obj->qty;
2337 $this->db->free($resql);
2340 $this->error = $this->db->lasterror();
2352 $sql =
'SELECT count(*)';
2353 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expedition as e';
2354 $sql .=
', '.MAIN_DB_PREFIX.
'element_element as el';
2355 $sql .=
' WHERE el.fk_source = '.((int) $this->
id);
2356 $sql .=
" AND el.sourcetype = 'commande'";
2357 $sql .=
" AND el.fk_target = e.rowid";
2358 $sql .=
" AND el.targettype = 'shipping'";
2360 $resql = $this->db->query($sql);
2362 $row = $this->db->fetch_row($resql);
2420 if ($this->statut == self::STATUS_DRAFT) {
2426 $line->context = $this->context;
2429 $line->fetch($lineid);
2431 if ($id > 0 && $line->fk_commande != $id) {
2432 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
2437 $staticline = clone $line;
2438 $line->oldline = $staticline;
2440 if ($line->delete($user) > 0) {
2444 $this->db->commit();
2447 $this->db->rollback();
2448 $this->error = $this->db->lasterror();
2452 $this->db->rollback();
2453 $this->error = $line->error;
2457 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
2476 dol_syslog(get_class($this).
"::set_remise is deprecated, use setDiscount instead", LOG_NOTICE);
2478 return $this->
setDiscount($user, $remise, $notrigger);
2491 $remise = trim((
string) $remise) ? trim((
string) $remise) : 0;
2493 if ($user->hasRight(
'commande',
'creer')) {
2500 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2501 $sql .=
' SET remise_percent = '.((float) $remise);
2502 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_DRAFT);
2505 $resql = $this->db->query($sql);
2507 $this->errors[] = $this->db->error();
2512 $this->oldcopy = clone $this;
2513 $this->remise_percent = $remise;
2517 if (!$notrigger && empty($error)) {
2527 $this->db->commit();
2530 foreach ($this->errors as $errmsg) {
2531 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2532 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2534 $this->db->rollback();
2622 if ($user->hasRight(
'commande',
'creer')) {
2627 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2628 $sql .=
" SET date_commande = ".($date ?
"'".$this->db->idate($date).
"'" :
'null');
2629 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = ".((int) self::STATUS_DRAFT);
2632 $resql = $this->db->query($sql);
2634 $this->errors[] = $this->db->error();
2639 $this->oldcopy = clone $this;
2640 $this->date = $date;
2643 if (!$notrigger && empty($error)) {
2653 $this->db->commit();
2656 foreach ($this->errors as $errmsg) {
2657 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2658 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2660 $this->db->rollback();
2694 if ($user->hasRight(
'commande',
'creer')) {
2699 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2700 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2701 $sql .=
" WHERE rowid = ".((int) $this->
id);
2704 $resql = $this->db->query($sql);
2706 $this->errors[] = $this->db->error();
2711 $this->oldcopy = clone $this;
2712 $this->delivery_date = $delivery_date;
2715 if (!$notrigger && empty($error)) {
2725 $this->db->commit();
2728 foreach ($this->errors as $errmsg) {
2729 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2730 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2732 $this->db->rollback();
2754 public function liste_array($shortlist = 0, $draft = 0, $excluser =
null, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'c.date_commande', $sortorder =
'DESC')
2761 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2762 $sql .=
" c.rowid as cid, c.ref";
2763 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2764 $sql .=
", sc.fk_soc, sc.fk_user";
2766 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.$this->table_element.
" as c";
2767 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2768 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
2770 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2771 $sql .=
" AND c.fk_soc = s.rowid";
2772 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2773 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2776 $sql .=
" AND s.rowid = ".((int) $socid);
2779 $sql .=
" AND c.fk_statut = ".self::STATUS_DRAFT;
2781 if (is_object($excluser)) {
2782 $sql .=
" AND c.fk_user_author <> ".((int) $excluser->id);
2784 $sql .= $this->db->order($sortfield, $sortorder);
2785 $sql .= $this->db->plimit($limit, $offset);
2787 $result = $this->db->query($sql);
2789 $numc = $this->db->num_rows($result);
2792 while ($i < $numc) {
2793 $obj = $this->db->fetch_object($result);
2795 if ($shortlist == 1) {
2796 $ga[$obj->cid] = $obj->ref;
2797 } elseif ($shortlist == 2) {
2798 $ga[$obj->cid] = $obj->ref.
' ('.$obj->name.
')';
2800 $ga[$i][
'id'] = $obj->cid;
2801 $ga[$i][
'ref'] = $obj->ref;
2802 $ga[$i][
'name'] = $obj->name;
2825 dol_syslog(
'Commande::availability('.$availability_id.
')');
2826 if ($this->statut >= self::STATUS_DRAFT) {
2831 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2832 $sql .=
' SET fk_availability = '.((int) $availability_id);
2833 $sql .=
' WHERE rowid='.((int) $this->
id);
2836 $resql = $this->db->query($sql);
2838 $this->errors[] = $this->db->error();
2843 $this->oldcopy = clone $this;
2844 $this->availability_id = $availability_id;
2847 if (!$notrigger && empty($error)) {
2857 $this->db->commit();
2860 foreach ($this->errors as $errmsg) {
2861 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2862 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2864 $this->db->rollback();
2868 $error_str =
'Command status do not meet requirement '.$this->statut;
2870 $this->error = $error_str;
2871 $this->errors[] = $this->error;
2889 dol_syslog(
'Commande::demand_reason('.$demand_reason_id.
')');
2890 if ($this->statut >= self::STATUS_DRAFT) {
2895 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2896 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
2897 $sql .=
' WHERE rowid='.((int) $this->
id);
2900 $resql = $this->db->query($sql);
2902 $this->errors[] = $this->db->error();
2907 $this->oldcopy = clone $this;
2908 $this->demand_reason_id = $demand_reason_id;
2911 if (!$notrigger && empty($error)) {
2921 $this->db->commit();
2924 foreach ($this->errors as $errmsg) {
2925 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2926 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2928 $this->db->rollback();
2932 $error_str =
'order status do not meet requirement '.$this->statut;
2934 $this->error = $error_str;
2935 $this->errors[] = $this->error;
2952 if ($user->hasRight(
'commande',
'creer')) {
2957 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET';
2958 $sql .=
' ref_client = '.(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2959 $sql .=
' WHERE rowid = '.((int) $this->
id);
2961 dol_syslog(__METHOD__.
' this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2962 $resql = $this->db->query($sql);
2964 $this->errors[] = $this->db->error();
2969 $this->oldcopy = clone $this;
2970 $this->ref_client = $ref_client;
2971 $this->ref_customer = $ref_client;
2974 if (!$notrigger && empty($error)) {
2983 $this->db->commit();
2986 foreach ($this->errors as $errmsg) {
2987 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2988 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2990 $this->db->rollback();
3009 if ($this->billed) {
3015 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 1';
3018 dol_syslog(get_class($this).
"::classifyBilled", LOG_DEBUG);
3019 if ($this->db->query($sql)) {
3021 $this->oldcopy = clone $this;
3025 if (!$notrigger && empty($error)) {
3027 $result = $this->
call_trigger(
'ORDER_CLASSIFY_BILLED', $user);
3035 $this->db->commit();
3038 foreach ($this->errors as $errmsg) {
3039 dol_syslog(get_class($this).
"::classifyBilled ".$errmsg, LOG_ERR);
3040 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3042 $this->db->rollback();
3046 $this->error = $this->db->error();
3047 $this->db->rollback();
3065 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 0';
3068 dol_syslog(get_class($this).
"::classifyUnBilled", LOG_DEBUG);
3069 if ($this->db->query($sql)) {
3071 $this->oldcopy = clone $this;
3075 if (!$notrigger && empty($error)) {
3077 $result = $this->
call_trigger(
'ORDER_CLASSIFY_UNBILLED', $user);
3087 $this->db->commit();
3090 foreach ($this->errors as $errmsg) {
3091 dol_syslog(get_class($this).
"::classifyUnBilled ".$errmsg, LOG_ERR);
3092 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3094 $this->db->rollback();
3098 $this->error = $this->db->error();
3099 $this->db->rollback();
3135 public function updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1 = 0.0, $txlocaltax2 = 0.0, $price_base_type =
'HT', $info_bits = 0, $date_start =
'', $date_end =
'', $type = 0, $fk_parent_line = 0, $skip_update_total = 0, $fk_fournprice =
null, $pa_ht = 0, $label =
'', $special_code = 0, $array_options = array(), $fk_unit =
null, $pu_ht_devise = 0, $notrigger = 0, $ref_ext =
'', $rang = 0)
3137 global $conf, $mysoc, $langs, $user;
3139 dol_syslog(get_class($this).
"::updateline id=$rowid, desc=$desc, pu=$pu, qty=$qty, remise_percent=$remise_percent, txtva=$txtva, txlocaltax1=$txlocaltax1, txlocaltax2=$txlocaltax2, price_base_type=$price_base_type, info_bits=$info_bits, date_start=$date_start, date_end=$date_end, type=$type, fk_parent_line=$fk_parent_line, pa_ht=$pa_ht, special_code=$special_code, ref_ext=$ref_ext");
3140 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3147 if (empty($info_bits)) {
3150 if (empty($txtva)) {
3153 if (empty($txlocaltax1)) {
3156 if (empty($txlocaltax2)) {
3159 if (empty($remise_percent)) {
3160 $remise_percent = 0;
3162 if (empty($special_code) || $special_code == 3) {
3165 if (empty($ref_ext)) {
3169 if ($date_start && $date_end && $date_start > $date_end) {
3170 $langs->load(
"errors");
3171 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
3175 $remise_percent = (float)
price2num($remise_percent);
3179 $pu_ht_devise =
price2num($pu_ht_devise);
3180 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
3183 $txlocaltax1 = (float)
price2num($txlocaltax1);
3184 $txlocaltax2 = (float)
price2num($txlocaltax2);
3198 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
3199 $vat_src_code = $reg[1];
3200 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
3203 $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);
3205 $total_ht = $tabprice[0];
3206 $total_tva = $tabprice[1];
3207 $total_ttc = $tabprice[2];
3208 $total_localtax1 = $tabprice[9];
3209 $total_localtax2 = $tabprice[10];
3210 $pu_ht = $tabprice[3];
3211 $pu_tva = $tabprice[4];
3212 $pu_ttc = $tabprice[5];
3215 $multicurrency_total_ht = $tabprice[16];
3216 $multicurrency_total_tva = $tabprice[17];
3217 $multicurrency_total_ttc = $tabprice[18];
3218 $pu_ht_devise = $tabprice[19];
3222 if ($price_base_type ==
'TTC') {
3223 $subprice = $pu_ttc;
3228 if ($remise_percent > 0) {
3229 $remise = round(((
float) $pu * $remise_percent / 100), 2);
3230 $price = ((float) $pu - $remise);
3235 $line->fetch($rowid);
3236 $line->fetch_optionals();
3238 if (!empty($line->fk_product)) {
3239 $product =
new Product($this->db);
3240 $result = $product->fetch($line->fk_product);
3241 $product_type = $product->type;
3243 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
3244 $langs->load(
"errors");
3245 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
3246 $this->errors[] = $this->error;
3248 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
3250 $this->db->rollback();
3255 $staticline = clone $line;
3257 $line->oldline = $staticline;
3258 $this->line = $line;
3259 $this->line->context = $this->context;
3260 $this->line->rang = $rang;
3263 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
3264 $rangmax = $this->
line_max($fk_parent_line);
3265 $this->line->rang = $rangmax + 1;
3268 $this->line->id = $rowid;
3269 $this->line->label = $label;
3270 $this->line->desc = $desc;
3271 $this->line->qty = $qty;
3272 $this->line->ref_ext = $ref_ext;
3274 $this->line->vat_src_code = $vat_src_code;
3275 $this->line->tva_tx = $txtva;
3276 $this->line->localtax1_tx = $txlocaltax1;
3277 $this->line->localtax2_tx = $txlocaltax2;
3278 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
3279 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
3280 $this->line->remise_percent = $remise_percent;
3281 $this->line->subprice = $pu_ht;
3282 $this->line->info_bits = $info_bits;
3283 $this->line->special_code = $special_code;
3284 $this->line->total_ht = $total_ht;
3285 $this->line->total_tva = $total_tva;
3286 $this->line->total_localtax1 = $total_localtax1;
3287 $this->line->total_localtax2 = $total_localtax2;
3288 $this->line->total_ttc = $total_ttc;
3289 $this->line->date_start = $date_start;
3290 $this->line->date_end = $date_end;
3291 $this->line->product_type = $type;
3292 $this->line->fk_parent_line = $fk_parent_line;
3293 $this->line->skip_update_total = $skip_update_total;
3294 $this->line->fk_unit = $fk_unit;
3296 $this->line->fk_fournprice = $fk_fournprice;
3297 $this->line->pa_ht = $pa_ht;
3300 $this->line->multicurrency_subprice = $pu_ht_devise;
3301 $this->line->multicurrency_total_ht = $multicurrency_total_ht;
3302 $this->line->multicurrency_total_tva = $multicurrency_total_tva;
3303 $this->line->multicurrency_total_ttc = $multicurrency_total_ttc;
3306 $this->line->price = $price;
3308 if (is_array($array_options) && count($array_options) > 0) {
3310 foreach ($array_options as $key => $value) {
3311 $this->line->array_options[$key] = $array_options[$key];
3315 $result = $this->line->update($user, $notrigger);
3318 if (!empty($fk_parent_line)) {
3325 $this->db->commit();
3328 $this->error = $this->line->error;
3330 $this->db->rollback();
3334 $this->error = get_class($this).
"::updateline Order status makes operation forbidden";
3335 $this->errors = array(
'OrderStatusMakeOperationForbidden');
3354 if (isset($this->
ref)) {
3355 $this->
ref = trim($this->
ref);
3357 if (isset($this->ref_client)) {
3358 $this->ref_client = trim($this->ref_client);
3360 if (isset($this->ref_customer)) {
3361 $this->ref_customer = trim($this->ref_customer);
3363 if (isset($this->note) || isset($this->note_private)) {
3364 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
3366 if (isset($this->note_public)) {
3367 $this->note_public = trim($this->note_public);
3369 if (isset($this->model_pdf)) {
3370 $this->model_pdf = trim($this->model_pdf);
3372 if (isset($this->import_key)) {
3373 $this->import_key = trim($this->import_key);
3375 $delivery_date = $this->delivery_date;
3381 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
3383 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
3384 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
3385 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
3386 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
3387 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
3388 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
3389 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
3390 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
3391 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
3392 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
3393 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
3394 $sql .=
" fk_statut=".(isset($this->statut) ? $this->statut :
"null").
",";
3395 $sql .=
" fk_user_modif=".(isset($user->id) ? $user->id :
"null").
",";
3396 $sql .=
" fk_user_valid=".((isset($this->user_validation_id) && $this->user_validation_id > 0) ? $this->user_validation_id :
"null").
",";
3397 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
3398 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
3399 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ? strval($this->deposit_percent) :
"null").
",";
3400 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
3401 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
3402 $sql .=
" fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id :
"null").
",";
3403 $sql .=
" fk_account=".($this->fk_account > 0 ? $this->fk_account :
"null").
",";
3404 $sql .=
" fk_input_reason=".($this->demand_reason_id > 0 ? $this->demand_reason_id :
"null").
",";
3405 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
3406 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
3407 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
3408 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
3410 $sql .=
" WHERE rowid=".((int) $this->
id);
3414 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3415 $resql = $this->db->query($sql);
3418 $this->errors[] =
"Error ".$this->db->lasterror();
3428 if (!$error && !$notrigger) {
3439 foreach ($this->errors as $errmsg) {
3440 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
3441 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3443 $this->db->rollback();
3446 $this->db->commit();
3458 public function delete($user, $notrigger = 0)
3460 global $conf, $langs;
3461 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3465 dol_syslog(get_class($this).
"::delete ".$this->
id, LOG_DEBUG);
3480 $this->errors[] = $langs->trans(
'SomeShipmentExists');
3485 if (!$error && !empty($this->table_element_line)) {
3486 $tabletodelete = $this->table_element_line;
3487 $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).
")";
3488 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3489 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3491 $this->error = $this->db->lasterror();
3492 $this->errors[] = $this->error;
3493 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3518 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3524 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3525 $res = $this->db->query($sql);
3528 $this->error = $this->db->lasterror();
3529 $this->errors[] = $this->error;
3530 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3546 if ($conf->commande->multidir_output[$this->entity] && !empty($this->
ref)) {
3547 $dir = $conf->commande->multidir_output[$this->entity].
"/".$ref;
3548 $file = $dir.
"/".$ref.
".pdf";
3549 if (file_exists($file)) {
3553 $this->error =
'ErrorFailToDeleteFile';
3554 $this->errors[] = $this->error;
3555 $this->db->rollback();
3559 if (file_exists($dir)) {
3562 $this->error =
'ErrorFailToDeleteDir';
3563 $this->errors[] = $this->error;
3564 $this->db->rollback();
3572 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3573 $this->db->commit();
3576 $this->db->rollback();
3593 global $conf, $langs;
3597 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht";
3598 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as c";
3599 if (!$user->hasRight(
'societe',
'client',
'voir')) {
3600 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc";
3601 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3604 $sql .= $clause.
" c.entity IN (".
getEntity(
'commande').
")";
3606 if ($mode ==
'toship') {
3608 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
")";
3610 if ($mode ==
'tobill') {
3612 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
", " . self::STATUS_CLOSED .
") AND c.facture = 0";
3614 if ($mode ==
'shippedtobill') {
3616 $sql .=
" AND c.fk_statut IN (" . self::STATUS_CLOSED .
") AND c.facture = 0";
3619 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3622 $resql = $this->db->query($sql);
3625 $label = $labelShort = $url =
'';
3626 if ($mode ==
'toship') {
3627 $delay_warning = $conf->commande->client->warning_delay / 60 / 60 / 24;
3628 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-2&mainmenu=commercial&leftmenu=orders';
3629 $label = $langs->transnoentitiesnoconv(
"OrdersToProcess");
3630 $labelShort = $langs->transnoentitiesnoconv(
"Opened");
3632 if ($mode ==
'tobill') {
3633 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3634 $label = $langs->trans(
"OrdersToBill");
3635 $labelShort = $langs->trans(
"ToBill");
3637 if ($mode ==
'shippedtobill') {
3638 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3639 $label = $langs->trans(
"OrdersToBill");
3640 $labelShort = $langs->trans(
"StatusOrderDelivered").
' '.$langs->trans(
"and").
' '.$langs->trans(
"ToBill");
3645 $response->warning_delay = $delay_warning;
3646 $response->label = $label;
3647 $response->labelShort = $labelShort;
3648 $response->url = $url;
3649 $response->url_late = DOL_URL_ROOT.
'/commande/list.php?search_option=late&mainmenu=commercial&leftmenu=orders';
3652 $generic_commande =
new Commande($this->db);
3654 while ($obj = $this->db->fetch_object($resql)) {
3655 $response->nbtodo++;
3656 $response->total += $obj->total_ht;
3658 $generic_commande->statut = $obj->fk_statut;
3659 $generic_commande->date_commande = $this->db->jdate($obj->date_commande);
3660 $generic_commande->date = $this->db->jdate($obj->date_commande);
3661 $generic_commande->delivery_date = $this->db->jdate($obj->delivery_date);
3663 if ($mode ==
'toship' && $generic_commande->hasDelay()) {
3664 $response->nbtodolate++;
3670 $this->error = $this->db->error();
3684 $label = $langs->trans(
'OrderSource'.$this->source);
3686 if ($label ==
'OrderSource') {
3700 return $this->
LibStatut($this->statut, $this->billed, $mode);
3713 public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
3716 global $langs, $hookmanager;
3719 if (empty($donotshowbilled)) {
3720 $billedtext .= ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3725 if ($status == self::STATUS_CANCELED) {
3726 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderCanceled');
3727 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderCanceledShort');
3728 $statusType =
'status9';
3729 } elseif ($status == self::STATUS_DRAFT) {
3730 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDraft');
3731 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDraftShort');
3732 $statusType =
'status0';
3733 } elseif ($status == self::STATUS_VALIDATED) {
3734 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderValidated').$billedtext;
3735 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderValidatedShort').$billedtext;
3736 $statusType =
'status1';
3737 } elseif ($status == self::STATUS_SHIPMENTONPROCESS) {
3738 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderSent').$billedtext;
3739 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderSentShort').$billedtext;
3740 $labelTooltip = $langs->transnoentitiesnoconv(
"StatusOrderSent");
3741 if (!empty($this->delivery_date)) {
3742 $labelTooltip .=
' - '.$langs->transnoentitiesnoconv(
"DateDeliveryPlanned").dol_print_date($this->delivery_date,
'day').$billedtext;
3744 $statusType =
'status4';
3745 } elseif ($status == self::STATUS_CLOSED) {
3746 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDelivered').$billedtext;
3747 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDeliveredShort').$billedtext;
3748 $statusType =
'status6';
3750 $labelStatus = $langs->transnoentitiesnoconv(
'Unknown');
3751 $labelStatusShort =
'';
3756 $parameters = array(
3757 'status' => $status,
3759 'billed' => $billed,
3760 'donotshowbilled' => $donotshowbilled
3763 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3766 return $hookmanager->resPrint;
3769 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode,
'', array(
'tooltip' => $labelTooltip));
3780 global $conf, $langs, $user;
3782 $langs->load(
'orders');
3784 $nofetch = !empty($params[
'nofetch']);
3787 return [
'optimize' => $langs->trans(
"Order")];
3790 if ($user->hasRight(
'commande',
'lire')) {
3791 $datas[
'picto'] =
img_picto(
'', $this->picto).
' <u class="paddingrightonly">'.$langs->trans(
"Order").
'</u>';
3792 if (isset($this->statut)) {
3793 $datas[
'status'] =
' '.$this->getLibStatut(5);
3795 $datas[
'Ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3797 $langs->load(
'companies');
3798 if (empty($this->thirdparty)) {
3801 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3803 $datas[
'RefCustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.(empty($this->ref_customer) ? (empty($this->ref_client) ?
'' : $this->ref_client) : $this->ref_customer);
3805 $langs->load(
'project');
3806 if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
3808 if ($res > 0 && $this->project instanceof
Project) {
3809 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0, 1);
3813 if (!empty($this->total_ht)) {
3814 $datas[
'AmountHT'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1, $conf->currency);
3816 if (!empty($this->total_tva)) {
3817 $datas[
'VAT'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1, $conf->currency);
3819 if (!empty($this->total_ttc)) {
3820 $datas[
'AmountTTC'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1, $conf->currency);
3822 if (!empty($this->date)) {
3823 $datas[
'Date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
3825 if (!empty($this->delivery_date)) {
3826 $datas[
'DeliveryDate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3846 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target =
'')
3848 global $conf, $langs, $user, $hookmanager;
3850 if (!empty($conf->dol_no_mouse_hover)) {
3856 if (isModEnabled(
"shipping") && ($option ==
'1' || $option ==
'2')) {
3857 $url = DOL_URL_ROOT.
'/expedition/shipment.php?id='.$this->id;
3859 $url = DOL_URL_ROOT.
'/commande/card.php?id='.$this->id;
3862 if (!$user->hasRight(
'commande',
'lire')) {
3866 if ($option !==
'nolink') {
3868 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3869 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3870 $add_save_lastsearch_values = 1;
3872 if ($add_save_lastsearch_values) {
3873 $url .=
'&save_lastsearch_values=1';
3882 'objecttype' => $this->element,
3883 'option' => $option,
3886 $classfortooltip =
'classfortooltip';
3889 $classfortooltip =
'classforajaxtooltip';
3890 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3897 if (empty($notooltip) && $user->hasRight(
'commande',
'lire')) {
3899 $label = $langs->trans(
"Order");
3900 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
3902 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
3903 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3905 $target_value = array(
'_self',
'_blank',
'_parent',
'_top');
3906 if (in_array($target, $target_value)) {
3907 $linkclose .=
' target="'.dol_escape_htmltag($target).
'"';
3911 $linkstart =
'<a href="'.$url.
'"';
3912 $linkstart .= $linkclose.
'>';
3915 if ($option ===
'nolink') {
3920 $result .= $linkstart;
3922 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
3924 if ($withpicto != 2) {
3925 $result .= $this->ref;
3927 $result .= $linkend;
3929 if ($addlinktonotes) {
3930 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
3933 $result .=
' <span class="note inline-block">';
3934 $result .=
'<a href="'.DOL_URL_ROOT.
'/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
3939 $result .=
'</span>';
3944 $hookmanager->initHooks(array($this->element .
'dao'));
3945 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
3946 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
3948 $result = $hookmanager->resPrint;
3950 $result .= $hookmanager->resPrint;
3964 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem,';
3965 $sql .=
' date_valid as datev,';
3966 $sql .=
' date_cloture as datecloture,';
3967 $sql .=
' fk_user_author, fk_user_valid, fk_user_cloture';
3968 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
3969 $sql .=
' WHERE c.rowid = '.((int) $id);
3970 $result = $this->db->query($sql);
3972 if ($this->db->num_rows($result)) {
3973 $obj = $this->db->fetch_object($result);
3974 $this->
id = $obj->rowid;
3975 if ($obj->fk_user_author) {
3976 $this->user_creation_id = $obj->fk_user_author;
3978 if ($obj->fk_user_valid) {
3979 $this->user_validation_id = $obj->fk_user_valid;
3981 if ($obj->fk_user_cloture) {
3982 $this->user_closing_id = $obj->fk_user_cloture;
3985 $this->date_creation = $this->db->jdate($obj->datec);
3986 $this->date_modification = $this->db->jdate($obj->datem);
3987 $this->date_validation = $this->db->jdate($obj->datev);
3988 $this->date_cloture = $this->db->jdate($obj->datecloture);
3991 $this->db->free($result);
4007 global $conf, $langs;
4009 dol_syslog(get_class($this).
"::initAsSpecimen");
4014 $sql =
"SELECT rowid";
4015 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
4016 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
4017 $sql .= $this->db->plimit(100);
4019 $resql = $this->db->query($sql);
4021 $num_prods = $this->db->num_rows($resql);
4023 while ($i < $num_prods) {
4025 $row = $this->db->fetch_row($resql);
4026 $prodids[$i] = $row[0];
4032 $this->
ref =
'SPECIMEN';
4033 $this->specimen = 1;
4034 $this->entity = $conf->entity;
4036 $this->date = time();
4037 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
4038 $this->cond_reglement_code =
'RECEP';
4039 $this->mode_reglement_code =
'CHQ';
4040 $this->availability_code =
'DSP';
4041 $this->demand_reason_code =
'SRC_00';
4043 $this->note_public =
'This is a comment (public)';
4044 $this->note_private =
'This is a comment (private)';
4046 $this->multicurrency_tx = 1;
4047 $this->multicurrency_code = $conf->currency;
4049 $this->
status = $this::STATUS_DRAFT;
4054 while ($xnbp < $nbp) {
4057 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
4059 $line->subprice = 100;
4063 $line->total_ht = 50;
4064 $line->total_ttc = 60;
4065 $line->total_tva = 10;
4066 $line->remise_percent = 50;
4068 $line->total_ht = 100;
4069 $line->total_ttc = 120;
4070 $line->total_tva = 20;
4071 $line->remise_percent = 0;
4073 if ($num_prods > 0) {
4074 $prodid = mt_rand(1, $num_prods);
4075 $line->fk_product = $prodids[$prodid];
4076 $line->product_ref =
'SPECIMEN';
4079 $this->lines[$xnbp] = $line;
4081 $this->total_ht += $line->total_ht;
4082 $this->total_tva += $line->total_tva;
4083 $this->total_ttc += $line->total_ttc;
4101 $this->nb = array();
4104 $sql =
"SELECT count(co.rowid) as nb";
4105 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as co";
4106 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON co.fk_soc = s.rowid";
4107 if (!$user->hasRight(
'societe',
'client',
'voir')) {
4108 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
4109 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
4112 $sql .=
" ".$clause.
" co.entity IN (".
getEntity(
'commande').
")";
4114 $resql = $this->db->query($sql);
4116 while ($obj = $this->db->fetch_object($resql)) {
4117 $this->nb[
"orders"] = $obj->nb;
4119 $this->db->free($resql);
4123 $this->error = $this->db->error();
4149 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
4151 global $conf, $langs;
4153 $langs->load(
"orders");
4154 $outputlangs->load(
"products");
4157 $modele =
'einstein';
4159 if (!empty($this->model_pdf)) {
4160 $modele = $this->model_pdf;
4166 $modelpath =
"core/modules/commande/doc/";
4168 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4221 return max($this->date, $this->delivery_date) < ($now - $conf->commande->client->warning_delay);
4231 global $conf, $langs;
4233 if (empty($this->delivery_date)) {
4234 $text = $langs->trans(
"OrderDate").
' '.
dol_print_date($this->date,
'day');
4236 $text = $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
4238 $text .=
' '.($conf->commande->client->warning_delay > 0 ?
'+' :
'-').
' '.round(abs($conf->commande->client->warning_delay) / 3600 / 24, 1).
' '.$langs->trans(
"days").
' < '.$langs->trans(
"Today");
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Class to manage customers orders.
getNbOfServicesLines()
Return number of line with type service.
getNbOfShipments()
Count number of shipments for this order.
createFromProposal($object, User $user)
Load an object from a proposal and create a new order into database.
setDraft($user, $idwarehouse=-1)
Set draft status.
setDeliveryDate($user, $delivery_date, $notrigger=0)
Set the planned delivery date.
static replaceProduct(DoliDB $db, $origin_id, $dest_id)
Function used to replace a product id with another one.
getLinesArray()
Create an array of order lines.
showDelay()
Show the customer delayed info.
set_date($user, $date, $notrigger=0)
Set a fixed amount discount.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
loadStateBoard()
Load the indicators this->nb for the state board.
fetch_lines($only_product=0, $loadalsotranslation=0)
Load array lines.
createFromClone(User $user, $socid=0)
Load an object from its id and create a new one in database.
const STATUS_SHIPMENTONPROCESS
Shipment on process.
LibStatut($status, $billed, $mode, $donotshowbilled=0)
Return label of status.
getLibStatut($mode)
Return status label of Order.
hasDelay()
Is the sales order delayed?
const STATUS_CLOSED
Closed (Sent, billed or not)
valid($user, $idwarehouse=0, $notrigger=0)
Validate order.
getLabelSource()
Return source label of order.
set_remise($user, $remise, $notrigger=0)
Applique une remise relative.
const STATUS_CANCELED
Canceled status.
getNomUrl($withpicto=0, $option='', $max=0, $short=0, $notooltip=0, $save_lastsearch_value=-1, $addlinktonotes=0, $target='')
Return clickable link of object (with eventually picto)
loadExpeditions($filtre_statut=-1, $fk_product=0)
Load array this->expeditions of lines of shipments with nb of products sent for each order line Note:...
__construct($db)
Constructor.
availability($availability_id, $notrigger=0)
Update delivery delay.
set_reopen($user)
Tag the order as validated (opened) Function used when order is reopend after being closed.
set_ref_client($user, $ref_client, $notrigger=0)
Set customer ref.
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)
Add a discount line into a sale order (as a sale order line) using an existing absolute discount (Con...
getNbOfProductsLines()
Return number of line with type product.
update(User $user, $notrigger=0)
Update database.
classifyUnBilled(User $user, $notrigger=0)
Classify the order as not invoiced.
setDiscount($user, $remise, $notrigger=0)
Set a percentage discount.
cloture($user, $notrigger=0)
Close order.
cancel($idwarehouse=-1)
Cancel an order If stock is decremented on order validation, we must reincrement it.
const STATUS_ACCEPTED
For backward compatibility.
updateline($rowid, $desc, $pu, $qty, $remise_percent, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0, $price_base_type='HT', $info_bits=0, $date_start='', $date_end='', $type=0, $fk_parent_line=0, $skip_update_total=0, $fk_fournprice=null, $pa_ht=0, $label='', $special_code=0, $array_options=array(), $fk_unit=null, $pu_ht_devise=0, $notrigger=0, $ref_ext='', $rang=0)
Update a line in database.
classifyBilled(User $user, $notrigger=0)
Classify the order as invoiced.
info($id)
Charge les information d'ordre info dans l'objet commande.
load_board($user, $mode)
Load indicators for dashboard (this->nbtodo and this->nbtodolate)
const STATUS_VALIDATED
Validated status.
deleteLine($user=null, $lineid=0, $id=0)
Return a array with the pending stock by product.
countNbOfShipments()
Returns an array with expeditions lines number.
liste_array($shortlist=0, $draft=0, $excluser=null, $socid=0, $limit=0, $offset=0, $sortfield='c.date_commande', $sortorder='DESC')
Return list of orders (eventuelly filtered on a user) into an array.
fetch($id, $ref='', $ref_ext='', $notused='')
Get object from database.
set_date_livraison($user, $delivery_date, $notrigger=0)
Set delivery date.
add_product($idproduct, $qty, $remise_percent=0.0, $date_start='', $date_end='')
Add line into array $this->client must be loaded.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
setSignedStatus(User $user, int $status=0, int $notrigger=0, $triggercode='')
Set signed status.
fetch_optionals($rowid=null, $optionsArray=null)
Function to get extra fields of an object into $this->array_options This method is in most cases call...
line_order($renum=false, $rowidorder='ASC', $fk_parent_line=true)
Save a new position (field rang) for details lines.
deleteEcmFiles($mode=0)
Delete related files of object in database.
update_price($exclspec=0, $roundingadjust='auto', $nodatabaseupdate=0, $seller=null)
Update total_ht, total_ttc, total_vat, total_localtax1, total_localtax2 for an object (sum of lines).
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetchProject()
Load the project with id $this->fk_project into this->project.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid=0, $f_user=null, $notrigger=0)
Delete all links between an object $this.
setErrorsFromObject($object)
setErrorsFromObject
static isExistingObject($element, $id, $ref='', $ref_ext='')
Check if an object id or ref exists If you don't need or want to instantiate the object and just need...
updateRangOfLine($rowid, $rang)
Update position of line (rang)
deleteExtraFields()
Delete all extra fields values for the current object.
copy_linked_contact($objFrom, $source='internal')
Copy contact from one element to current.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
static commonReplaceProduct(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a product id with another one.
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
delete_linked_contact($source='', $code='')
Delete all links between an object $this and all its contacts in llx_element_contact.
call_trigger($triggerName, $user)
Call trigger based on this instance.
add_contact($fk_socpeople, $type_contact, $source='external', $notrigger=0)
Add a link between element $this->element and a contact.
Superclass for orders classes.
Class to manage absolute discounts.
Class to manage Dolibarr database access.
Class to manage stock movements.
static 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.
Class to manage products or services.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
setSignedStatusCommon(User $user, int $status, int $notrigger=0, string $triggercode='')
Set signed status & call trigger with context message.
dol_delete_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($utf8_path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
dol_delete_preview($object)
Delete all preview files linked to object instance.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
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_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getLocalTaxesFromRate($vatrate, $local, $buyer, $seller, $firstparamisid=0)
Get type and rate of localtaxes for a particular vat rate/country of a thirdparty.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
get_default_npr(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that returns whether VAT must be recoverable collected VAT (e.g.: VAT NPR in France)
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
get_default_tva(Societe $thirdparty_seller, Societe $thirdparty_buyer, $idprod=0, $idprodfournprice=0)
Function that return vat rate of a product line (according to seller, buyer and product vat rate) VAT...
get_localtax($vatrate, $local, $thirdparty_buyer=null, $thirdparty_seller=null, $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
getMarginInfos($pv_ht, $remise_percent, $tva_tx, $localtax1_tx, $localtax2_tx, $fk_pa, $pa_ht)
Return an array with margins information of a line.
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.