42require
'../main.inc.php';
52require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formfile.class.php';
53require_once DOL_DOCUMENT_ROOT .
'/expedition/class/expedition.class.php';
54require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
55require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
56require_once DOL_DOCUMENT_ROOT .
'/core/lib/sendings.lib.php';
57require_once DOL_DOCUMENT_ROOT .
'/core/modules/expedition/modules_expedition.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
59require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
60require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/entrepot.class.php';
61require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/productlot.class.php';
62require_once DOL_DOCUMENT_ROOT .
'/commande/class/commande.class.php';
64 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
67 require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
70 require_once DOL_DOCUMENT_ROOT .
'/product/class/productbatch.class.php';
73 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
74 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
78$langs->loadLangs(array(
"sendings",
"companies",
"bills",
'orders',
'stocks',
'other',
'propal',
'productbatch'));
81 $langs->load(
'incoterm');
84 $langs->load(
'productbatch');
88$origin =
GETPOST(
'origin',
'alpha');
93if (empty($origin_id) && !empty($origin)) {
96if (empty($origin_id) && !empty($origin)) {
105$action =
GETPOST(
'action',
'alpha');
106$confirm =
GETPOST(
'confirm',
'alpha');
107$cancel =
GETPOST(
'cancel',
'alpha');
110$backtopage =
GETPOST(
'backtopage',
'alpha');
122$extrafields->fetch_name_optionals_label(
$object->table_element);
123$extrafields->fetch_name_optionals_label(
$object->table_element_line);
124$extrafields->fetch_name_optionals_label($objectorder->table_element_line);
127include DOL_DOCUMENT_ROOT .
'/core/actions_fetchobject.inc.php';
130$usercanread = $user->hasRight(
"expedition",
"lire");
131$usercancreate = $user->hasRight(
"expedition",
"creer");
132$usercandelete = $user->hasRight(
"expedition",
"supprimer");
135$hookmanager->initHooks(array(
'expeditioncard',
'globalcard'));
146 $socid = $user->socid;
151$permissiondellink = $user->hasRight(
'expedition',
'delivery',
'creer');
152$permissiontoadd = $user->hasRight(
'expedition',
'creer');
153$permissiontoedit = $usercancreate;
154$permissiontoeditextra = $permissiontoadd;
155if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
157 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
160$upload_dir = $conf->expedition->dir_output .
'/sending';
166$shipping_method_id =
null;
176$parameters = array();
177$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
182if (empty($reshook)) {
183 $backurlforlist = DOL_URL_ROOT.
'/expedition/list.php';
185 if (empty($backtopage) || ($cancel && empty($id))) {
186 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
187 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
188 $backtopage = $backurlforlist;
190 $backtopage = DOL_URL_ROOT.
'/expedition/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
196 if (!empty($backtopageforcancel)) {
197 header(
"Location: ".$backtopageforcancel);
199 } elseif (!empty($backtopage)) {
200 header(
"Location: ".$backtopage);
208 if ($origin_id > 0) {
209 if ($origin ==
'commande') {
210 header(
"Location: " . DOL_URL_ROOT .
'/expedition/shipment.php?id=' . ((
int) $origin_id));
219 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
222 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
225 if ($action ==
'setdraft' && $permissiontoadd) {
227 $result =
$object->setDraft($user, 0);
231 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
236 if ($action ==
'reopen' && $permissiontoadd) {
242 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
248 if ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $permissiontoadd) {
252 if ($action ==
'setref_customer' && $permissiontoadd) {
258 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'SHIPPING_MODIFY');
261 $action =
'editref_customer';
263 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
268 if ($action ==
'update_extras' && $permissiontoeditextra) {
271 $attribute_name =
GETPOST(
'attribute',
'aZ09');
274 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
281 $result =
$object->updateExtraField($attribute_name,
'SHIPPING_MODIFY');
289 $action =
'edit_extras';
294 if ($action ==
'add' && $permissiontoadd) {
297 if ($origin && $origin_id > 0) {
299 $classname = ucfirst($origin);
300 $objectsrc =
new $classname($db);
301 '@phan-var-force Facture|Commande $objectsrc';
302 $objectsrc->fetch($origin_id);
303 $object->socid = $objectsrc->socid;
308 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
317 $object->origin_type = $origin;
318 $object->origin_id = $origin_id;
328 $object->date_delivery = $date_delivery;
329 $object->date_shipping = $date_shipping;
336 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
341 $ret = $extrafields->setOptionalsFromPost(
null, $object);
355 if ($origin && $origin_id > 0) {
357 $object->origin_type = $origin;
358 $object->origin_id = $origin_id;
368 $object->date_delivery = $date_delivery;
369 $object->date_shipping = $date_shipping;
376 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
379 $classname = ucfirst(
$object->origin_type);
380 $objectsrc =
new $classname($db);
381 '@phan-var-force Facture|Commande $objectsrc';
382 $objectsrc->fetch(
$object->origin_id);
384 $object->socid = $objectsrc->socid;
385 $object->fk_delivery_address = $objectsrc->fk_delivery_address;
389 $batch_line = array();
390 $stockLine = array();
391 $array_options = array();
393 $num = count($objectsrc->lines);
396 $product_batch_used = array();
398 for ($i = 0; $i < $num; $i++) {
406 $batch =
"batchl" . $i .
"_0";
407 $stockLocation =
"ent1" . $i .
"_0";
410 $is_batch_or_serial = 0;
411 if (!empty($objectsrc->lines[$i]->fk_product)) {
412 $resultFetch = $product->fetch($objectsrc->lines[$i]->fk_product,
'',
'',
'', 1, 1, 1);
413 if ($resultFetch < 0) {
416 $is_batch_or_serial = $product->status_batch;
420 if (
isModEnabled(
'productbatch') && $objectsrc->lines[$i]->product_tobatch) {
421 if (GETPOSTISSET($batch)) {
424 while (GETPOSTISSET($batch)) {
427 $sub_qty[$j][
'id_batch'] =
GETPOSTINT($batch);
428 $subtotalqty += $sub_qty[$j][
'q'];
430 if ($is_batch_or_serial == 2 && ($sub_qty[$j][
'q'] > 1 || ($sub_qty[$j][
'q'] > 0 && in_array($sub_qty[$j][
'id_batch'], $product_batch_used)))) {
431 setEventMessages($langs->trans(
"TooManyQtyForSerialNumber", $product->ref,
''),
null,
'errors');
436 if ($is_batch_or_serial == 2 && $sub_qty[$j][
'q'] > 0) {
438 $product_batch_used[$j] = $sub_qty[$j][
'id_batch'];
442 $batch =
"batchl" . $i .
"_" . $j;
443 $qty =
"qtyl" . $i .
'_' . $j;
446 $batch_line[$i][
'detail'] = $sub_qty;
447 $batch_line[$i][
'qty'] = $subtotalqty;
450 $totalqty += $subtotalqty;
457 setEventMessages($langs->trans(
"StockIsRequiredToChooseWhichLotToUse") .
' (' . $langs->trans(
"Line") .
' ' .
GETPOSTINT($idl) .
')',
null,
'errors');
461 } elseif (GETPOSTISSET($stockLocation)) {
464 while (GETPOSTISSET($stockLocation)) {
467 $stockLine[$i][$j][
'warehouse_id'] =
GETPOSTINT($stockLocation);
468 $stockLine[$i][$j][
'ix_l'] =
GETPOSTINT($idl);
474 $stockLocation =
"ent1" . $i .
"_" . $j;
475 $qty =
"qtyl" . $i .
'_' . $j;
486 if (
getDolGlobalInt(
"MAIN_DONT_SHIP_MORE_THAN_ORDERED") && $subtotalqty > $objectsrc->lines[$i]->qty) {
487 setEventMessages($langs->trans(
"ErrorTooMuchShipped", $i + 1),
null,
'errors');
493 $array_options[$i] = $extrafields->getOptionalsFromPost(
$object->table_element_line, (
string) $i);
495 if (isset($extrafields->attributes[
$object->table_element_line][
'label']) && is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
497 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
498 unset($_POST[
"options_" . $key]);
503 if (($totalqty > 0 ||
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS')) && !$error) {
504 $selected_subtotal_lines =
GETPOST(
'subtotal_toselect',
'array:int');
505 for ($i = 0; $i < $num; $i++) {
508 if (!isset($batch_line[$i])) {
510 if (isset($stockLine[$i])) {
512 $nbstockline = count($stockLine[$i]);
513 for ($j = 0; $j < $nbstockline; $j++) {
514 if ($stockLine[$i][$j][
'qty'] > 0 || ($stockLine[$i][$j][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
515 $ret =
$object->addline($stockLine[$i][$j][
'warehouse_id'], $stockLine[$i][$j][
'ix_l'], (
float) $stockLine[$i][$j][
'qty'], $array_options[$i]);
527 if ($entrepot_id < 0) {
530 if (!($objectsrc->lines[$i]->fk_product > 0)) {
541 if (
isModEnabled(
'subtotals') && $objectsrc->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE && in_array($objectsrc->lines[$i]->id, $selected_subtotal_lines)) {
542 $object->addSubtotalLine($langs, $objectsrc->lines[$i]->desc, (
int) $objectsrc->lines[$i]->qty, $objectsrc->lines[$i]->extraparams, $objectsrc->lines[$i]->id);
547 if ($batch_line[$i][
'qty'] > 0 || ($batch_line[$i][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
548 $origin_line_id = (int) $batch_line[$i][
'ix_l'];
550 $res = $origin_line->fetch($origin_line_id);
555 $ret =
$object->addline_batch($batch_line[$i], $array_options[$i], $origin_line);
564 $ret = $extrafields->setOptionalsFromPost(
null, $object);
577 $labelfieldmissing = $langs->transnoentitiesnoconv(
"QtyToShip");
579 $labelfieldmissing .=
'/' . $langs->transnoentitiesnoconv(
"Warehouse");
581 setEventMessages($langs->trans(
"ErrorFieldRequired", $labelfieldmissing),
null,
'errors');
588 foreach (
$object->lines as $line) {
589 $objectsrc_line =
new $objectsrc->class_element_line($db);
590 '@phan-var-force CommonObjectLine $objectsrc_line';
591 $objectsrc_line->fetch($line->origin_line_id);
592 $line->extraparams = $objectsrc_line->extraparams;
593 $line->setExtraParameters();
595 header(
"Location: card.php?id=" .
$object->id);
602 } elseif ($action ==
'create_delivery' &&
getDolGlobalInt(
'MAIN_SUBMODULE_DELIVERY') && $user->hasRight(
'expedition',
'delivery',
'creer')) {
606 $result =
$object->create_delivery($user);
610 header(
"Location: " . DOL_URL_ROOT .
'/delivery/card.php?action=create_delivery&token=' .
newToken() .
'&id=' . $result);
618 $action ==
'confirm_valid' && $confirm ==
'yes' && ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
619 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate')))
623 $result =
$object->valid($user);
630 $outputlangs = $langs;
633 $newlang =
GETPOST(
'lang_id',
'aZ09');
636 $newlang =
$object->thirdparty->default_lang;
638 if (!empty($newlang)) {
640 $outputlangs->setDefaultLang($newlang);
645 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
651 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
652 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
653 $result =
$object->cancel($user, 0, (
bool) $also_update_stock);
655 $result =
$object->setStatut(-1);
659 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'supprimer')) {
660 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
661 $result =
$object->delete($user, 0, (
bool) $also_update_stock);
663 header(
"Location: " . DOL_URL_ROOT .
'/expedition/index.php');
677 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $permissiontoadd) {
678 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'), $user);
681 $object->line_order(
true,
'ASC',
false);
683 $outputlangs = $langs;
686 $newlang =
GETPOST(
'lang_id',
'aZ09');
689 $newlang =
$object->thirdparty->default_lang;
691 if (!empty($newlang)) {
693 $outputlangs->setDefaultLang($newlang);
697 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
700 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
705 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
707 $result =
$object->deleteLine($user, $lineid);
712 $outputlangs = $langs;
715 $newlang =
GETPOST(
'lang_id',
'aZ09');
718 $newlang =
$object->thirdparty->default_lang;
720 if (!empty($newlang)) {
722 $outputlangs->setDefaultLang($newlang);
726 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
729 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
734 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
735 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
737 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
742 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
743 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
745 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
750 } elseif ($action ==
'setdate_livraison' && $user->hasRight(
'expedition',
'creer')) {
754 $result =
$object->setDeliveryDate($user, $datedelivery);
758 } elseif ($action ==
'setdate_shipping' && $user->hasRight(
'expedition',
'creer')) {
762 $result =
$object->setShippingDate($user, $dateshipping);
766 } elseif (in_array($action, array(
'settracking_number',
'settracking_url',
'settrueWeight',
'settrueWidth',
'settrueHeight',
'settrueDepth',
'setshipping_method_id')) && $user->hasRight(
'expedition',
'creer')) {
770 if ($action ==
'settracking_number') {
771 $object->tracking_number = trim(
GETPOST(
'tracking_number',
'alpha'));
773 if ($action ==
'settracking_url') {
774 $object->tracking_url = trim(
GETPOST(
'tracking_url',
'restricthtml'));
777 if ($action ==
'settrueWeight') {
781 if ($action ==
'settrueWidth') {
784 if ($action ==
'settrueHeight') {
788 if ($action ==
'settrueDepth') {
791 if ($action ==
'setshipping_method_id') {
795 if (
$object->update($user) >= 0) {
796 header(
"Location: card.php?id=" .
$object->id);
801 } elseif ($action ==
'classifybilled' && $permissiontoadd) {
803 $result =
$object->setBilled();
805 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
809 } elseif ($action ==
'classifyclosed' && $permissiontoadd) {
811 $result =
$object->setClosed();
813 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
817 } elseif ($action ==
'deleteline' && !empty($line_id) && $permissiontoadd) {
822 $line->fk_expedition =
$object->id;
824 $num_prod = count($lines);
825 for ($i = 0; $i < $num_prod; $i++) {
826 if ($lines[$i]->
id == $line_id) {
827 if (count($lines[$i]->details_entrepot) > 1) {
829 foreach ($lines[$i]->details_entrepot as $details_entrepot) {
830 $line->id = $details_entrepot->line_id;
831 if (!$error && $line->delete($user) < 0) {
837 $line->id = $line_id;
838 if (!$error && $line->delete($user) < 0) {
843 unset($_POST[
"lineid"]);
847 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
852 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'save')) {
857 if (!
$object->fetch($id) > 0) {
862 $qty =
GETPOST(
'qty',
'alpha');
865 $element_type =
'shipping';
871 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
872 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
874 if (is_array($extralabelsline)) {
876 foreach ($extralabelsline as $key => $value) {
877 unset($_POST[
"options_" . $key]);
886 $result =
$object->updatelinefree(
GETPOSTINT(
'lineid'), (
float) $qty, $element_type, $fk_product,
GETPOSTINT(
'units'), $rang, $description, $fk_parent, 0, $array_options);
891 $outputlangs = $langs;
894 $newlang =
GETPOST(
'lang_id',
'aZ09');
897 $newlang =
$object->thirdparty->default_lang;
899 if (!empty($newlang)) {
901 $outputlangs->setDefaultLang($newlang);
902 $outputlangs->load(
'products');
906 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
908 unset($_POST[
'qty']);
909 unset($_POST[
'units']);
914 } elseif ($origin && $origin_id > 0) {
922 $num_prod = count($lines);
923 for ($i = 0; $i < $num_prod; $i++) {
924 if ($lines[$i]->
id == $line_id) {
925 $update_done =
false;
927 $line->fk_expedition =
$object->id;
930 $line->array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
932 if (is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
933 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
934 unset($_POST[
"options_" . $key]);
937 $line->fk_product = $lines[$i]->fk_product;
938 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
940 foreach ($lines[$i]->detail_batch as $detail_batch) {
942 $batch =
"batchl" . $detail_batch->fk_expeditiondet .
"_" . $detail_batch->fk_origin_stock;
943 $qty =
"qtyl" . $detail_batch->fk_expeditiondet .
'_' . $detail_batch->id;
946 if (!empty($batch_id)) {
947 if ($lotStock->fetch($batch_id) > 0 && $line->fetch($detail_batch->fk_expeditiondet) > 0) {
948 if ($lines[$i]->entrepot_id != 0) {
950 $line->entrepot_id = $lotStock->warehouseid;
954 if (empty($line->detail_batch)) {
955 $line->detail_batch =
new stdClass();
958 $line->detail_batch->fk_origin_stock = $batch_id;
959 $line->detail_batch->batch = $lotStock->batch;
960 $line->detail_batch->id = $detail_batch->id;
961 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
962 $line->detail_batch->qty = $batch_qty;
963 if ($line->update($user) < 0) {
974 unset($_POST[$batch]);
979 $batch =
"batchl" . $line_id .
"_0";
980 $qty =
"qtyl" . $line_id .
"_0";
984 if ($batch_qty > 0 && !empty($batch_id)) {
985 if ($lotStock->fetch($batch_id) > 0) {
987 if ($lines[$i]->entrepot_id > 0) {
989 if ($lines[$i]->entrepot_id == $lotStock->warehouseid) {
990 $lineIdToAddLot = $line_id;
992 } elseif (count($lines[$i]->details_entrepot) > 1) {
994 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
995 if ($detail_entrepot->entrepot_id == $lotStock->warehouseid) {
996 $lineIdToAddLot = $detail_entrepot->line_id;
1000 if ($lineIdToAddLot) {
1002 if ($line->fetch($lineIdToAddLot) > 0) {
1003 $line->detail_batch->fk_origin_stock = $batch_id;
1004 $line->detail_batch->batch = $lotStock->batch;
1005 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
1006 $line->detail_batch->qty = $batch_qty;
1007 if ($line->update($user) < 0) {
1011 $update_done =
true;
1019 $line->origin_line_id = $lines[$i]->origin_line_id;
1020 $line->entrepot_id = $lotStock->warehouseid;
1022 $line->detail_batch[0]->fk_origin_stock = $batch_id;
1023 $line->detail_batch[0]->batch = $lotStock->batch;
1024 $line->detail_batch[0]->entrepot_id = $lotStock->warehouseid;
1025 $line->detail_batch[0]->qty = $batch_qty;
1026 if (
$object->create_line_batch($line, $line->array_options) < 0) {
1030 $update_done =
true;
1039 if ($lines[$i]->fk_product > 0) {
1041 if ($lines[$i]->entrepot_id == 0) {
1043 $stockLocation =
"entl" . $line_id;
1044 $qty =
"qtyl" . $line_id;
1045 $line->id = $line_id;
1046 $line->entrepot_id =
GETPOSTINT((
string) $stockLocation);
1048 if ($line->update($user) < 0) {
1052 unset($_POST[$stockLocation]);
1053 unset($_POST[$qty]);
1054 } elseif ($lines[$i]->entrepot_id > 0) {
1056 $stockLocation =
"entl" . $line_id;
1057 $qty =
"qtyl" . $line_id;
1058 $line->id = $line_id;
1059 $line->entrepot_id =
GETPOSTINT($stockLocation);
1061 if ($line->update($user) < 0) {
1065 unset($_POST[$stockLocation]);
1066 unset($_POST[$qty]);
1067 } elseif (count($lines[$i]->details_entrepot) > 1) {
1069 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
1071 $stockLocation =
"entl" . $detail_entrepot->line_id;
1072 $qty =
"qtyl" . $detail_entrepot->line_id;
1074 if (!empty($warehouse)) {
1075 $line->id = $detail_entrepot->line_id;
1076 $line->entrepot_id = $warehouse;
1078 if ($line->update($user) < 0) {
1082 $update_done =
true;
1085 unset($_POST[$stockLocation]);
1086 unset($_POST[$qty]);
1090 $qty =
"qtyl" . $line_id;
1091 $line->id = $line_id;
1093 $line->entrepot_id = 0;
1094 if ($line->update($user) < 0) {
1098 $update_done =
true;
1100 unset($_POST[$qty]);
1104 $qty =
"qtyl" . $line_id;
1105 $line->id = $line_id;
1107 $line->entrepot_id = 0;
1108 if ($line->update($user) < 0) {
1112 $update_done =
true;
1114 unset($_POST[$qty]);
1118 if (empty($update_done)) {
1119 $line->id = $lines[$i]->id;
1120 $line->insertExtraFields();
1125 unset($_POST[
"lineid"]);
1130 $outputlangs = $langs;
1133 $newlang =
GETPOST(
'lang_id',
'aZ09');
1136 $newlang =
$object->thirdparty->default_lang;
1138 if (!empty($newlang)) {
1139 $outputlangs =
new Translate(
"", $conf);
1140 $outputlangs->setDefaultLang($newlang);
1144 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1147 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1151 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'cancel',
'alpha') == $langs->trans(
"Cancel")) {
1152 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1154 } elseif ($action ==
'addline' && !$origin &&
getDolGlobalString(
'SHIPMENT_STANDALONE') && $usercancreate) {
1155 $langs->load(
'errors');
1157 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1161 $fk_elementdet =
'';
1162 $element_type =
'shipping';
1168 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1169 if ($prod_entry_mode ==
'free') {
1174 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1182 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1183 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1185 if (is_array($extralabelsline)) {
1187 foreach ($extralabelsline as $key => $value) {
1188 unset($_POST[
"options_".$key]);
1192 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1193 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
1198 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1202 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1205 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1206 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
1210 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1211 if ($combinations =
GETPOST(
'combinations',
'array')) {
1215 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1216 $idprod = $res->fk_product_child;
1217 $fk_product = $idprod;
1219 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1225 if (!$error && ($qty >= 0) && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1227 if (!empty($idprod) && $idprod > 0) {
1229 $prod->fetch($idprod);
1230 $desc = $prod->label;
1231 $description = $desc;
1234 $outputlangs = $langs;
1236 if (
GETPOST(
'lang_id',
'aZ09')) {
1237 $newlang =
GETPOST(
'lang_id',
'aZ09');
1239 if (empty($newlang)) {
1240 $newlang =
$object->thirdparty->default_lang;
1242 if (!empty($newlang)) {
1243 $outputlangs =
new Translate(
"", $conf);
1244 $outputlangs->setDefaultLang($newlang);
1247 $description = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1249 $description = $prod->description;
1254 $description = $line_desc;
1258 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1261 $outputlangs = $langs;
1263 if (
GETPOST(
'lang_id',
'alpha')) {
1264 $newlang =
GETPOST(
'lang_id',
'alpha');
1266 if (empty($newlang)) {
1267 $newlang =
$object->thirdparty->default_lang;
1269 if (!empty($newlang)) {
1270 $outputlangs =
new Translate(
"", $conf);
1271 $outputlangs->setDefaultLang($newlang);
1272 $outputlangs->load(
'products');
1274 if (!empty($prod->customcode)) {
1275 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode").
': '.$prod->customcode;
1277 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1280 if (!empty($prod->country_code)) {
1281 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1284 if (!empty($prod->customcode)) {
1285 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode").
': '.$prod->customcode;
1287 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1290 if (!empty($prod->country_code)) {
1291 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $langs, 0);
1297 $type = $prod->type;
1298 $fk_unit = $prod->fk_unit;
1300 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1303 $fk_unit =
GETPOST(
'units',
'alpha');
1304 $description = $desc;
1305 $fk_elementdet =
'';
1310 $result =
$object->addlinefree((
float) $qty, $element_type, $idprod, $fk_unit, min($rank, count(
$object->lines) + 1), $description, $fk_parent, $array_options);
1317 $outputlangs = $langs;
1318 $newlang =
GETPOST(
'lang_id',
'alpha');
1320 $newlang =
$object->thirdparty->default_lang;
1322 if (!empty($newlang)) {
1323 $outputlangs =
new Translate(
"", $conf);
1324 $outputlangs->setDefaultLang($newlang);
1326 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1329 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1333 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $permissiontoadd) {
1334 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
1338 $outputlangs = $langs;
1341 $newlang =
GETPOST(
'lang_id',
'aZ09');
1344 $newlang =
$object->thirdparty->default_lang;
1346 if (!empty($newlang)) {
1347 $outputlangs =
new Translate(
"", $conf);
1348 $outputlangs->setDefaultLang($newlang);
1350 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1353 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1358 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $permissiontoadd) {
1359 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
1363 $outputlangs = $langs;
1366 $newlang =
GETPOST(
'lang_id',
'aZ09');
1369 $newlang =
$object->thirdparty->default_lang;
1371 if (!empty($newlang)) {
1372 $outputlangs =
new Translate(
"", $conf);
1373 $outputlangs->setDefaultLang($newlang);
1375 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1378 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1385 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1391 $triggersendname =
'SHIPPING_SENTBYMAIL';
1393 $autocopy =
'MAIN_MAIL_AUTOCOPY_SHIPMENT_TO';
1394 $mode =
'emailfromshipment';
1395 $trackid =
'shi' .
$object->id;
1396 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1403$title =
$object->ref .
' - ' . $langs->trans(
"Card");
1404if ($action ==
'create') {
1405 $title = $langs->trans(
"NewSending");
1408$help_url =
'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Expediciones|DE:Modul_Lieferungen';
1410llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-expedition page-card');
1412if (empty($action)) {
1416$form =
new Form($db);
1422 $formproject =
null;
1425$product_static =
new Product($db);
1427$warehousestatic =
new Entrepot($db);
1432 print
'<br>' .$langs->trans(
"ShipmentCreationIsDoneFromOrder");
1439if ($action ==
'create' && $usercancreate) {
1447 $res = $soc->fetch($socid);
1450 $shipping_method_id = $soc->shipping_method_id;
1451 $note_private =
$object->getDefaultCreateValueFor(
'note_private');
1452 $note_public =
$object->getDefaultCreateValueFor(
'note_public');
1454 print
'<form name="crea_expedition" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
1455 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1456 print
'<input type="hidden" name="action" value="add">';
1457 print
'<input type="hidden" name="changecompany" value="0">';
1458 print
'<input type="hidden" name="originid" value="' .
$id .
'">';
1459 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
1463 print
'<table class="border centpercent">';
1467 print
'<td class="fieldrequired">' . $langs->trans(
'ThirdParty') .
'</td>';
1470 print $soc->getNomUrl(1);
1471 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1474 print
'<td class="valuefieldcreate">';
1475 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth175 maxwidth500 widthcentpercentminusxx');
1479 $(document).ready(function() {
1480 $("#socid").change(function() {
1481 console.log("We have changed the company - Reload page");
1482 var socid = $(this).val();
1484 $("input[name=action]").val("create");
1485 $("input[name=changecompany]").val("1");
1486 $("form[name=crea_expedition]").submit();
1491 print
' <a href="'.DOL_URL_ROOT.
'/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create').
'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span></a>';
1497 if (
isModEnabled(
'project') && is_object($formproject)) {
1499 if (empty($projectid) && !empty(
$object->fk_project)) {
1500 $projectid = (int)
$object->fk_project;
1503 $langs->load(
"projects");
1505 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1506 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1507 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1508 print
' <a class="paddingleft" href="' . DOL_URL_ROOT .
'/projet/card.php?socid=' . $soc->id .
'&action=create&status=1&backtopage=' . urlencode($_SERVER[
"PHP_SELF"] .
'?action=create&socid=' . $soc->id) .
'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
1514 print
'<tr><td>'.$langs->trans(
"DateShipping").
'</td>';
1515 print
'<td colspan="3">';
1516 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1517 $date_shipping = ($date_shipping ? $date_shipping :
$object->date_shipping);
1518 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1523 print
'<tr><td>'.$langs->trans(
"DateDeliveryPlanned").
'</td>';
1524 print
'<td colspan="3">';
1525 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1526 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1527 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1533 print $langs->trans(
"Weight");
1534 print
'</td><td colspan="3">';
1535 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1536 print
'<input name="weight" size="4" value="' .
GETPOST(
'weight') .
'"> ';
1537 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight",
GETPOST(
'weight_units'), 0, 2);
1538 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1539 print $form->textwithpicto($text, $htmltext);
1544 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1545 print
' </td><td colspan="3">';
1546 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1547 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1548 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1549 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1551 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1552 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1553 print $form->textwithpicto($text, $htmltext);
1557 print
"<tr><td>".$langs->trans(
"DeliveryMethod").
"</td>";
1558 print
'<td colspan="3">';
1559 $expe->fetch_delivery_methods();
1560 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1561 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1563 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1565 print
"</td></tr>\n";
1568 print
"<tr><td>".$langs->trans(
"TrackingNumber").
"</td>";
1569 print
'<td colspan="3">';
1570 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1571 print
'<input name="tracking_number" size="20" value="'.GETPOST(
'tracking_number',
'alpha').
'">';
1572 print
"</td></tr>\n";
1575 $parameters = array(
'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
'colspan' =>
' colspan="3"',
'cols' =>
'3',
'socid' => $socid);
1576 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $expe, $action);
1577 print $hookmanager->resPrint;
1579 if (empty($reshook)) {
1581 if (
$object->fetch_optionals() > 0) {
1582 $expe->array_options = array_merge($expe->array_options,
$object->array_options);
1584 print $expe->showOptionals($extrafields,
'edit', $parameters);
1590 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1).
'</label></td>';
1591 print
'<td colspan="3" class="maxwidthonsmartphone">';
1592 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1593 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1598 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
1600 if (is_array($list) && count($list) > 1) {
1601 print
"<tr><td>".$langs->trans(
"DefaultModel").
"</td>";
1602 print
'<td colspan="3">';
1603 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1604 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1605 print
"</td></tr>\n";
1611 print
'<td class="tdtop">';
1612 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext);
1614 print
'<td valign="top" colspan="2">';
1615 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1616 print $doleditor->Create(1);
1619 if (!$user->socid) {
1621 print
'<td class="tdtop">';
1622 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext);
1624 print
'<td valign="top" colspan="2">';
1625 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1626 print $doleditor->Create(1);
1634 print $form->buttonsSaveCancel(
"CreateDraft");
1637 } elseif ($origin) {
1638 $classname = ucfirst($origin);
1640 $object =
new $classname($db);
1642 '@phan-var-force Commande|Facture $object';
1645 if (
$object->fetch($origin_id)) {
1649 $author =
new User($db);
1650 $author->fetch(
$object->user_author_id);
1656 print
'<form action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
1657 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1658 print
'<input type="hidden" name="action" value="add">';
1659 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
1660 print
'<input type="hidden" name="origin_id" value="' .
$object->id .
'">';
1662 print
'<input type="hidden" name="entrepot_id" value="' .
GETPOSTINT(
'entrepot_id') .
'">';
1667 print
'<table class="border centpercent">';
1670 print
'<tr><td class="titlefieldcreate fieldrequired">';
1672 print $langs->trans(
"RefOrder");
1675 print $langs->trans(
"RefProposal");
1677 print
'</td><td colspan="3">';
1684 if ($origin ==
'commande') {
1685 print $langs->trans(
'RefCustomerOrder');
1686 } elseif ($origin ==
'propal') {
1687 print $langs->trans(
'RefCustomerOrder');
1689 print $langs->trans(
'RefCustomer');
1691 print
'</td><td colspan="3">';
1692 print
'<input type="text" name="ref_customer" value="' .
$object->ref_client .
'" />';
1697 print
'<tr><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Company') .
'</td>';
1698 print
'<td colspan="3">' . $soc->getNomUrl(1) .
'</td>';
1699 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1703 if (
isModEnabled(
'project') && is_object($formproject)) {
1705 if (empty($projectid) && !empty(
$object->fk_project)) {
1706 $projectid = (int)
$object->fk_project;
1708 if ($origin ==
'project') {
1711 $langs->load(
"projects");
1713 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1714 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1715 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1716 print
' <a class="paddingleft" href="' . DOL_URL_ROOT .
'/projet/card.php?socid=' . $soc->id .
'&action=create&status=1&backtopage=' . urlencode($_SERVER[
"PHP_SELF"] .
'?action=create&socid=' . $soc->id) .
'"><span class="fa fa-plus-circle valignmiddle"></span></a>';
1722 print
'<tr><td>' . $langs->trans(
"DateDeliveryPlanned") .
'</td>';
1723 print
'<td colspan="3">';
1724 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1725 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1726 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1731 print
'<tr><td>' . $langs->trans(
"DateShipping") .
'</td>';
1732 print
'<td colspan="3">';
1733 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1735 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1740 print
'<tr><td>' . $langs->trans(
"NotePublic") .
'</td>';
1741 print
'<td colspan="3">';
1742 $doleditor =
new DolEditor(
'note_public',
$object->note_public,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1743 print $doleditor->Create(1);
1747 if (
$object->note_private && !$user->socid) {
1748 print
'<tr><td>' . $langs->trans(
"NotePrivate") .
'</td>';
1749 print
'<td colspan="3">';
1750 $doleditor =
new DolEditor(
'note_private',
$object->note_private,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1751 print $doleditor->Create(1);
1757 print $langs->trans(
"Weight");
1758 print
'</td><td colspan="3">';
1759 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1762 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
GETPOST(
'weight_units'), 0, 2);
1763 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1764 print $form->textwithpicto($text, $htmltext);
1769 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1770 print
' </td><td colspan="3">';
1771 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1772 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1773 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1774 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1776 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1777 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1778 print $form->textwithpicto($text, $htmltext);
1782 print
"<tr><td>" . $langs->trans(
"DeliveryMethod") .
"</td>";
1783 print
'<td colspan="3">';
1784 $expe->fetch_delivery_methods();
1785 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1786 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1788 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1790 print
"</td></tr>\n";
1793 print
"<tr><td>" . $langs->trans(
"TrackingNumber") .
"</td>";
1794 print
'<td colspan="3">';
1795 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1796 print
'<input name="tracking_number" size="20" value="' .
GETPOST(
'tracking_number',
'alpha') .
'">';
1797 print
"</td></tr>\n";
1802 print
'<td><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1) .
'</label></td>';
1803 print
'<td colspan="3" class="maxwidthonsmartphone">';
1804 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1805 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1810 include_once DOL_DOCUMENT_ROOT .
'/core/modules/expedition/modules_expedition.php';
1812 if (is_array($list) && count($list) > 1) {
1813 print
"<tr><td>" . $langs->trans(
"DefaultModel") .
"</td>";
1814 print
'<td colspan="3">';
1815 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1816 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1817 print
"</td></tr>\n";
1825 if (isset($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && !empty($extrafields->attributes[
$object->table_element][
'label'])) {
1826 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
1827 if (array_key_exists(
'options_'.$key, $objectsav->array_options)) {
1828 $object->array_options[
'options_'.$key] = $objectsav->array_options[
'options_'.$key];
1832 $parameters = array(
1833 'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
1837 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
1847 $numAsked = count(
$object->lines);
1849 print
'<script type="text/javascript">' .
"\n";
1850 print
'jQuery(document).ready(function() {' .
"\n";
1851 print
'jQuery("#autofill").click(function() {';
1853 while ($i < $numAsked) {
1854 print
'jQuery("#qtyl' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1856 print
'jQuery("#qtyl' . $i .
'_' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1860 print
'return false; });' .
"\n";
1861 print
'jQuery("#autoreset").click(function() { console.log("Reset values to 0"); jQuery(".qtyl").val(0);' .
"\n";
1862 print
'return false; });' .
"\n";
1864 print
'</script>' .
"\n";
1868 print
'<div class="div-table-responsive-no-min">';
1869 print
'<table class="noborder centpercent">';
1874 $alreadyQtyBatchSetted = $alreadyQtySetted = array();
1876 $title_lines_to_disable = array();
1881 $title_lines_to_disable =
$object->getDisabledShippmentSubtotalLines();
1883 foreach (
$object->lines as $line) {
1884 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1885 $show_check_add_buttons =
true;
1890 print
'<tr class="liste_titre">';
1892 if (isset($show_check_add_buttons)) {
1893 print $form->showCheckAddButtons(
'checkforselect');
1895 print $langs->trans(
"Description");
1897 print
'<td class="center">' . $langs->trans(
"QtyOrdered") .
'</td>';
1898 print
'<td class="center">' . $langs->trans(
"QtyShipped") .
'</td>';
1899 print
'<td class="center">' . $langs->trans(
"QtyToShip");
1901 print
'<br><a href="#" id="autofill" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Autofill"),
'autofill',
'class="paddingrightonly"') .
'</a>';
1906 print
'<span id="autoreset" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Reset"),
'eraser') .
'</span>';
1910 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' (' . $langs->trans(
"Stock") .
')</td>';
1912 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' / ' . $langs->trans(
"Batch") .
' (' . $langs->trans(
"Stock") .
')</td>';
1916 print
'<td class="left">' . $langs->trans(
'StockEntryDate') .
'</td>';
1922 $warehousePicking = array();
1924 if ($warehouse_id > 0) {
1925 $warehousePicking[] = $warehouse_id;
1927 $warehouseObj->get_children_warehouses($warehouse_id, $warehousePicking);
1931 while ($indiceAsked < $numAsked) {
1934 $line =
$object->lines[$indiceAsked];
1936 $parameters = array(
'i' => $indiceAsked,
'line' => $line,
'num' => $numAsked);
1937 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
1942 if (empty($reshook) && $line->special_code != SUBTOTALS_SPECIAL_CODE) {
1944 $type = $line->product_type ? $line->product_type : $line->fk_product_type;
1946 if (!empty($line->date_start)) {
1949 if (!empty($line->date_end)) {
1953 print
'<!-- line for order line ' . $line->id .
' -->' .
"\n";
1954 print
'<tr class="oddeven" id="row-' . $line->id .
'">' .
"\n";
1956 $qtyProdCom = $line->qty;
1957 $productChildrenNb = 0;
1959 if ($line->fk_product > 0) {
1960 $res = $product->fetch($line->fk_product);
1965 $productChildrenNb = $product->hasFatherOrChild(1);
1967 if ($productChildrenNb > 0) {
1968 $product->loadStockForVirtualProduct(
'warehouseopen', $qtyProdCom);
1970 $product->load_stock(
'warehouseopen');
1975 print
'<a name="' . $line->id .
'"></a>';
1978 $product_static->type = $line->fk_product_type;
1979 $product_static->id = $line->fk_product;
1980 $product_static->ref = $line->ref;
1981 $product_static->status = $line->product_tosell;
1982 $product_static->status_buy = $line->product_tobuy;
1983 $product_static->status_batch = $line->product_tobatch;
1985 $showdescinproductdesc =
getDolGlobalString(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE');
1987 $text = $product_static->getNomUrl(1);
1988 $text .=
' - ' . (!empty($line->label) ? $line->label : $line->product_label);
1990 $description .= empty($product->stockable_product) ? $langs->trans(
'StockDisabled') : $langs->trans(
'StockEnabled');
1991 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
1994 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
1997 if ($showdescinproductdesc) {
1998 print ($line->desc && $line->desc != $line->product_label) ?
'<br>' .
dol_htmlentitiesbr($line->desc) :
'';
2005 $text =
img_object($langs->trans(
'Service'),
'service');
2007 $text =
img_object($langs->trans(
'Product'),
'product');
2010 if (!empty($line->label)) {
2011 $text .=
' <strong>' . $line->label .
'</strong>';
2012 print $form->textwithtooltip($text, $line->desc, 3, 0,
'', (
string) $i);
2014 print $text .
' ' . nl2br($line->desc);
2018 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
2029 print
'<td class="center">' . $line->qty;
2030 print
'<input name="qtyasked' . $indiceAsked .
'" id="qtyasked' . $indiceAsked .
'" type="hidden" value="' . $line->qty .
'">';
2032 print
' ' . $unit_order .
'</td>';
2036 print
'<td class="center">';
2037 $quantityDelivered = isset(
$object->expeditions[$line->id]) ?
$object->expeditions[$line->id] :
'';
2038 print $quantityDelivered;
2039 print
'<input name="qtydelivered' . $indiceAsked .
'" id="qtydelivered' . $indiceAsked .
'" type="hidden" value="' . $quantityDelivered .
'">';
2040 if ($quantityDelivered) {
2041 print
' ' . $unit_order .
'</td>';
2045 $quantityAsked = $line->qty;
2047 $quantityToBeDelivered = 0;
2049 if (is_numeric($quantityDelivered)) {
2050 $quantityToBeDelivered = $quantityAsked - $quantityDelivered;
2052 $quantityToBeDelivered = $quantityAsked;
2056 $warehouseObject =
null;
2057 if (count($warehousePicking) == 1 || !($line->fk_product > 0) || !
isModEnabled(
'stock')) {
2058 print
'<!-- Case warehouse already known or product not a predefined product -->';
2060 $stock = + (isset($product->stock_warehouse[$warehouse_id]->real) ? $product->stock_warehouse[$warehouse_id]->real : 0);
2062 $deliverableQty = $quantityToBeDelivered;
2064 $deliverableQty = min($quantityToBeDelivered, $stock);
2066 if ($deliverableQty < 0) {
2067 $deliverableQty = 0;
2069 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2071 print
'<td class="center">';
2073 if (GETPOSTISSET(
'qtyl'.$indiceAsked) &&
GETPOST(
'qtyl'.$indiceAsked) !==
'') {
2074 $deliverableQty =
GETPOSTFLOAT(
'qtyl'.$indiceAsked,
'MS');
2076 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2077 $qtylValue = $deliverableQty;
2080 } elseif (is_numeric($qtylValue)) {
2082 $qtylValue =
price($qtylValue);
2084 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" class="qtyl right" type="text" size="4" value="' . $qtylValue .
'">';
2087 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2088 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2091 print $langs->trans(
"NA");
2097 print
'<td class="left">';
2100 $ent =
"entl" . $indiceAsked;
2101 $idl =
"idl" . $indiceAsked;
2103 if ($line->fk_product > 0) {
2104 print
'<!-- Show warehouse selection -->';
2110 if ($productChildrenNb > 0) {
2111 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, 0,
'', 0, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2113 if ($product->stockable_product == Product::ENABLED_STOCK) {
2114 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, $line->fk_product,
'', 1, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2116 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2120 if ($tmpentrepot_id > 0 && $tmpentrepot_id == $warehouse_id) {
2122 if ($stock < $quantityToBeDelivered) {
2123 print
' ' .
img_warning($langs->trans(
"StockTooLow"));
2128 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span><input name="entl' . $indiceAsked .
'" id="entl' . $indiceAsked .
'" type="hidden" value="0">';
2139 $product->get_sousproduits_arbo();
2140 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2141 if (count($prods_arbo) > 0) {
2142 foreach ($prods_arbo as $key => $value) {
2145 if ($value[
'stock'] < $value[
'stock_alert']) {
2148 print
"<tr class=\"oddeven\"><td> ->
2149 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2150 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2151 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2161 print
'<td></td><td></td>';
2166 print
'<!-- Case product need lot -->';
2168 $staticwarehouse =
new Entrepot($db);
2169 if ($warehouse_id > 0) {
2170 $staticwarehouse->fetch($warehouse_id);
2176 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2177 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2181 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
2182 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2183 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2185 $batchStock = +$dbatch->qty;
2186 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2189 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2190 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2192 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2193 $alreadyQtyBatchSetted[$line->fk_product] = array();
2196 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2197 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2200 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2203 if ($deliverableQty < 0) {
2204 $deliverableQty = 0;
2207 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2208 if (GETPOSTISSET($inputName)) {
2209 $deliverableQty =
GETPOST($inputName,
'int');
2212 $tooltipClass = $tooltipTitle =
'';
2213 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2214 $tooltipClass =
' classfortooltip';
2215 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2217 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2219 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2221 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2222 print
'<td colspan="3" ></td><td class="center">';
2223 $qtylValue = $deliverableQty;
2226 } elseif (is_numeric($qtylValue)) {
2227 $qtylValue =
price($qtylValue);
2229 print
'<input class="qtyl ' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="' . $qtylValue .
'">';
2232 print
'<!-- Show details of lot -->';
2233 print
'<td class="left">';
2235 print $staticwarehouse->getNomUrl(0) .
' / ';
2237 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2240 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
2242 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2245 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2247 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
2251 $quantityToBeDelivered -= $deliverableQty;
2252 if ($quantityToBeDelivered < 0) {
2253 $quantityToBeDelivered = 0;
2258 print
'<td>' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2263 print
'<!-- Case there is no details of lot at all -->';
2264 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2265 print
'<input class="qtyl right" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="0" disabled="disabled"> ';
2268 print
'<td class="left">';
2269 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $staticwarehouse->label);
2279 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2280 print
'<!-- Case warehouse not already known and product does not need lot -->';
2281 print
'<td></td><td></td>';
2285 print
'</tr>' .
"\n";
2287 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2292 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2293 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2297 $tmpwarehouseObject =
new Entrepot($db);
2298 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2300 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2305 $tmpwarehouseObject->fetch($warehouse_id);
2306 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2307 $stock = +$stock_warehouse->real;
2308 $deliverableQty = min($quantityToBeDelivered, $stock);
2309 $deliverableQty = max(0, $deliverableQty);
2311 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2312 print
'<td colspan="3" ></td><td class="center"><!-- qty to ship (no lot management for product line indiceAsked=' . $indiceAsked .
') -->';
2314 if (isset($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2315 $deliverableQty = min($quantityToBeDelivered, $stock - $alreadyQtySetted[$line->fk_product][intval($warehouse_id)]);
2317 if (!isset($alreadyQtySetted[$line->fk_product])) {
2318 $alreadyQtySetted[$line->fk_product] = array();
2321 $deliverableQty = min($quantityToBeDelivered, $stock);
2324 if ($deliverableQty < 0) {
2325 $deliverableQty = 0;
2328 $tooltipClass = $tooltipTitle =
'';
2329 if (!empty($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2330 $tooltipClass =
' classfortooltip';
2331 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2333 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = 0;
2336 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = $deliverableQty + $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2338 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2339 if (GETPOSTISSET($inputName)) {
2342 $qtylValue = $deliverableQty;
2345 } elseif (is_numeric($qtylValue)) {
2346 $qtylValue =
price($qtylValue);
2348 print
'<input class="qtyl' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="text" size="4" value="' . $qtylValue .
'">';
2349 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_id .
'">';
2352 print
'<input name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2355 print $langs->trans(
"NA");
2360 print
'<td class="left">';
2362 if ($product->stockable_product == Product::ENABLED_STOCK || $productChildrenNb > 0) {
2363 print $tmpwarehouseObject->getNomUrl(0) .
' ';
2364 if ($productChildrenNb <= 0) {
2365 print
'<!-- Show details of stock -->';
2366 print
'(' . $stock .
')';
2369 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2372 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2375 $quantityToBeDelivered -= $deliverableQty;
2376 if ($quantityToBeDelivered < 0) {
2377 $quantityToBeDelivered = 0;
2388 $product->get_sousproduits_arbo();
2389 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2390 if (count($prods_arbo) > 0) {
2391 foreach ($prods_arbo as $key => $value) {
2394 if ($value[
'stock'] < $value[
'stock_alert']) {
2397 print
'<tr class"oddeven"><td>';
2398 print
" ->
2399 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2400 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2401 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2410 print
'<!-- Case warehouse not already known and product need lot -->';
2411 print
'<td></td><td></td>';
2418 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2420 $tmpwarehouseObject =
new Entrepot($db);
2425 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2426 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2427 $nbofsuggested += count($stock_warehouse->detail_batch);
2431 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2433 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2438 $tmpwarehouseObject->fetch($warehouse_id);
2439 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2440 foreach ($stock_warehouse->detail_batch as $dbatch) {
2441 $batchStock = +$dbatch->qty;
2442 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2443 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2445 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2446 $alreadyQtyBatchSetted[$line->fk_product] = array();
2449 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2450 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2453 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2456 if ($deliverableQty < 0) {
2457 $deliverableQty = 0;
2460 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2461 if (GETPOSTISSET($inputName)) {
2465 $tooltipClass = $tooltipTitle =
'';
2466 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2467 $tooltipClass =
' classfortooltip';
2468 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2470 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2472 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2474 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'><td colspan="3"></td><td class="center">';
2475 $qtylValue = $deliverableQty;
2478 } elseif (is_numeric($qtylValue)) {
2479 $qtylValue =
price($qtylValue);
2481 print
'<input class="qtyl right ' . $tooltipClass .
'" title="' . $tooltipTitle .
'" name="' . $inputName .
'" id="' . $inputName .
'" type="text" size="4" value="' . $qtylValue .
'">';
2484 print
'<td class="left">';
2486 print $tmpwarehouseObject->getNomUrl(0) .
' / ';
2488 print
'<!-- Show details of lot -->';
2489 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2490 print
'<input name="entl' . $indiceAsked .
'_'.$subj.
'" type="hidden" value="' . $tmpwarehouseObject->id .
'">';
2493 print $langs->trans(
"Batch") .
': ';
2494 $result = $productlotObject->fetch(0, $line->fk_product, $dbatch->batch);
2496 print $productlotObject->getNomUrl(1);
2498 print $langs->trans(
"TableLotIncompleteRunRepairWithParamStandardEqualConfirmed");
2501 print
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2504 print
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2506 print
' (' . $dbatch->qty .
')';
2507 $quantityToBeDelivered -= $deliverableQty;
2508 if ($quantityToBeDelivered < 0) {
2509 $quantityToBeDelivered = 0;
2515 print
'<td class="left">' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2523 $warehouse_selected_id =
GETPOSTINT(
'entrepot_id');
2525 print
'<!-- line not shown yet, we show it -->';
2526 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2531 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2532 $disabled =
'disabled="disabled"';
2533 $alt =
'Product need serial or batch number';
2535 if ($warehouse_selected_id <= 0) {
2536 $disabled =
'disabled="disabled"';
2539 if ($product->stockable_product == Product::ENABLED_STOCK) {
2542 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="0"'.($disabled ?
' '.$disabled :
'').($alt ?
' title="'.
dolPrintHTMLForAttribute($alt).
'"' :
'').
'> ';
2544 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2548 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2549 $disabled =
'disabled="disabled"';
2551 if ($warehouse_selected_id <= 0) {
2552 $disabled =
'disabled="disabled"';
2554 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="'.$quantityToBeDelivered.
'"'.($disabled ?
' '.$disabled :
'').
'> ';
2555 if (empty($disabled) && !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2556 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2559 print $langs->trans(
"NA");
2563 print
'<td class="left">';
2566 if (($warehouse_selected_id > 0 && $product->stockable_product == Product::ENABLED_STOCK)) {
2567 $warehouseObject =
new Entrepot($db);
2568 $warehouseObject->fetch($warehouse_selected_id);
2569 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $warehouseObject->label);
2571 if ($line->fk_product) {
2572 if ($product->stockable_product != Product::ENABLED_STOCK) {
2573 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2575 print
img_warning() .
' ' . $langs->trans(
'StockTooLow');
2582 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2598 $srcLine->id = $line->id;
2599 $srcLine->fetch_optionals();
2601 $expLine->array_options = array_merge($expLine->array_options, $srcLine->array_options);
2603 print $expLine->showOptionals($extrafields,
'edit', array(
'style' =>
'class="drag drop oddeven"',
'colspan' => $colspan), (
string) $indiceAsked,
'',
'1');
2604 } elseif (empty($reshook) && $line->special_code == SUBTOTALS_SPECIAL_CODE && !in_array($line->id, $title_lines_to_disable)) {
2605 require
dol_buildpath(
'/core/tpl/subtotalline_select.tpl.php');
2616 print $form->buttonsSaveCancel(
"Create");
2626 '@phan-var-force Expedition $object';
2632 $num_prod = count($lines);
2635 $typeobject =
$object->origin;
2637 $origin_id =
$object->origin_id;
2645 $res =
$object->fetch_optionals();
2653 if ($action ==
'delete') {
2654 $formquestion = array();
2656 $formquestion = array(
2658 'label' => $langs->trans(
'ShipmentIncrementStockOnDelete'),
2659 'name' =>
'alsoUpdateStock',
2660 'type' =>
'checkbox',
2665 $formconfirm = $form->formconfirm(
2666 $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
2667 $langs->trans(
'DeleteSending'),
2668 $langs->trans(
"ConfirmDeleteSending",
$object->ref),
2677 if ($action ==
'ask_subtotal_deleteline') {
2679 $langs->load(
"subtotals");
2680 $title =
"DeleteSubtotalLine";
2681 $question =
"ConfirmDeleteSubtotalLine";
2682 if (
GETPOST(
'type') ==
'title') {
2683 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2684 $title =
"DeleteTitleLine";
2685 $question =
"ConfirmDeleteTitleLine";
2687 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2691 if ($action ==
'valid') {
2692 $objectref = substr(
$object->ref, 1, 4);
2693 if ($objectref ==
'PROV') {
2694 $numref =
$object->getNextNumRef($soc);
2696 $numref = (string)
$object->ref;
2699 $text = $langs->trans(
"ConfirmValidateSending", $numref);
2701 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementWillBeRecorded") .
'.';
2703 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementNotYetRecorded") .
'.';
2707 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2708 $notify =
new Notify($db);
2710 $text .= $notify->confirmMessage(
'SHIPPING_VALIDATE',
$object->socid, $object);
2713 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $langs->trans(
'ValidateSending'), $text,
'confirm_valid',
'', 0, 1, 260);
2717 if ($action ==
'cancel') {
2718 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, $langs->trans(
'CancelSending'), $langs->trans(
"ConfirmCancelSending",
$object->ref),
'confirm_cancel',
'', 0, 1);
2722 if ($action ==
'sign') {
2723 $text = $langs->trans(
'ConfirmSignShipping');
2725 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2726 $notify =
new Notify($db);
2728 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2733 'name' =>
'signed_status',
2734 'select_show_empty' => 0,
2735 'label' =>
'<span class="fieldrequired">' . $langs->trans(
'SignStatus') .
'</span>',
2736 'values' =>
$object->getSignedStatusLocalisedArray()
2738 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SignShipping'), $text,
'confirm_sign', $formquestion, 0, 1);
2742 if ($action ==
'unsign') {
2743 $text = $langs->trans(
'ConfirmUnsignShipping');
2745 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2746 $notify =
new Notify($db);
2748 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2750 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'UnsignShipping'), $text,
'confirm_unsign',
'', 0, 1);
2754 $parameters = array(
'formConfirm' => $formconfirm);
2755 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
2756 if (empty($reshook)) {
2757 $formconfirm .= $hookmanager->resPrint;
2758 } elseif ($reshook > 0) {
2759 $formconfirm = $hookmanager->resPrint;
2767 $tmparray =
$object->getTotalWeightVolume();
2768 $totalWeight = $tmparray[
'weight'];
2769 $totalVolume = $tmparray[
'volume'];
2771 if (!empty($typeobject) && $typeobject ===
'commande' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2773 $objectsrc->fetch(
$object->origin_object->id);
2775 if (!empty($typeobject) && $typeobject ===
'propal' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2776 $objectsrc =
new Propal($db);
2777 $objectsrc->fetch(
$object->origin_object->id);
2781 $linkback =
'<a href="' . DOL_URL_ROOT .
'/expedition/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
2782 $morehtmlref =
'<div class="refidno">';
2784 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
2785 $morehtmlref .= $form->editfieldval(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string' . (isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ?
':' .
getDolGlobalString(
'THIRDPARTY_REF_INPUT_SIZE') :
''),
'', null, null,
'', 1);
2788 $morehtmlref .=
'<br>' .
$object->thirdparty->getNomUrl(1);
2791 if ($origin && $origin_id > 0) {
2793 $langs->load(
"projects");
2794 $morehtmlref .=
'<br>';
2796 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2797 if ($action !=
'classify') {
2798 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2800 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $objectsrc->socid, (
string) $objectsrc->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2802 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
2804 $proj->fetch($objectsrc->fk_project);
2805 $morehtmlref .= $proj->getNomUrl(1);
2807 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2815 $langs->load(
"projects");
2816 $morehtmlref .=
'<br>';
2817 if ($permissiontoadd) {
2818 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2819 if ($action !=
'classify') {
2820 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
2822 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
$object->socid, (
string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
2824 if (!empty(
$object->fk_project)) {
2826 $proj->fetch(
$object->fk_project);
2827 $morehtmlref .= $proj->getNomUrl(1);
2829 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
2836 $morehtmlref .=
'</div>';
2837 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2839 print
'<div class="fichecenter">';
2840 print
'<div class="fichehalfleft">';
2841 print
'<div class="underbanner clearboth"></div>';
2843 print
'<table class="border tableforfield centpercent">';
2846 if (!empty($typeobject) && $typeobject ==
'commande' &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2848 print $langs->trans(
"RefOrder") .
'</td>';
2850 print $objectsrc->getNomUrl(1,
'commande');
2854 if (!empty($typeobject) && $typeobject ==
'propal' &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2856 print $langs->trans(
"RefProposal") .
'</td>';
2858 print $objectsrc->getNomUrl(1,
'expedition');
2864 print
'<tr><td class="titlefieldmiddle">' . $langs->trans(
"DateCreation") .
'</td>';
2869 print
'<tr><td height="10">';
2870 print
'<table class="nobordernopadding centpercent"><tr><td>';
2871 print $langs->trans(
'DateDeliveryPlanned');
2873 if ($action !=
'editdate_livraison') {
2874 print
'<td class="right"><a class="editfielda" href="' . $_SERVER[
"PHP_SELF"] .
'?action=editdate_livraison&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->trans(
'SetDeliveryDate'), 1) .
'</a></td>';
2876 print
'</tr></table>';
2878 if ($action ==
'editdate_livraison') {
2879 print
'<form name="setdate_livraison" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2880 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2881 print
'<input type="hidden" name="action" value="setdate_livraison">';
2882 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
2883 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2892 print
'<tr><td height="10">';
2893 print
'<table class="nobordernopadding centpercent"><tr><td>';
2894 print $langs->trans(
'DateShipping');
2896 if ($action !=
'editdate_shipping') {
2897 print
'<td class="right"><a class="editfielda" href="' . $_SERVER[
"PHP_SELF"] .
'?action=editdate_shipping&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->trans(
'SetShippingDate'), 1) .
'</a></td>';
2899 print
'</tr></table>';
2901 if ($action ==
'editdate_shipping') {
2902 print
'<form name="setdate_shipping" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2903 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2904 print
'<input type="hidden" name="action" value="setdate_shipping">';
2905 print $form->selectDate(
$object->date_shipping ?
$object->date_shipping : -1,
'ship_', 1, 1, 0,
"setdate_shipping", 1, 0);
2906 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2916 print $form->editfieldkey(
"Weight",
'trueWeight',
$object->trueWeight, $object, $user->hasRight(
'expedition',
'creer'));
2919 if ($action ==
'edittrueWeight') {
2920 print
'<form name="settrueweight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2921 print
'<input name="action" value="settrueWeight" type="hidden">';
2922 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2923 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2924 print
'<input id="trueWeight" name="trueWeight" value="' .
$object->trueWeight .
'" type="text" class="width50 valignmiddle">';
2925 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
$object->weight_units, 0, 2,
'maxwidth125 valignmiddle');
2926 print
' <input class="button smallpaddingimp valignmiddle" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2927 print
' <input class="button button-cancel smallpaddingimp valignmiddle" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
2935 if ($totalWeight > 0) {
2936 if (!empty(
$object->trueWeight)) {
2937 print
' (' . $langs->trans(
"SumOfProductWeights") .
': ';
2940 if (!empty(
$object->trueWeight)) {
2947 print
'<tr><td>' . $form->editfieldkey(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2948 print $form->editfieldval(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer'));
2953 print
'<tr><td>' . $form->editfieldkey(
"Height",
'trueHeight',
$object->trueHeight, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2954 if ($action ==
'edittrueHeight') {
2955 print
'<form name="settrueHeight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2956 print
'<input name="action" value="settrueHeight" type="hidden">';
2957 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2958 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2959 print
'<input id="trueHeight" name="trueHeight" value="' .
$object->trueHeight .
'" type="text" class="width50">';
2960 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
$object->size_units, 0, 2);
2961 print
' <input class="button smallpaddingimp" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2962 print
' <input class="button button-cancel smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
2972 print
'<tr><td>' . $form->editfieldkey(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2973 print $form->editfieldval(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer'));
2979 print $langs->trans(
"Volume");
2982 $calculatedVolume = 0;
2986 $volumeUnit =
$object->size_units * 3;
2989 if ($calculatedVolume > 0) {
2990 if ($volumeUnit < 50) {
2996 if ($totalVolume > 0) {
2997 if ($calculatedVolume) {
2998 print
' (' . $langs->trans(
"SumOfProductVolumes") .
': ';
3002 if ($calculatedVolume) {
3011 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3016 print
'<div class="fichehalfright">';
3017 print
'<div class="underbanner clearboth"></div>';
3019 print
'<table class="border centpercent tableforfield">';
3023 print
'<table class="nobordernopadding centpercent"><tr><td>';
3024 print $langs->trans(
'SendingMethod');
3027 if ($action !=
'editshipping_method_id' && $permissiontoadd) {
3028 print
'<td class="right"><a class="editfielda" href="' . $_SERVER[
"PHP_SELF"] .
'?action=editshipping_method_id&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->trans(
'SetSendingMethod'), 1) .
'</a></td>';
3030 print
'</tr></table>';
3032 if ($action ==
'editshipping_method_id') {
3033 print
'<form name="setshipping_method_id" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3034 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3035 print
'<input type="hidden" name="action" value="setshipping_method_id">';
3036 $object->fetch_delivery_methods();
3037 print $form->selectarray(
"shipping_method_id",
$object->meths,
$object->shipping_method_id, 1, 0, 0,
"", 1);
3039 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
3041 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
3044 if (
$object->shipping_method_id > 0) {
3046 $code = $langs->getLabelFromKey($db, (
string)
$object->shipping_method_id,
'c_shipment_mode',
'rowid',
'code');
3047 print $langs->trans(
"SendingMethod" . strtoupper($code));
3054 print
'<tr><td class="titlefieldmiddle">' . $form->editfieldkey(
"TrackingNumber",
'tracking_number',
$object->tracking_number, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3055 print $form->editfieldval(
"TrackingNumber",
'tracking_number',
$object->tracking_url, $object, $user->hasRight(
'expedition',
'creer'),
'safehtmlstring',
$object->tracking_number);
3061 print
'<table class="nobordernopadding centpercent"><tr><td>';
3062 print $langs->trans(
'IncotermLabel');
3063 print
'<td><td class="right">';
3064 if ($permissiontoadd) {
3065 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/expedition/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3069 print
'</td></tr></table>';
3072 if ($action !=
'editincoterm') {
3073 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3075 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3081 $parameters = array();
3082 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3083 print $hookmanager->resPrint;
3090 print
'<div class="clearboth"></div>';
3099 if (!empty(
$object->table_element_line)) {
3101 $result =
$object->getLinesArray();
3103 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
3104 <input type="hidden" name="token" value="' .
newToken().
'">
3105 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3106 <input type="hidden" name="mode" value="">
3107 <input type="hidden" name="page_y" value="">
3108 <input type="hidden" name="id" value="' .
$object->id.
'">
3111 if (!empty($conf->use_javascript_ajax) &&
$object->status == 0) {
3112 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3115 print
'<div class="div-table-responsive-no-min">';
3116 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3117 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
3125 if (
$object->status == 0 && $permissiontoadd && $action !=
'selectlines') {
3126 if ($action !=
'editline') {
3129 $parameters = array();
3130 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3134 if (empty($reshook)) {
3140 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3151 if ($action ==
'editline') {
3152 print
' <form name="updateline" id="updateline" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $line_id .
'" method="POST">
3153 <input type="hidden" name="token" value="' .
newToken() .
'">
3154 <input type="hidden" name="action" value="updateline">
3155 <input type="hidden" name="mode" value="">
3156 <input type="hidden" name="id" value="' .
$object->id .
'">
3161 print
'<div class="div-table-responsive-no-min">';
3162 print
'<table class="noborder centpercent" id="tablelines" >';
3164 print
'<tr class="liste_titre">';
3167 print
'<td width="5" class="center linecolnum"> </td>';
3170 print
'<td class="linecoldescription" >' . $langs->trans(
"Products") .
'</td>';
3172 print
'<td class="center linecolqty">' . $langs->trans(
"QtyOrdered") .
'</td>';
3173 if ($origin_id > 0) {
3174 print
'<td class="center linecolqtyinothershipments">' . $langs->trans(
"QtyInOtherShipments") .
'</td>';
3176 if ($action ==
'editline') {
3184 print
'<td class="center linecoleditlineotherinfo" colspan="' . $editColspan .
'">';
3186 print $langs->trans(
"QtyToShip");
3188 print $langs->trans(
"QtyShipped");
3191 print
' - ' . $langs->trans(
"WarehouseSource");
3194 print
' - ' . $langs->trans(
"Batch");
3199 print
'<td class="center linecolqtytoship">' . $langs->trans(
"QtyToShip") .
'</td>';
3201 print
'<td class="center linecolqtyshipped">' . $langs->trans(
"QtyShipped") .
'</td>';
3204 print
'<td class="left linecolwarehousesource">' . $langs->trans(
"WarehouseSource") .
'</td>';
3208 print
'<td class="left linecolbatch">' . $langs->trans(
"Batch") .
'</td>';
3211 print
'<td class="center linecolweight">' . $langs->trans(
"CalculatedWeight") .
'</td>';
3212 print
'<td class="center linecolvolume">' . $langs->trans(
"CalculatedVolume") .
'</td>';
3215 print
'<td class="linecoledit"></td>';
3216 print
'<td class="linecoldelete" width="10"></td>';
3221 $outputlangs = $langs;
3226 if (
GETPOST(
'lang_id',
'aZ09')) {
3227 $newlang =
GETPOST(
'lang_id',
'aZ09');
3229 if (empty($newlang)) {
3230 $newlang =
$object->thirdparty->default_lang;
3232 if (!empty($newlang)) {
3233 $outputlangs =
new Translate(
"", $conf);
3234 $outputlangs->setDefaultLang($newlang);
3239 $alreadysent = array();
3240 if ($origin_id > 0) {
3241 $sql =
"SELECT obj.rowid, obj.fk_product, obj.label, obj.description, obj.product_type as fk_product_type, obj.qty as qty_asked, obj.fk_unit, obj.date_start, obj.date_end, obj.special_code";
3242 $sql .=
", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot";
3243 $sql .=
", e.rowid as shipment_id, e.ref as shipment_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_expedition";
3245 $sql .=
', p.label as product_label, p.ref, p.fk_product_type, p.rowid as prodid, p.tosell as product_tosell, p.tobuy as product_tobuy, p.tobatch as product_tobatch';
3246 $sql .=
', p.description as product_desc';
3247 $sql .=
" FROM " . MAIN_DB_PREFIX .
"expeditiondet as ed";
3248 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as e";
3249 $sql .=
", " . MAIN_DB_PREFIX . $origin .
"det as obj";
3251 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product as p ON obj.fk_product = p.rowid";
3252 $sql .=
" WHERE e.entity IN (" .
getEntity(
'expedition') .
")";
3253 $sql .=
" AND obj.fk_" . $origin .
" = " . ((int) $origin_id);
3254 $sql .=
" AND obj.rowid = ed.fk_elementdet";
3255 $sql .=
" AND ed.fk_expedition = e.rowid";
3257 $sql .=
" ORDER BY obj.fk_product";
3259 dol_syslog(
"expedition/card.php get list of shipment lines", LOG_DEBUG);
3260 $resql = $db->query($sql);
3262 $num = $db->num_rows($resql);
3266 $obj = $db->fetch_object($resql);
3269 $alreadysent[$obj->rowid][$obj->shipmentline_id] = array(
3270 'shipment_ref' => $obj->shipment_ref,
3271 'shipment_id' => $obj->shipment_id,
3272 'warehouse' => $obj->fk_entrepot,
3273 'qty_shipped' => $obj->qty_shipped,
3274 'product_tosell' => $obj->product_tosell,
3275 'product_tobuy' => $obj->product_tobuy,
3276 'product_tobatch' => $obj->product_tobatch,
3277 'date_valid' => $db->jdate($obj->date_valid),
3278 'date_delivery' => $db->jdate($obj->date_delivery));
3289 $conf->cache[
'product'] = array();
3290 $conf->cache[
'warehouse'] = array();
3291 for ($i = 0; $i < $num_prod; $i++) {
3292 $parameters = array(
'i' => $i,
'line' => $lines[$i],
'line_id' => $line_id,
'num' => $num_prod,
'alreadysent' => $alreadysent,
'editColspan' => !empty($editColspan) ? $editColspan : 0,
'outputlangs' => $outputlangs);
3293 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
3298 if (empty($reshook) && $lines[$i]->product_type !=
"9") {
3299 print
'<!-- origin line id = ' . $lines[$i]->origin_line_id .
' -->';
3300 print
'<tr class="oddeven" id="row-' . $lines[$i]->id .
'" data-id="' . $lines[$i]->id .
'" data-element="' . $lines[$i]->element .
'" >';
3304 print
'<td class="center linecolnum">' . ($i + 1) .
'</td>';
3308 if ($lines[$i]->fk_product > 0) {
3311 $product_id = $lines[$i]->fk_product;
3312 if (!isset($conf->cache[
'product'][$product_id])) {
3314 $prod->fetch($product_id);
3315 $conf->cache[
'product'][$product_id] = $prod;
3317 $prod = $conf->cache[
'product'][$product_id];
3319 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"label"])) ? $prod->multilangs[$outputlangs->defaultlang][
"label"] : $lines[$i]->product_label;
3321 $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label);
3324 print
'<td class="linecoldescription">';
3327 $product_static->type = $lines[$i]->fk_product_type;
3328 $product_static->id = $lines[$i]->fk_product;
3329 $product_static->ref = $lines[$i]->ref;
3330 $product_static->status = $lines[$i]->product_tosell;
3331 $product_static->status_buy = $lines[$i]->product_tobuy;
3332 $product_static->status_batch = $lines[$i]->product_tobatch;
3334 $product_static->weight = $lines[$i]->weight;
3335 $product_static->weight_units = $lines[$i]->weight_units;
3336 $product_static->length = $lines[$i]->length;
3337 $product_static->length_units = $lines[$i]->length_units;
3338 $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0;
3339 $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0;
3340 $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0;
3341 $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0;
3342 $product_static->surface = $lines[$i]->surface;
3343 $product_static->surface_units = $lines[$i]->surface_units;
3344 $product_static->volume = $lines[$i]->volume;
3345 $product_static->volume_units = $lines[$i]->volume_units;
3346 $product_static->stockable_product = $lines[$i]->stockable_product;
3348 $text = $product_static->getNomUrl(1);
3349 $text .=
' - ' . $label;
3351 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
3352 print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start :
'', !empty($lines[$i]->date_end) ? $lines[$i]->date_end :
'');
3358 print
'<td class="linecoldescription" >';
3360 $text =
img_object($langs->trans(
'Service'),
'service');
3362 $text =
img_object($langs->trans(
'Product'),
'product');
3365 if (!empty($lines[$i]->label)) {
3366 $text .=
' <strong>' . $lines[$i]->label .
'</strong>';
3367 print $form->textwithtooltip($text, $lines[$i]->
description, 3, 0,
'', (
string) $i);
3369 print $text .
' ' . nl2br($lines[$i]->
description);
3382 print
'<td class="center linecolqty">' . $lines[$i]->qty_asked .
' ' . $unit_order .
'</td>';
3385 if ($origin_id > 0) {
3386 print
'<td class="linecolqtyinothershipments center nowrap">';
3388 $qtyalreadysent = 0;
3389 foreach ($alreadysent as $key => $val) {
3390 if ($lines[$i]->fk_elementdet == $key) {
3392 foreach ($val as $shipmentline_id => $shipmentline_var) {
3393 if ($shipmentline_var[
'shipment_id'] == $lines[$i]->fk_expedition) {
3399 $htmltooltip .=
'<br>';
3401 $shipment_static->fetch($shipmentline_var[
'shipment_id']);
3402 $htmltooltip .= $shipment_static->getNomUrl(1,
'', 0, 0, 1);
3403 $htmltooltip .=
' - ' . $shipmentline_var[
'qty_shipped'];
3404 $htmltooltip .=
' - ' . $langs->trans(
"DateValidation") .
' : ' . (empty($shipmentline_var[
'date_valid']) ? $langs->trans(
"Draft") :
dol_print_date($shipmentline_var[
'date_valid'],
'dayhour'));
3411 $qtyalreadysent += $shipmentline_var[
'qty_shipped'];
3414 $htmltooltip = $langs->trans(
"QtyInOtherShipments") .
'...<br><br>' . $htmltooltip .
'<br><input type="submit" name="dummyhiddenbuttontogetfocus" style="display:none" autofocus>';
3418 print $form->textwithpicto((
string) $qtyalreadysent, $htmltooltip, 1,
'info',
'', 0, 3,
'tooltip' . $lines[$i]->id);
3422 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3424 print
'<td colspan="' . $editColspan .
'" class="center"><table class="nobordernopadding centpercent">';
3425 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
3426 print
'<!-- case edit 1 -->';
3428 foreach ($lines[$i]->detail_batch as $detail_batch) {
3431 print
'<td><input class="qtyl right" name="qtyl' . $detail_batch->fk_expeditiondet .
'_' . $detail_batch->id .
'" id="qtyl' . $line_id .
'_' . $detail_batch->id .
'" type="text" size="4" value="' . $detail_batch->qty .
'"></td>';
3433 if ($lines[$i]->entrepot_id == 0) {
3435 $line->fetch($detail_batch->fk_expeditiondet);
3437 $entrepot_id = !empty($detail_batch->entrepot_id) ? $detail_batch->entrepot_id : $lines[$i]->entrepot_id;
3438 print
'<td>' . $formproduct->selectLotStock($detail_batch->fk_origin_stock,
'batchl' . $detail_batch->fk_expeditiondet .
'_' . $detail_batch->fk_origin_stock,
'', 1, 0, $lines[$i]->fk_product, $entrepot_id) .
'</td>';
3444 print
'<td><input class="qtyl" name="qtyl' . $line_id .
'_0" id="qtyl' . $line_id .
'_0" type="text" size="4" value="0"></td>';
3446 print
'<td>' . $formproduct->selectLotStock(
'',
'batchl' . $line_id .
'_0',
'', 1, 0, $lines[$i]->fk_product) .
'</td>';
3449 if ($lines[$i]->fk_product > 0) {
3450 if ($lines[$i]->entrepot_id > 0) {
3451 print
'<!-- case edit 2 -->';
3454 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'">' . $unit_order .
'</td>';
3456 print
'<td>' . $formproduct->selectWarehouses($lines[$i]->entrepot_id,
'entl' . $line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3460 print
' - ' . $langs->trans(
"NA");
3464 } elseif (count($lines[$i]->details_entrepot) > 1) {
3465 print
'<!-- case edit 3 -->';
3466 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3469 print
'<td><input class="qtyl right" name="qtyl' . $detail_entrepot->line_id .
'" id="qtyl' . $detail_entrepot->line_id .
'" type="text" size="4" value="' . $detail_entrepot->qty_shipped .
'">' . $unit_order .
'</td>';
3471 print
'<td>' . $formproduct->selectWarehouses($detail_entrepot->entrepot_id,
'entl' . $detail_entrepot->line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3475 print
' - ' . $langs->trans(
"NA");
3481 print
'<!-- case edit 4 -->';
3484 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3485 print
'<td><span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span></td>';
3489 print
'<!-- case edit 5 -->';
3490 print
'<tr><td colspan="3">' . $langs->trans(
"ErrorStockIsNotEnough") .
'</td></tr>';
3493 print
'<!-- case edit 6 -->';
3496 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'">' . $unit_order .
'</td>';
3504 print
'<!-- case edit 7 -->';
3507 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3515 print
'</table></td>';
3518 print
'<td class="linecolqtytoship center">' . $lines[$i]->qty_shipped .
' ' . $unit_order .
'</td>';
3522 print
'<td class="linecolwarehousesource tdoverflowmax200">';
3524 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
3525 } elseif ($lines[$i]->entrepot_id > 0 && $lines[$i]->stockable_product == Product::ENABLED_STOCK) {
3526 $warehouse_id = $lines[$i]->entrepot_id;
3527 if (!isset($conf->cache[
'warehouse'][$warehouse_id])) {
3529 $warehouse->fetch($warehouse_id);
3530 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3532 $warehouse = $conf->cache[
'warehouse'][$warehouse_id];
3534 print $warehouse->getNomUrl(1);
3535 } elseif (count($lines[$i]->details_entrepot) > 1) {
3537 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3538 $warehouse_id = $detail_entrepot->entrepot_id;
3539 if ($warehouse_id > 0) {
3540 if (!isset($conf->cache[
'warehouse'][$warehouse_id])) {
3542 $warehouse->fetch($warehouse_id);
3543 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3545 $warehouse = $conf->cache[
'warehouse'][$warehouse_id];
3547 $detail .= $langs->trans(
"DetailWarehouseFormat", $warehouse->label, $detail_entrepot->qty_shipped) .
'<br>';
3550 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
"DetailWarehouseNumber"), $detail);
3551 } elseif (count($lines[$i]->detail_children ?? []) > 1) {
3553 foreach ($lines[$i]->detail_children as $child_product_id => $child_stock_list) {
3554 foreach ($child_stock_list as $warehouse_id => $total_qty) {
3556 $child_product_label =
'';
3557 if (!isset($conf->cache[
'product'][$child_product_id])) {
3558 $child_product =
new Product($db);
3559 $child_product->fetch($child_product_id);
3560 $conf->cache[
'product'][$child_product_id] = $child_product;
3562 $child_product = $conf->cache[
'product'][$child_product_id];
3564 $child_product_label = $child_product->ref .
' ' . $child_product->label;
3567 if (!isset($conf->cache[
'warehouse'][$warehouse_id])) {
3568 $child_warehouse =
new Entrepot($db);
3569 $child_warehouse->fetch($warehouse_id);
3570 $conf->cache[
'warehouse'][$warehouse_id] = $child_warehouse;
3572 $child_warehouse = $conf->cache[
'warehouse'][$warehouse_id];
3574 $detail .= $langs->trans(
'DetailChildrenFormat', $child_product_label, $child_warehouse->label,
price2num($total_qty,
'MS')) .
'<br>';
3577 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
'DetailWarehouseNumber'), $detail);
3584 if (isset($lines[$i]->detail_batch)) {
3585 print
'<!-- Detail of lot -->';
3586 print
'<td class="linecolbatch">';
3587 if ($lines[$i]->product_tobatch) {
3589 foreach ($lines[$i]->detail_batch as $dbatch) {
3590 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
3592 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
3595 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
3597 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
3600 print $form->textwithtooltip(
img_picto(
'',
'object_barcode') .
' ' . $langs->trans(
"DetailBatchNumber"), $detail);
3602 print $langs->trans(
"NA");
3606 print
'<td class="linecolbatch" ></td>';
3612 print
'<td class="center linecolweight">';
3614 print $lines[$i]->weight * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"weight", $lines[$i]->weight_units);
3621 print
'<td class="center linecolvolume">';
3623 print $lines[$i]->volume * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"volume", $lines[$i]->volume_units);
3632 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3633 print
'<td class="center" colspan="2" valign="middle">';
3634 print
'<input type="submit" class="button button-save" id="savelinebutton marginbottomonly" name="save" value="' . $langs->trans(
"Save") .
'"><br>';
3635 print
'<input type="submit" class="button button-cancel" id="cancellinebutton" name="cancel" value="' . $langs->trans(
"Cancel") .
'"><br>';
3638 $edit_url = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id;
3640 $product_id = $lines[$i]->fk_product;
3641 if (!isset($conf->cache[
'product'][$product_id])) {
3643 $product->fetch($product_id);
3644 $conf->cache[
'product'][$product_id] = $product;
3646 $product = $conf->cache[
'product'][$product_id];
3649 if ($product->hasFatherOrChild(1)) {
3655 print
'<td class="linecoledit center">';
3656 print
'<a class="editfielda reposition" href="' . $edit_url .
'">' .
img_edit() .
'</a>';
3658 print
'<td class="linecoldelete" width="10">';
3659 print
'<a class="reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=deleteline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id .
'">' .
img_delete() .
'</a>';
3663 if (!empty($rowExtrafieldsStart)) {
3664 print $rowExtrafieldsStart;
3665 print $rowExtrafieldsView;
3675 if ($origin_id > 0) {
3686 $line->fetch_optionals();
3689 if ($action ==
'editline' && $line->id == $line_id) {
3690 print $lines[$i]->showOptionals($extrafields,
'edit', array(
'colspan' => $colspan), !empty($indiceAsked) ? $indiceAsked :
'',
'',
'',
'card');
3692 print $lines[$i]->showOptionals($extrafields,
'view', array(
'colspan' => $colspan), !empty($indiceAsked) ? $indiceAsked :
'',
'',
'',
'card');
3694 } elseif (empty($reshook) && $lines[$i]->product_type ==
"9") {
3696 $objectsrc->fetch($lines[$i]->origin_line_id);
3697 if ($objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) {
3699 require
dol_buildpath(
'/core/tpl/subtotal_expedition_view.tpl.php');
3704 if (empty($num_prod)) {
3705 print
'<tr><td colspan="8"><span class="opacitymedium">' . $langs->trans(
"NoLineGoOnTabToAddSome", $langs->transnoentitiesnoconv(
"ShipmentDistribution")) .
'</span></td></tr>';
3719 if (($user->socid == 0) && ($action !=
'presend')) {
3720 print
'<div class="tabsAction">';
3722 $parameters = array();
3723 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3725 if (empty($reshook)) {
3727 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
3728 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate'))
3732 print
dolGetButtonAction($langs->trans(
'NotAllowed'), $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3738 if ($user->hasRight(
'expedition',
'creer')) {
3743 if ($user->hasRight(
'expedition',
'creer')) {
3749 if (empty($user->socid)) {
3751 if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'expedition',
'shipping_advance',
'send')) {
3752 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3754 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3762 print
dolGetButtonAction(
'', $langs->trans(
'CreateDeliveryOrder'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=create_delivery&token=' .
newToken() .
'&id=' .
$object->id,
'');
3767 if (
$object->signed_status != Expedition::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
3768 print
'<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=sign&token=' .
newToken() .
'">' . $langs->trans(
"SignShipping") .
'</a></div>';
3770 print
'<div class="inline-block divButAction"><a class="butAction" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=unsign&token=' .
newToken() .
'">' . $langs->trans(
"UnsignShipping") .
'</a></div>';
3776 if ($user->hasRight(
'facture',
'creer')) {
3778 print
dolGetButtonAction(
'', $langs->trans(
'CreateBill'),
'default', DOL_URL_ROOT .
'/compta/facture/card.php?action=create&origin=' .
$object->element .
'&originid=' .
$object->id .
'&socid=' .
$object->socid,
'');
3785 if ($user->hasRight(
'expedition',
'creer') &&
$object->status > 0) {
3787 print
dolGetButtonAction(
'', $langs->trans(
'ClassifyBilled'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifybilled&token=' .
newToken() .
'&id=' .
$object->id,
'');
3789 print
dolGetButtonAction(
'', $langs->trans(
"Close"),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifyclosed&token=' .
newToken() .
'&id=' .
$object->id,
'');
3795 if ($user->hasRight(
'expedition',
'creer')) {
3796 print
dolGetButtonAction(
'', $langs->trans(
'Cancel'),
'danger', $_SERVER[
"PHP_SELF"] .
'?action=cancel&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3801 if ($user->hasRight(
'expedition',
'supprimer')) {
3814 if ($action !=
'presend' && $action !=
'editline') {
3815 print
'<div class="fichecenter"><div class="fichehalfleft">';
3818 $filedir = $conf->expedition->dir_output .
"/sending/" . $objectref;
3820 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3822 $genallowed = $user->hasRight(
'expedition',
'lire');
3823 $delallowed = $user->hasRight(
'expedition',
'creer');
3825 print $formfile->showdocuments(
'expedition', $objectref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $soc->default_lang);
3829 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'shipping'), 1);
3830 $linktoelem = $tmparray[
'linktoelem'];
3831 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3832 print $htmltoenteralink;
3834 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
3840 print
'<br><!-- Link to sign -->';
3841 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3842 print showOnlineSignatureUrl(
'expedition',
$object->ref, $object) .
'<br>';
3845 print
'</div><div class="fichehalfright">';
3849 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3854 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/expedition/messaging.php?id=' .
$object->id);
3856 $somethingshown = $formactions->showactions($object,
'shipping', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3857 print
'</div></div>';
3866 if (
GETPOST(
'modelselected')) {
3867 $action =
'presend';
3871 $modelmail =
'shipping_send';
3872 $defaulttopic =
'SendShippingRef';
3873 $diroutput = $conf->expedition->dir_output .
'/sending';
3874 $trackid =
'shi' .
$object->id;
3876 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage customers orders.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
const STATUS_DRAFT
Draft status.
const STATUS_CLOSED
Closed status -> parcel was received by customer / end of process prev status : validated or shipment...
const STATUS_VALIDATED
Validated status -> parcel is ready to be sent prev status : draft next status : closed or shipment_i...
Class to manage lines of shipment.
CRUD class for batch number management within shipment.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class to manage order lines.
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage products or services.
const DISABLED_STOCK
Stockable product.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Manage record for batch number management.
Class with list of lots and properties.
Class to manage projects.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dolPrintHTMLForAttribute($s, $escapeonlyhtmltags=0, $allowothertags=array())
Return a string ready to be output into an HTML attribute (alt, title, data-html, ....
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
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...
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
shipping_prepare_head($object)
Prepare array with list of tabs.