37 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonobject.class.php';
38 require_once DOL_DOCUMENT_ROOT.
"/core/class/commonobjectline.class.php";
39 require_once DOL_DOCUMENT_ROOT.
'/core/class/commonincoterm.class.php';
41 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
44 require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
46 require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expeditionlinebatch.class.php';
59 public $element =
"shipping";
64 public $fk_element =
"fk_expedition";
69 public $table_element =
"expedition";
74 public $table_element_line =
"expeditiondet";
80 public $ismultientitymanaged = 1;
85 public $picto =
'dolly';
91 public $fields = array();
106 public $ref_customer;
118 public $tracking_number;
123 public $tracking_url;
132 public $weight_units;
136 public $height_units;
145 public $date_delivery;
163 public $date_shipping;
168 public $date_creation;
178 public $lines = array();
214 $this->statuts = array();
215 $this->statuts[-1] =
'StatusSendingCanceled';
216 $this->statuts[0] =
'StatusSendingDraft';
217 $this->statuts[1] =
'StatusSendingValidated';
218 $this->statuts[2] =
'StatusSendingProcessed';
221 $this->statuts_short = array();
222 $this->statuts_short[-1] =
'StatusSendingCanceledShort';
223 $this->statuts_short[0] =
'StatusSendingDraftShort';
224 $this->statuts_short[1] =
'StatusSendingValidatedShort';
225 $this->statuts_short[2] =
'StatusSendingProcessedShort';
236 global $langs, $conf;
237 $langs->load(
"sendings");
239 if (!empty($conf->global->EXPEDITION_ADDON_NUMBER)) {
242 $file = $conf->global->EXPEDITION_ADDON_NUMBER.
".php";
243 $classname = $conf->global->EXPEDITION_ADDON_NUMBER;
246 $dirmodels = array_merge(array(
'/'), (array) $conf->modules_parts[
'models']);
248 foreach ($dirmodels as $reldir) {
252 $mybool |= @include_once $dir.$file;
260 $obj =
new $classname();
262 $numref = $obj->getNextValue($soc, $this);
271 print $langs->trans(
"Error").
" ".$langs->trans(
"Error_EXPEDITION_ADDON_NUMBER_NotDefined");
283 public function create($user, $notrigger = 0)
285 global $conf, $hookmanager;
289 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
293 $this->brouillon = 1;
295 if (empty($this->fk_project)) {
296 $this->fk_project = 0;
304 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"expedition (";
307 $sql .=
", ref_customer";
309 $sql .=
", date_creation";
310 $sql .=
", fk_user_author";
311 $sql .=
", date_expedition";
312 $sql .=
", date_delivery";
314 $sql .=
", fk_projet";
315 $sql .=
", fk_address";
316 $sql .=
", fk_shipping_method";
317 $sql .=
", tracking_number";
322 $sql .=
", weight_units";
323 $sql .=
", size_units";
324 $sql .=
", note_private";
325 $sql .=
", note_public";
326 $sql .=
", model_pdf";
327 $sql .=
", fk_incoterms, location_incoterms";
328 $sql .=
") VALUES (";
330 $sql .=
", ".((int) $conf->entity);
331 $sql .=
", ".($this->ref_customer ?
"'".$this->db->escape($this->ref_customer).
"'" :
"null");
332 $sql .=
", ".($this->ref_ext ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null");
333 $sql .=
", '".$this->db->idate($now).
"'";
334 $sql .=
", ".((int) $user->id);
335 $sql .=
", ".($this->date_expedition > 0 ?
"'".$this->db->idate($this->date_expedition).
"'" :
"null");
336 $sql .=
", ".($this->date_delivery > 0 ?
"'".$this->db->idate($this->date_delivery).
"'" :
"null");
337 $sql .=
", ".($this->socid > 0 ? ((int) $this->socid) :
"null");
338 $sql .=
", ".($this->fk_project > 0 ? ((int) $this->fk_project) :
"null");
339 $sql .=
", ".($this->fk_delivery_address > 0 ? $this->fk_delivery_address :
"null");
340 $sql .=
", ".($this->shipping_method_id > 0 ? ((int) $this->shipping_method_id) :
"null");
341 $sql .=
", '".$this->db->escape($this->tracking_number).
"'";
342 $sql .=
", ".(is_numeric($this->weight) ? $this->weight :
'NULL');
343 $sql .=
", ".(is_numeric($this->sizeS) ? $this->sizeS :
'NULL');
344 $sql .=
", ".(is_numeric($this->sizeW) ? $this->sizeW :
'NULL');
345 $sql .=
", ".(is_numeric($this->sizeH) ? $this->sizeH :
'NULL');
346 $sql .=
", ".($this->weight_units !=
'' ? (int) $this->weight_units :
'NULL');
347 $sql .=
", ".($this->size_units !=
'' ? (int) $this->size_units :
'NULL');
348 $sql .=
", ".(!empty($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null");
349 $sql .=
", ".(!empty($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null");
350 $sql .=
", ".(!empty($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null");
351 $sql .=
", ".(int) $this->fk_incoterms;
352 $sql .=
", '".$this->db->escape($this->location_incoterms).
"'";
355 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
358 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
"expedition");
360 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"expedition";
361 $sql .=
" SET ref = '(PROV".$this->id.
")'";
362 $sql .=
" WHERE rowid = ".((int) $this->
id);
364 dol_syslog(get_class($this).
"::create", LOG_DEBUG);
365 if ($this->
db->query($sql)) {
367 $num = count($this->lines);
368 for ($i = 0; $i < $num; $i++) {
369 if (empty($this->lines[$i]->product_type) || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
370 if (!isset($this->lines[$i]->detail_batch)) {
371 if ($this->
create_line($this->lines[$i]->entrepot_id, $this->lines[$i]->origin_line_id, $this->lines[$i]->qty, $this->lines[$i]->rang, $this->lines[$i]->array_options) <= 0) {
375 if ($this->
create_line_batch($this->lines[$i], $this->lines[$i]->array_options) <= 0) {
382 if (!$error && $this->
id && $this->origin_id) {
397 if (!$error && !$notrigger) {
399 $result = $this->
call_trigger(
'SHIPPING_CREATE', $user);
409 foreach ($this->errors as $errmsg) {
410 dol_syslog(get_class($this).
"::create ".$errmsg, LOG_ERR);
411 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
413 $this->
db->rollback();
418 $this->
db->rollback();
423 $this->error = $this->
db->lasterror().
" - sql=$sql";
424 $this->
db->rollback();
429 $this->error = $this->
db->error().
" - sql=$sql";
430 $this->
db->rollback();
446 public function create_line($entrepot_id, $origin_line_id, $qty, $rang = 0, $array_options =
null)
452 $expeditionline->fk_expedition = $this->id;
453 $expeditionline->entrepot_id = $entrepot_id;
454 $expeditionline->fk_origin_line = $origin_line_id;
455 $expeditionline->qty = $qty;
456 $expeditionline->rang = $rang;
457 $expeditionline->array_options = $array_options;
459 if (($lineId = $expeditionline->insert($user)) < 0) {
460 $this->errors[] = $expeditionline->error;
478 $stockLocationQty = array();
480 $tab = $line_ext->detail_batch;
482 foreach ($tab as $detbatch) {
483 if ($detbatch->entrepot_id) {
484 $stockLocationQty[$detbatch->entrepot_id] += $detbatch->qty;
488 foreach ($stockLocationQty as $stockLocation => $qty) {
489 $line_id = $this->
create_line($stockLocation, $line_ext->origin_line_id, $qty, $line_ext->rang, $array_options);
494 foreach ($tab as $detbatch) {
495 if ($detbatch->entrepot_id == $stockLocation) {
496 if (!($detbatch->create($line_id) > 0)) {
520 public function fetch($id, $ref =
'', $ref_ext =
'', $notused =
'')
525 if (empty($id) && empty($ref) && empty($ref_ext)) {
529 $sql =
"SELECT e.rowid, e.entity, e.ref, e.fk_soc as socid, e.date_creation, e.ref_customer, e.ref_ext, e.fk_user_author, e.fk_statut, e.fk_projet as fk_project, e.billed";
530 $sql .=
", e.date_valid";
531 $sql .=
", e.weight, e.weight_units, e.size, e.size_units, e.width, e.height";
532 $sql .=
", e.date_expedition as date_expedition, e.model_pdf, e.fk_address, e.date_delivery";
533 $sql .=
", e.fk_shipping_method, e.tracking_number";
534 $sql .=
", e.note_private, e.note_public";
535 $sql .=
', e.fk_incoterms, e.location_incoterms';
536 $sql .=
', i.libelle as label_incoterms';
537 $sql .=
', s.libelle as shipping_method';
538 $sql .=
", el.fk_source as origin_id, el.sourcetype as origin";
539 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expedition as e";
540 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"element_element as el ON el.fk_target = e.rowid AND el.targettype = '".$this->
db->escape($this->element).
"'";
541 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_incoterms as i ON e.fk_incoterms = i.rowid';
542 $sql .=
' LEFT JOIN '.MAIN_DB_PREFIX.
'c_shipment_mode as s ON e.fk_shipping_method = s.rowid';
543 $sql .=
" WHERE e.entity IN (".getEntity(
'expedition').
")";
545 $sql .=
" AND e.rowid = ".((int) $id);
548 $sql .=
" AND e.ref='".$this->db->escape($ref).
"'";
551 $sql .=
" AND e.ref_ext='".$this->db->escape($ref_ext).
"'";
554 dol_syslog(get_class($this).
"::fetch", LOG_DEBUG);
555 $result = $this->
db->query($sql);
557 if ($this->
db->num_rows($result)) {
558 $obj = $this->
db->fetch_object($result);
560 $this->
id = $obj->rowid;
561 $this->entity = $obj->entity;
562 $this->
ref = $obj->ref;
563 $this->socid = $obj->socid;
564 $this->ref_customer = $obj->ref_customer;
565 $this->ref_ext = $obj->ref_ext;
566 $this->statut = $obj->fk_statut;
567 $this->user_author_id = $obj->fk_user_author;
568 $this->date_creation = $this->
db->jdate($obj->date_creation);
569 $this->date_valid = $this->
db->jdate($obj->date_valid);
570 $this->date = $this->
db->jdate($obj->date_expedition);
571 $this->date_expedition = $this->
db->jdate($obj->date_expedition);
572 $this->date_shipping = $this->
db->jdate($obj->date_expedition);
573 $this->date_delivery = $this->
db->jdate($obj->date_delivery);
574 $this->fk_delivery_address = $obj->fk_address;
575 $this->model_pdf = $obj->model_pdf;
576 $this->modelpdf = $obj->model_pdf;
577 $this->shipping_method_id = $obj->fk_shipping_method;
578 $this->shipping_method = $obj->shipping_method;
579 $this->tracking_number = $obj->tracking_number;
580 $this->origin = ($obj->origin ? $obj->origin :
'commande');
581 $this->origin_id = $obj->origin_id;
582 $this->billed = $obj->billed;
583 $this->fk_project = $obj->fk_project;
585 $this->trueWeight = $obj->weight;
586 $this->weight_units = $obj->weight_units;
588 $this->trueWidth = $obj->width;
589 $this->width_units = $obj->size_units;
590 $this->trueHeight = $obj->height;
591 $this->height_units = $obj->size_units;
592 $this->trueDepth = $obj->size;
593 $this->depth_units = $obj->size_units;
595 $this->note_public = $obj->note_public;
596 $this->note_private = $obj->note_private;
599 $this->trueSize = $obj->size.
"x".$obj->width.
"x".$obj->height;
600 $this->size_units = $obj->size_units;
603 $this->fk_incoterms = $obj->fk_incoterms;
604 $this->location_incoterms = $obj->location_incoterms;
605 $this->label_incoterms = $obj->label_incoterms;
607 $this->
db->free($result);
609 if ($this->statut == self::STATUS_DRAFT) {
610 $this->brouillon = 1;
624 if (!empty($this->multicurrency_code)) {
625 $this->multicurrency_code = $this->thirdparty->multicurrency_code;
627 if (!empty($conf->global->MULTICURRENCY_USE_ORIGIN_TX) && !empty($this->thirdparty->multicurrency_tx)) {
628 $this->multicurrency_tx = $this->thirdparty->multicurrency_tx;
642 dol_syslog(get_class($this).
'::Fetch no expedition found', LOG_ERR);
643 $this->error =
'Delivery with id '.$id.
' not found';
647 $this->error = $this->
db->error();
659 public function valid($user, $notrigger = 0)
661 global $conf, $langs;
663 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
669 dol_syslog(get_class($this).
"::valid not in draft status", LOG_WARNING);
673 if (!((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->expedition->creer))
674 || (!empty($conf->global->MAIN_USE_ADVANCED_PERMS) && !empty($user->rights->expedition->shipping_advance->validate)))) {
675 $this->error =
'Permission denied';
676 dol_syslog(get_class($this).
"::valid ".$this->error, LOG_ERR);
686 $soc->fetch($this->socid);
689 $result = $soc->set_as_client();
692 if (!$error && (preg_match(
'/^[\(]?PROV/i', $this->
ref) || empty($this->
ref))) {
695 $numref =
"EXP".$this->id;
702 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"expedition SET";
703 $sql .=
" ref='".$this->db->escape($numref).
"'";
704 $sql .=
", fk_statut = 1";
705 $sql .=
", date_valid = '".$this->db->idate($now).
"'";
706 $sql .=
", fk_user_valid = ".$user->id;
707 $sql .=
" WHERE rowid = ".((int) $this->
id);
709 dol_syslog(get_class($this).
"::valid update expedition", LOG_DEBUG);
712 $this->error = $this->
db->lasterror();
717 if (!$error &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)) {
718 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
720 $langs->load(
"agenda");
723 $sql =
"SELECT cd.fk_product, cd.subprice,";
724 $sql .=
" ed.rowid, ed.qty, ed.fk_entrepot,";
725 $sql .=
" edb.rowid as edbrowid, edb.eatby, edb.sellby, edb.batch, edb.qty as edbqty, edb.fk_origin_stock";
726 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commandedet as cd,";
727 $sql .=
" ".MAIN_DB_PREFIX.
"expeditiondet as ed";
728 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"expeditiondet_batch as edb on edb.fk_expeditiondet = ed.rowid";
729 $sql .=
" WHERE ed.fk_expedition = ".((int) $this->
id);
730 $sql .=
" AND cd.rowid = ed.fk_origin_line";
732 dol_syslog(get_class($this).
"::valid select details", LOG_DEBUG);
736 for ($i = 0; $i < $cpt; $i++) {
737 $obj = $this->
db->fetch_object(
$resql);
738 if (empty($obj->edbrowid)) {
744 if ($qty == 0 || ($qty < 0 && !
getDolGlobalInt(
'SHIPMENT_ALLOW_NEGATIVE_QTY'))) {
747 dol_syslog(get_class($this).
"::valid movement index ".$i.
" ed.rowid=".$obj->rowid.
" edb.rowid=".$obj->edbrowid);
752 $mouvS->setOrigin($this->element, $this->
id);
754 if (empty($obj->edbrowid)) {
758 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans(
"ShipmentValidatedInDolibarr", $numref),
'',
'',
'',
'', 0,
'', 1);
762 $this->error = $mouvS->error;
763 $this->errors = array_merge($this->errors, $mouvS->errors);
771 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans(
"ShipmentValidatedInDolibarr", $numref),
'', $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch, $obj->fk_origin_stock,
'', 1);
774 $this->error = $mouvS->error;
775 $this->errors = array_merge($this->errors, $mouvS->errors);
783 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"product_stock WHERE reel = 0 AND rowid NOT IN (SELECT fk_product_stock FROM ".MAIN_DB_PREFIX.
"product_batch as pb)";
787 $this->
db->rollback();
788 $this->error = $this->
db->error();
799 if (!$error && !$notrigger) {
801 $result = $this->
call_trigger(
'SHIPPING_VALIDATE', $user);
809 $this->oldref = $this->ref;
812 if (preg_match(
'/^[\(]?PROV/i', $this->
ref)) {
814 $sql =
'UPDATE '.MAIN_DB_PREFIX.
"ecm_files set filename = CONCAT('".$this->
db->escape($this->newref).
"', SUBSTR(filename, ".(strlen($this->
ref) + 1).
")), filepath = 'expedition/sending/".$this->
db->escape($this->newref).
"'";
815 $sql .=
" WHERE filename LIKE '".$this->db->escape($this->
ref).
"%' AND filepath = 'expedition/sending/".$this->
db->escape($this->
ref).
"' and entity = ".((int) $conf->entity);
818 $error++; $this->error = $this->
db->lasterror();
824 $dirsource = $conf->expedition->dir_output.
'/sending/'.$oldref;
825 $dirdest = $conf->expedition->dir_output.
'/sending/'.$newref;
826 if (!$error && file_exists($dirsource)) {
827 dol_syslog(get_class($this).
"::valid rename dir ".$dirsource.
" into ".$dirdest);
829 if (@rename($dirsource, $dirdest)) {
832 $listoffiles =
dol_dir_list($conf->expedition->dir_output.
'/sending/'.$newref,
'files', 1,
'^'.preg_quote($oldref,
'/'));
833 foreach ($listoffiles as $fileentry) {
834 $dirsource = $fileentry[
'name'];
835 $dirdest = preg_replace(
'/^'.preg_quote($oldref,
'/').
'/', $newref, $dirsource);
836 $dirsource = $fileentry[
'path'].
'/'.$dirsource;
837 $dirdest = $fileentry[
'path'].
'/'.$dirdest;
838 @rename($dirsource, $dirdest);
847 $this->
ref = $numref;
855 $this->
db->rollback();
873 if ($conf->delivery_note->enabled) {
874 if ($this->statut == self::STATUS_VALIDATED || $this->statut == self::STATUS_CLOSED) {
876 include_once DOL_DOCUMENT_ROOT.
'/delivery/class/delivery.class.php';
878 $result = $delivery->create_from_sending($user, $this->
id);
882 $this->error = $delivery->error;
905 public function addline($entrepot_id, $id, $qty, $array_options = 0)
907 global $conf, $langs;
909 $num = count($this->lines);
912 $line->entrepot_id = $entrepot_id;
913 $line->origin_line_id = $id;
914 $line->fk_origin_line = $id;
918 $orderline->fetch($id);
921 $line->rang = $orderline->rang;
922 $line->product_type = $orderline->product_type;
924 if (
isModEnabled(
'stock') && !empty($orderline->fk_product)) {
925 $fk_product = $orderline->fk_product;
927 if (!($entrepot_id > 0) && empty($conf->global->STOCK_WAREHOUSE_NOT_REQUIRED_FOR_SHIPMENTS)) {
928 $langs->load(
"errors");
929 $this->error = $langs->trans(
"ErrorWarehouseRequiredIntoShipmentLine");
933 if (!empty($conf->global->STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT)) {
935 $product->fetch($fk_product);
938 if ($entrepot_id > 0) {
939 $product->load_stock(
'warehouseopen');
940 $product_stock = $product->stock_warehouse[$entrepot_id]->real;
942 $product_stock = $product->stock_reel;
945 $product_type = $product->type;
946 if ($product_type == 0 || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) {
947 $isavirtualproduct = ($product->hasFatherOrChild(1) > 0);
949 if (!$isavirtualproduct || empty($conf->global->PRODUIT_SOUSPRODUITS) || ($isavirtualproduct && empty($conf->global->STOCK_EXCLUDE_VIRTUAL_PRODUCTS))) {
950 if ($product_stock < $qty) {
951 $langs->load(
"errors");
952 $this->error = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnShipment', $product->ref);
953 $this->errorhidden =
'ErrorStockIsNotEnoughToAddProductOnShipment';
955 $this->
db->rollback();
965 if (
isModEnabled(
'productbatch') && !empty($orderline->fk_product) && !empty($orderline->product_tobatch)) {
966 $this->error =
'ADDLINE_WAS_CALLED_INSTEAD_OF_ADDLINEBATCH '.$orderline->id.
' '.$orderline->fk_product;
971 if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_options) && count($array_options) > 0) {
972 $line->array_options = $array_options;
975 $this->lines[$num] = $line;
991 global $conf, $langs;
993 $num = count($this->lines);
994 if ($dbatch[
'qty'] > 0) {
997 foreach ($dbatch[
'detail'] as $key => $value) {
998 if ($value[
'q'] > 0) {
1004 $ret = $linebatch->fetchFromStock($value[
'id_batch']);
1006 $this->error = $linebatch->error;
1009 $linebatch->qty = $value[
'q'];
1010 $tab[] = $linebatch;
1012 if ($conf->global->STOCK_MUST_BE_ENOUGH_FOR_SHIPMENT) {
1013 require_once DOL_DOCUMENT_ROOT.
'/product/class/productbatch.class.php';
1015 $prod_batch->fetch($value[
'id_batch']);
1017 if ($prod_batch->qty < $linebatch->qty) {
1018 $langs->load(
"errors");
1019 $this->errors[] = $langs->trans(
'ErrorStockIsNotEnoughToAddProductOnShipment', $prod_batch->fk_product);
1020 dol_syslog(get_class($this).
"::addline_batch error=Product ".$prod_batch->batch.
": ".$this->errorsToString(), LOG_ERR);
1021 $this->
db->rollback();
1029 $line->entrepot_id = $linebatch->entrepot_id;
1030 $line->origin_line_id = $dbatch[
'ix_l'];
1031 $line->fk_origin_line = $dbatch[
'ix_l'];
1032 $line->qty = $dbatch[
'qty'];
1033 $line->detail_batch = $tab;
1036 if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED) && is_array($array_options) && count($array_options) > 0) {
1037 $line->array_options = $array_options;
1041 $this->lines[$num] = $line;
1053 public function update($user =
null, $notrigger = 0)
1060 if (isset($this->
ref)) {
1061 $this->
ref = trim($this->
ref);
1063 if (isset($this->entity)) {
1064 $this->entity = (int) $this->entity;
1066 if (isset($this->ref_customer)) {
1067 $this->ref_customer = trim($this->ref_customer);
1069 if (isset($this->socid)) {
1070 $this->socid = (int) $this->socid;
1072 if (isset($this->fk_user_author)) {
1073 $this->fk_user_author = (int) $this->fk_user_author;
1075 if (isset($this->fk_user_valid)) {
1076 $this->fk_user_valid = (int) $this->fk_user_valid;
1078 if (isset($this->fk_delivery_address)) {
1079 $this->fk_delivery_address = (int) $this->fk_delivery_address;
1081 if (isset($this->shipping_method_id)) {
1082 $this->shipping_method_id = (int) $this->shipping_method_id;
1084 if (isset($this->tracking_number)) {
1085 $this->tracking_number = trim($this->tracking_number);
1087 if (isset($this->statut)) {
1088 $this->statut = (int) $this->statut;
1090 if (isset($this->trueDepth)) {
1091 $this->trueDepth = trim($this->trueDepth);
1093 if (isset($this->trueWidth)) {
1094 $this->trueWidth = trim($this->trueWidth);
1096 if (isset($this->trueHeight)) {
1097 $this->trueHeight = trim($this->trueHeight);
1099 if (isset($this->size_units)) {
1100 $this->size_units = trim($this->size_units);
1102 if (isset($this->weight_units)) {
1103 $this->weight_units = trim($this->weight_units);
1105 if (isset($this->trueWeight)) {
1106 $this->weight = trim($this->trueWeight);
1108 if (isset($this->note_private)) {
1109 $this->note_private = trim($this->note_private);
1111 if (isset($this->note_public)) {
1112 $this->note_public = trim($this->note_public);
1114 if (isset($this->model_pdf)) {
1115 $this->model_pdf = trim($this->model_pdf);
1124 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"expedition SET";
1126 $sql .=
" ref=".(isset($this->
ref) ?
"'".$this->db->escape($this->
ref).
"'" :
"null").
",";
1127 $sql .=
" ref_ext=".(isset($this->ref_ext) ?
"'".$this->db->escape($this->ref_ext).
"'" :
"null").
",";
1128 $sql .=
" ref_customer=".(isset($this->ref_customer) ?
"'".$this->db->escape($this->ref_customer).
"'" :
"null").
",";
1129 $sql .=
" fk_soc=".(isset($this->socid) ? $this->socid :
"null").
",";
1130 $sql .=
" date_creation=".(dol_strlen($this->date_creation) != 0 ?
"'".$this->db->idate($this->date_creation).
"'" :
'null').
",";
1131 $sql .=
" fk_user_author=".(isset($this->fk_user_author) ? $this->fk_user_author :
"null").
",";
1132 $sql .=
" date_valid=".(dol_strlen($this->date_valid) != 0 ?
"'".$this->db->idate($this->date_valid).
"'" :
'null').
",";
1133 $sql .=
" fk_user_valid=".(isset($this->fk_user_valid) ? $this->fk_user_valid :
"null").
",";
1134 $sql .=
" date_expedition=".(dol_strlen($this->date_expedition) != 0 ?
"'".$this->db->idate($this->date_expedition).
"'" :
'null').
",";
1135 $sql .=
" date_delivery=".(dol_strlen($this->date_delivery) != 0 ?
"'".$this->db->idate($this->date_delivery).
"'" :
'null').
",";
1136 $sql .=
" fk_address=".(isset($this->fk_delivery_address) ? $this->fk_delivery_address :
"null").
",";
1137 $sql .=
" fk_shipping_method=".((isset($this->shipping_method_id) && $this->shipping_method_id > 0) ? $this->shipping_method_id :
"null").
",";
1138 $sql .=
" tracking_number=".(isset($this->tracking_number) ?
"'".$this->db->escape($this->tracking_number).
"'" :
"null").
",";
1139 $sql .=
" fk_statut=".(isset($this->statut) ? $this->statut :
"null").
",";
1140 $sql .=
" fk_projet=".(isset($this->fk_project) ? $this->fk_project :
"null").
",";
1141 $sql .=
" height=".(($this->trueHeight !=
'') ? $this->trueHeight :
"null").
",";
1142 $sql .=
" width=".(($this->trueWidth !=
'') ? $this->trueWidth :
"null").
",";
1143 $sql .=
" size_units=".(isset($this->size_units) ? $this->size_units :
"null").
",";
1144 $sql .=
" size=".(($this->trueDepth !=
'') ? $this->trueDepth :
"null").
",";
1145 $sql .=
" weight_units=".(isset($this->weight_units) ? $this->weight_units :
"null").
",";
1146 $sql .=
" weight=".(($this->trueWeight !=
'') ? $this->trueWeight :
"null").
",";
1147 $sql .=
" note_private=".(isset($this->note_private) ?
"'".$this->db->escape($this->note_private).
"'" :
"null").
",";
1148 $sql .=
" note_public=".(isset($this->note_public) ?
"'".$this->db->escape($this->note_public).
"'" :
"null").
",";
1149 $sql .=
" model_pdf=".(isset($this->model_pdf) ?
"'".$this->db->escape($this->model_pdf).
"'" :
"null").
",";
1150 $sql .=
" entity=".$conf->entity;
1152 $sql .=
" WHERE rowid=".((int) $this->
id);
1156 dol_syslog(get_class($this).
"::update", LOG_DEBUG);
1159 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1162 if (!$error && !$notrigger) {
1164 $result = $this->
call_trigger(
'SHIPPING_MODIFY', $user);
1173 foreach ($this->errors as $errmsg) {
1174 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
1175 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
1177 $this->
db->rollback();
1180 $this->
db->commit();
1193 public function cancel($notrigger = 0, $also_update_stock =
false)
1195 global $conf, $langs, $user;
1197 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1206 if (count($this->linkedObjectsIds) > 0) {
1207 $this->error =
'ErrorThereIsSomeDeliveries';
1211 if (!$error && !$notrigger) {
1213 $result = $this->
call_trigger(
'SHIPPING_CANCEL', $user);
1222 (($conf->global->STOCK_CALCULATE_ON_SHIPMENT && $this->statut > self::STATUS_DRAFT) ||
1223 ($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE && $this->statut == self::STATUS_CLOSED && $also_update_stock))) {
1224 require_once DOL_DOCUMENT_ROOT.
"/product/stock/class/mouvementstock.class.php";
1226 $langs->load(
"agenda");
1229 $sql =
"SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.rowid as expeditiondet_id";
1230 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commandedet as cd,";
1231 $sql .=
" ".MAIN_DB_PREFIX.
"expeditiondet as ed";
1232 $sql .=
" WHERE ed.fk_expedition = ".((int) $this->
id);
1233 $sql .=
" AND cd.rowid = ed.fk_origin_line";
1235 dol_syslog(get_class($this).
"::delete select details", LOG_DEBUG);
1238 $cpt = $this->
db->num_rows(
$resql);
1242 for ($i = 0; $i < $cpt; $i++) {
1243 dol_syslog(get_class($this).
"::delete movement index ".$i);
1244 $obj = $this->
db->fetch_object(
$resql);
1248 $mouvS->origin =
null;
1252 $lotArray = $shipmentlinebatch->fetchAll($obj->expeditiondet_id);
1253 if (!is_array($lotArray)) {
1255 $this->errors[] =
"Error ".$this->db->lasterror();
1259 if (empty($lotArray)) {
1263 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, 0, $langs->trans(
"ShipmentCanceledInDolibarr", $this->ref));
1266 $this->errors = array_merge($this->errors, $mouvS->errors);
1272 foreach ($lotArray as $lot) {
1273 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $lot->qty, 0, $langs->trans(
"ShipmentCanceledInDolibarr", $this->ref), $lot->eatby, $lot->sellby, $lot->batch);
1276 $this->errors = array_merge($this->errors, $mouvS->errors);
1286 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1293 if ($shipmentlinebatch->deleteFromShipment($this->id) < 0) {
1294 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1300 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"expeditiondet";
1301 $sql .=
" WHERE fk_expedition = ".((int) $this->
id);
1303 if ($this->
db->query($sql)) {
1312 $sql =
"SELECT rowid FROM ".MAIN_DB_PREFIX.
"expedition";
1313 $sql .=
" WHERE rowid = ".((int) $this->
id);
1315 if ($this->
db->query($sql)) {
1316 if (!empty($this->origin) && $this->origin_id > 0) {
1318 $origin = $this->origin;
1321 $this->$origin->loadExpeditions();
1323 if (count($this->$origin->expeditions) <= 0) {
1330 $this->
db->commit();
1334 if (!empty($conf->expedition->dir_output)) {
1335 $dir = $conf->expedition->dir_output.
'/sending/'.$ref;
1336 $file = $dir.
'/'.$ref.
'.pdf';
1337 if (file_exists($file)) {
1342 if (file_exists($dir)) {
1344 $this->error = $langs->trans(
"ErrorCanNotDeleteDir", $dir);
1352 $this->
db->rollback();
1356 $this->error = $this->
db->lasterror().
" - sql=$sql";
1357 $this->
db->rollback();
1361 $this->error = $this->
db->lasterror().
" - sql=$sql";
1362 $this->
db->rollback();
1366 $this->error = $this->
db->lasterror().
" - sql=$sql";
1367 $this->
db->rollback();
1371 $this->
db->rollback();
1384 public function delete($notrigger = 0, $also_update_stock =
false)
1386 global $conf, $langs, $user;
1388 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
1397 if (count($this->linkedObjectsIds) > 0) {
1398 $this->error =
'ErrorThereIsSomeDeliveries';
1402 if (!$error && !$notrigger) {
1404 $result = $this->
call_trigger(
'SHIPPING_DELETE', $user);
1413 (($conf->global->STOCK_CALCULATE_ON_SHIPMENT && $this->statut > self::STATUS_DRAFT) ||
1414 ($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE && $this->statut == self::STATUS_CLOSED && $also_update_stock))) {
1415 require_once DOL_DOCUMENT_ROOT.
"/product/stock/class/mouvementstock.class.php";
1417 $langs->load(
"agenda");
1423 $sql =
"SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.rowid as expeditiondet_id";
1424 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commandedet as cd,";
1425 $sql .=
" ".MAIN_DB_PREFIX.
"expeditiondet as ed";
1426 $sql .=
" WHERE ed.fk_expedition = ".((int) $this->
id);
1427 $sql .=
" AND cd.rowid = ed.fk_origin_line";
1429 dol_syslog(get_class($this).
"::delete select details", LOG_DEBUG);
1432 $cpt = $this->
db->num_rows(
$resql);
1433 for ($i = 0; $i < $cpt; $i++) {
1434 dol_syslog(get_class($this).
"::delete movement index ".$i);
1435 $obj = $this->
db->fetch_object(
$resql);
1439 $mouvS->origin =
null;
1441 $lotArray = $shipmentlinebatch->fetchAll($obj->expeditiondet_id);
1442 if (!is_array($lotArray)) {
1443 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1445 if (empty($lotArray)) {
1449 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, 0, $langs->trans(
"ShipmentDeletedInDolibarr", $this->ref));
1452 $this->errors = array_merge($this->errors, $mouvS->errors);
1458 foreach ($lotArray as $lot) {
1459 $result = $mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $lot->qty, 0, $langs->trans(
"ShipmentDeletedInDolibarr", $this->ref), $lot->eatby, $lot->sellby, $lot->batch);
1462 $this->errors = array_merge($this->errors, $mouvS->errors);
1472 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1479 if ($shipmentlinebatch->deleteFromShipment($this->id) < 0) {
1480 $error++; $this->errors[] =
"Error ".$this->db->lasterror();
1485 $main = MAIN_DB_PREFIX.
'expeditiondet';
1486 $ef = $main.
"_extrafields";
1487 $sqlef =
"DELETE FROM $ef WHERE fk_object IN (SELECT rowid FROM $main WHERE fk_expedition = ".((int) $this->
id).
")";
1489 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"expeditiondet";
1490 $sql .=
" WHERE fk_expedition = ".((int) $this->
id);
1492 if ($this->
db->query($sqlef) && $this->
db->query($sql)) {
1506 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"expedition";
1507 $sql .=
" WHERE rowid = ".((int) $this->
id);
1509 if ($this->
db->query($sql)) {
1510 if (!empty($this->origin) && $this->origin_id > 0) {
1512 $origin = $this->origin;
1515 $this->$origin->loadExpeditions();
1517 if (count($this->$origin->expeditions) <= 0) {
1524 $this->
db->commit();
1531 if (!empty($conf->expedition->dir_output)) {
1532 $dir = $conf->expedition->dir_output.
'/sending/'.$ref;
1533 $file = $dir.
'/'.$ref.
'.pdf';
1534 if (file_exists($file)) {
1539 if (file_exists($dir)) {
1541 $this->error = $langs->trans(
"ErrorCanNotDeleteDir", $dir);
1549 $this->
db->rollback();
1553 $this->error = $this->
db->lasterror().
" - sql=$sql";
1554 $this->
db->rollback();
1558 $this->error = $this->
db->lasterror().
" - sql=$sql";
1559 $this->
db->rollback();
1563 $this->error = $this->
db->lasterror().
" - sql=$sql";
1564 $this->
db->rollback();
1568 $this->
db->rollback();
1582 global $conf, $mysoc;
1584 $this->lines = array();
1589 $sql =
"SELECT cd.rowid, cd.fk_product, cd.label as custom_label, cd.description, cd.qty as qty_asked, cd.product_type, cd.fk_unit";
1590 $sql .=
", cd.total_ht, cd.total_localtax1, cd.total_localtax2, cd.total_ttc, cd.total_tva";
1591 $sql .=
", cd.vat_src_code, cd.tva_tx, cd.localtax1_tx, cd.localtax2_tx, cd.localtax1_type, cd.localtax2_type, cd.info_bits, cd.price, cd.subprice, cd.remise_percent,cd.buy_price_ht as pa_ht";
1592 $sql .=
", cd.fk_multicurrency, cd.multicurrency_code, cd.multicurrency_subprice, cd.multicurrency_total_ht, cd.multicurrency_total_tva, cd.multicurrency_total_ttc, cd.rang";
1593 $sql .=
", ed.rowid as line_id, ed.qty as qty_shipped, ed.fk_origin_line, ed.fk_entrepot";
1594 $sql .=
", p.ref as product_ref, p.label as product_label, p.fk_product_type";
1595 $sql .=
", p.weight, p.weight_units, p.length, p.length_units, p.surface, p.surface_units, p.volume, p.volume_units, p.tosell as product_tosell, p.tobuy as product_tobuy, p.tobatch as product_tobatch";
1596 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expeditiondet as ed, ".MAIN_DB_PREFIX.
"commandedet as cd";
1597 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON p.rowid = cd.fk_product";
1598 $sql .=
" WHERE ed.fk_expedition = ".((int) $this->
id);
1599 $sql .=
" AND ed.fk_origin_line = cd.rowid";
1600 $sql .=
" ORDER BY cd.rang, ed.fk_origin_line";
1602 dol_syslog(get_class($this).
"::fetch_lines", LOG_DEBUG);
1605 include_once DOL_DOCUMENT_ROOT.
'/core/lib/price.lib.php';
1607 $num = $this->
db->num_rows(
$resql);
1612 $this->total_ht = 0;
1613 $this->total_tva = 0;
1614 $this->total_ttc = 0;
1615 $this->total_localtax1 = 0;
1616 $this->total_localtax2 = 0;
1621 $obj = $this->
db->fetch_object(
$resql);
1623 if ($originline > 0 && $originline == $obj->fk_origin_line) {
1624 $line->entrepot_id = 0;
1625 $line->qty_shipped += $obj->qty_shipped;
1628 $line->entrepot_id = $obj->fk_entrepot;
1629 $line->qty_shipped = $obj->qty_shipped;
1632 $detail_entrepot =
new stdClass();
1633 $detail_entrepot->entrepot_id = $obj->fk_entrepot;
1634 $detail_entrepot->qty_shipped = $obj->qty_shipped;
1635 $detail_entrepot->line_id = $obj->line_id;
1636 $line->details_entrepot[] = $detail_entrepot;
1638 $line->line_id = $obj->line_id;
1639 $line->rowid = $obj->line_id;
1640 $line->id = $obj->line_id;
1642 $line->fk_origin =
'orderline';
1643 $line->fk_origin_line = $obj->fk_origin_line;
1644 $line->origin_line_id = $obj->fk_origin_line;
1646 $line->fk_expedition = $this->id;
1648 $line->product_type = $obj->product_type;
1649 $line->fk_product = $obj->fk_product;
1650 $line->fk_product_type = $obj->fk_product_type;
1651 $line->ref = $obj->product_ref;
1652 $line->product_ref = $obj->product_ref;
1653 $line->product_label = $obj->product_label;
1654 $line->libelle = $obj->product_label;
1655 $line->product_tosell = $obj->product_tosell;
1656 $line->product_tobuy = $obj->product_tobuy;
1657 $line->product_tobatch = $obj->product_tobatch;
1658 $line->label = $obj->custom_label;
1659 $line->description = $obj->description;
1660 $line->qty_asked = $obj->qty_asked;
1661 $line->rang = $obj->rang;
1662 $line->weight = $obj->weight;
1663 $line->weight_units = $obj->weight_units;
1664 $line->length = $obj->length;
1665 $line->length_units = $obj->length_units;
1666 $line->surface = $obj->surface;
1667 $line->surface_units = $obj->surface_units;
1668 $line->volume = $obj->volume;
1669 $line->volume_units = $obj->volume_units;
1670 $line->fk_unit = $obj->fk_unit;
1672 $line->pa_ht = $obj->pa_ht;
1675 $localtax_array = array(0=>$obj->localtax1_type, 1=>$obj->localtax1_tx, 2=>$obj->localtax2_type, 3=>$obj->localtax2_tx);
1676 $localtax1_tx =
get_localtax($obj->tva_tx, 1, $this->thirdparty);
1677 $localtax2_tx =
get_localtax($obj->tva_tx, 2, $this->thirdparty);
1680 $tabprice =
calcul_price_total($obj->qty_shipped, $obj->subprice, $obj->remise_percent, $obj->tva_tx, $localtax1_tx, $localtax2_tx, 0,
'HT', $obj->info_bits, $obj->fk_product_type, $mysoc, $localtax_array);
1681 $line->desc = $obj->description;
1682 $line->qty = $line->qty_shipped;
1683 $line->total_ht = $tabprice[0];
1684 $line->total_localtax1 = $tabprice[9];
1685 $line->total_localtax2 = $tabprice[10];
1686 $line->total_ttc = $tabprice[2];
1687 $line->total_tva = $tabprice[1];
1688 $line->vat_src_code = $obj->vat_src_code;
1689 $line->tva_tx = $obj->tva_tx;
1690 $line->localtax1_tx = $obj->localtax1_tx;
1691 $line->localtax2_tx = $obj->localtax2_tx;
1692 $line->info_bits = $obj->info_bits;
1693 $line->price = $obj->price;
1694 $line->subprice = $obj->subprice;
1695 $line->remise_percent = $obj->remise_percent;
1697 $this->total_ht += $tabprice[0];
1698 $this->total_tva += $tabprice[1];
1699 $this->total_ttc += $tabprice[2];
1700 $this->total_localtax1 += $tabprice[9];
1701 $this->total_localtax2 += $tabprice[10];
1704 $this->fk_multicurrency = $obj->fk_multicurrency;
1705 $this->multicurrency_code = $obj->multicurrency_code;
1706 $this->multicurrency_subprice = $obj->multicurrency_subprice;
1707 $this->multicurrency_total_ht = $obj->multicurrency_total_ht;
1708 $this->multicurrency_total_tva = $obj->multicurrency_total_tva;
1709 $this->multicurrency_total_ttc = $obj->multicurrency_total_ttc;
1711 if ($originline != $obj->fk_origin_line) {
1712 $line->detail_batch = array();
1716 if (
isModEnabled(
'productbatch') && $obj->line_id > 0 && $obj->product_tobatch > 0) {
1717 $newdetailbatch = $shipmentlinebatch->fetchAll($obj->line_id, $obj->fk_product);
1719 if (is_array($newdetailbatch)) {
1720 if ($originline != $obj->fk_origin_line) {
1721 $line->detail_batch = $newdetailbatch;
1723 $line->detail_batch = array_merge($line->detail_batch, $newdetailbatch);
1728 $line->fetch_optionals();
1730 if ($originline != $obj->fk_origin_line) {
1731 $this->lines[$lineindex] = $line;
1734 $line->total_ht += $tabprice[0];
1735 $line->total_localtax1 += $tabprice[9];
1736 $line->total_localtax2 += $tabprice[10];
1737 $line->total_ttc += $tabprice[2];
1738 $line->total_tva += $tabprice[1];
1742 $originline = $obj->fk_origin_line;
1747 $this->error = $this->
db->error();
1763 if ($this->statut == self::STATUS_DRAFT) {
1769 $line->fetch($lineid);
1771 if ($line->delete($user) > 0) {
1774 $this->
db->commit();
1777 $this->
db->rollback();
1781 $this->error =
'ErrorDeleteLineNotAllowedByObjectStatus';
1798 public function getNomUrl($withpicto = 0, $option =
'', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1)
1800 global $langs, $conf, $hookmanager;
1803 $label =
'<u>'.$langs->trans(
"Shipment").
'</u>';
1804 $label .=
'<br><b>'.$langs->trans(
'Ref').
':</b> '.$this->ref;
1805 $label .=
'<br><b>'.$langs->trans(
'RefCustomer').
':</b> '.($this->ref_customer ? $this->ref_customer : $this->ref_client);
1807 $url = DOL_URL_ROOT.
'/expedition/card.php?id='.$this->id;
1813 if ($option !==
'nolink') {
1815 $add_save_lastsearch_values = ($save_lastsearch_value == 1 ? 1 : 0);
1816 if ($save_lastsearch_value == -1 && preg_match(
'/list\.php/', $_SERVER[
"PHP_SELF"])) {
1817 $add_save_lastsearch_values = 1;
1819 if ($add_save_lastsearch_values) {
1820 $url .=
'&save_lastsearch_values=1';
1825 if (empty($notooltip)) {
1826 if (!empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) {
1827 $label = $langs->trans(
"Shipment");
1828 $linkclose .=
' alt="'.dol_escape_htmltag($label, 1).
'"';
1830 $linkclose .=
' title="'.dol_escape_htmltag($label, 1).
'"';
1831 $linkclose .=
' class="classfortooltip"';
1834 $linkstart =
'<a href="'.$url.
'"';
1835 $linkstart .= $linkclose.
'>';
1838 $result .= $linkstart;
1840 $result .=
img_object(($notooltip ?
'' : $label), $this->picto, ($notooltip ? (($withpicto != 2) ?
'class="paddingright"' :
'') :
'class="'.(($withpicto != 2) ?
'paddingright ' :
'').
'classfortooltip"'), 0, 0, $notooltip ? 0 : 1);
1842 if ($withpicto != 2) {
1843 $result .= $this->ref;
1845 $result .= $linkend;
1847 $hookmanager->initHooks(array($this->element .
'dao'));
1848 $parameters = array(
'id'=>$this->
id,
'getnomurl' => &$result);
1849 $reshook = $hookmanager->executeHooks(
'getNomUrl', $parameters, $this, $action);
1851 $result = $hookmanager->resPrint;
1853 $result .= $hookmanager->resPrint;
1866 return $this->
LibStatut($this->statut, $mode);
1882 $labelStatus = $langs->transnoentitiesnoconv($this->statuts[$status]);
1883 $labelStatusShort = $langs->transnoentitiesnoconv($this->statuts_short[$status]);
1885 $statusType =
'status'.$status;
1886 if ($status == self::STATUS_VALIDATED) {
1887 $statusType =
'status4';
1889 if ($status == self::STATUS_CLOSED) {
1890 $statusType =
'status6';
1892 if ($status == self::STATUS_CANCELED) {
1893 $statusType =
'status9';
1896 return dolGetStatus($labelStatus, $labelStatusShort,
'', $statusType, $mode);
1912 dol_syslog(get_class($this).
"::initAsSpecimen");
1915 $order->initAsSpecimen();
1919 $this->
ref =
'SPECIMEN';
1920 $this->specimen = 1;
1922 $this->livraison_id = 0;
1924 $this->date_creation = $now;
1925 $this->date_valid = $now;
1926 $this->date_delivery = $now + 24 * 3600;
1927 $this->date_expedition = $now + 24 * 3600;
1929 $this->entrepot_id = 0;
1930 $this->fk_delivery_address = 0;
1933 $this->commande_id = 0;
1934 $this->commande = $order;
1936 $this->origin_id = 1;
1937 $this->origin =
'commande';
1939 $this->note_private =
'Private note';
1940 $this->note_public =
'Public note';
1944 while ($xnbp < $nbp) {
1946 $line->desc = $langs->trans(
"Description").
" ".$xnbp;
1947 $line->libelle = $langs->trans(
"Description").
" ".$xnbp;
1948 $line->label = $langs->trans(
"Description").
" ".$xnbp;
1950 $line->qty_asked = 5;
1951 $line->qty_shipped = 4;
1952 $line->fk_product = $this->commande->lines[$xnbp]->fk_product;
1954 $this->lines[] = $line;
1983 if ($user->rights->expedition->creer) {
1984 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"expedition";
1985 $sql .=
" SET date_delivery = ".($delivery_date ?
"'".$this->db->idate($delivery_date).
"'" :
'null');
1986 $sql .=
" WHERE rowid = ".((int) $this->
id);
1988 dol_syslog(get_class($this).
"::setDeliveryDate", LOG_DEBUG);
1991 $this->date_delivery = $delivery_date;
1994 $this->error = $this->
db->error();
2012 $this->meths = array();
2014 $sql =
"SELECT em.rowid, em.code, em.libelle as label";
2015 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_shipment_mode as em";
2016 $sql .=
" WHERE em.active = 1";
2017 $sql .=
" ORDER BY em.libelle ASC";
2021 while ($obj = $this->
db->fetch_object(
$resql)) {
2022 $label = $langs->trans(
'SendingMethod'.$obj->code);
2023 $this->meths[$obj->rowid] = ($label !=
'SendingMethod'.$obj->code ? $label : $obj->label);
2040 $this->listmeths = array();
2043 $sql =
"SELECT em.rowid, em.code, em.libelle as label, em.description, em.tracking, em.active";
2044 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_shipment_mode as em";
2046 $sql .=
" WHERE em.rowid=".((int) $id);
2051 while ($obj = $this->
db->fetch_object(
$resql)) {
2052 $this->listmeths[$i][
'rowid'] = $obj->rowid;
2053 $this->listmeths[$i][
'code'] = $obj->code;
2054 $label = $langs->trans(
'SendingMethod'.$obj->code);
2055 $this->listmeths[$i][
'libelle'] = ($label !=
'SendingMethod'.$obj->code ? $label : $obj->label);
2056 $this->listmeths[$i][
'description'] = $obj->description;
2057 $this->listmeths[$i][
'tracking'] = $obj->tracking;
2058 $this->listmeths[$i][
'active'] = $obj->active;
2072 if (!empty($this->shipping_method_id)) {
2073 $sql =
"SELECT em.code, em.tracking";
2074 $sql .=
" FROM ".MAIN_DB_PREFIX.
"c_shipment_mode as em";
2075 $sql .=
" WHERE em.rowid = ".((int) $this->shipping_method_id);
2079 if ($obj = $this->
db->fetch_object(
$resql)) {
2080 $tracking = $obj->tracking;
2085 if (!empty($tracking) && !empty($value)) {
2086 $url = str_replace(
'{TRACKID}', $value, $tracking);
2087 $this->tracking_url = sprintf(
'<a target="_blank" rel="noopener noreferrer" href="%s">'.($value ? $value :
'url').
'</a>', $url, $url);
2089 $this->tracking_url = $value;
2100 global $conf, $langs, $user;
2105 if ($this->statut == self::STATUS_CLOSED) {
2112 $sql .=
" WHERE rowid = ".((int) $this->
id).
" AND fk_statut > 0";
2117 if ($this->origin ==
'commande' && $this->origin_id > 0) {
2119 $order->fetch($this->origin_id);
2121 $order->loadExpeditions(self::STATUS_CLOSED);
2123 $shipments_match_order = 1;
2124 foreach ($order->lines as $line) {
2125 $lineid = $line->id;
2127 if (($line->product_type == 0 || !empty($conf->global->STOCK_SUPPORTS_SERVICES)) && $order->expeditions[$lineid] != $qty) {
2128 $shipments_match_order = 0;
2129 $text =
'Qty for order line id '.$lineid.
' is '.$qty.
'. However in the shipments with status Expedition::STATUS_CLOSED='.self::STATUS_CLOSED.
' we have qty = '.$order->expeditions[$lineid].
', so we can t close order';
2134 if ($shipments_match_order) {
2135 dol_syslog(
"Qty for the ".count($order->lines).
" lines of the origin order is same than qty for lines in the shipment we close (shipments_match_order is true), with new status Expedition::STATUS_CLOSED=".self::STATUS_CLOSED.
', so we close order');
2137 $order->cloture($user);
2145 if (!$error &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) {
2146 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
2148 $langs->load(
"agenda");
2152 $sql =
"SELECT cd.fk_product, cd.subprice,";
2153 $sql .=
" ed.rowid, ed.qty, ed.fk_entrepot,";
2155 $sql .=
" edb.rowid as edbrowid, edb.eatby, edb.sellby, edb.batch, edb.qty as edbqty, edb.fk_origin_stock";
2156 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commandedet as cd,";
2157 $sql .=
" ".MAIN_DB_PREFIX.
"expeditiondet as ed";
2158 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"expeditiondet_batch as edb on edb.fk_expeditiondet = ed.rowid";
2159 $sql .=
" INNER JOIN ".MAIN_DB_PREFIX.
"expedition as e ON ed.fk_expedition = e.rowid";
2160 $sql .=
" WHERE ed.fk_expedition = ".((int) $this->
id);
2161 $sql .=
" AND cd.rowid = ed.fk_origin_line";
2163 dol_syslog(get_class($this).
"::valid select details", LOG_DEBUG);
2166 $cpt = $this->
db->num_rows(
$resql);
2167 for ($i = 0; $i < $cpt; $i++) {
2168 $obj = $this->
db->fetch_object(
$resql);
2169 if (empty($obj->edbrowid)) {
2172 $qty = $obj->edbqty;
2177 dol_syslog(get_class($this).
"::valid movement index ".$i.
" ed.rowid=".$obj->rowid.
" edb.rowid=".$obj->edbrowid);
2180 $mouvS->origin = &$this;
2181 $mouvS->setOrigin($this->element, $this->
id);
2183 if (empty($obj->edbrowid)) {
2187 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans(
"ShipmentClassifyClosedInDolibarr", $obj->ref));
2189 $this->error = $mouvS->error;
2190 $this->errors = $mouvS->errors;
2198 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, $qty, $obj->subprice, $langs->trans(
"ShipmentClassifyClosedInDolibarr", $obj->ref),
'', $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch, $obj->fk_origin_stock);
2200 $this->error = $mouvS->error;
2201 $this->errors = $mouvS->errors;
2208 $this->error = $this->
db->lasterror();
2215 $result = $this->
call_trigger(
'SHIPPING_CLOSED', $user);
2226 $this->
db->commit();
2232 $this->
db->rollback();
2249 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'expedition SET fk_statut=2, billed=1';
2250 $sql .=
" WHERE rowid = ".((int) $this->
id).
' AND fk_statut > 0';
2258 $result = $this->
call_trigger(
'SHIPPING_BILLED', $user);
2264 $this->errors[] = $this->
db->lasterror;
2267 if (empty($error)) {
2268 $this->
db->commit();
2273 $this->
db->rollback();
2285 global $conf, $langs, $user;
2290 if ($this->statut == self::STATUS_VALIDATED) {
2296 $oldbilled = $this->billed;
2298 $sql =
'UPDATE '.MAIN_DB_PREFIX.
'expedition SET fk_statut=1';
2299 $sql .=
" WHERE rowid = ".((int) $this->
id).
' AND fk_statut > 0';
2307 if (!$error &&
isModEnabled(
'stock') && !empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT_CLOSE)) {
2308 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
2310 $langs->load(
"agenda");
2314 $sql =
"SELECT cd.fk_product, cd.subprice,";
2315 $sql .=
" ed.rowid, ed.qty, ed.fk_entrepot,";
2316 $sql .=
" edb.rowid as edbrowid, edb.eatby, edb.sellby, edb.batch, edb.qty as edbqty, edb.fk_origin_stock";
2317 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commandedet as cd,";
2318 $sql .=
" ".MAIN_DB_PREFIX.
"expeditiondet as ed";
2319 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"expeditiondet_batch as edb on edb.fk_expeditiondet = ed.rowid";
2320 $sql .=
" WHERE ed.fk_expedition = ".((int) $this->
id);
2321 $sql .=
" AND cd.rowid = ed.fk_origin_line";
2323 dol_syslog(get_class($this).
"::valid select details", LOG_DEBUG);
2326 $cpt = $this->
db->num_rows(
$resql);
2327 for ($i = 0; $i < $cpt; $i++) {
2328 $obj = $this->
db->fetch_object(
$resql);
2329 if (empty($obj->edbrowid)) {
2332 $qty = $obj->edbqty;
2337 dol_syslog(get_class($this).
"::reopen expedition movement index ".$i.
" ed.rowid=".$obj->rowid.
" edb.rowid=".$obj->edbrowid);
2341 $mouvS->origin = &$this;
2342 $mouvS->setOrigin($this->element, $this->
id);
2344 if (empty($obj->edbrowid)) {
2348 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, -$qty, $obj->subprice, $langs->trans(
"ShipmentUnClassifyCloseddInDolibarr", $numref));
2350 $this->error = $mouvS->error;
2351 $this->errors = $mouvS->errors;
2359 $result = $mouvS->livraison($user, $obj->fk_product, $obj->fk_entrepot, -$qty, $obj->subprice, $langs->trans(
"ShipmentUnClassifyCloseddInDolibarr", $numref),
'', $this->db->jdate($obj->eatby), $this->db->jdate($obj->sellby), $obj->batch, $obj->fk_origin_stock);
2361 $this->error = $mouvS->error;
2362 $this->errors = $mouvS->errors;
2369 $this->error = $this->
db->lasterror();
2376 $result = $this->
call_trigger(
'SHIPPING_REOPEN', $user);
2383 $this->errors[] = $this->
db->lasterror();
2387 $this->
db->commit();
2391 $this->billed = $oldbilled;
2392 $this->
db->rollback();
2408 public function generateDocument($modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0, $moreparams =
null)
2412 $outputlangs->load(
"products");
2417 if (!empty($this->model_pdf)) {
2418 $modele = $this->model_pdf;
2419 } elseif (!empty($this->modelpdf)) {
2420 $modele = $this->modelpdf;
2421 } elseif (!empty($conf->global->EXPEDITION_ADDON_PDF)) {
2422 $modele = $conf->global->EXPEDITION_ADDON_PDF;
2426 $modelpath =
"core/modules/expedition/doc/";
2430 return $this->
commonGenerateDocument($modelpath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams);
2460 public $element =
'expeditiondet';
2465 public $table_element =
'expeditiondet';
2492 public $fk_origin_line;
2497 public $fk_expedition;
2512 public $qty_shipped;
2521 public $detail_batch;
2525 public $details_entrepot;
2531 public $entrepot_id;
2548 public $product_ref;
2559 public $product_label;
2571 public $product_desc;
2577 public $product_type = 0;
2588 public $weight_units;
2594 public $length_units;
2600 public $surface_units;
2606 public $volume_units;
2609 public $remise_percent;
2630 public $total_localtax1;
2635 public $total_localtax2;
2656 $sql =
'SELECT ed.rowid, ed.fk_expedition, ed.fk_entrepot, ed.fk_origin_line, ed.qty, ed.rang';
2657 $sql .=
' FROM '.MAIN_DB_PREFIX.$this->table_element.
' as ed';
2658 $sql .=
' WHERE ed.rowid = '.((int) $rowid);
2659 $result = $this->
db->query($sql);
2661 $objp = $this->
db->fetch_object($result);
2662 $this->
id = $objp->rowid;
2663 $this->fk_expedition = $objp->fk_expedition;
2664 $this->entrepot_id = $objp->fk_entrepot;
2665 $this->fk_origin_line = $objp->fk_origin_line;
2666 $this->qty = $objp->qty;
2667 $this->rang = $objp->rang;
2669 $this->
db->free($result);
2673 $this->errors[] = $this->
db->lasterror();
2674 $this->error = $this->
db->lasterror();
2686 public function insert($user, $notrigger = 0)
2688 global $langs, $conf;
2693 if (empty($this->fk_expedition) || empty($this->fk_origin_line) || !is_numeric($this->qty)) {
2694 $this->error =
'ErrorMandatoryParametersNotProvided';
2700 if (empty($this->rang)) {
2705 $ranktouse = $this->rang;
2706 if ($ranktouse == -1) {
2707 $rangmax = $this->
line_max($this->fk_expedition);
2708 $ranktouse = $rangmax + 1;
2711 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.
"expeditiondet (";
2712 $sql .=
"fk_expedition";
2713 $sql .=
", fk_entrepot";
2714 $sql .=
", fk_origin_line";
2717 $sql .=
") VALUES (";
2718 $sql .= $this->fk_expedition;
2719 $sql .=
", ".(empty($this->entrepot_id) ?
'NULL' : $this->entrepot_id);
2720 $sql .=
", ".((int) $this->fk_origin_line);
2721 $sql .=
", ".price2num($this->qty,
'MS');
2722 $sql .=
", ".((int) $ranktouse);
2725 dol_syslog(get_class($this).
"::insert", LOG_DEBUG);
2728 $this->
id = $this->
db->last_insert_id(MAIN_DB_PREFIX.
"expeditiondet");
2737 if (!$error && !$notrigger) {
2739 $result = $this->
call_trigger(
'LINESHIPPING_INSERT', $user);
2747 foreach ($this->errors as $errmsg) {
2748 dol_syslog(get_class($this).
"::delete ".$errmsg, LOG_ERR);
2749 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2757 $this->
db->rollback();
2760 $this->
db->commit();
2772 public function delete($user =
null, $notrigger = 0)
2782 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"expeditiondet_batch";
2783 $sql .=
" WHERE fk_expeditiondet = ".((int) $this->
id);
2785 if (!$this->
db->query($sql)) {
2786 $this->errors[] = $this->
db->lasterror().
" - sql=$sql";
2791 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"expeditiondet";
2792 $sql .=
" WHERE rowid = ".((int) $this->
id);
2794 if (!$error && $this->
db->query($sql)) {
2799 $this->errors[] = $this->error;
2803 if (!$error && !$notrigger) {
2805 $result = $this->
call_trigger(
'LINESHIPPING_DELETE', $user);
2807 $this->errors[] = $this->error;
2813 $this->errors[] = $this->
db->lasterror().
" - sql=$sql";
2818 $this->
db->commit();
2821 foreach ($this->errors as $errmsg) {
2822 dol_syslog(get_class($this).
"::delete ".$errmsg, LOG_ERR);
2823 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2825 $this->
db->rollback();
2837 public function update($user =
null, $notrigger = 0)
2843 dol_syslog(get_class($this).
"::update id=$this->id, entrepot_id=$this->entrepot_id, product_id=$this->fk_product, qty=$this->qty");
2848 if (empty($this->qty)) {
2855 $expedition_batch_id =
null;
2856 if (is_array($this->detail_batch)) {
2857 if (count($this->detail_batch) > 1) {
2858 dol_syslog(get_class($this).
'::update only possible for one batch', LOG_ERR);
2859 $this->errors[] =
'ErrorBadParameters';
2862 $batch = $this->detail_batch[0]->batch;
2863 $batch_id = $this->detail_batch[0]->fk_origin_stock;
2864 $expedition_batch_id = $this->detail_batch[0]->id;
2865 if ($this->entrepot_id != $this->detail_batch[0]->entrepot_id) {
2866 dol_syslog(get_class($this).
'::update only possible for batch of same warehouse', LOG_ERR);
2867 $this->errors[] =
'ErrorBadParameters';
2870 $qty =
price2num($this->detail_batch[0]->qty);
2872 } elseif (!empty($this->detail_batch)) {
2873 $batch = $this->detail_batch->batch;
2874 $batch_id = $this->detail_batch->fk_origin_stock;
2875 $expedition_batch_id = $this->detail_batch->id;
2876 if ($this->entrepot_id != $this->detail_batch->entrepot_id) {
2877 dol_syslog(get_class($this).
'::update only possible for batch of same warehouse', LOG_ERR);
2878 $this->errors[] =
'ErrorBadParameters';
2881 $qty =
price2num($this->detail_batch->qty);
2885 if (!isset($this->
id) || !isset($this->entrepot_id)) {
2886 dol_syslog(get_class($this).
'::update missing line id and/or warehouse id', LOG_ERR);
2887 $this->errors[] =
'ErrorMandatoryParametersNotProvided';
2895 dol_syslog(get_class($this).
"::update expedition batch id=$expedition_batch_id, batch_id=$batch_id, batch=$batch");
2897 if (empty($batch_id) || empty($this->fk_product)) {
2898 dol_syslog(get_class($this).
'::update missing fk_origin_stock (batch_id) and/or fk_product', LOG_ERR);
2899 $this->errors[] =
'ErrorMandatoryParametersNotProvided';
2906 if (!$error && ($lotArray = $shipmentlinebatch->fetchAll($this->id)) < 0) {
2907 $this->errors[] = $this->
db->lasterror().
" - ExpeditionLineBatch::fetchAll";
2911 foreach ($lotArray as $lot) {
2912 if ($expedition_batch_id != $lot->id) {
2913 $remainingQty += $lot->qty;
2916 $qty += $remainingQty;
2921 require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
2923 if ($lot->fetch(0, $this->fk_product, $batch) < 0) {
2924 $this->errors[] = $lot->errors;
2927 if (!$error && !empty($expedition_batch_id)) {
2929 $sql =
"DELETE FROM ".MAIN_DB_PREFIX.
"expeditiondet_batch";
2930 $sql .=
" WHERE fk_expeditiondet = ".((int) $this->
id);
2931 $sql .=
" AND rowid = ".((int) $expedition_batch_id);
2933 if (!$this->
db->query($sql)) {
2934 $this->errors[] = $this->
db->lasterror().
" - sql=$sql";
2938 if (!$error && $this->detail_batch->qty > 0) {
2940 if (isset($lot->id)) {
2942 $shipmentLot->batch = $lot->batch;
2943 $shipmentLot->eatby = $lot->eatby;
2944 $shipmentLot->sellby = $lot->sellby;
2945 $shipmentLot->entrepot_id = $this->detail_batch->entrepot_id;
2946 $shipmentLot->qty = $this->detail_batch->qty;
2947 $shipmentLot->fk_origin_stock = $batch_id;
2948 if ($shipmentLot->create($this->id) < 0) {
2949 $this->errors[] = $shipmentLot->errors;
2958 $sql =
"UPDATE ".MAIN_DB_PREFIX.$this->table_element.
" SET";
2959 $sql .=
" fk_entrepot = ".($this->entrepot_id > 0 ? $this->entrepot_id :
'null');
2960 $sql .=
" , qty = ".((float)
price2num($qty,
'MS'));
2961 $sql .=
" WHERE rowid = ".((int) $this->
id);
2963 if (!$this->
db->query($sql)) {
2964 $this->errors[] = $this->
db->lasterror().
" - sql=$sql";
2973 $this->errors[] = $this->error;
2979 if (!$error && !$notrigger) {
2981 $result = $this->
call_trigger(
'LINESHIPPING_MODIFY', $user);
2983 $this->errors[] = $this->error;
2989 $this->
db->commit();
2992 foreach ($this->errors as $errmsg) {
2993 dol_syslog(get_class($this).
"::update ".$errmsg, LOG_ERR);
2994 $this->error .= ($this->error ?
', '.$errmsg : $errmsg);
2996 $this->
db->rollback();
Class to manage customers orders.
const STATUS_SHIPMENTONPROCESS
Shipment on process.
const STATUS_VALIDATED
Validated status.
Parent class of all other business classes (invoices, contracts, proposals, orders,...
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...
deleteEcmFiles($mode=0)
Delete related files of object in database.
add_object_linked($origin=null, $origin_id=null, $f_user=null, $notrigger=0)
Add an object link into llx_element_element.
commonGenerateDocument($modelspath, $modele, $outputlangs, $hidedetails, $hidedesc, $hideref, $moreparams=null)
Common function for all objects extending CommonObject for generating documents.
fetch_thirdparty($force_thirdparty_id=0)
Load the third party of object, from id $this->socid or $this->fk_soc, into this->thirdparty.
deleteObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $rowid='', $f_user=null, $notrigger=0)
Delete all links between an object $this.
setStatut($status, $elementId=null, $elementType='', $trigkey='', $fieldstatus='fk_statut')
Set status of an object.
deleteExtraFields()
Delete all extra fields values for the current object.
static commonReplaceThirdparty(DoliDB $dbs, $origin_id, $dest_id, array $tables, $ignoreerrors=0)
Function used to replace a thirdparty id with another one.
fetchObjectLinked($sourceid=null, $sourcetype='', $targetid=null, $targettype='', $clause='OR', $alsosametype=1, $orderby='sourcetype', $loadalsoobjects=1)
Fetch array of objects linked to current object (object of enabled modules only).
line_max($fk_parent_line=0)
Get max value used for position of line (rang)
fetch_origin()
Read linked origin object.
insertExtraFields($trigger='', $userused=null)
Add/Update all extra fields values for the current object.
call_trigger($triggerName, $user)
Call trigger based on this instance.
Parent class for class inheritance lines of business objects This class is useless for the moment so ...
Class to manage receptions.
Class to manage Dolibarr database access.
Class to manage shipments.
getNomUrl($withpicto=0, $option='', $max=0, $short=0, $notooltip=0, $save_lastsearch_value=-1)
Return clicable link of object (with eventually picto)
create_delivery($user)
Create a delivery receipt from a shipment.
deleteline($user, $lineid)
Delete detail line.
getUrlTrackingStatus($value='')
Forge an set tracking url.
setClosed()
Classify the shipping as closed.
__construct($db)
Constructor.
list_delivery_methods($id='')
Fetch all deliveries method and return an array.
create($user, $notrigger=0)
Create expedition en base.
LibStatut($status, $mode)
Return label of a status.
setBilled()
Classify the shipping as invoiced (used when WORKFLOW_BILL_ON_SHIPMENT is on)
addline_batch($dbatch, $array_options=0)
Add a shipment line with batch record.
generateDocument($modele, $outputlangs, $hidedetails=0, $hidedesc=0, $hideref=0, $moreparams=null)
Create a document onto disk according to template module.
setDeliveryDate($user, $delivery_date)
Set the planned delivery date.
const STATUS_DRAFT
Draft status.
const STATUS_CANCELED
Canceled status.
getLibStatut($mode=0)
Return status label.
set_date_livraison($user, $delivery_date)
Set delivery date.
initAsSpecimen()
Initialise an instance with random values.
getNextNumRef($soc)
Return next expedition ref.
const STATUS_CLOSED
Closed status.
const STATUS_VALIDATED
Validated status.
create_line_batch($line_ext, $array_options=0)
Create the detail of the expedition line.
valid($user, $notrigger=0)
Validate object and update stock if option enabled.
update($user=null, $notrigger=0)
Update database.
cancel($notrigger=0, $also_update_stock=false)
Cancel shipment.
fetch_delivery_methods()
Fetch deliveries method and return an array.
addline($entrepot_id, $id, $qty, $array_options=0)
Add an expedition line.
fetch($id, $ref='', $ref_ext='', $notused='')
Get object and lines from database.
reOpen()
Classify the shipping as validated/opened.
static replaceThirdparty(DoliDB $dbs, $origin_id, $dest_id)
Function used to replace a thirdparty id with another one.
create_line($entrepot_id, $origin_line_id, $qty, $rang=0, $array_options=null)
Create a expedition line.
Classe to manage lines of shipment.
fetch($rowid)
Load line expedition.
__construct($db)
Constructor.
insert($user, $notrigger=0)
Insert line into database.
update($user=null, $notrigger=0)
Update a line in database.
CRUD class for batch number management within shipment.
Class to manage stock movements.
Class to manage order lines.
Class to manage products or services.
Manage record for batch number management.
Class with list of lots and properties.
Class to manage third parties objects (customers, suppliers, prospects...)
trait CommonIncoterm
Superclass for incoterm classes.
if(isModEnabled('facture') &&!empty($user->rights->facture->lire)) if((isModEnabled('fournisseur') &&empty($conf->global->MAIN_USE_NEW_SUPPLIERMOD) && $user->hasRight("fournisseur", "facture", "lire"))||(isModEnabled('supplier_invoice') && $user->hasRight("supplier_invoice", "lire"))) if(isModEnabled('don') &&!empty($user->rights->don->lire)) if(isModEnabled('tax') &&!empty($user->rights->tax->charges->lire)) if(isModEnabled('facture') &&isModEnabled('commande') && $user->hasRight("commande", "lire") &&empty($conf->global->WORKFLOW_DISABLE_CREATE_INVOICE_FROM_ORDER)) $resql
Social contributions to pay.
dol_delete_dir_recursive($dir, $count=0, $nophperrors=0, $onlysub=0, &$countdeleted=0, $indexdatabase=1, $nolog=0)
Remove a directory $dir and its subdirectories (or only files and subdirectories)
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter=null, $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0, $relativename="", $donotfollowsymlinks=0, $nbsecondsold=0)
Scan a directory and return a list of files/directories.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_print_error($db='', $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=false, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return dolibarr global constant int value.
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.
get_localtax($vatrate, $local, $thirdparty_buyer="", $thirdparty_seller="", $vatnpr=0)
Return localtax rate for a particular vat, when selling a product with vat $vatrate,...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
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.
$conf db
API class for accounts.