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;
953 dol_syslog(get_class($this).
"::create user=".$user->id);
956 if (!empty($this->
ref)) {
959 $this->error =
'ErrorRefAlreadyExists';
960 dol_syslog(get_class($this).
"::create ".$this->error, LOG_WARNING);
961 $this->db->rollback();
967 $result = $soc->fetch($this->socid);
969 $this->error =
"Failed to fetch company";
970 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
974 $this->error = $langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Source"));
975 dol_syslog(get_class($this).
"::create ".$this->error, LOG_ERR);
983 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$this->table_element.
" (";
984 $sql .=
" ref, fk_soc, date_creation, fk_user_author, fk_projet, date_commande, source, note_private, note_public, ref_ext, ref_client";
985 $sql .=
", model_pdf, fk_cond_reglement, deposit_percent, fk_mode_reglement, fk_account, fk_availability, fk_input_reason, date_livraison, fk_delivery_address";
986 $sql .=
", fk_shipping_method";
987 $sql .=
", fk_warehouse";
988 $sql .=
", fk_incoterms, location_incoterms";
989 $sql .=
", entity, module_source, pos_source";
990 $sql .=
", fk_multicurrency";
991 $sql .=
", multicurrency_code";
992 $sql .=
", multicurrency_tx";
994 $sql .=
" VALUES ('(PROV)', ".((int) $this->socid).
", '".$this->db->idate($now).
"', ".((int) $user->id);
995 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
996 $sql .=
", '".$this->db->idate($date).
"'";
997 $sql .=
", ".($this->source >= 0 && $this->source !=
'' ? $this->db->escape($this->source) :
'null');
998 $sql .=
", '".$this->db->escape($this->note_private).
"'";
999 $sql .=
", '".$this->db->escape($this->note_public).
"'";
1000 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
1001 $sql .=
", ".($this->ref_client ?
"'".$this->db->escape($this->ref_client).
"'" :
"null");
1002 $sql .=
", '".$this->db->escape($this->model_pdf).
"'";
1003 $sql .=
", ".($this->cond_reglement_id > 0 ? ((int) $this->cond_reglement_id) :
"null");
1004 $sql .=
", ".(!empty($this->deposit_percent) ?
"'".$this->db->escape($this->deposit_percent).
"'" :
"null");
1005 $sql .=
", ".($this->mode_reglement_id > 0 ? ((int) $this->mode_reglement_id) :
"null");
1006 $sql .=
", ".($this->fk_account > 0 ? ((int) $this->fk_account) :
'NULL');
1007 $sql .=
", ".($this->availability_id > 0 ? ((int) $this->availability_id) :
"null");
1008 $sql .=
", ".($this->demand_reason_id > 0 ? ((int) $this->demand_reason_id) :
"null");
1009 $sql .=
", ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
"null");
1010 $sql .=
", ".($this->fk_delivery_address > 0 ? ((int) $this->fk_delivery_address) :
'NULL');
1011 $sql .=
", ".(!empty($this->shipping_method_id) && $this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
'NULL');
1012 $sql .=
", ".(!empty($this->warehouse_id) && $this->warehouse_id > 0 ? ((int) $this->warehouse_id) :
'NULL');
1013 $sql .=
", ".(int) $this->fk_incoterms;
1014 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
1015 $sql .=
", ".(int) $this->entity;
1016 $sql .=
", ".($this->module_source ?
"'".$this->db->escape($this->module_source).
"'" :
"null");
1017 $sql .=
", ".($this->pos_source !=
'' ?
"'".$this->db->escape($this->pos_source).
"'" :
"null");
1018 $sql .=
", ".(int) $this->fk_multicurrency;
1019 $sql .=
", '".$this->db->escape($this->multicurrency_code).
"'";
1020 $sql .=
", ".(float) $this->multicurrency_tx;
1023 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
1024 $resql = $this->db->query($sql);
1026 $this->
id = $this->db->last_insert_id(MAIN_DB_PREFIX.
'commande');
1029 $fk_parent_line = 0;
1030 $num = count($this->lines);
1035 for ($i = 0; $i < $num; $i++) {
1036 $line = $this->lines[$i];
1040 if (!is_object($line)) {
1041 $line = (object) $line;
1045 if (($line->product_type != 9 && empty($line->fk_parent_line)) || $line->product_type == 9) {
1046 $fk_parent_line = 0;
1050 $vatrate = $line->tva_tx;
1051 if ($line->vat_src_code && !preg_match(
'/\(.*\)/', (
string) $vatrate)) {
1052 $vatrate .=
' ('.$line->vat_src_code.
')';
1056 $originid = $line->origin_id;
1057 $origintype = $line->origin;
1059 $originid = $line->id;
1060 $origintype = $this->element;
1064 if (empty($line->ref_ext)) {
1065 $line->ref_ext =
'';
1073 $line->localtax1_tx,
1074 $line->localtax2_tx,
1076 $line->remise_percent,
1078 $line->fk_remise_except,
1083 $line->product_type,
1085 $line->special_code,
1087 $line->fk_fournprice,
1090 $line->array_options,
1099 if ($result != self::STOCK_NOT_ENOUGH_FOR_ORDER) {
1100 $this->error = $this->db->lasterror();
1101 $this->errors[] = $this->error;
1104 $this->db->rollback();
1108 if ($result > 0 && $line->product_type == 9) {
1109 $fk_parent_line = $result;
1116 $initialref =
'(PROV'.$this->id.
')';
1117 if (!empty($this->
ref)) {
1118 $initialref = $this->ref;
1121 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
" SET ref='".$this->db->escape($initialref).
"' WHERE rowid=".((int) $this->
id);
1122 if ($this->db->query($sql)) {
1123 $this->
ref = $initialref;
1125 if (!empty($this->linkedObjectsIds) && empty($this->linked_objects)) {
1126 $this->linked_objects = $this->linkedObjectsIds;
1130 if (!$error && $this->
id && !empty($this->linked_objects) && is_array($this->linked_objects)) {
1131 foreach ($this->linked_objects as $origin => $tmp_origin_id) {
1132 if (is_array($tmp_origin_id)) {
1133 foreach ($tmp_origin_id as $origin_id) {
1136 $this->error = $this->db->lasterror();
1141 $origin_id = $tmp_origin_id;
1144 $this->error = $this->db->lasterror();
1151 if (!$error && $this->
id &&
getDolGlobalString(
'MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN') && !empty($this->origin) && !empty($this->origin_id)) {
1152 $originforcontact = $this->origin;
1153 $originidforcontact = $this->origin_id;
1154 if ($originforcontact ==
'shipping') {
1155 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
1157 $exp->fetch($this->origin_id);
1158 $exp->fetchObjectLinked();
1159 if (count($exp->linkedObjectsIds[
'commande']) > 0) {
1160 foreach ($exp->linkedObjectsIds[
'commande'] as $key => $value) {
1161 $originforcontact =
'commande';
1162 if (is_object($value)) {
1163 $originidforcontact = $value->id;
1165 $originidforcontact = $value;
1172 $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";
1173 $sqlcontact .=
" WHERE element_id = ".((int) $originidforcontact).
" AND ec.fk_c_type_contact = ctc.rowid AND ctc.element = '".$this->db->escape($originforcontact).
"'";
1175 $resqlcontact = $this->db->query($sqlcontact);
1176 if ($resqlcontact) {
1177 while ($objcontact = $this->db->fetch_object($resqlcontact)) {
1179 $this->
add_contact($objcontact->fk_socpeople, $objcontact->code, $objcontact->source);
1193 if (!$error && !$notrigger) {
1203 $this->db->commit();
1206 $this->db->rollback();
1210 $this->error = $this->db->lasterror();
1211 $this->db->rollback();
1218 $this->error = $this->db->lasterror();
1219 $this->db->rollback();
1234 global
$conf, $user, $hookmanager;
1241 foreach ($this->lines as $line) {
1242 $line->fetch_optionals();
1246 $objFrom = clone $this;
1249 if (!empty($socid) && $socid != $this->socid) {
1250 $objsoc =
new Societe($this->db);
1252 if ($objsoc->fetch($socid) > 0) {
1253 $this->socid = $objsoc->id;
1254 $this->cond_reglement_id = (!empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0);
1255 $this->deposit_percent = (!empty($objsoc->deposit_percent) ? $objsoc->deposit_percent : 0);
1256 $this->mode_reglement_id = (!empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0);
1257 $this->fk_project = 0;
1258 $this->fk_delivery_address = 0;
1269 $this->user_author_id = $user->id;
1270 $this->user_validation_id = 0;
1272 $this->date_commande =
dol_now();
1273 $this->date_creation =
'';
1274 $this->date_validation =
'';
1276 $this->ref_client =
'';
1277 $this->ref_customer =
'';
1281 $num = count($this->lines);
1282 for ($i = 0; $i < $num; $i++) {
1283 $this->lines[$i]->ref_ext =
'';
1287 $this->context[
'createfromclone'] =
'createfromclone';
1288 $result = $this->
create($user);
1302 if ($this->socid == $objFrom->socid) {
1311 if (is_object($hookmanager)) {
1312 $parameters = array(
'objFrom' => $objFrom);
1314 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1322 unset($this->context[
'createfromclone']);
1326 $this->db->commit();
1329 $this->db->rollback();
1344 global
$conf, $hookmanager;
1346 require_once DOL_DOCUMENT_ROOT .
'/multicurrency/class/multicurrency.class.php';
1347 require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
1351 $this->date_commande =
dol_now();
1356 for ($i = 0; $i < $num; $i++) {
1359 $line->libelle =
$object->lines[$i]->libelle;
1360 $line->label =
$object->lines[$i]->label;
1361 $line->desc =
$object->lines[$i]->desc;
1362 $line->price =
$object->lines[$i]->price;
1363 $line->subprice =
$object->lines[$i]->subprice;
1364 $line->vat_src_code =
$object->lines[$i]->vat_src_code;
1365 $line->tva_tx =
$object->lines[$i]->tva_tx;
1366 $line->localtax1_tx =
$object->lines[$i]->localtax1_tx;
1367 $line->localtax2_tx =
$object->lines[$i]->localtax2_tx;
1368 $line->qty =
$object->lines[$i]->qty;
1369 $line->fk_remise_except =
$object->lines[$i]->fk_remise_except;
1370 $line->remise_percent =
$object->lines[$i]->remise_percent;
1371 $line->fk_product =
$object->lines[$i]->fk_product;
1372 $line->info_bits =
$object->lines[$i]->info_bits;
1373 $line->product_type =
$object->lines[$i]->product_type;
1374 $line->rang =
$object->lines[$i]->rang;
1375 $line->special_code =
$object->lines[$i]->special_code;
1376 $line->fk_parent_line =
$object->lines[$i]->fk_parent_line;
1377 $line->fk_unit =
$object->lines[$i]->fk_unit;
1379 $line->date_start =
$object->lines[$i]->date_start;
1380 $line->date_end =
$object->lines[$i]->date_end;
1382 $line->fk_fournprice =
$object->lines[$i]->fk_fournprice;
1384 $line->pa_ht = $marginInfos[0];
1385 $line->marge_tx = $marginInfos[1];
1386 $line->marque_tx = $marginInfos[2];
1388 $line->origin =
$object->element;
1389 $line->origin_id =
$object->lines[$i]->id;
1392 $object->lines[$i]->fetch_optionals();
1393 foreach (
$object->lines[$i]->array_options as $options_key => $value) {
1394 $line->array_options[$options_key] = $value;
1397 $this->lines[$i] = $line;
1400 $this->entity =
$object->entity;
1401 $this->socid =
$object->socid;
1402 $this->fk_project =
$object->fk_project;
1403 $this->cond_reglement_id =
$object->cond_reglement_id;
1404 $this->deposit_percent =
$object->deposit_percent;
1405 $this->mode_reglement_id =
$object->mode_reglement_id;
1406 $this->fk_account =
$object->fk_account;
1407 $this->availability_id =
$object->availability_id;
1408 $this->demand_reason_id =
$object->demand_reason_id;
1409 $this->delivery_date =
$object->delivery_date;
1410 $this->shipping_method_id =
$object->shipping_method_id;
1411 $this->warehouse_id =
$object->warehouse_id;
1412 $this->fk_delivery_address =
$object->fk_delivery_address;
1413 $this->contact_id =
$object->contact_id;
1414 $this->ref_client =
$object->ref_client;
1415 $this->ref_customer =
$object->ref_client;
1418 $this->note_private =
$object->note_private;
1419 $this->note_public =
$object->note_public;
1422 $this->origin =
$object->element;
1423 $this->origin_id =
$object->id;
1426 if (isModEnabled(
'multicurrency')) {
1427 if (!empty(
$object->multicurrency_code)) {
1428 $this->multicurrency_code =
$object->multicurrency_code;
1431 $this->multicurrency_tx =
$object->multicurrency_tx;
1434 if (!empty($this->multicurrency_code) && empty($this->multicurrency_tx)) {
1436 $this->fk_multicurrency = $tmparray[0];
1437 $this->multicurrency_tx = $tmparray[1];
1441 if (empty($this->fk_multicurrency)) {
1442 $this->multicurrency_code =
$conf->currency;
1443 $this->fk_multicurrency = 0;
1444 $this->multicurrency_tx = 1;
1452 $element_extrafields = $e->fetch_name_optionals_label($this->table_element);
1454 foreach (
$object->array_options as $options_key => $value) {
1455 if (array_key_exists(str_replace(
'options_',
'', $options_key), $element_extrafields)) {
1456 $this->array_options[$options_key] = $value;
1460 $this->linked_objects[$this->origin] = $this->origin_id;
1461 if (isset(
$object->other_linked_objects) && is_array(
$object->other_linked_objects) && !empty(
$object->other_linked_objects)) {
1462 $this->linked_objects = array_merge($this->linked_objects,
$object->other_linked_objects);
1465 $ret = $this->
create($user);
1469 $hookmanager->initHooks(array(
'orderdao'));
1471 $parameters = array(
'objFrom' =>
$object);
1473 $reshook = $hookmanager->executeHooks(
'createFrom', $parameters, $this, $action);
1483 $this->
valid($user);
1535 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)
1537 global $mysoc,
$conf, $langs, $user;
1539 $logtext =
"::addline commandeid=$this->id, desc=$desc, pu_ht=$pu_ht, qty=$qty, txtva=$txtva, fk_product=$fk_product, remise_percent=$remise_percent";
1540 $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";
1541 $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";
1542 dol_syslog(get_class($this).$logtext, LOG_DEBUG);
1544 if ($this->statut == self::STATUS_DRAFT) {
1545 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1549 if (empty($remise_percent)) {
1550 $remise_percent = 0;
1555 if (empty($info_bits)) {
1561 if (empty($txtva)) {
1564 if (empty($txlocaltax1)) {
1567 if (empty($txlocaltax2)) {
1570 if (empty($fk_parent_line) || $fk_parent_line < 0) {
1571 $fk_parent_line = 0;
1573 if (empty($this->fk_multicurrency)) {
1574 $this->fk_multicurrency = 0;
1576 if (empty($ref_ext)) {
1580 $remise_percent = (float)
price2num($remise_percent);
1583 $pu_ht_devise =
price2num($pu_ht_devise);
1586 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
1591 if ($price_base_type ==
'HT') {
1596 $label = trim($label);
1597 $desc = trim($desc);
1604 if ($date_start && $date_end && $date_start > $date_end) {
1605 $langs->load(
"errors");
1606 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
1612 $product_type = $type;
1613 if (!empty($fk_product) && $fk_product > 0) {
1614 $product =
new Product($this->db);
1615 $result = $product->fetch($fk_product);
1616 $product_type = $product->type;
1618 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
1619 $langs->load(
"errors");
1620 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
1621 $this->errors[] = $this->error;
1622 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
1623 $this->db->rollback();
1637 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
1638 $vat_src_code = $reg[1];
1639 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
1642 $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);
1652 $total_ht = $tabprice[0];
1653 $total_tva = $tabprice[1];
1654 $total_ttc = $tabprice[2];
1655 $total_localtax1 = $tabprice[9];
1656 $total_localtax2 = $tabprice[10];
1657 $pu_ht = $tabprice[3];
1660 $multicurrency_total_ht = $tabprice[16];
1661 $multicurrency_total_tva = $tabprice[17];
1662 $multicurrency_total_ttc = $tabprice[18];
1663 $pu_ht_devise = $tabprice[19];
1667 if ($ranktouse == -1) {
1668 $rangmax = $this->
line_max($fk_parent_line);
1669 $ranktouse = $rangmax + 1;
1676 if ($remise_percent > 0) {
1677 $remise = round(((
float) $pu * $remise_percent / 100), 2);
1678 $price = (float) $pu - $remise;
1684 $this->line->context = $this->context;
1686 $this->line->fk_commande = $this->id;
1687 $this->line->label = $label;
1688 $this->line->desc = $desc;
1689 $this->line->qty = $qty;
1690 $this->line->ref_ext = $ref_ext;
1692 $this->line->vat_src_code = $vat_src_code;
1693 $this->line->tva_tx = $txtva;
1694 $this->line->localtax1_tx = ($total_localtax1 ? $localtaxes_type[1] : 0);
1695 $this->line->localtax2_tx = ($total_localtax2 ? $localtaxes_type[3] : 0);
1696 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
1697 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
1698 $this->line->fk_product = $fk_product;
1699 $this->line->product_type = $product_type;
1700 $this->line->fk_remise_except = $fk_remise_except;
1701 $this->line->remise_percent = $remise_percent;
1702 $this->line->subprice = (float) $pu_ht;
1703 $this->line->rang = $ranktouse;
1704 $this->line->info_bits = $info_bits;
1705 $this->line->total_ht = (float) $total_ht;
1706 $this->line->total_tva = (float) $total_tva;
1707 $this->line->total_localtax1 = (float) $total_localtax1;
1708 $this->line->total_localtax2 = (float) $total_localtax2;
1709 $this->line->total_ttc = (float) $total_ttc;
1710 $this->line->special_code = $special_code;
1711 $this->line->origin = $origin;
1712 $this->line->origin_id = $origin_id;
1713 $this->line->fk_parent_line = $fk_parent_line;
1714 $this->line->fk_unit = $fk_unit;
1716 $this->line->date_start = $date_start;
1717 $this->line->date_end = $date_end;
1719 $this->line->fk_fournprice = $fk_fournprice;
1720 $this->line->pa_ht = $pa_ht;
1723 $this->line->fk_multicurrency = $this->fk_multicurrency;
1724 $this->line->multicurrency_code = $this->multicurrency_code;
1725 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
1726 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
1727 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
1728 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
1731 $this->line->price = $price;
1733 if (is_array($array_options) && count($array_options) > 0) {
1734 $this->line->array_options = $array_options;
1737 $result = $this->line->insert($user);
1740 if (!empty($fk_parent_line)) {
1742 } elseif ($ranktouse > 0 && $ranktouse <= count($this->lines)) {
1743 $linecount = count($this->lines);
1744 for ($ii = $ranktouse; $ii <= $linecount; $ii++) {
1750 if (empty($noupdateafterinsertline)) {
1755 $this->db->commit();
1756 $this->lines[] = $this->line;
1757 return $this->line->id;
1759 $this->db->rollback();
1763 $this->error = $this->line->error;
1764 dol_syslog(get_class($this).
"::addline error=".$this->error, LOG_ERR);
1765 $this->db->rollback();
1769 dol_syslog(get_class($this).
"::addline status of order must be Draft to allow use of ->addline()", LOG_ERR);
1789 public function add_product($idproduct, $qty, $remise_percent = 0.0, $date_start =
'', $date_end =
'')
1792 global
$conf, $mysoc;
1798 if ($idproduct > 0) {
1799 $prod =
new Product($this->db);
1800 $prod->fetch($idproduct);
1804 if (empty($tva_tx)) {
1809 $localtax1_tx =
get_localtax($tva_tx, 1, $this->thirdparty, $mysoc, $tva_npr);
1810 $localtax2_tx =
get_localtax($tva_tx, 2, $this->thirdparty, $mysoc, $tva_npr);
1813 if (
$conf->global->PRODUIT_MULTIPRICES && $this->thirdparty->price_level) {
1814 $price = $prod->multiprices[$this->thirdparty->price_level];
1816 $price = $prod->price;
1821 $line->context = $this->context;
1823 $line->fk_product = $idproduct;
1824 $line->desc = $prod->description;
1826 $line->subprice = $price;
1827 $line->remise_percent = $remise_percent;
1828 $line->vat_src_code = $vat_src_code;
1829 $line->tva_tx = $tva_tx;
1830 $line->localtax1_tx = $localtax1_tx;
1831 $line->localtax2_tx = $localtax2_tx;
1833 $line->product_ref = $prod->ref;
1834 $line->product_label = $prod->label;
1835 $line->product_desc = $prod->description;
1836 $line->fk_unit = $prod->fk_unit;
1840 $line->date_start = $date_start;
1843 $line->date_end = $date_end;
1846 $this->lines[] = $line;
1879 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
1882 if (empty($id) && empty($ref) && empty($ref_ext)) {
1886 $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';
1887 $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';
1888 $sql .=
', c.fk_account';
1889 $sql .=
', c.date_commande, c.date_valid, c.tms';
1890 $sql .=
', c.date_livraison as delivery_date';
1891 $sql .=
', c.fk_shipping_method';
1892 $sql .=
', c.fk_warehouse';
1893 $sql .=
', c.fk_projet as fk_project, c.source, c.facture as billed';
1894 $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';
1895 $sql .=
', c.fk_incoterms, c.location_incoterms';
1896 $sql .=
", c.fk_multicurrency, c.multicurrency_code, c.multicurrency_tx, c.multicurrency_total_ht, c.multicurrency_total_tva, c.multicurrency_total_ttc";
1897 $sql .=
", c.module_source, c.pos_source";
1898 $sql .=
", i.libelle as label_incoterms";
1899 $sql .=
', p.code as mode_reglement_code, p.libelle as mode_reglement_libelle';
1900 $sql .=
', cr.code as cond_reglement_code, cr.libelle as cond_reglement_libelle, cr.libelle_facture as cond_reglement_libelle_doc';
1901 $sql .=
', ca.code as availability_code, ca.label as availability_label';
1902 $sql .=
', dr.code as demand_reason_code';
1903 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
1904 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_payment_term as cr ON c.fk_cond_reglement = cr.rowid';
1905 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_paiement as p ON c.fk_mode_reglement = p.id';
1906 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_availability as ca ON c.fk_availability = ca.rowid';
1907 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_input_reason as dr ON c.fk_input_reason = dr.rowid';
1908 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON c.fk_incoterms = i.rowid';
1911 $sql .=
" WHERE c.rowid=".((int) $id);
1913 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
1917 $sql .=
" AND c.ref='".$this->db->escape($ref).
"'";
1920 $sql .=
" AND c.ref_ext='".$this->db->escape($ref_ext).
"'";
1923 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
1924 $result = $this->db->query($sql);
1926 $obj = $this->db->fetch_object($result);
1928 $this->
id = $obj->rowid;
1929 $this->entity = $obj->entity;
1931 $this->
ref = $obj->ref;
1932 $this->ref_client = $obj->ref_client;
1933 $this->ref_customer = $obj->ref_client;
1934 $this->ref_ext = $obj->ref_ext;
1936 $this->socid = $obj->fk_soc;
1937 $this->thirdparty =
null;
1939 $this->fk_project = $obj->fk_project;
1940 $this->project =
null;
1942 $this->statut = $obj->fk_statut;
1943 $this->
status = $obj->fk_statut;
1945 $this->user_author_id = $obj->fk_user_author;
1946 $this->user_creation_id = $obj->fk_user_author;
1947 $this->user_validation_id = $obj->fk_user_valid;
1948 $this->user_modification_id = $obj->fk_user_modif;
1949 $this->total_ht = $obj->total_ht;
1950 $this->total_tva = $obj->total_tva;
1951 $this->total_localtax1 = $obj->total_localtax1;
1952 $this->total_localtax2 = $obj->total_localtax2;
1953 $this->total_ttc = $obj->total_ttc;
1954 $this->date = $this->db->jdate($obj->date_commande);
1955 $this->date_commande = $this->db->jdate($obj->date_commande);
1956 $this->date_creation = $this->db->jdate($obj->date_creation);
1957 $this->date_validation = $this->db->jdate($obj->date_valid);
1958 $this->date_modification = $this->db->jdate($obj->tms);
1959 $this->source = $obj->source;
1960 $this->billed = $obj->billed;
1961 $this->note = $obj->note_private;
1962 $this->note_private = $obj->note_private;
1963 $this->note_public = $obj->note_public;
1964 $this->model_pdf = $obj->model_pdf;
1965 $this->last_main_doc = $obj->last_main_doc;
1966 $this->mode_reglement_id = $obj->fk_mode_reglement;
1967 $this->mode_reglement_code = $obj->mode_reglement_code;
1968 $this->mode_reglement = $obj->mode_reglement_libelle;
1969 $this->cond_reglement_id = $obj->fk_cond_reglement;
1970 $this->cond_reglement_code = $obj->cond_reglement_code;
1971 $this->cond_reglement = $obj->cond_reglement_libelle;
1972 $this->cond_reglement_doc = $obj->cond_reglement_libelle_doc;
1973 $this->deposit_percent = $obj->deposit_percent;
1974 $this->fk_account = $obj->fk_account;
1975 $this->availability_id = $obj->fk_availability;
1976 $this->availability_code = $obj->availability_code;
1978 $this->demand_reason_id = $obj->fk_input_reason;
1979 $this->demand_reason_code = $obj->demand_reason_code;
1980 $this->delivery_date = $this->db->jdate($obj->delivery_date);
1981 $this->shipping_method_id = ($obj->fk_shipping_method > 0) ? $obj->fk_shipping_method :
null;
1982 $this->warehouse_id = ($obj->fk_warehouse > 0) ? $obj->fk_warehouse :
null;
1983 $this->fk_delivery_address = $obj->fk_delivery_address;
1984 $this->module_source = $obj->module_source;
1985 $this->pos_source = $obj->pos_source;
1988 $this->fk_incoterms = $obj->fk_incoterms;
1989 $this->location_incoterms = $obj->location_incoterms;
1990 $this->label_incoterms = $obj->label_incoterms;
1993 $this->fk_multicurrency = $obj->fk_multicurrency;
1994 $this->multicurrency_code = $obj->multicurrency_code;
1995 $this->multicurrency_tx = $obj->multicurrency_tx;
1996 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1997 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1998 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
2000 $this->extraparams = !empty($obj->extraparams) ? (array) json_decode($obj->extraparams,
true) : array();
2002 $this->lines = array();
2008 $this->db->free($result);
2017 $this->error =
'Order with id '.$id.
' not found sql='.$sql;
2021 $this->error = $this->db->error();
2039 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
2040 include_once DOL_DOCUMENT_ROOT.
'/core/class/discount.class.php';
2045 $result = $remise->fetch($idremise);
2048 if ($remise->fk_facture) {
2049 $this->error = $langs->trans(
"ErrorDiscountAlreadyUsed");
2050 $this->db->rollback();
2056 $line->fk_commande = $this->id;
2057 $line->fk_remise_except = $remise->id;
2058 $line->desc = $remise->description;
2059 $line->vat_src_code = $remise->vat_src_code;
2060 $line->tva_tx = $remise->tva_tx;
2061 $line->subprice = -(float) $remise->amount_ht;
2062 $line->price = -(float) $remise->amount_ht;
2063 $line->fk_product = 0;
2065 $line->remise_percent = 0;
2067 $line->info_bits = 2;
2069 $line->total_ht = -(float) $remise->amount_ht;
2070 $line->total_tva = -(float) $remise->amount_tva;
2071 $line->total_ttc = -(float) $remise->amount_ttc;
2073 $result = $line->insert();
2077 $this->db->commit();
2080 $this->db->rollback();
2084 $this->error = $line->error;
2085 $this->errors = $line->errors;
2086 $this->db->rollback();
2090 $this->db->rollback();
2104 public function fetch_lines($only_product = 0, $loadalsotranslation = 0)
2107 global $langs,
$conf;
2109 $this->lines = array();
2111 $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,';
2112 $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,';
2113 $sql .=
' l.total_ht, l.total_ttc, l.total_tva, l.total_localtax1, l.total_localtax2, l.date_start, l.date_end,';
2114 $sql .=
' l.fk_unit,';
2115 $sql .=
' l.fk_multicurrency, l.multicurrency_code, l.multicurrency_subprice, l.multicurrency_total_ht, l.multicurrency_total_tva, l.multicurrency_total_ttc,';
2116 $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,';
2117 $sql .=
' p.weight, p.weight_units, p.volume, p.volume_units';
2118 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element_line.
' as l';
2119 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'product as p ON (p.rowid = l.fk_product)';
2120 $sql .=
' WHERE l.fk_commande = '.((int) $this->
id);
2121 if ($only_product) {
2122 $sql .=
' AND p.fk_product_type = 0';
2124 $sql .=
' ORDER BY l.rang, l.rowid';
2126 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
2127 $result = $this->db->query($sql);
2129 $num = $this->db->num_rows($result);
2133 $objp = $this->db->fetch_object($result);
2137 $line->rowid = $objp->rowid;
2138 $line->id = $objp->rowid;
2139 $line->fk_commande = $objp->fk_commande;
2140 $line->commande_id = $objp->fk_commande;
2141 $line->label = $objp->custom_label;
2142 $line->desc = $objp->description;
2143 $line->description = $objp->description;
2144 $line->product_type = $objp->product_type;
2145 $line->qty = $objp->qty;
2146 $line->ref_ext = $objp->ref_ext;
2148 $line->vat_src_code = $objp->vat_src_code;
2149 $line->tva_tx = $objp->tva_tx;
2150 $line->localtax1_tx = $objp->localtax1_tx;
2151 $line->localtax2_tx = $objp->localtax2_tx;
2152 $line->localtax1_type = $objp->localtax1_type;
2153 $line->localtax2_type = $objp->localtax2_type;
2154 $line->total_ht = $objp->total_ht;
2155 $line->total_ttc = $objp->total_ttc;
2156 $line->total_tva = $objp->total_tva;
2157 $line->total_localtax1 = $objp->total_localtax1;
2158 $line->total_localtax2 = $objp->total_localtax2;
2159 $line->subprice = $objp->subprice;
2160 $line->fk_remise_except = $objp->fk_remise_except;
2161 $line->remise_percent = $objp->remise_percent;
2162 $line->price = $objp->price;
2163 $line->fk_product = $objp->fk_product;
2164 $line->fk_fournprice = $objp->fk_fournprice;
2165 $marginInfos =
getMarginInfos($objp->subprice, $objp->remise_percent, $objp->tva_tx, $objp->localtax1_tx, $objp->localtax2_tx, $line->fk_fournprice, $objp->pa_ht);
2166 $line->pa_ht = $marginInfos[0];
2167 $line->marge_tx = $marginInfos[1];
2168 $line->marque_tx = $marginInfos[2];
2169 $line->rang = $objp->rang;
2170 $line->info_bits = $objp->info_bits;
2171 $line->special_code = $objp->special_code;
2172 $line->fk_parent_line = $objp->fk_parent_line;
2174 $line->ref = $objp->product_ref;
2175 $line->libelle = $objp->product_label;
2177 $line->product_ref = $objp->product_ref;
2178 $line->product_label = $objp->product_label;
2179 $line->product_tosell = $objp->product_tosell;
2180 $line->product_tobuy = $objp->product_tobuy;
2181 $line->product_desc = $objp->product_desc;
2182 $line->product_tobatch = $objp->product_tobatch;
2183 $line->product_barcode = $objp->product_barcode;
2185 $line->fk_product_type = $objp->fk_product_type;
2186 $line->fk_unit = $objp->fk_unit;
2188 $line->weight = $objp->weight;
2189 $line->weight_units = $objp->weight_units;
2190 $line->volume = $objp->volume;
2191 $line->volume_units = $objp->volume_units;
2193 $line->date_start = $this->db->jdate($objp->date_start);
2194 $line->date_end = $this->db->jdate($objp->date_end);
2197 $line->fk_multicurrency = $objp->fk_multicurrency;
2198 $line->multicurrency_code = $objp->multicurrency_code;
2199 $line->multicurrency_subprice = $objp->multicurrency_subprice;
2200 $line->multicurrency_total_ht = $objp->multicurrency_total_ht;
2201 $line->multicurrency_total_tva = $objp->multicurrency_total_tva;
2202 $line->multicurrency_total_ttc = $objp->multicurrency_total_ttc;
2204 $line->fetch_optionals();
2207 if (
getDolGlobalInt(
'MAIN_MULTILANGS') && !empty($objp->fk_product) && !empty($loadalsotranslation)) {
2208 $tmpproduct =
new Product($this->db);
2209 $tmpproduct->fetch($objp->fk_product);
2210 $tmpproduct->getMultiLangs();
2212 $line->multilangs = $tmpproduct->multilangs;
2215 $this->lines[$i] = $line;
2220 $this->db->free($result);
2224 $this->error = $this->db->error();
2238 foreach ($this->lines as $line) {
2239 if ($line->product_type == 0) {
2254 foreach ($this->lines as $line) {
2255 if ($line->product_type == 1) {
2271 $sql =
'SELECT COUNT(DISTINCT ed.fk_expedition) as nb';
2272 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2273 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2275 $sql .=
' ed.fk_elementdet = cd.rowid';
2276 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2279 dol_syslog(get_class($this).
"::getNbOfShipments", LOG_DEBUG);
2280 $resql = $this->db->query($sql);
2282 $obj = $this->db->fetch_object($resql);
2287 $this->db->free($resql);
2290 $this->error = $this->db->lasterror();
2305 $this->expeditions = array();
2307 $sql =
'SELECT cd.rowid, cd.fk_product,';
2308 $sql .=
' sum(ed.qty) as qty';
2309 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expeditiondet as ed,';
2310 if ($filtre_statut >= 0) {
2311 $sql .=
' '.MAIN_DB_PREFIX.
'expedition as e,';
2313 $sql .=
' '.MAIN_DB_PREFIX.$this->table_element_line.
' as cd';
2315 if ($filtre_statut >= 0) {
2316 $sql .=
' ed.fk_expedition = e.rowid AND';
2318 $sql .=
' ed.fk_elementdet = cd.rowid';
2319 $sql .=
' AND cd.fk_commande = '.((int) $this->
id);
2320 if ($fk_product > 0) {
2321 $sql .=
' AND cd.fk_product = '.((int) $fk_product);
2323 if ($filtre_statut >= 0) {
2324 $sql .=
' AND e.fk_statut >= '.((int) $filtre_statut);
2326 $sql .=
' GROUP BY cd.rowid, cd.fk_product';
2329 dol_syslog(get_class($this).
"::loadExpeditions", LOG_DEBUG);
2330 $resql = $this->db->query($sql);
2332 $num = $this->db->num_rows($resql);
2335 $obj = $this->db->fetch_object($resql);
2336 $this->expeditions[$obj->rowid] = $obj->qty;
2339 $this->db->free($resql);
2342 $this->error = $this->db->lasterror();
2354 $sql =
'SELECT count(*)';
2355 $sql .=
' FROM '.MAIN_DB_PREFIX.
'expedition as e';
2356 $sql .=
', '.MAIN_DB_PREFIX.
'element_element as el';
2357 $sql .=
' WHERE el.fk_source = '.((int) $this->
id);
2358 $sql .=
" AND el.sourcetype = 'commande'";
2359 $sql .=
" AND el.fk_target = e.rowid";
2360 $sql .=
" AND el.targettype = 'shipping'";
2362 $resql = $this->db->query($sql);
2364 $row = $this->db->fetch_row($resql);
2422 if ($this->statut == self::STATUS_DRAFT) {
2428 $line->context = $this->context;
2431 $line->fetch($lineid);
2433 if ($id > 0 && $line->fk_commande != $id) {
2434 $this->error =
'ErrorLineIDDoesNotMatchWithObjectID';
2439 $staticline = clone $line;
2440 $line->oldline = $staticline;
2442 if ($line->delete($user) > 0) {
2446 $this->db->commit();
2449 $this->db->rollback();
2450 $this->error = $this->db->lasterror();
2454 $this->db->rollback();
2455 $this->error = $line->error;
2459 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
2478 dol_syslog(get_class($this).
"::set_remise is deprecated, use setDiscount instead", LOG_NOTICE);
2480 return $this->
setDiscount($user, $remise, $notrigger);
2493 $remise = trim((
string) $remise) ? trim((
string) $remise) : 0;
2495 if ($user->hasRight(
'commande',
'creer')) {
2502 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2503 $sql .=
' SET remise_percent = '.((float) $remise);
2504 $sql .=
' WHERE rowid = '.((int) $this->
id).
' AND fk_statut = '.((int) self::STATUS_DRAFT);
2507 $resql = $this->db->query($sql);
2509 $this->errors[] = $this->db->error();
2514 $this->oldcopy = clone $this;
2515 $this->remise_percent = $remise;
2519 if (!$notrigger && empty($error)) {
2529 $this->db->commit();
2532 foreach ($this->errors as $errmsg) {
2533 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2534 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2536 $this->db->rollback();
2624 if ($user->hasRight(
'commande',
'creer')) {
2629 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2630 $sql .=
" SET date_commande = ".($date ?
"'".$this->db->idate($date).
"'" :
'null');
2631 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut = ".((int) self::STATUS_DRAFT);
2634 $resql = $this->db->query($sql);
2636 $this->errors[] = $this->db->error();
2641 $this->oldcopy = clone $this;
2642 $this->date = $date;
2645 if (!$notrigger && empty($error)) {
2655 $this->db->commit();
2658 foreach ($this->errors as $errmsg) {
2659 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2660 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2662 $this->db->rollback();
2696 if ($user->hasRight(
'commande',
'creer')) {
2701 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element;
2702 $sql .=
" SET date_livraison = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
2703 $sql .=
" WHERE rowid = ".((int) $this->
id);
2706 $resql = $this->db->query($sql);
2708 $this->errors[] = $this->db->error();
2713 $this->oldcopy = clone $this;
2714 $this->delivery_date = $delivery_date;
2717 if (!$notrigger && empty($error)) {
2727 $this->db->commit();
2730 foreach ($this->errors as $errmsg) {
2731 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2732 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2734 $this->db->rollback();
2756 public function liste_array($shortlist = 0, $draft = 0, $excluser =
null, $socid = 0, $limit = 0, $offset = 0, $sortfield =
'c.date_commande', $sortorder =
'DESC')
2763 $sql =
"SELECT s.rowid, s.nom as name, s.client,";
2764 $sql .=
" c.rowid as cid, c.ref";
2765 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2766 $sql .=
", sc.fk_soc, sc.fk_user";
2768 $sql .=
" FROM ".MAIN_DB_PREFIX.
"societe as s, ".MAIN_DB_PREFIX.$this->table_element.
" as c";
2769 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2770 $sql .=
", ".MAIN_DB_PREFIX.
"societe_commerciaux as sc";
2772 $sql .=
" WHERE c.entity IN (".getEntity(
'commande').
")";
2773 $sql .=
" AND c.fk_soc = s.rowid";
2774 if (!$user->hasRight(
'societe',
'client',
'voir')) {
2775 $sql .=
" AND s.rowid = sc.fk_soc AND sc.fk_user = ".((int) $user->id);
2778 $sql .=
" AND s.rowid = ".((int) $socid);
2781 $sql .=
" AND c.fk_statut = ".self::STATUS_DRAFT;
2783 if (is_object($excluser)) {
2784 $sql .=
" AND c.fk_user_author <> ".((int) $excluser->id);
2786 $sql .= $this->db->order($sortfield, $sortorder);
2787 $sql .= $this->db->plimit($limit, $offset);
2789 $result = $this->db->query($sql);
2791 $numc = $this->db->num_rows($result);
2794 while ($i < $numc) {
2795 $obj = $this->db->fetch_object($result);
2797 if ($shortlist == 1) {
2798 $ga[$obj->cid] = $obj->ref;
2799 } elseif ($shortlist == 2) {
2800 $ga[$obj->cid] = $obj->ref.
' ('.$obj->name.
')';
2802 $ga[$i][
'id'] = $obj->cid;
2803 $ga[$i][
'ref'] = $obj->ref;
2804 $ga[$i][
'name'] = $obj->name;
2827 dol_syslog(
'Commande::availability('.$availability_id.
')');
2828 if ($this->statut >= self::STATUS_DRAFT) {
2833 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2834 $sql .=
' SET fk_availability = '.((int) $availability_id);
2835 $sql .=
' WHERE rowid='.((int) $this->
id);
2838 $resql = $this->db->query($sql);
2840 $this->errors[] = $this->db->error();
2845 $this->oldcopy = clone $this;
2846 $this->availability_id = $availability_id;
2849 if (!$notrigger && empty($error)) {
2859 $this->db->commit();
2862 foreach ($this->errors as $errmsg) {
2863 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2864 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2866 $this->db->rollback();
2870 $error_str =
'Command status do not meet requirement '.$this->statut;
2872 $this->error = $error_str;
2873 $this->errors[] = $this->error;
2891 dol_syslog(
'Commande::demand_reason('.$demand_reason_id.
')');
2892 if ($this->statut >= self::STATUS_DRAFT) {
2897 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element;
2898 $sql .=
' SET fk_input_reason = '.((int) $demand_reason_id);
2899 $sql .=
' WHERE rowid='.((int) $this->
id);
2902 $resql = $this->db->query($sql);
2904 $this->errors[] = $this->db->error();
2909 $this->oldcopy = clone $this;
2910 $this->demand_reason_id = $demand_reason_id;
2913 if (!$notrigger && empty($error)) {
2923 $this->db->commit();
2926 foreach ($this->errors as $errmsg) {
2927 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2928 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2930 $this->db->rollback();
2934 $error_str =
'order status do not meet requirement '.$this->statut;
2936 $this->error = $error_str;
2937 $this->errors[] = $this->error;
2954 if ($user->hasRight(
'commande',
'creer')) {
2959 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET';
2960 $sql .=
' ref_client = '.(empty($ref_client) ?
'NULL' :
"'".$this->db->escape($ref_client).
"'");
2961 $sql .=
' WHERE rowid = '.((int) $this->
id);
2963 dol_syslog(__METHOD__.
' this->id='.$this->id.
', ref_client='.$ref_client, LOG_DEBUG);
2964 $resql = $this->db->query($sql);
2966 $this->errors[] = $this->db->error();
2971 $this->oldcopy = clone $this;
2972 $this->ref_client = $ref_client;
2973 $this->ref_customer = $ref_client;
2976 if (!$notrigger && empty($error)) {
2985 $this->db->commit();
2988 foreach ($this->errors as $errmsg) {
2989 dol_syslog(__METHOD__.
' Error: '.$errmsg, LOG_ERR);
2990 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2992 $this->db->rollback();
3011 if ($this->billed) {
3017 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 1';
3020 dol_syslog(get_class($this).
"::classifyBilled", LOG_DEBUG);
3021 if ($this->db->query($sql)) {
3023 $this->oldcopy = clone $this;
3027 if (!$notrigger && empty($error)) {
3029 $result = $this->
call_trigger(
'ORDER_CLASSIFY_BILLED', $user);
3037 $this->db->commit();
3040 foreach ($this->errors as $errmsg) {
3041 dol_syslog(get_class($this).
"::classifyBilled ".$errmsg, LOG_ERR);
3042 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3044 $this->db->rollback();
3048 $this->error = $this->db->error();
3049 $this->db->rollback();
3067 $sql =
'UPDATE '.MAIN_DB_PREFIX.$this->table_element.
' SET facture = 0';
3070 dol_syslog(get_class($this).
"::classifyUnBilled", LOG_DEBUG);
3071 if ($this->db->query($sql)) {
3073 $this->oldcopy = clone $this;
3077 if (!$notrigger && empty($error)) {
3079 $result = $this->
call_trigger(
'ORDER_CLASSIFY_UNBILLED', $user);
3089 $this->db->commit();
3092 foreach ($this->errors as $errmsg) {
3093 dol_syslog(get_class($this).
"::classifyUnBilled ".$errmsg, LOG_ERR);
3094 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3096 $this->db->rollback();
3100 $this->error = $this->db->error();
3101 $this->db->rollback();
3137 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)
3139 global
$conf, $mysoc, $langs, $user;
3141 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");
3142 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
3149 if (empty($info_bits)) {
3152 if (empty($txtva)) {
3155 if (empty($txlocaltax1)) {
3158 if (empty($txlocaltax2)) {
3161 if (empty($remise_percent)) {
3162 $remise_percent = 0;
3164 if (empty($special_code) || $special_code == 3) {
3167 if (empty($ref_ext)) {
3171 if ($date_start && $date_end && $date_start > $date_end) {
3172 $langs->load(
"errors");
3173 $this->error = $langs->trans(
'ErrorStartDateGreaterEnd');
3177 $remise_percent = (float)
price2num($remise_percent);
3181 $pu_ht_devise =
price2num($pu_ht_devise);
3182 if (!preg_match(
'/\((.*)\)/', (
string) $txtva)) {
3185 $txlocaltax1 = (float)
price2num($txlocaltax1);
3186 $txlocaltax2 = (float)
price2num($txlocaltax2);
3200 if (preg_match(
'/\((.*)\)/', $txtva, $reg)) {
3201 $vat_src_code = $reg[1];
3202 $txtva = preg_replace(
'/\s*\(.*\)/',
'', $txtva);
3205 $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);
3207 $total_ht = $tabprice[0];
3208 $total_tva = $tabprice[1];
3209 $total_ttc = $tabprice[2];
3210 $total_localtax1 = $tabprice[9];
3211 $total_localtax2 = $tabprice[10];
3212 $pu_ht = $tabprice[3];
3213 $pu_tva = $tabprice[4];
3214 $pu_ttc = $tabprice[5];
3217 $multicurrency_total_ht = $tabprice[16];
3218 $multicurrency_total_tva = $tabprice[17];
3219 $multicurrency_total_ttc = $tabprice[18];
3220 $pu_ht_devise = $tabprice[19];
3224 if ($price_base_type ==
'TTC') {
3225 $subprice = $pu_ttc;
3230 if ($remise_percent > 0) {
3231 $remise = round(((
float) $pu * $remise_percent / 100), 2);
3232 $price = ((float) $pu - $remise);
3237 $line->fetch($rowid);
3238 $line->fetch_optionals();
3240 if (!empty($line->fk_product)) {
3241 $product =
new Product($this->db);
3242 $result = $product->fetch($line->fk_product);
3243 $product_type = $product->type;
3245 if (
getDolGlobalString(
'STOCK_MUST_BE_ENOUGH_FOR_ORDER') && $product_type == 0 && $product->stock_reel < $qty) {
3246 $langs->load(
"errors");
3247 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref);
3248 $this->errors[] = $this->error;
3250 dol_syslog(get_class($this).
"::addline error=Product ".$product->ref.
": ".$this->error, LOG_ERR);
3252 $this->db->rollback();
3257 $staticline = clone $line;
3259 $line->oldline = $staticline;
3260 $this->line = $line;
3261 $this->line->context = $this->context;
3262 $this->line->rang = $rang;
3265 if (!empty($fk_parent_line) && !empty($staticline->fk_parent_line) && $fk_parent_line != $staticline->fk_parent_line) {
3266 $rangmax = $this->
line_max($fk_parent_line);
3267 $this->line->rang = $rangmax + 1;
3270 $this->line->id = $rowid;
3271 $this->line->label = $label;
3272 $this->line->desc = $desc;
3273 $this->line->qty = $qty;
3274 $this->line->ref_ext = $ref_ext;
3276 $this->line->vat_src_code = $vat_src_code;
3277 $this->line->tva_tx = $txtva;
3278 $this->line->localtax1_tx = $txlocaltax1;
3279 $this->line->localtax2_tx = $txlocaltax2;
3280 $this->line->localtax1_type = empty($localtaxes_type[0]) ?
'' : $localtaxes_type[0];
3281 $this->line->localtax2_type = empty($localtaxes_type[2]) ?
'' : $localtaxes_type[2];
3282 $this->line->remise_percent = $remise_percent;
3283 $this->line->subprice = (float) $pu_ht;
3284 $this->line->info_bits = $info_bits;
3285 $this->line->special_code = $special_code;
3286 $this->line->total_ht = (float) $total_ht;
3287 $this->line->total_tva = (float) $total_tva;
3288 $this->line->total_localtax1 = (float) $total_localtax1;
3289 $this->line->total_localtax2 = (float) $total_localtax2;
3290 $this->line->total_ttc = (float) $total_ttc;
3291 $this->line->date_start = $date_start;
3292 $this->line->date_end = $date_end;
3293 $this->line->product_type = $type;
3294 $this->line->fk_parent_line = $fk_parent_line;
3295 $this->line->skip_update_total = $skip_update_total;
3296 $this->line->fk_unit = $fk_unit;
3298 $this->line->fk_fournprice = $fk_fournprice;
3299 $this->line->pa_ht = $pa_ht;
3302 $this->line->multicurrency_subprice = (float) $pu_ht_devise;
3303 $this->line->multicurrency_total_ht = (float) $multicurrency_total_ht;
3304 $this->line->multicurrency_total_tva = (float) $multicurrency_total_tva;
3305 $this->line->multicurrency_total_ttc = (float) $multicurrency_total_ttc;
3308 $this->line->price = $price;
3310 if (is_array($array_options) && count($array_options) > 0) {
3312 foreach ($array_options as $key => $value) {
3313 $this->line->array_options[$key] = $array_options[$key];
3317 $result = $this->line->update($user, $notrigger);
3320 if (!empty($fk_parent_line)) {
3327 $this->db->commit();
3330 $this->error = $this->line->error;
3332 $this->db->rollback();
3336 $this->error = get_class($this).
"::updateline Order status makes operation forbidden";
3337 $this->errors = array(
'OrderStatusMakeOperationForbidden');
3356 if (isset($this->
ref)) {
3357 $this->
ref = trim($this->
ref);
3359 if (isset($this->ref_client)) {
3360 $this->ref_client = trim($this->ref_client);
3362 if (isset($this->ref_customer)) {
3363 $this->ref_customer = trim($this->ref_customer);
3365 if (isset($this->note) || isset($this->note_private)) {
3366 $this->note_private = (isset($this->note_private) ? trim($this->note_private) : trim($this->note));
3368 if (isset($this->note_public)) {
3369 $this->note_public = trim($this->note_public);
3371 if (isset($this->model_pdf)) {
3372 $this->model_pdf = trim($this->model_pdf);
3374 if (isset($this->import_key)) {
3375 $this->import_key = trim($this->import_key);
3377 $delivery_date = $this->delivery_date;
3383 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
3385 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
3386 $sql .=
" ref_client=".(isset($this->ref_client) ?
"'".$this->db->escape($this->ref_client).
"'" :
"null").
",";
3387 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
3388 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
3389 $sql .=
" date_commande=".(strval($this->date_commande) !=
'' ?
"'".$this->db->idate($this->date_commande).
"'" :
'null').
",";
3390 $sql .=
" date_valid=".(strval($this->date_validation) !=
'' ?
"'".$this->db->idate($this->date_validation).
"'" :
'null').
",";
3391 $sql .=
" total_tva=".(isset($this->total_tva) ? $this->total_tva :
"null").
",";
3392 $sql .=
" localtax1=".(isset($this->total_localtax1) ? $this->total_localtax1 :
"null").
",";
3393 $sql .=
" localtax2=".(isset($this->total_localtax2) ? $this->total_localtax2 :
"null").
",";
3394 $sql .=
" total_ht=".(isset($this->total_ht) ? $this->total_ht :
"null").
",";
3395 $sql .=
" total_ttc=".(isset($this->total_ttc) ? $this->total_ttc :
"null").
",";
3396 $sql .=
" fk_statut=".(isset($this->statut) ? $this->statut :
"null").
",";
3397 $sql .=
" fk_user_modif=".(isset($user->id) ? $user->id :
"null").
",";
3398 $sql .=
" fk_user_valid=".((isset($this->user_validation_id) && $this->user_validation_id > 0) ? $this->user_validation_id :
"null").
",";
3399 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
3400 $sql .=
" fk_cond_reglement=".(isset($this->cond_reglement_id) ? $this->cond_reglement_id :
"null").
",";
3401 $sql .=
" deposit_percent=".(!empty($this->deposit_percent) ? strval($this->deposit_percent) :
"null").
",";
3402 $sql .=
" fk_mode_reglement=".(isset($this->mode_reglement_id) ? $this->mode_reglement_id :
"null").
",";
3403 $sql .=
" date_livraison=".(strval($this->delivery_date) !=
'' ?
"'".$this->db->idate($this->delivery_date).
"'" :
'null').
",";
3404 $sql .=
" fk_shipping_method=".(isset($this->shipping_method_id) ? $this->shipping_method_id :
"null").
",";
3405 $sql .=
" fk_account=".($this->fk_account > 0 ? $this->fk_account :
"null").
",";
3406 $sql .=
" fk_input_reason=".($this->demand_reason_id > 0 ? $this->demand_reason_id :
"null").
",";
3407 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
3408 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
3409 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
3410 $sql .=
" import_key=".(isset($this->import_key) ?
"'".$this->db->escape($this->import_key).
"'" :
"null");
3412 $sql .=
" WHERE rowid=".((int) $this->
id);
3416 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
3417 $resql = $this->db->query($sql);
3420 $this->errors[] =
"Error ".$this->db->lasterror();
3430 if (!$error && !$notrigger) {
3441 foreach ($this->errors as $errmsg) {
3442 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
3443 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
3445 $this->db->rollback();
3448 $this->db->commit();
3460 public function delete($user, $notrigger = 0)
3462 global
$conf, $langs;
3463 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
3467 dol_syslog(get_class($this).
"::delete ".$this->
id, LOG_DEBUG);
3482 $this->errors[] = $langs->trans(
'SomeShipmentExists');
3487 if (!$error && !empty($this->table_element_line)) {
3488 $tabletodelete = $this->table_element_line;
3489 $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).
")";
3490 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$tabletodelete.
" WHERE ".$this->fk_element.
" = ".((int) $this->
id);
3491 if (!$this->db->query($sqlef) || !$this->db->query($sql)) {
3493 $this->error = $this->db->lasterror();
3494 $this->errors[] = $this->error;
3495 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3520 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3526 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.$this->table_element.
" WHERE rowid = ".((int) $this->
id);
3527 $res = $this->db->query($sql);
3530 $this->error = $this->db->lasterror();
3531 $this->errors[] = $this->error;
3532 dol_syslog(get_class($this).
"::delete error ".$this->error, LOG_ERR);
3548 if ($conf->commande->multidir_output[$this->entity] && !empty($this->
ref)) {
3549 $dir =
$conf->commande->multidir_output[$this->entity].
"/".$ref;
3550 $file = $dir.
"/".$ref.
".pdf";
3551 if (file_exists($file)) {
3555 $this->error =
'ErrorFailToDeleteFile';
3556 $this->errors[] = $this->error;
3557 $this->db->rollback();
3561 if (file_exists($dir)) {
3564 $this->error =
'ErrorFailToDeleteDir';
3565 $this->errors[] = $this->error;
3566 $this->db->rollback();
3574 dol_syslog(get_class($this).
"::delete ".$this->
id.
" by ".$user->id, LOG_DEBUG);
3575 $this->db->commit();
3578 $this->db->rollback();
3595 global
$conf, $langs;
3599 $sql =
"SELECT c.rowid, c.date_creation as datec, c.date_commande, c.date_livraison as delivery_date, c.fk_statut, c.total_ht";
3600 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as c";
3601 if (!$user->hasRight(
'societe',
'client',
'voir')) {
3602 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON c.fk_soc = sc.fk_soc";
3603 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
3606 $sql .= $clause.
" c.entity IN (".
getEntity(
'commande').
")";
3608 if ($mode ==
'toship') {
3610 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
")";
3612 if ($mode ==
'tobill') {
3614 $sql .=
" AND c.fk_statut IN (" . self::STATUS_VALIDATED .
"," . self::STATUS_SHIPMENTONPROCESS .
", " . self::STATUS_CLOSED .
") AND c.facture = 0";
3616 if ($mode ==
'shippedtobill') {
3618 $sql .=
" AND c.fk_statut IN (" . self::STATUS_CLOSED .
") AND c.facture = 0";
3621 $sql .=
" AND c.fk_soc = ".((int) $user->socid);
3624 $resql = $this->db->query($sql);
3627 $label = $labelShort = $url =
'';
3628 if ($mode ==
'toship') {
3629 $delay_warning =
$conf->commande->client->warning_delay / 60 / 60 / 24;
3630 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-2&mainmenu=commercial&leftmenu=orders';
3631 $label = $langs->transnoentitiesnoconv(
"OrdersToProcess");
3632 $labelShort = $langs->transnoentitiesnoconv(
"Opened");
3634 if ($mode ==
'tobill') {
3635 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=-3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3636 $label = $langs->trans(
"OrdersToBill");
3637 $labelShort = $langs->trans(
"ToBill");
3639 if ($mode ==
'shippedtobill') {
3640 $url = DOL_URL_ROOT.
'/commande/list.php?search_status=3&search_billed=0&mainmenu=commercial&leftmenu=orders';
3641 $label = $langs->trans(
"OrdersToBill");
3642 $labelShort = $langs->trans(
"StatusOrderDelivered").
' '.$langs->trans(
"and").
' '.$langs->trans(
"ToBill");
3647 $response->warning_delay = $delay_warning;
3648 $response->label = $label;
3649 $response->labelShort = $labelShort;
3650 $response->url = $url;
3651 $response->url_late = DOL_URL_ROOT.
'/commande/list.php?search_option=late&mainmenu=commercial&leftmenu=orders';
3654 $generic_commande =
new Commande($this->db);
3656 while ($obj = $this->db->fetch_object($resql)) {
3657 $response->nbtodo++;
3658 $response->total += $obj->total_ht;
3660 $generic_commande->statut = $obj->fk_statut;
3661 $generic_commande->date_commande = $this->db->jdate($obj->date_commande);
3662 $generic_commande->date = $this->db->jdate($obj->date_commande);
3663 $generic_commande->delivery_date = $this->db->jdate($obj->delivery_date);
3665 if ($mode ==
'toship' && $generic_commande->hasDelay()) {
3666 $response->nbtodolate++;
3672 $this->error = $this->db->error();
3686 $label = $langs->trans(
'OrderSource'.$this->source);
3688 if ($label ==
'OrderSource') {
3702 return $this->
LibStatut($this->statut, $this->billed, $mode);
3715 public function LibStatut($status, $billed, $mode, $donotshowbilled = 0)
3718 global $langs, $hookmanager;
3721 if (empty($donotshowbilled)) {
3722 $billedtext .= ($billed ?
' - '.$langs->transnoentitiesnoconv(
"Billed") :
'');
3727 if ($status == self::STATUS_CANCELED) {
3728 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderCanceled');
3729 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderCanceledShort');
3730 $statusType =
'status9';
3731 } elseif ($status == self::STATUS_DRAFT) {
3732 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDraft');
3733 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDraftShort');
3734 $statusType =
'status0';
3735 } elseif ($status == self::STATUS_VALIDATED) {
3736 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderValidated').$billedtext;
3737 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderValidatedShort').$billedtext;
3738 $statusType =
'status1';
3739 } elseif ($status == self::STATUS_SHIPMENTONPROCESS) {
3740 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderSent').$billedtext;
3741 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderSentShort').$billedtext;
3742 $labelTooltip = $langs->transnoentitiesnoconv(
"StatusOrderSent");
3743 if (!empty($this->delivery_date)) {
3744 $labelTooltip .=
' - '.$langs->transnoentitiesnoconv(
"DateDeliveryPlanned").dol_print_date($this->delivery_date,
'day').$billedtext;
3746 $statusType =
'status4';
3747 } elseif ($status == self::STATUS_CLOSED) {
3748 $labelStatus = $langs->transnoentitiesnoconv(
'StatusOrderDelivered').$billedtext;
3749 $labelStatusShort = $langs->transnoentitiesnoconv(
'StatusOrderDeliveredShort').$billedtext;
3750 $statusType =
'status6';
3752 $labelStatus = $langs->transnoentitiesnoconv(
'Unknown');
3753 $labelStatusShort =
'';
3758 $parameters = array(
3759 'status' => $status,
3761 'billed' => $billed,
3762 'donotshowbilled' => $donotshowbilled
3765 $reshook = $hookmanager->executeHooks(
'LibStatut', $parameters, $this);
3768 return $hookmanager->resPrint;
3771 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode,
'', array(
'tooltip' => $labelTooltip));
3782 global
$conf, $langs, $user;
3784 $langs->load(
'orders');
3786 $nofetch = !empty($params[
'nofetch']);
3789 return [
'optimize' => $langs->trans(
"Order")];
3792 if ($user->hasRight(
'commande',
'lire')) {
3793 $datas[
'picto'] =
img_picto(
'', $this->picto,
'', 0, 0, 0,
'',
'paddingrightonly').
'<u>'.$langs->trans(
"Order").
'</u>';
3794 if (isset($this->statut)) {
3795 $datas[
'status'] =
' '.$this->getLibStatut(5);
3797 $datas[
'Ref'] =
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
3799 $langs->load(
'companies');
3800 if (empty($this->thirdparty)) {
3803 $datas[
'customer'] =
'<br><b>'.$langs->trans(
'Customer').
':</b> '.$this->thirdparty->getNomUrl(1,
'', 0, 1);
3805 $datas[
'RefCustomer'] =
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.(empty($this->ref_customer) ? (empty($this->ref_client) ?
'' : $this->ref_client) : $this->ref_customer);
3807 $langs->load(
'project');
3808 if (is_null($this->project) || (is_object($this->project) && $this->project->isEmpty())) {
3810 if ($res > 0 && $this->project instanceof
Project) {
3811 $datas[
'project'] =
'<br><b>'.$langs->trans(
'Project').
':</b> '.$this->project->getNomUrl(1,
'', 0, 1);
3815 if (!empty($this->total_ht)) {
3816 $datas[
'AmountHT'] =
'<br><b>'.$langs->trans(
'AmountHT').
':</b> '.
price($this->total_ht, 0, $langs, 0, -1, -1,
$conf->currency);
3818 if (!empty($this->total_tva)) {
3819 $datas[
'VAT'] =
'<br><b>'.$langs->trans(
'VAT').
':</b> '.
price($this->total_tva, 0, $langs, 0, -1, -1,
$conf->currency);
3821 if (!empty($this->total_ttc)) {
3822 $datas[
'AmountTTC'] =
'<br><b>'.$langs->trans(
'AmountTTC').
':</b> '.
price($this->total_ttc, 0, $langs, 0, -1, -1,
$conf->currency);
3824 if (!empty($this->date)) {
3825 $datas[
'Date'] =
'<br><b>'.$langs->trans(
'Date').
':</b> '.
dol_print_date($this->date,
'day');
3827 if (!empty($this->delivery_date)) {
3828 $datas[
'DeliveryDate'] =
'<br><b>'.$langs->trans(
'DeliveryDate').
':</b> '.
dol_print_date($this->delivery_date,
'dayhour');
3848 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target =
'')
3850 global
$conf, $langs, $user, $hookmanager;
3852 if (!empty(
$conf->dol_no_mouse_hover)) {
3858 if (isModEnabled(
"shipping") && ($option ==
'1' || $option ==
'2')) {
3859 $url = DOL_URL_ROOT.
'/expedition/shipment.php?id='.$this->id;
3861 $url = DOL_URL_ROOT.
'/commande/card.php?id='.$this->id;
3864 if (!$user->hasRight(
'commande',
'lire')) {
3868 if ($option !==
'nolink') {
3870 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
3871 if ($save_lastsearch_value == -1 && isset($_SERVER[
"PHP_SELF"]) && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
3872 $add_save_lastsearch_values = 1;
3874 if ($add_save_lastsearch_values) {
3875 $url .=
'&save_lastsearch_values=1';
3884 'objecttype' => $this->element,
3885 'option' => $option,
3888 $classfortooltip =
'classfortooltip';
3891 $classfortooltip =
'classforajaxtooltip';
3892 $dataparams =
' data-params="'.dol_escape_htmltag(json_encode($params)).
'"';
3899 if (empty($notooltip) && $user->hasRight(
'commande',
'lire')) {
3901 $label = $langs->trans(
"Order");
3902 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
3904 $linkclose .= ($label ?
' title="'.dol_escape_htmltag($label, 1).
'"' :
' title="tocomplete"');
3905 $linkclose .= $dataparams.
' class="'.$classfortooltip.
'"';
3907 $target_value = array(
'_self',
'_blank',
'_parent',
'_top');
3908 if (in_array($target, $target_value)) {
3909 $linkclose .=
' target="'.dol_escape_htmltag($target).
'"';
3913 $linkstart =
'<a href="'.$url.
'"';
3914 $linkstart .= $linkclose.
'>';
3917 if ($option ===
'nolink') {
3922 $result .= $linkstart;
3924 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, (($withpicto != 2) ?
'class="paddingright"' :
''), 0, 0, $notooltip ? 0 : 1);
3926 if ($withpicto != 2) {
3927 $result .= $this->ref;
3929 $result .= $linkend;
3931 if ($addlinktonotes) {
3932 $txttoshow = ($user->socid > 0 ? $this->note_public : $this->note_private);
3935 $result .=
' <span class="note inline-block">';
3936 $result .=
'<a href="'.DOL_URL_ROOT.
'/commande/note.php?id='.$this->
id.
'" class="classfortooltip" title="'.
dol_escape_htmltag($notetoshow).
'">';
3941 $result .=
'</span>';
3946 $hookmanager->initHooks(array($this->element .
'dao'));
3947 $parameters = array(
'id' => $this->
id,
'getnomurl' => &$result);
3948 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
3950 $result = $hookmanager->resPrint;
3952 $result .= $hookmanager->resPrint;
3966 $sql =
'SELECT c.rowid, date_creation as datec, tms as datem,';
3967 $sql .=
' date_valid as datev,';
3968 $sql .=
' date_cloture as datecloture,';
3969 $sql .=
' fk_user_author, fk_user_valid, fk_user_cloture';
3970 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as c';
3971 $sql .=
' WHERE c.rowid = '.((int) $id);
3972 $result = $this->db->query($sql);
3974 if ($this->db->num_rows($result)) {
3975 $obj = $this->db->fetch_object($result);
3976 $this->
id = $obj->rowid;
3977 if ($obj->fk_user_author) {
3978 $this->user_creation_id = $obj->fk_user_author;
3980 if ($obj->fk_user_valid) {
3981 $this->user_validation_id = $obj->fk_user_valid;
3983 if ($obj->fk_user_cloture) {
3984 $this->user_closing_id = $obj->fk_user_cloture;
3987 $this->date_creation = $this->db->jdate($obj->datec);
3988 $this->date_modification = $this->db->jdate($obj->datem);
3989 $this->date_validation = $this->db->jdate($obj->datev);
3990 $this->date_cloture = $this->db->jdate($obj->datecloture);
3993 $this->db->free($result);
4009 global
$conf, $langs;
4011 dol_syslog(get_class($this).
"::initAsSpecimen");
4016 $sql =
"SELECT rowid";
4017 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product";
4018 $sql .=
" WHERE entity IN (".getEntity(
'product').
")";
4019 $sql .= $this->db->plimit(100);
4021 $resql = $this->db->query($sql);
4023 $num_prods = $this->db->num_rows($resql);
4025 while ($i < $num_prods) {
4027 $row = $this->db->fetch_row($resql);
4028 $prodids[$i] = $row[0];
4034 $this->
ref =
'SPECIMEN';
4035 $this->specimen = 1;
4036 $this->entity =
$conf->entity;
4038 $this->date = time();
4039 $this->date_lim_reglement = $this->date + 3600 * 24 * 30;
4040 $this->cond_reglement_code =
'RECEP';
4041 $this->mode_reglement_code =
'CHQ';
4042 $this->availability_code =
'DSP';
4043 $this->demand_reason_code =
'SRC_00';
4045 $this->note_public =
'This is a comment (public)';
4046 $this->note_private =
'This is a comment (private)';
4048 $this->multicurrency_tx = 1;
4049 $this->multicurrency_code =
$conf->currency;
4051 $this->
status = $this::STATUS_DRAFT;
4057 while ($xnbp < $nbp) {
4060 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
4062 $line->subprice = 100;
4066 $line->total_ht = 50;
4067 $line->total_ttc = 60;
4068 $line->total_tva = 10;
4069 $line->remise_percent = 50;
4071 $line->total_ht = 100;
4072 $line->total_ttc = 120;
4073 $line->total_tva = 20;
4074 $line->remise_percent = 0;
4076 if ($num_prods > 0) {
4077 $prodid = mt_rand(1, $num_prods);
4078 $line->fk_product = $prodids[$prodid];
4079 $line->product_ref =
'SPECIMEN';
4082 $this->lines[$xnbp] = $line;
4084 $this->total_ht += $line->total_ht;
4085 $this->total_tva += $line->total_tva;
4086 $this->total_ttc += $line->total_ttc;
4104 $this->nb = array();
4107 $sql =
"SELECT count(co.rowid) as nb";
4108 $sql .=
" FROM ".MAIN_DB_PREFIX.$this->table_element.
" as co";
4109 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe as s ON co.fk_soc = s.rowid";
4110 if (!$user->hasRight(
'societe',
'client',
'voir')) {
4111 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"societe_commerciaux as sc ON s.rowid = sc.fk_soc";
4112 $sql .=
" WHERE sc.fk_user = ".((int) $user->id);
4115 $sql .=
" ".$clause.
" co.entity IN (".
getEntity(
'commande').
")";
4117 $resql = $this->db->query($sql);
4119 while ($obj = $this->db->fetch_object($resql)) {
4120 $this->nb[
"orders"] = $obj->nb;
4122 $this->db->free($resql);
4126 $this->error = $this->db->error();
4152 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
4154 global
$conf, $langs;
4156 $langs->load(
"orders");
4157 $outputlangs->load(
"products");
4160 $modele =
'einstein';
4162 if (!empty($this->model_pdf)) {
4163 $modele = $this->model_pdf;
4169 $modelpath =
"core/modules/commande/doc/";
4171 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
4224 return max($this->date, $this->delivery_date) < ($now -
$conf->commande->client->warning_delay);
4234 global
$conf, $langs;
4236 if (empty($this->delivery_date)) {
4237 $text = $langs->trans(
"OrderDate").
' '.
dol_print_date($this->date,
'day');
4239 $text = $text = $langs->trans(
"DeliveryDate").
' '.
dol_print_date($this->delivery_date,
'day');
4241 $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)
setEntity($currentobject)
Set entity id to use when to create an object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_string_nohtmltag($stringtoclean, $removelinefeed=1, $pagecodeto='UTF-8', $strip_tags=0, $removedoublespaces=1)
Clean a string from all HTML tags and entities.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
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)
dolGetStatus($statusLabel='', $statusLabelShort='', $html='', $statusType='status0', $displayMode=0, $url='', $params=array())
Output the badge of a status.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_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.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
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.