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 .
'/product/stock/class/entrepot.class.php';
60require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/productlot.class.php';
61require_once DOL_DOCUMENT_ROOT .
'/commande/class/commande.class.php';
63 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
66 require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
69 require_once DOL_DOCUMENT_ROOT .
'/product/class/productbatch.class.php';
72 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
73 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
77$langs->loadLangs(array(
"sendings",
"companies",
"bills",
'orders',
'stocks',
'other',
'propal',
'productbatch'));
80 $langs->load(
'incoterm');
83 $langs->load(
'productbatch');
87$origin =
GETPOST(
'origin',
'alpha');
92if (empty($origin_id) && !empty($origin)) {
95if (empty($origin_id) && !empty($origin)) {
104$action =
GETPOST(
'action',
'alpha');
105$confirm =
GETPOST(
'confirm',
'alpha');
106$cancel =
GETPOST(
'cancel',
'alpha');
109$backtopage =
GETPOST(
'backtopage',
'alpha');
120$extrafields->fetch_name_optionals_label(
$object->table_element);
121$extrafields->fetch_name_optionals_label(
$object->table_element_line);
122$extrafields->fetch_name_optionals_label($objectorder->table_element_line);
125include DOL_DOCUMENT_ROOT .
'/core/actions_fetchobject.inc.php';
127if (empty($origin) && !empty(
$object->origin_type) &&
$object->origin_id > 0) {
128 $origin =
$object->origin_type;
129} elseif (empty($origin) && is_string(
$object->origin) &&
$object->origin !==
'' &&
$object->origin_id > 0) {
132if (empty($origin_id) &&
$object->origin_id > 0) {
133 $origin_id =
$object->origin_id;
135$origin_type = is_string($origin) ? $origin :
'';
138$usercanread = $user->hasRight(
"expedition",
"lire");
139$usercancreate = $user->hasRight(
"expedition",
"creer");
140$usercandelete = $user->hasRight(
"expedition",
"supprimer");
143$hookmanager->initHooks(array(
'expeditioncard',
'globalcard'));
153 $socid = $user->socid;
158$permissiondellink = $user->hasRight(
'expedition',
'delivery',
'creer');
159$permissiontoadd = $user->hasRight(
'expedition',
'creer');
160$permissiontoedit = $usercancreate;
161$permissiontoeditextra = $permissiontoadd;
162if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
164 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
167$upload_dir =
$conf->expedition->dir_output .
'/sending';
173$shipping_method_id =
null;
183$parameters = array();
184$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
189if (empty($reshook)) {
190 $backurlforlist = DOL_URL_ROOT.
'/expedition/list.php';
192 if (empty($backtopage) || ($cancel && empty($id))) {
193 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
194 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
195 $backtopage = $backurlforlist;
197 $backtopage = DOL_URL_ROOT.
'/expedition/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
203 if (!empty($backtopageforcancel)) {
204 header(
"Location: ".$backtopageforcancel);
206 } elseif (!empty($backtopage)) {
207 header(
"Location: ".$backtopage);
215 if ($origin_id > 0) {
216 if ($origin ==
'commande') {
217 header(
"Location: " . DOL_URL_ROOT .
'/expedition/shipment.php?id=' . ((
int) $origin_id));
226 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
229 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
232 if ($action ==
'setdraft' && $permissiontoadd) {
234 $result =
$object->setDraft($user, 0);
238 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
243 if ($action ==
'reopen' && $permissiontoadd) {
249 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
255 if ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $permissiontoadd) {
259 if ($action ==
'classin' && $permissiontoadd) {
267 if ($action ==
'setref_customer' && $permissiontoadd) {
273 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'SHIPPING_MODIFY');
276 $action =
'editref_customer';
278 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
283 if ($action ==
'update_extras' && $permissiontoeditextra) {
286 $attribute_name =
GETPOST(
'attribute',
'aZ09');
289 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
296 $result =
$object->updateExtraField($attribute_name,
'SHIPPING_MODIFY');
304 $action =
'edit_extras';
309 if ($action ==
'add' && $permissiontoadd) {
312 if ($origin && $origin_id > 0) {
314 $classname = ucfirst($origin);
315 $objectsrc =
new $classname(
$db);
316 '@phan-var-force Facture|Commande $objectsrc';
317 $objectsrc->fetch($origin_id);
318 $object->socid = $objectsrc->socid;
323 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
332 $object->origin_type = $origin_type;
333 $object->origin_id = $origin_id;
343 $object->date_delivery = $date_delivery;
344 $object->date_shipping = $date_shipping;
351 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
356 $ret = $extrafields->setOptionalsFromPost(
null, $object);
370 if ($origin && $origin_id > 0) {
372 $object->origin_type = $origin_type;
373 $object->origin_id = $origin_id;
383 $object->date_delivery = $date_delivery;
384 $object->date_shipping = $date_shipping;
391 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
394 $classname = ucfirst(
$object->origin_type);
395 $objectsrc =
new $classname(
$db);
396 '@phan-var-force Facture|Commande $objectsrc';
397 $objectsrc->fetch(
$object->origin_id);
399 $object->socid = $objectsrc->socid;
400 $object->fk_delivery_address = $objectsrc->fk_delivery_address;
404 $batch_line = array();
405 $stockLine = array();
406 $array_options = array();
408 $num = count($objectsrc->lines);
411 $product_batch_used = array();
413 for ($i = 0; $i < $num; $i++) {
421 $batch =
"batchl" . $i .
"_0";
422 $stockLocation =
"ent1" . $i .
"_0";
425 $is_batch_or_serial = 0;
426 if (!empty($objectsrc->lines[$i]->fk_product)) {
427 $resultFetch = $product->fetch($objectsrc->lines[$i]->fk_product,
'',
'',
'', 1, 1, 1);
428 if ($resultFetch < 0) {
431 $is_batch_or_serial = $product->status_batch;
435 if (
isModEnabled(
'productbatch') && $objectsrc->lines[$i]->product_tobatch) {
442 $sub_qty[$j][
'id_batch'] =
GETPOSTINT($batch);
443 $subtotalqty += $sub_qty[$j][
'q'];
445 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)))) {
446 setEventMessages($langs->trans(
"TooManyQtyForSerialNumber", $product->ref,
''),
null,
'errors');
451 if ($is_batch_or_serial == 2 && $sub_qty[$j][
'q'] > 0) {
453 $product_batch_used[$j] = $sub_qty[$j][
'id_batch'];
457 $batch =
"batchl" . $i .
"_" . $j;
458 $qty =
"qtyl" . $i .
'_' . $j;
461 $batch_line[$i][
'detail'] = $sub_qty;
462 $batch_line[$i][
'qty'] = $subtotalqty;
465 $totalqty += $subtotalqty;
472 setEventMessages($langs->trans(
"StockIsRequiredToChooseWhichLotToUse") .
' (' . $langs->trans(
"Line") .
' ' .
GETPOSTINT($idl) .
')',
null,
'errors');
482 $stockLine[$i][$j][
'warehouse_id'] =
GETPOSTINT($stockLocation);
483 $stockLine[$i][$j][
'ix_l'] =
GETPOSTINT($idl);
489 $stockLocation =
"ent1" . $i .
"_" . $j;
490 $qty =
"qtyl" . $i .
'_' . $j;
501 if (
getDolGlobalInt(
"MAIN_DONT_SHIP_MORE_THAN_ORDERED") && $subtotalqty > $objectsrc->lines[$i]->qty) {
502 setEventMessages($langs->trans(
"ErrorTooMuchShipped", $i + 1),
null,
'errors');
508 $array_options[$i] = $extrafields->getOptionalsFromPost(
$object->table_element_line, (
string) $i);
510 if (isset($extrafields->attributes[
$object->table_element_line][
'label']) && is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
512 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
513 unset($_POST[
"options_" . $key]);
518 if (($totalqty > 0 ||
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS')) && !$error) {
519 $selected_subtotal_lines =
GETPOST(
'subtotal_toselect',
'array:int');
520 for ($i = 0; $i < $num; $i++) {
523 if (!isset($batch_line[$i])) {
525 if (isset($stockLine[$i])) {
527 $nbstockline = count($stockLine[$i]);
528 for ($j = 0; $j < $nbstockline; $j++) {
529 if ($stockLine[$i][$j][
'qty'] > 0 || ($stockLine[$i][$j][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
530 $ret =
$object->addline($stockLine[$i][$j][
'warehouse_id'], $stockLine[$i][$j][
'ix_l'], (
float) $stockLine[$i][$j][
'qty'], $array_options[$i]);
542 if ($entrepot_id < 0) {
545 if (!($objectsrc->lines[$i]->fk_product > 0)) {
556 if (
isModEnabled(
'subtotals') && $objectsrc->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE && in_array($objectsrc->lines[$i]->id, $selected_subtotal_lines)) {
557 $object->addSubtotalLine($langs, $objectsrc->lines[$i]->desc, (
int) $objectsrc->lines[$i]->qty, $objectsrc->lines[$i]->extraparams, $objectsrc->lines[$i]->id);
562 if ($batch_line[$i][
'qty'] > 0 || ($batch_line[$i][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
563 $origin_line_id = (int) $batch_line[$i][
'ix_l'];
565 $res = $origin_line->fetch($origin_line_id);
570 $ret =
$object->addline_batch($batch_line[$i], $array_options[$i], $origin_line);
579 $ret = $extrafields->setOptionalsFromPost(
null, $object);
592 $labelfieldmissing = $langs->transnoentitiesnoconv(
"QtyToShip");
594 $labelfieldmissing .=
'/' . $langs->transnoentitiesnoconv(
"Warehouse");
596 setEventMessages($langs->trans(
"ErrorFieldRequired", $labelfieldmissing),
null,
'errors');
603 foreach (
$object->lines as $line) {
604 $objectsrc_line =
new $objectsrc->class_element_line(
$db);
605 '@phan-var-force CommonObjectLine $objectsrc_line';
606 $objectsrc_line->fetch($line->origin_line_id);
607 $line->extraparams = $objectsrc_line->extraparams;
608 $line->setExtraParameters();
610 header(
"Location: card.php?id=" .
$object->id);
617 } elseif ($action ==
'create_delivery' &&
getDolGlobalInt(
'MAIN_SUBMODULE_DELIVERY') && $user->hasRight(
'expedition',
'delivery',
'creer')) {
621 $result =
$object->create_delivery($user);
625 header(
"Location: " . DOL_URL_ROOT .
'/delivery/card.php?action=create_delivery&token=' .
newToken() .
'&id=' . $result);
633 $action ==
'confirm_valid' && $confirm ==
'yes' && ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
634 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate')))
638 $result =
$object->valid($user);
645 $outputlangs = $langs;
648 $newlang =
GETPOST(
'lang_id',
'aZ09');
651 $newlang =
$object->thirdparty->default_lang;
653 if (!empty($newlang)) {
655 $outputlangs->setDefaultLang($newlang);
660 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
666 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
667 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
668 $result =
$object->cancel($user, 0, (
bool) $also_update_stock);
674 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'supprimer')) {
675 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
676 $result =
$object->delete($user, 0, (
bool) $also_update_stock);
678 header(
"Location: " . DOL_URL_ROOT .
'/expedition/index.php');
692 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $permissiontoadd) {
693 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'), $user);
696 $object->line_order(
true,
'ASC',
false);
698 $outputlangs = $langs;
701 $newlang =
GETPOST(
'lang_id',
'aZ09');
704 $newlang =
$object->thirdparty->default_lang;
706 if (!empty($newlang)) {
708 $outputlangs->setDefaultLang($newlang);
712 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
715 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
720 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
722 $result =
$object->deleteLine($user, $lineid);
727 $outputlangs = $langs;
730 $newlang =
GETPOST(
'lang_id',
'aZ09');
733 $newlang =
$object->thirdparty->default_lang;
735 if (!empty($newlang)) {
737 $outputlangs->setDefaultLang($newlang);
741 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
744 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
749 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
750 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
752 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
757 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
758 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
760 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
765 } elseif ($action ==
'setdate_livraison' && $user->hasRight(
'expedition',
'creer')) {
769 $result =
$object->setDeliveryDate($user, $datedelivery);
773 } elseif ($action ==
'setdate_shipping' && $user->hasRight(
'expedition',
'creer')) {
777 $result =
$object->setShippingDate($user, $dateshipping);
781 } elseif (in_array($action, array(
'settracking_number',
'settracking_url',
'settrueWeight',
'settrueWidth',
'settrueHeight',
'settrueDepth',
'setshipping_method_id')) && $user->hasRight(
'expedition',
'creer')) {
785 if ($action ==
'settracking_number') {
786 $object->tracking_number = trim(
GETPOST(
'tracking_number',
'alpha'));
787 $object->tracking_number = preg_replace(
'/\s+/',
'',
$object->tracking_number);
789 if ($action ==
'settracking_url') {
790 $object->tracking_url = trim(
GETPOST(
'tracking_url',
'restricthtml'));
793 if ($action ==
'settrueWeight') {
797 if ($action ==
'settrueWidth') {
800 if ($action ==
'settrueHeight') {
804 if ($action ==
'settrueDepth') {
807 if ($action ==
'setshipping_method_id') {
811 if (
$object->update($user) >= 0) {
812 header(
"Location: card.php?id=" .
$object->id);
817 } elseif ($action ==
'classifybilled' && $permissiontoadd) {
819 $result =
$object->setBilled();
821 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
825 } elseif ($action ==
'classifyclosed' && $permissiontoadd) {
827 $result =
$object->setClosed();
829 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
833 } elseif ($action ==
'deleteline' && !empty($line_id) && $permissiontoadd) {
839 $line->fk_expedition =
$object->id;
841 $num_prod = count($lines);
842 for ($i = 0; $i < $num_prod; $i++) {
843 if ($lines[$i]->
id == $line_id) {
846 if (is_array($lines[$i]->details_entrepot) && count($lines[$i]->details_entrepot) > 1) {
848 foreach ($lines[$i]->details_entrepot as $details_entrepot) {
849 $line->id = $details_entrepot->line_id;
850 if (!$error && $line->delete($user) < 0) {
856 $line->id = $line_id;
857 if (!$error && $line->delete($user) < 0) {
862 unset($_POST[
"lineid"]);
866 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
871 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'cancel',
'alpha') != $langs->trans(
"Cancel")) {
876 if (!
$object->fetch($id) > 0) {
881 $qty =
GETPOST(
'qty',
'alpha');
884 $element_type =
'shipping';
890 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
891 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
893 if (is_array($extralabelsline)) {
895 foreach ($extralabelsline as $key => $value) {
896 unset($_POST[
"options_" . $key]);
905 $result =
$object->updatelinefree(
GETPOSTINT(
'lineid'), (
float) $qty, $element_type, $fk_product,
GETPOSTINT(
'units'), $rang, $description, $fk_parent, 0, $array_options);
910 $outputlangs = $langs;
913 $newlang =
GETPOST(
'lang_id',
'aZ09');
916 $newlang =
$object->thirdparty->default_lang;
918 if (!empty($newlang)) {
920 $outputlangs->setDefaultLang($newlang);
921 $outputlangs->load(
'products');
925 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
927 unset($_POST[
'qty']);
928 unset($_POST[
'units']);
933 } elseif ($origin && $origin_id > 0) {
941 $num_prod = count($lines);
942 for ($i = 0; $i < $num_prod; $i++) {
943 if ($lines[$i]->
id == $line_id) {
944 $update_done =
false;
946 $line->fk_expedition =
$object->id;
949 $line->array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
951 if (is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
952 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
953 unset($_POST[
"options_" . $key]);
956 $line->fk_product = $lines[$i]->fk_product;
957 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
959 foreach ($lines[$i]->detail_batch as $detail_batch) {
961 $batch =
"batchl" . $detail_batch->fk_expeditiondet .
"_" . $detail_batch->fk_origin_stock;
962 $qty =
"qtyl" . $detail_batch->fk_expeditiondet .
'_' . $detail_batch->id;
965 if (!empty($batch_id)) {
966 if ($lotStock->fetch($batch_id) > 0 && $line->fetch($detail_batch->fk_expeditiondet) > 0) {
967 if ($lines[$i]->entrepot_id != 0) {
969 $line->entrepot_id = $lotStock->warehouseid;
973 if (empty($line->detail_batch)) {
974 $line->detail_batch =
new stdClass();
977 $line->detail_batch->fk_origin_stock = $batch_id;
978 $line->detail_batch->batch = $lotStock->batch;
979 $line->detail_batch->id = $detail_batch->id;
980 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
981 $line->detail_batch->qty = $batch_qty;
982 if ($line->update($user) < 0) {
993 unset($_POST[$batch]);
998 $batch =
"batchl" . $line_id .
"_0";
999 $qty =
"qtyl" . $line_id .
"_0";
1002 $lineIdToAddLot = 0;
1003 if ($batch_qty > 0 && !empty($batch_id)) {
1004 if ($lotStock->fetch($batch_id) > 0) {
1006 if ($lines[$i]->entrepot_id > 0) {
1008 if ($lines[$i]->entrepot_id == $lotStock->warehouseid) {
1009 $lineIdToAddLot = $line_id;
1011 } elseif (count($lines[$i]->details_entrepot) > 1) {
1013 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
1014 if ($detail_entrepot->entrepot_id == $lotStock->warehouseid) {
1015 $lineIdToAddLot = $detail_entrepot->line_id;
1019 if ($lineIdToAddLot) {
1021 if ($line->fetch($lineIdToAddLot) > 0) {
1022 $line->detail_batch->fk_origin_stock = $batch_id;
1023 $line->detail_batch->batch = $lotStock->batch;
1024 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
1025 $line->detail_batch->qty = $batch_qty;
1026 if ($line->update($user) < 0) {
1030 $update_done =
true;
1038 $line->origin_line_id = $lines[$i]->origin_line_id;
1039 $line->entrepot_id = $lotStock->warehouseid;
1041 $line->detail_batch[0]->fk_origin_stock = $batch_id;
1042 $line->detail_batch[0]->batch = $lotStock->batch;
1043 $line->detail_batch[0]->entrepot_id = $lotStock->warehouseid;
1044 $line->detail_batch[0]->qty = $batch_qty;
1045 if (
$object->create_line_batch($line, $line->array_options) < 0) {
1049 $update_done =
true;
1058 if ($lines[$i]->fk_product > 0) {
1060 if ($lines[$i]->entrepot_id == 0) {
1062 $stockLocation =
"entl" . $line_id;
1063 $qty =
"qtyl" . $line_id;
1064 $line->id = $line_id;
1065 $line->entrepot_id =
GETPOSTINT((
string) $stockLocation);
1067 if ($line->update($user) < 0) {
1071 $update_done =
true;
1073 unset($_POST[$stockLocation]);
1074 unset($_POST[$qty]);
1075 } elseif ($lines[$i]->entrepot_id > 0) {
1077 $stockLocation =
"entl" . $line_id;
1078 $qty =
"qtyl" . $line_id;
1079 $line->id = $line_id;
1080 $line->entrepot_id =
GETPOSTINT($stockLocation);
1082 if ($line->update($user) < 0) {
1086 $update_done =
true;
1088 unset($_POST[$stockLocation]);
1089 unset($_POST[$qty]);
1090 } elseif (count($lines[$i]->details_entrepot) > 1) {
1092 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
1094 $stockLocation =
"entl" . $detail_entrepot->line_id;
1095 $qty =
"qtyl" . $detail_entrepot->line_id;
1097 if (!empty($warehouse)) {
1098 $line->id = $detail_entrepot->line_id;
1099 $line->entrepot_id = $warehouse;
1101 if ($line->update($user) < 0) {
1105 $update_done =
true;
1108 unset($_POST[$stockLocation]);
1109 unset($_POST[$qty]);
1113 $qty =
"qtyl" . $line_id;
1114 $line->id = $line_id;
1116 $line->entrepot_id = 0;
1117 if ($line->update($user) < 0) {
1121 $update_done =
true;
1123 unset($_POST[$qty]);
1127 $qty =
"qtyl" . $line_id;
1128 $line->id = $line_id;
1130 $line->entrepot_id = 0;
1131 if ($line->update($user) < 0) {
1135 $update_done =
true;
1137 unset($_POST[$qty]);
1141 if (empty($update_done)) {
1142 $line->id = $lines[$i]->id;
1143 $resultInsertExtraFields = $line->insertExtraFields();
1144 if ($resultInsertExtraFields < 0) {
1147 } elseif ($resultInsertExtraFields > 0) {
1148 $update_done =
true;
1152 if (empty($update_done) && !$error) {
1153 setEventMessages($langs->trans(
'NoShipmentLineChangeDetected'),
null,
'warnings');
1158 unset($_POST[
"lineid"]);
1163 $outputlangs = $langs;
1166 $newlang =
GETPOST(
'lang_id',
'aZ09');
1169 $newlang =
$object->thirdparty->default_lang;
1171 if (!empty($newlang)) {
1173 $outputlangs->setDefaultLang($newlang);
1177 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1180 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1184 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'cancel',
'alpha') == $langs->trans(
"Cancel")) {
1185 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1187 } elseif ($action ==
'addline' && !$origin &&
getDolGlobalString(
'SHIPMENT_STANDALONE') && $usercancreate) {
1188 $langs->load(
'errors');
1194 $fk_elementdet =
'';
1195 $element_type =
'shipping';
1201 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1202 if ($prod_entry_mode ==
'free') {
1207 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1215 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1216 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1218 if (is_array($extralabelsline)) {
1220 foreach ($extralabelsline as $key => $value) {
1221 unset($_POST[
"options_".$key]);
1225 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1226 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
1231 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1235 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1238 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1239 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
1243 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1244 if ($combinations =
GETPOST(
'combinations',
'array')) {
1248 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1249 $idprod = $res->fk_product_child;
1250 $fk_product = $idprod;
1252 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1258 if (!$error && ($qty >= 0) && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1260 if (!empty($idprod) && $idprod > 0) {
1262 $prod->fetch($idprod);
1263 $desc =
$prod->label;
1264 $description = $desc;
1267 $outputlangs = $langs;
1269 if (
GETPOST(
'lang_id',
'aZ09')) {
1270 $newlang =
GETPOST(
'lang_id',
'aZ09');
1272 if (empty($newlang)) {
1273 $newlang =
$object->thirdparty->default_lang;
1275 if (!empty($newlang)) {
1277 $outputlangs->setDefaultLang($newlang);
1280 $description = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"description"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"description"] :
$prod->
description;
1282 $description =
$prod->description;
1287 $description = $line_desc;
1294 $outputlangs = $langs;
1296 if (
GETPOST(
'lang_id',
'alpha')) {
1297 $newlang =
GETPOST(
'lang_id',
'alpha');
1299 if (empty($newlang)) {
1300 $newlang =
$object->thirdparty->default_lang;
1302 if (!empty($newlang)) {
1304 $outputlangs->setDefaultLang($newlang);
1305 $outputlangs->load(
'products');
1307 if (!empty(
$prod->customcode)) {
1308 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
1310 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1313 if (!empty(
$prod->country_code)) {
1314 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'',
$db, $outputlangs, 0);
1317 if (!empty(
$prod->customcode)) {
1318 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
1320 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1323 if (!empty(
$prod->country_code)) {
1324 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'',
$db, $langs, 0);
1330 $type =
$prod->type;
1331 $fk_unit =
$prod->fk_unit;
1333 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1336 $fk_unit =
GETPOST(
'units',
'alpha');
1337 $description = $desc;
1338 $fk_elementdet =
'';
1343 $result =
$object->addlinefree((
float) $qty, $element_type, $idprod, $fk_unit, min($rank, count(
$object->lines) + 1), $description, $fk_parent, $array_options);
1350 $outputlangs = $langs;
1351 $newlang =
GETPOST(
'lang_id',
'alpha');
1353 $newlang =
$object->thirdparty->default_lang;
1355 if (!empty($newlang)) {
1357 $outputlangs->setDefaultLang($newlang);
1359 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1362 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1366 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $permissiontoadd) {
1367 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
1371 $outputlangs = $langs;
1374 $newlang =
GETPOST(
'lang_id',
'aZ09');
1377 $newlang =
$object->thirdparty->default_lang;
1379 if (!empty($newlang)) {
1381 $outputlangs->setDefaultLang($newlang);
1383 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1386 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1391 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $permissiontoadd) {
1392 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
1396 $outputlangs = $langs;
1399 $newlang =
GETPOST(
'lang_id',
'aZ09');
1402 $newlang =
$object->thirdparty->default_lang;
1404 if (!empty($newlang)) {
1406 $outputlangs->setDefaultLang($newlang);
1408 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1411 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1418 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1424 $triggersendname =
'SHIPPING_SENTBYMAIL';
1426 $autocopy =
'MAIN_MAIL_AUTOCOPY_SHIPMENT_TO';
1427 $mode =
'emailfromshipment';
1428 $trackid =
'shi' .
$object->id;
1429 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1436$title =
$object->ref .
' - ' . $langs->trans(
"Card");
1437if ($action ==
'create') {
1438 $title = $langs->trans(
"NewSending");
1441$help_url =
'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Expediciones|DE:Modul_Lieferungen';
1443llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-expedition page-card');
1445if (empty($action)) {
1455 $formproject =
null;
1465 print
'<br>' .$langs->trans(
"ShipmentCreationIsDoneFromOrder");
1472if ($action ==
'create' && $usercancreate) {
1480 $res = $soc->fetch($socid);
1483 $shipping_method_id = $soc->shipping_method_id;
1484 $note_private =
$object->getDefaultCreateValueFor(
'note_private');
1485 $note_public =
$object->getDefaultCreateValueFor(
'note_public');
1487 print
'<form name="crea_expedition" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
1488 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1489 print
'<input type="hidden" name="action" value="add">';
1490 print
'<input type="hidden" name="changecompany" value="0">';
1491 print
'<input type="hidden" name="originid" value="' .
$id .
'">';
1492 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
1496 print
'<table class="border centpercent">';
1500 print
'<td class="fieldrequired">' . $langs->trans(
'ThirdParty') .
'</td>';
1503 print $soc->getNomUrl(1);
1504 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1507 print
'<td class="valuefieldcreate">';
1508 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth175 maxwidth500 widthcentpercentminusxx');
1512 $(document).ready(function() {
1513 $("#socid").change(function() {
1514 console.log("We have changed the company - Reload page");
1515 var socid = $(this).val();
1517 $("input[name=action]").val("create");
1518 $("input[name=changecompany]").val("1");
1519 $("form[name=crea_expedition]").submit();
1524 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>';
1530 if (
isModEnabled(
'project') && is_object($formproject)) {
1532 if (empty($projectid) && !empty(
$object->fk_project)) {
1533 $projectid = (int)
$object->fk_project;
1536 $langs->load(
"projects");
1538 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1539 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1540 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1541 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>';
1547 print
'<tr><td>'.$langs->trans(
"DateShipping").
'</td>';
1548 print
'<td colspan="3">';
1549 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1550 $date_shipping = ($date_shipping ? $date_shipping :
$object->date_shipping);
1551 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1556 print
'<tr><td>'.$langs->trans(
"DateDeliveryPlanned").
'</td>';
1557 print
'<td colspan="3">';
1558 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1559 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1560 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1566 print $langs->trans(
"Weight");
1567 print
'</td><td colspan="3">';
1568 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1569 print
'<input name="weight" size="4" value="' .
GETPOST(
'weight') .
'"> ';
1570 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight",
GETPOST(
'weight_units'), 0, 2);
1571 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1572 print $form->textwithpicto($text, $htmltext);
1577 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1578 print
' </td><td colspan="3">';
1579 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1580 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1581 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1582 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1584 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1585 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1586 print $form->textwithpicto($text, $htmltext);
1590 print
"<tr><td>".$langs->trans(
"DeliveryMethod").
"</td>";
1591 print
'<td colspan="3">';
1592 $expe->fetch_delivery_methods();
1593 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1594 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1596 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1598 print
"</td></tr>\n";
1601 print
"<tr><td>".$langs->trans(
"TrackingNumber").
"</td>";
1602 print
'<td colspan="3">';
1603 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1604 print
'<input name="tracking_number" size="20" value="'.GETPOST(
'tracking_number',
'alpha').
'">';
1605 print
"</td></tr>\n";
1608 $parameters = array(
'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
'colspan' =>
' colspan="3"',
'cols' =>
'3',
'socid' => $socid);
1609 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $expe, $action);
1610 print $hookmanager->resPrint;
1612 if (empty($reshook)) {
1614 if (
$object->fetch_optionals() > 0) {
1615 $expe->array_options = array_merge($expe->array_options,
$object->array_options);
1617 print $expe->showOptionals($extrafields,
'edit', $parameters);
1623 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1).
'</label></td>';
1624 print
'<td colspan="3" class="maxwidthonsmartphone">';
1625 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1626 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1631 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
1633 if (is_array($list) && count($list) > 1) {
1634 print
"<tr><td>".$langs->trans(
"DefaultModel").
"</td>";
1635 print
'<td colspan="3">';
1636 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1637 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1638 print
"</td></tr>\n";
1644 print
'<td class="tdtop">';
1645 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext);
1647 print
'<td valign="top" colspan="2">';
1648 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1649 print $doleditor->Create(1);
1652 if (!$user->socid) {
1654 print
'<td class="tdtop">';
1655 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext);
1657 print
'<td valign="top" colspan="2">';
1658 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1659 print $doleditor->Create(1);
1667 print $form->buttonsSaveCancel(
"CreateDraft");
1670 } elseif ($origin) {
1671 $classname = ucfirst($origin);
1675 '@phan-var-force Commande|Facture $object';
1678 if (
$object->fetch($origin_id)) {
1683 $author->fetch(
$object->user_author_id);
1689 print
'<form action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
1690 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1691 print
'<input type="hidden" name="action" value="add">';
1692 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
1693 print
'<input type="hidden" name="origin_id" value="' .
$object->id .
'">';
1695 print
'<input type="hidden" name="entrepot_id" value="' .
GETPOSTINT(
'entrepot_id') .
'">';
1700 print
'<table class="border centpercent">';
1703 print
'<tr><td class="titlefieldcreate fieldrequired">';
1705 print $langs->trans(
"RefOrder");
1708 print $langs->trans(
"RefProposal");
1710 print
'</td><td colspan="3">';
1717 if ($origin ==
'commande') {
1718 print $langs->trans(
'RefCustomerOrder');
1719 } elseif ($origin ==
'propal') {
1720 print $langs->trans(
'RefCustomerOrder');
1722 print $langs->trans(
'RefCustomer');
1724 print
'</td><td colspan="3">';
1725 print
'<input type="text" name="ref_customer" value="' .
$object->ref_client .
'" />';
1730 print
'<tr><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Company') .
'</td>';
1731 print
'<td colspan="3">' . $soc->getNomUrl(1) .
'</td>';
1732 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1736 if (
isModEnabled(
'project') && is_object($formproject)) {
1738 if (empty($projectid) && !empty(
$object->fk_project)) {
1739 $projectid = (int)
$object->fk_project;
1741 if ($origin ==
'project') {
1744 $langs->load(
"projects");
1746 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1747 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1748 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1749 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>';
1755 print
'<tr><td>' . $langs->trans(
"DateDeliveryPlanned") .
'</td>';
1756 print
'<td colspan="3">';
1757 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1758 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1759 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1764 print
'<tr><td>' . $langs->trans(
"DateShipping") .
'</td>';
1765 print
'<td colspan="3">';
1766 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1768 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1773 print
'<tr><td>' . $langs->trans(
"NotePublic") .
'</td>';
1774 print
'<td colspan="3">';
1775 $doleditor =
new DolEditor(
'note_public',
$object->note_public,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1776 print $doleditor->Create(1);
1780 if (
$object->note_private && !$user->socid) {
1781 print
'<tr><td>' . $langs->trans(
"NotePrivate") .
'</td>';
1782 print
'<td colspan="3">';
1783 $doleditor =
new DolEditor(
'note_private',
$object->note_private,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1784 print $doleditor->Create(1);
1790 print $langs->trans(
"Weight");
1791 print
'</td><td colspan="3">';
1792 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1795 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
GETPOST(
'weight_units'), 0, 2);
1796 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1797 print $form->textwithpicto($text, $htmltext);
1802 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1803 print
' </td><td colspan="3">';
1804 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1805 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1806 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1807 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1809 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1810 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1811 print $form->textwithpicto($text, $htmltext);
1815 print
"<tr><td>" . $langs->trans(
"DeliveryMethod") .
"</td>";
1816 print
'<td colspan="3">';
1817 $expe->fetch_delivery_methods();
1818 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1819 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1821 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1823 print
"</td></tr>\n";
1826 print
"<tr><td>" . $langs->trans(
"TrackingNumber") .
"</td>";
1827 print
'<td colspan="3">';
1828 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1829 print
'<input name="tracking_number" size="20" value="' .
GETPOST(
'tracking_number',
'alpha') .
'">';
1830 print
"</td></tr>\n";
1835 print
'<td><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1) .
'</label></td>';
1836 print
'<td colspan="3" class="maxwidthonsmartphone">';
1837 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1838 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1843 include_once DOL_DOCUMENT_ROOT .
'/core/modules/expedition/modules_expedition.php';
1845 if (is_array($list) && count($list) > 1) {
1846 print
"<tr><td>" . $langs->trans(
"DefaultModel") .
"</td>";
1847 print
'<td colspan="3">';
1848 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1849 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1850 print
"</td></tr>\n";
1858 if (isset($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && !empty($extrafields->attributes[
$object->table_element][
'label'])) {
1859 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
1860 if (array_key_exists(
'options_'.$key, $objectsav->array_options)) {
1861 $object->array_options[
'options_'.$key] = $objectsav->array_options[
'options_'.$key];
1865 $parameters = array(
1866 'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
1870 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
1880 $numAsked = count(
$object->lines);
1882 print
'<script type="text/javascript">' .
"\n";
1883 print
'jQuery(document).ready(function() {' .
"\n";
1884 print
'jQuery("#autofill").click(function() {';
1886 while ($i < $numAsked) {
1887 print
'jQuery("#qtyl' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1889 print
'jQuery("#qtyl' . $i .
'_' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1893 print
'return false; });' .
"\n";
1894 print
'jQuery("#autoreset").click(function() { console.log("Reset values to 0"); jQuery(".qtyl").val(0);' .
"\n";
1895 print
'return false; });' .
"\n";
1897 print
'</script>' .
"\n";
1901 print
'<div class="div-table-responsive-no-min">';
1902 print
'<table class="noborder centpercent">';
1907 $alreadyQtyBatchSetted = $alreadyQtySetted = array();
1909 $title_lines_to_disable = array();
1914 $title_lines_to_disable =
$object->getDisabledShippmentSubtotalLines();
1916 $selectedLines =
GETPOST(
'subtotal_toselect',
'array:int');
1917 foreach (
$object->lines as $line) {
1918 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1919 $show_check_add_buttons =
true;
1924 print
'<tr class="liste_titre">';
1926 if (isset($show_check_add_buttons)) {
1927 print $form->showCheckAddButtons(
'checkforselect');
1929 print $langs->trans(
"Description");
1931 print
'<td class="center">' . $langs->trans(
"QtyOrdered") .
'</td>';
1932 print
'<td class="center">' . $langs->trans(
"QtyShipped") .
'</td>';
1933 print
'<td class="center">' . $langs->trans(
"QtyToShip");
1935 print
'<br><a href="#" id="autofill" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Autofill"),
'autofill',
'class="paddingrightonly"') .
'</a>';
1940 print
'<span id="autoreset" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Reset"),
'eraser') .
'</span>';
1944 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' (' . $langs->trans(
"Stock") .
')</td>';
1946 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' / ' . $langs->trans(
"Batch") .
' (' . $langs->trans(
"Stock") .
')</td>';
1950 print
'<td class="left">' . $langs->trans(
'StockEntryDate') .
'</td>';
1956 $warehousePicking = array();
1958 if ($warehouse_id > 0) {
1959 $warehousePicking[] = $warehouse_id;
1961 $warehouseObj->get_children_warehouses($warehouse_id, $warehousePicking);
1965 while ($indiceAsked < $numAsked) {
1968 $line =
$object->lines[$indiceAsked];
1970 $parameters = array(
'i' => $indiceAsked,
'line' => $line,
'num' => $numAsked);
1971 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
1976 if (empty($reshook) && $line->special_code != SUBTOTALS_SPECIAL_CODE) {
1978 $type = $line->product_type ? $line->product_type : $line->fk_product_type;
1980 if (!empty($line->date_start)) {
1983 if (!empty($line->date_end)) {
1987 print
'<!-- line for order line ' . $line->id .
' -->' .
"\n";
1988 print
'<tr class="oddeven" id="row-' . $line->id .
'">' .
"\n";
1990 $qtyProdCom = $line->qty;
1991 $productChildrenNb = 0;
1993 if ($line->fk_product > 0) {
1994 $res = $product->fetch($line->fk_product);
1999 $productChildrenNb = $product->hasFatherOrChild(1);
2001 if ($productChildrenNb > 0) {
2002 $product->loadStockForVirtualProduct(
'warehouseopen', $qtyProdCom);
2004 $product->load_stock(
'warehouseopen');
2009 print
'<a name="' . $line->id .
'"></a>';
2012 $product_static->type = $line->fk_product_type;
2013 $product_static->id = $line->fk_product;
2014 $product_static->ref = $line->ref;
2015 $product_static->status = $line->product_tosell;
2016 $product_static->status_buy = $line->product_tobuy;
2017 $product_static->status_batch = $line->product_tobatch;
2019 $showdescinproductdesc =
getDolGlobalString(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE');
2021 $text = $product_static->getNomUrl(1);
2022 $text .=
' - ' . (!empty($line->label) ? $line->label : $line->product_label);
2024 $description .= empty($product->stockable_product) ? $langs->trans(
'StockDisabled') : $langs->trans(
'StockEnabled');
2025 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
2031 if ($showdescinproductdesc) {
2032 print ($line->desc && $line->desc != $line->product_label) ?
'<br>' .
dol_htmlentitiesbr($line->desc) :
'';
2037 $srcLine->id = $line->id;
2038 $srcLine->fetch_optionals();
2039 $expLine->array_options = array_merge($expLine->array_options, $srcLine->array_options);
2040 $lineExtrafieldsHtml = $expLine->showOptionals($extrafields,
'edit', array(), (
string) $indiceAsked,
'',
'1',
'line');
2041 if (!empty($lineExtrafieldsHtml)) {
2042 print
'<div style="padding-top: 10px" id="extrafield_lines_area_create_' . $indiceAsked .
'" name="extrafield_lines_area_create_' . $indiceAsked .
'">';
2043 print $lineExtrafieldsHtml;
2051 $text =
img_object($langs->trans(
'Service'),
'service');
2053 $text =
img_object($langs->trans(
'Product'),
'product');
2056 if (!empty($line->label)) {
2057 $text .=
' <strong>' . $line->label .
'</strong>';
2058 print $form->textwithtooltip($text, $line->desc, 3, 0,
'', (
string) $i);
2060 print $text .
' ' . nl2br($line->desc);
2068 $srcLine->id = $line->id;
2069 $srcLine->fetch_optionals();
2070 $expLine->array_options = array_merge($expLine->array_options, $srcLine->array_options);
2071 $lineExtrafieldsHtml = $expLine->showOptionals($extrafields,
'edit', array(), (
string) $indiceAsked,
'',
'1',
'line');
2072 if (!empty($lineExtrafieldsHtml)) {
2073 print
'<div style="padding-top: 10px" id="extrafield_lines_area_create_' . $indiceAsked .
'" name="extrafield_lines_area_create_' . $indiceAsked .
'">';
2074 print $lineExtrafieldsHtml;
2087 print
'<td class="center">' . $line->qty;
2088 print
'<input name="qtyasked' . $indiceAsked .
'" id="qtyasked' . $indiceAsked .
'" type="hidden" value="' . $line->qty .
'">';
2090 print
' ' . $unit_order .
'</td>';
2094 print
'<td class="center">';
2095 $quantityDelivered = isset(
$object->expeditions[$line->id]) ?
$object->expeditions[$line->id] :
'';
2096 print $quantityDelivered;
2097 print
'<input name="qtydelivered' . $indiceAsked .
'" id="qtydelivered' . $indiceAsked .
'" type="hidden" value="' . $quantityDelivered .
'">';
2098 if ($quantityDelivered) {
2099 print
' ' . $unit_order .
'</td>';
2103 $quantityAsked = $line->qty;
2105 $quantityToBeDelivered = 0;
2107 if (is_numeric($quantityDelivered)) {
2108 $quantityToBeDelivered = $quantityAsked - $quantityDelivered;
2110 $quantityToBeDelivered = $quantityAsked;
2114 $warehouseObject =
null;
2115 if (count($warehousePicking) == 1 || !($line->fk_product > 0) || !
isModEnabled(
'stock')) {
2116 print
'<!-- Case warehouse already known or product not a predefined product -->';
2118 $stock = + (isset($product->stock_warehouse[$warehouse_id]->real) ? $product->stock_warehouse[$warehouse_id]->real : 0);
2120 $deliverableQty = $quantityToBeDelivered;
2122 $deliverableQty = min($quantityToBeDelivered, $stock);
2124 if ($deliverableQty < 0) {
2125 $deliverableQty = 0;
2127 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2129 print
'<td class="center">';
2132 $deliverableQty =
GETPOSTFLOAT(
'qtyl'.$indiceAsked,
'MS');
2134 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2135 $qtylValue = $deliverableQty;
2138 } elseif (is_numeric($qtylValue)) {
2140 $qtylValue =
price($qtylValue);
2142 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" class="qtyl right" type="text" size="4" value="' . $qtylValue .
'">';
2145 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2146 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2149 print $langs->trans(
"NA");
2155 print
'<td class="left">';
2158 $ent =
"entl" . $indiceAsked;
2159 $idl =
"idl" . $indiceAsked;
2161 if ($line->fk_product > 0) {
2162 print
'<!-- Show warehouse selection -->';
2168 if ($productChildrenNb > 0) {
2169 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, 0,
'', 0, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2171 if ($product->stockable_product == Product::ENABLED_STOCK) {
2172 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, $line->fk_product,
'', 1, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2174 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2178 if ($tmpentrepot_id > 0 && $tmpentrepot_id == $warehouse_id) {
2180 if ($stock < $quantityToBeDelivered) {
2181 print
' ' .
img_warning($langs->trans(
"StockTooLow"));
2186 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span><input name="entl' . $indiceAsked .
'" id="entl' . $indiceAsked .
'" type="hidden" value="0">';
2197 $product->get_sousproduits_arbo();
2198 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2199 if (count($prods_arbo) > 0) {
2200 foreach ($prods_arbo as $key => $value) {
2203 if ($value[
'stock'] < $value[
'stock_alert']) {
2206 print
"<tr class=\"oddeven\"><td> ->
2207 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2208 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2209 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2219 print
'<td></td><td></td>';
2224 print
'<!-- Case product need lot -->';
2227 if ($warehouse_id > 0) {
2228 $staticwarehouse->fetch($warehouse_id);
2234 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2235 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2239 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
2240 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2241 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2243 $batchStock = +$dbatch->qty;
2244 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2247 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2248 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2250 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2251 $alreadyQtyBatchSetted[$line->fk_product] = array();
2254 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2255 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2258 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2261 if ($deliverableQty < 0) {
2262 $deliverableQty = 0;
2265 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2267 $deliverableQty =
GETPOST($inputName,
'int');
2270 $tooltipClass = $tooltipTitle =
'';
2271 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2272 $tooltipClass =
' classfortooltip';
2273 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2275 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2277 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2279 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2280 print
'<td colspan="3" ></td><td class="center">';
2281 $qtylValue = $deliverableQty;
2284 } elseif (is_numeric($qtylValue)) {
2285 $qtylValue =
price($qtylValue);
2287 print
'<input class="qtyl ' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="' . $qtylValue .
'">';
2290 print
'<!-- Show details of lot -->';
2291 print
'<td class="left">';
2293 print $staticwarehouse->getNomUrl(0) .
' / ';
2295 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2298 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
2300 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2303 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2305 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
2309 $quantityToBeDelivered -= $deliverableQty;
2310 if ($quantityToBeDelivered < 0) {
2311 $quantityToBeDelivered = 0;
2316 print
'<td>' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2321 print
'<!-- Case there is no details of lot at all -->';
2322 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2323 print
'<input class="qtyl right" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="0" disabled="disabled"> ';
2326 print
'<td class="left">';
2327 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $staticwarehouse->label);
2337 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2338 print
'<!-- Case warehouse not already known and product does not need lot -->';
2339 print
'<td></td><td></td>';
2343 print
'</tr>' .
"\n";
2345 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2350 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2351 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2356 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2358 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2363 $tmpwarehouseObject->fetch($warehouse_id);
2364 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2365 $stock = +$stock_warehouse->real;
2366 $deliverableQty = min($quantityToBeDelivered, $stock);
2367 $deliverableQty = max(0, $deliverableQty);
2369 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2370 print
'<td colspan="3" ></td><td class="center"><!-- qty to ship (no lot management for product line indiceAsked=' . $indiceAsked .
') -->';
2376 $tooltipClass = $tooltipTitle =
'';
2377 if ($productChildrenNb <= 0) {
2378 if (isset($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2379 $deliverableQty = min($quantityToBeDelivered, $stock - $alreadyQtySetted[$line->fk_product][intval($warehouse_id)]);
2381 if (!isset($alreadyQtySetted[$line->fk_product])) {
2382 $alreadyQtySetted[$line->fk_product] = array();
2385 $deliverableQty = min($quantityToBeDelivered, $stock);
2388 if ($deliverableQty < 0) {
2389 $deliverableQty = 0;
2392 if (!empty($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2393 $tooltipClass =
' classfortooltip';
2394 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines').
' : '.$alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2396 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = 0;
2399 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = $deliverableQty + $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2402 $inputName =
'qtyl'.$indiceAsked.
'_'.$subj;
2406 $qtylValue = $deliverableQty;
2409 } elseif (is_numeric($qtylValue)) {
2410 $qtylValue =
price($qtylValue);
2412 print
'<input class="qtyl' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="text" size="4" value="' . $qtylValue .
'">';
2413 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_id .
'">';
2416 print
'<input name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2419 print $langs->trans(
"NA");
2424 print
'<td class="left">';
2426 if ($product->stockable_product == Product::ENABLED_STOCK || $productChildrenNb > 0) {
2427 print $tmpwarehouseObject->getNomUrl(0) .
' ';
2428 if ($productChildrenNb <= 0) {
2429 print
'<!-- Show details of stock -->';
2430 print
'(' . $stock .
')';
2433 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2436 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2439 $quantityToBeDelivered -= $deliverableQty;
2440 if ($quantityToBeDelivered < 0) {
2441 $quantityToBeDelivered = 0;
2452 $product->get_sousproduits_arbo();
2453 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2454 if (count($prods_arbo) > 0) {
2455 foreach ($prods_arbo as $key => $value) {
2458 if ($value[
'stock'] < $value[
'stock_alert']) {
2461 print
'<tr class"oddeven"><td>';
2462 print
" ->
2463 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2464 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2465 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2474 print
'<!-- Case warehouse not already known and product need lot -->';
2475 print
'<td></td><td></td>';
2482 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2489 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2490 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2491 $nbofsuggested += count($stock_warehouse->detail_batch);
2495 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2497 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2502 $tmpwarehouseObject->fetch($warehouse_id);
2503 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2504 foreach ($stock_warehouse->detail_batch as $dbatch) {
2505 $batchStock = +$dbatch->qty;
2506 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2507 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2509 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2510 $alreadyQtyBatchSetted[$line->fk_product] = array();
2513 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2514 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2517 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2520 if ($deliverableQty < 0) {
2521 $deliverableQty = 0;
2524 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2529 $tooltipClass = $tooltipTitle =
'';
2530 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2531 $tooltipClass =
' classfortooltip';
2532 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2534 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2536 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2538 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'><td colspan="3"></td><td class="center">';
2539 $qtylValue = $deliverableQty;
2542 } elseif (is_numeric($qtylValue)) {
2543 $qtylValue =
price($qtylValue);
2545 print
'<input class="qtyl right ' . $tooltipClass .
'" title="' . $tooltipTitle .
'" name="' . $inputName .
'" id="' . $inputName .
'" type="text" size="4" value="' . $qtylValue .
'">';
2548 print
'<td class="left">';
2550 print $tmpwarehouseObject->getNomUrl(0) .
' / ';
2552 print
'<!-- Show details of lot -->';
2553 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2554 print
'<input name="entl' . $indiceAsked .
'_'.$subj.
'" type="hidden" value="' . $tmpwarehouseObject->id .
'">';
2557 print $langs->trans(
"Batch") .
': ';
2558 $result = $productlotObject->fetch(0, $line->fk_product, $dbatch->batch);
2560 print $productlotObject->getNomUrl(1);
2562 print $langs->trans(
"TableLotIncompleteRunRepairWithParamStandardEqualConfirmed");
2565 print
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2568 print
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2570 print
' (' . $dbatch->qty .
')';
2571 $quantityToBeDelivered -= $deliverableQty;
2572 if ($quantityToBeDelivered < 0) {
2573 $quantityToBeDelivered = 0;
2579 print
'<td class="left">' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2587 $warehouse_selected_id =
GETPOSTINT(
'entrepot_id');
2589 print
'<!-- line not shown yet, we show it -->';
2590 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2595 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2596 $disabled =
'disabled="disabled"';
2597 $alt =
'Product need serial or batch number';
2599 if ($warehouse_selected_id <= 0) {
2600 $disabled =
'disabled="disabled"';
2603 if ($product->stockable_product == Product::ENABLED_STOCK) {
2606 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).
'"' :
'').
'> ';
2608 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2614 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2615 $disabled =
'disabled="disabled"';
2617 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="'.$quantityToBeDelivered.
'"'.($disabled ?
' '.$disabled :
'').
'> ';
2621 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="0">';
2623 print $langs->trans(
"NA");
2627 print
'<td class="left">';
2630 if (($warehouse_selected_id > 0 && $product->stockable_product == Product::ENABLED_STOCK)) {
2632 $warehouseObject->fetch($warehouse_selected_id);
2633 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $warehouseObject->label);
2635 if ($line->fk_product) {
2636 if ($product->stockable_product != Product::ENABLED_STOCK) {
2637 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2639 print
img_warning() .
' ' . $langs->trans(
'StockTooLow');
2646 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2655 } elseif (empty($reshook) && $line->special_code == SUBTOTALS_SPECIAL_CODE && !in_array($line->id, $title_lines_to_disable)) {
2656 require
dol_buildpath(
'/core/tpl/subtotalline_select.tpl.php');
2667 print $form->buttonsSaveCancel(
"Create");
2677 '@phan-var-force Expedition $object';
2683 $num_prod = count($lines);
2686 $typeobject =
$object->origin;
2688 $origin_id =
$object->origin_id;
2696 $res =
$object->fetch_optionals();
2704 if ($action ==
'delete') {
2705 $formquestion = array();
2707 $formquestion = array(
2709 'label' => $langs->trans(
'ShipmentIncrementStockOnDelete'),
2710 'name' =>
'alsoUpdateStock',
2711 'type' =>
'checkbox',
2716 $formconfirm = $form->formconfirm(
2717 $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
2718 $langs->trans(
'DeleteSending'),
2719 $langs->trans(
"ConfirmDeleteSending",
$object->ref),
2728 if ($action ==
'ask_subtotal_deleteline') {
2730 $langs->load(
"subtotals");
2731 $title =
"DeleteSubtotalLine";
2732 $question =
"ConfirmDeleteSubtotalLine";
2733 if (
GETPOST(
'type') ==
'title') {
2734 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2735 $title =
"DeleteTitleLine";
2736 $question =
"ConfirmDeleteTitleLine";
2738 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2742 if ($action ==
'valid') {
2743 $objectref = substr(
$object->ref, 1, 4);
2744 if ($objectref ==
'PROV') {
2745 $numref =
$object->getNextNumRef($soc);
2750 $text = $langs->trans(
"ConfirmValidateSending", $numref);
2752 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementWillBeRecorded") .
'.';
2754 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementNotYetRecorded") .
'.';
2758 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2761 $text .= $notify->confirmMessage(
'SHIPPING_VALIDATE',
$object->socid, $object);
2764 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $langs->trans(
'ValidateSending'), $text,
'confirm_valid',
'', 0, 1, 260);
2768 if ($action ==
'cancel') {
2769 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, $langs->trans(
'CancelSending'), $langs->trans(
"ConfirmCancelSending",
$object->ref),
'confirm_cancel',
'', 0, 1);
2773 if ($action ==
'sign') {
2774 $text = $langs->trans(
'ConfirmSignShipping');
2776 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2779 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2784 'name' =>
'signed_status',
2785 'select_show_empty' => 0,
2786 'label' =>
'<span class="fieldrequired">' . $langs->trans(
'SignStatus') .
'</span>',
2787 'values' =>
$object->getSignedStatusLocalisedArray()
2789 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SignShipping'), $text,
'confirm_sign', $formquestion, 0, 1);
2793 if ($action ==
'unsign') {
2794 $text = $langs->trans(
'ConfirmUnsignShipping');
2796 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2799 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2801 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'UnsignShipping'), $text,
'confirm_unsign',
'', 0, 1);
2805 $parameters = array(
'formConfirm' => $formconfirm);
2806 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
2807 if (empty($reshook)) {
2808 $formconfirm .= $hookmanager->resPrint;
2809 } elseif ($reshook > 0) {
2810 $formconfirm = $hookmanager->resPrint;
2818 $tmparray =
$object->getTotalWeightVolume();
2819 $totalWeight = $tmparray[
'weight'];
2820 $totalVolume = $tmparray[
'volume'];
2822 if (!empty($typeobject) && $typeobject ===
'commande' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2824 $objectsrc->fetch(
$object->origin_object->id);
2826 if (!empty($typeobject) && $typeobject ===
'propal' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2828 $objectsrc->fetch(
$object->origin_object->id);
2832 $linkback =
'<a href="' . DOL_URL_ROOT .
'/expedition/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
2833 $morehtmlref =
'<div class="refidno">';
2835 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
2836 $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);
2839 $morehtmlref .=
'<br>' .
$object->thirdparty->getNomUrl(1);
2842 if ($origin && $origin_id > 0) {
2844 $langs->load(
"projects");
2845 $morehtmlref .=
'<br>';
2847 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2848 if ($action !=
'classify') {
2849 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2851 $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');
2853 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
2855 $proj->fetch($objectsrc->fk_project);
2856 $morehtmlref .= $proj->getNomUrl(1);
2858 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2866 $langs->load(
"projects");
2867 $morehtmlref .=
'<br>';
2868 if ($permissiontoadd) {
2869 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2870 if ($action !=
'classify') {
2871 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
2873 $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');
2875 if (!empty(
$object->fk_project)) {
2877 $proj->fetch(
$object->fk_project);
2878 $morehtmlref .= $proj->getNomUrl(1);
2880 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
2887 $morehtmlref .=
'</div>';
2888 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2890 print
'<div class="fichecenter">';
2891 print
'<div class="fichehalfleft">';
2892 print
'<div class="underbanner clearboth"></div>';
2894 print
'<table class="border tableforfield centpercent">';
2897 if (!empty($typeobject) && $typeobject ==
'commande' &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2899 print $langs->trans(
"RefOrder") .
'</td>';
2901 print $objectsrc->getNomUrl(1,
'commande');
2905 if (!empty($typeobject) && $typeobject ==
'propal' &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2907 print $langs->trans(
"RefProposal") .
'</td>';
2909 print $objectsrc->getNomUrl(1,
'expedition');
2915 print
'<tr><td class="titlefieldmiddle">' . $langs->trans(
"DateCreation") .
'</td>';
2920 print
'<tr><td height="10">';
2921 print
'<table class="nobordernopadding centpercent"><tr><td>';
2922 print $langs->trans(
'DateDeliveryPlanned');
2924 if ($action !=
'editdate_livraison') {
2925 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>';
2927 print
'</tr></table>';
2929 if ($action ==
'editdate_livraison') {
2930 print
'<form name="setdate_livraison" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2931 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2932 print
'<input type="hidden" name="action" value="setdate_livraison">';
2933 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
2934 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2943 print
'<tr><td height="10">';
2944 print
'<table class="nobordernopadding centpercent"><tr><td>';
2945 print $langs->trans(
'DateShipping');
2947 if ($action !=
'editdate_shipping') {
2948 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>';
2950 print
'</tr></table>';
2952 if ($action ==
'editdate_shipping') {
2953 print
'<form name="setdate_shipping" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2954 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2955 print
'<input type="hidden" name="action" value="setdate_shipping">';
2956 print $form->selectDate(
$object->date_shipping ?
$object->date_shipping : -1,
'ship_', 1, 1, 0,
"setdate_shipping", 1, 0);
2957 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2967 print $form->editfieldkey(
"Weight",
'trueWeight',
$object->trueWeight, $object, $user->hasRight(
'expedition',
'creer'));
2970 if ($action ==
'edittrueWeight') {
2971 print
'<form name="settrueweight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2972 print
'<input name="action" value="settrueWeight" type="hidden">';
2973 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2974 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2975 print
'<input id="trueWeight" name="trueWeight" value="' .
$object->trueWeight .
'" type="text" class="width50 valignmiddle">';
2976 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
$object->weight_units, 0, 2,
'maxwidth125 valignmiddle');
2977 print
' <input class="button smallpaddingimp valignmiddle" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2978 print
' <input class="button button-cancel smallpaddingimp valignmiddle" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
2986 if ($totalWeight > 0) {
2987 if (!empty(
$object->trueWeight)) {
2988 print
' (' . $langs->trans(
"SumOfProductWeights") .
': ';
2991 if (!empty(
$object->trueWeight)) {
2998 print
'<tr><td>' . $form->editfieldkey(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2999 print $form->editfieldval(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer'));
3004 print
'<tr><td>' . $form->editfieldkey(
"Height",
'trueHeight',
$object->trueHeight, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3005 if ($action ==
'edittrueHeight') {
3006 print
'<form name="settrueHeight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
3007 print
'<input name="action" value="settrueHeight" type="hidden">';
3008 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
3009 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3010 print
'<input id="trueHeight" name="trueHeight" value="' .
$object->trueHeight .
'" type="text" class="width50">';
3011 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
$object->size_units, 0, 2);
3012 print
' <input class="button smallpaddingimp" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
3013 print
' <input class="button button-cancel smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
3023 print
'<tr><td>' . $form->editfieldkey(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3024 print $form->editfieldval(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer'));
3030 print $langs->trans(
"Volume");
3033 $calculatedVolume = 0;
3037 $volumeUnit =
$object->size_units * 3;
3040 if ($calculatedVolume > 0) {
3041 if ($volumeUnit < 50) {
3047 if ($totalVolume > 0) {
3048 if ($calculatedVolume) {
3049 print
' (' . $langs->trans(
"SumOfProductVolumes") .
': ';
3053 if ($calculatedVolume) {
3062 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3067 print
'<div class="fichehalfright">';
3068 print
'<div class="underbanner clearboth"></div>';
3070 print
'<table class="border centpercent tableforfield">';
3074 print
'<table class="nobordernopadding centpercent"><tr><td>';
3075 print $langs->trans(
'SendingMethod');
3078 if ($action !=
'editshipping_method_id' && $permissiontoadd) {
3079 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>';
3081 print
'</tr></table>';
3083 if ($action ==
'editshipping_method_id') {
3084 print
'<form name="setshipping_method_id" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3085 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3086 print
'<input type="hidden" name="action" value="setshipping_method_id">';
3087 $object->fetch_delivery_methods();
3088 print $form->selectarray(
"shipping_method_id",
$object->meths,
$object->shipping_method_id, 1, 0, 0,
"", 1);
3090 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
3092 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
3095 if (
$object->shipping_method_id > 0) {
3097 $code = $langs->getLabelFromKey(
$db, (
string)
$object->shipping_method_id,
'c_shipment_mode',
'rowid',
'code');
3098 print $langs->trans(
"SendingMethod" . strtoupper($code));
3105 print
'<tr><td class="titlefieldmiddle">' . $form->editfieldkey(
"TrackingNumber",
'tracking_number',
$object->tracking_number, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3106 print $form->editfieldval(
"TrackingNumber",
'tracking_number',
$object->tracking_url, $object, $user->hasRight(
'expedition',
'creer'),
'safehtmlstring',
$object->tracking_number);
3112 print
'<table class="nobordernopadding centpercent"><tr><td>';
3113 print $langs->trans(
'IncotermLabel');
3114 print
'<td><td class="right">';
3115 if ($permissiontoadd) {
3116 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/expedition/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3120 print
'</td></tr></table>';
3123 if ($action !=
'editincoterm') {
3124 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3126 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3132 $parameters = array();
3133 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3134 print $hookmanager->resPrint;
3141 print
'<div class="clearboth"></div>';
3150 if (!empty(
$object->table_element_line)) {
3152 $result =
$object->getLinesArray();
3154 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
3155 <input type="hidden" name="token" value="' .
newToken().
'">
3156 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3157 <input type="hidden" name="mode" value="">
3158 <input type="hidden" name="page_y" value="">
3159 <input type="hidden" name="id" value="' .
$object->id.
'">
3162 if (!empty(
$conf->use_javascript_ajax) &&
$object->status == 0) {
3163 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3166 print
'<div class="div-table-responsive-no-min">';
3167 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3168 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
3176 if (
$object->status == 0 && $permissiontoadd && $action !=
'selectlines') {
3177 if ($action !=
'editline') {
3180 $parameters = array();
3181 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3185 if (empty($reshook)) {
3191 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3202 if ($action ==
'editline') {
3203 print
' <form name="updateline" id="updateline" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $line_id .
'" method="POST">
3204 <input type="hidden" name="token" value="' .
newToken() .
'">
3205 <input type="hidden" name="action" value="updateline">
3206 <input type="hidden" name="mode" value="">
3207 <input type="hidden" name="id" value="' .
$object->id .
'">
3212 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3215 print
'<div class="div-table-responsive-no-min">';
3216 print
'<table class="noborder centpercent" id="tablelines" >';
3218 print
'<tr class="liste_titre">';
3221 print
'<td width="5" class="center linecolnum"> </td>';
3224 print
'<td class="linecoldescription" >' . $langs->trans(
"Products") .
'</td>';
3226 print
'<td class="center linecolqty">' . $langs->trans(
"QtyOrdered") .
'</td>';
3227 if ($origin_id > 0) {
3228 print
'<td class="center linecolqtyinothershipments">' . $langs->trans(
"QtyInOtherShipments") .
'</td>';
3230 if ($action ==
'editline') {
3238 print
'<td class="center linecoleditlineotherinfo" colspan="' . $editColspan .
'">';
3240 print $langs->trans(
"QtyToShip");
3242 print $langs->trans(
"QtyShipped");
3245 print
' - ' . $langs->trans(
"WarehouseSource");
3248 print
' - ' . $langs->trans(
"Batch");
3253 print
'<td class="center linecolqtytoship">' . $langs->trans(
"QtyToShip") .
'</td>';
3255 print
'<td class="center linecolqtyshipped">' . $langs->trans(
"QtyShipped") .
'</td>';
3258 print
'<td class="left linecolwarehousesource">' . $langs->trans(
"WarehouseSource") .
'</td>';
3262 print
'<td class="left linecolbatch">' . $langs->trans(
"Batch") .
'</td>';
3265 print
'<td class="center linecolweight">' . $langs->trans(
"CalculatedWeight") .
'</td>';
3266 print
'<td class="center linecolvolume">' . $langs->trans(
"CalculatedVolume") .
'</td>';
3269 print
'<td class="linecoledit"></td>';
3270 print
'<td class="linecoldelete" width="10"></td>';
3271 print
'<td class="linecolmove"></td>';
3276 $outputlangs = $langs;
3281 if (
GETPOST(
'lang_id',
'aZ09')) {
3282 $newlang =
GETPOST(
'lang_id',
'aZ09');
3284 if (empty($newlang)) {
3285 $newlang =
$object->thirdparty->default_lang;
3287 if (!empty($newlang)) {
3289 $outputlangs->setDefaultLang($newlang);
3293 $origin = (
string) $origin;
3294 if (empty($origin) || $origin ==
'order') {
3295 $origin =
'commande';
3299 if (!in_array($origin, array(
'supplier_proposal',
'supplier_order',
'commande_fournisseur',
'facture_fourn',
'propal',
'commande',
'facture'))) {
3305 $alreadysent = array();
3306 if ($origin_id > 0) {
3307 $tablenametouse = (($origin ==
'supplier_order') ?
'commande_fournisseur' : (($origin ==
'facture_fourn') ?
'facture_fourn_' : $origin));
3309 $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";
3310 $sql .=
", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot";
3311 $sql .=
", e.rowid as shipment_id, e.ref as shipment_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_expedition";
3312 $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';
3313 $sql .=
', p.description as product_desc';
3314 $sql .=
" FROM " . MAIN_DB_PREFIX .
"expeditiondet as ed";
3315 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as e";
3316 $sql .=
", " . MAIN_DB_PREFIX .
$db->sanitize($tablenametouse) .
"det as obj";
3317 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product as p ON obj.fk_product = p.rowid";
3318 $sql .=
" WHERE e.entity IN (" .
getEntity(
'expedition') .
")";
3319 $sql .=
" AND obj.fk_" .
$db->sanitize((
string) $origin) .
" = " . ((int) $origin_id);
3320 $sql .=
" AND obj.rowid = ed.fk_elementdet";
3321 $sql .=
" AND ed.fk_expedition = e.rowid";
3323 $sql .=
" ORDER BY obj.fk_product";
3325 dol_syslog(
"expedition/card.php get list of shipment lines", LOG_DEBUG);
3326 $resql =
$db->query($sql);
3328 $num =
$db->num_rows($resql);
3332 $obj =
$db->fetch_object($resql);
3335 $alreadysent[$obj->rowid][$obj->shipmentline_id] = array(
3336 'shipment_ref' => $obj->shipment_ref,
3337 'shipment_id' => $obj->shipment_id,
3338 'warehouse' => $obj->fk_entrepot,
3339 'qty_shipped' => $obj->qty_shipped,
3340 'product_tosell' => $obj->product_tosell,
3341 'product_tobuy' => $obj->product_tobuy,
3342 'product_tobatch' => $obj->product_tobatch,
3343 'date_valid' =>
$db->jdate($obj->date_valid),
3344 'date_delivery' =>
$db->jdate($obj->date_delivery));
3355 $conf->cache[
'product'] = array();
3356 $conf->cache[
'warehouse'] = array();
3357 for ($i = 0; $i < $num_prod; $i++) {
3358 $parameters = array(
'i' => $i,
'line' => $lines[$i],
'line_id' => $line_id,
'num' => $num_prod,
'alreadysent' => $alreadysent,
'editColspan' => !empty($editColspan) ? $editColspan : 0,
'outputlangs' => $outputlangs);
3359 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
3364 if (empty($reshook) && $lines[$i]->product_type !=
"9") {
3365 print
'<!-- origin line id = ' . $lines[$i]->origin_line_id .
' -->';
3366 print
'<tr class="oddeven" id="row-' . $lines[$i]->id .
'" data-id="' . $lines[$i]->id .
'" data-element="' . $lines[$i]->element .
'" >';
3368 $line->fetch_optionals();
3372 print
'<td class="center linecolnum">' . ($i + 1) .
'</td>';
3376 if ($lines[$i]->fk_product > 0) {
3379 $product_id = $lines[$i]->fk_product;
3380 if (!isset(
$conf->cache[
'product'][$product_id])) {
3382 $prod->fetch($product_id);
3383 $conf->cache[
'product'][$product_id] =
$prod;
3385 $prod =
$conf->cache[
'product'][$product_id];
3387 $label = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"label"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"label"] : $lines[$i]->product_label;
3389 $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label);
3392 print
'<td class="linecoldescription">';
3395 $product_static->type = $lines[$i]->fk_product_type;
3396 $product_static->id = $lines[$i]->fk_product;
3397 $product_static->ref = $lines[$i]->ref;
3398 $product_static->status = $lines[$i]->product_tosell;
3399 $product_static->status_buy = $lines[$i]->product_tobuy;
3400 $product_static->status_batch = $lines[$i]->product_tobatch;
3402 $product_static->weight = $lines[$i]->weight;
3403 $product_static->weight_units = $lines[$i]->weight_units;
3404 $product_static->length = $lines[$i]->length;
3405 $product_static->length_units = $lines[$i]->length_units;
3406 $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0;
3407 $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0;
3408 $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0;
3409 $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0;
3410 $product_static->surface = $lines[$i]->surface;
3411 $product_static->surface_units = $lines[$i]->surface_units;
3412 $product_static->volume = $lines[$i]->volume;
3413 $product_static->volume_units = $lines[$i]->volume_units;
3414 $product_static->stockable_product = $lines[$i]->stockable_product;
3416 $text = $product_static->getNomUrl(1);
3417 $text .=
' - ' . $label;
3419 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
3420 print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start :
'', !empty($lines[$i]->date_end) ? $lines[$i]->date_end :
'');
3424 $lineExtrafieldsHtml = $line->showOptionals($extrafields, ($action ==
'editline' && $line->id == $line_id) ?
'edit' :
'view', array(),
'',
'',
'1',
'line');
3425 if (!empty($lineExtrafieldsHtml)) {
3426 print
'<div style="padding-top: 10px" id="extrafield_lines_area_' . $line->id .
'" name="extrafield_lines_area_' . $line->id .
'">';
3427 print $lineExtrafieldsHtml;
3432 print
'<td class="linecoldescription" >';
3434 $text =
img_object($langs->trans(
'Service'),
'service');
3436 $text =
img_object($langs->trans(
'Product'),
'product');
3439 if (!empty($lines[$i]->label)) {
3440 $text .=
' <strong>' . $lines[$i]->label .
'</strong>';
3441 print $form->textwithtooltip($text, $lines[$i]->
description, 3, 0,
'', (
string) $i);
3443 print $text .
' ' . nl2br($lines[$i]->
description);
3447 $lineExtrafieldsHtml = $line->showOptionals($extrafields, ($action ==
'editline' && $line->id == $line_id) ?
'edit' :
'view', array(),
'',
'',
'1',
'line');
3448 if (!empty($lineExtrafieldsHtml)) {
3449 print
'<div style="padding-top: 10px" id="extrafield_lines_area_' . $line->id .
'" name="extrafield_lines_area_' . $line->id .
'">';
3450 print $lineExtrafieldsHtml;
3462 print
'<td class="center linecolqty">' . $lines[$i]->qty_asked .
' ' . $unit_order .
'</td>';
3465 if ($origin_id > 0) {
3466 print
'<td class="linecolqtyinothershipments center nowrap">';
3468 $qtyalreadysent = 0;
3469 foreach ($alreadysent as $key => $val) {
3470 if ($lines[$i]->fk_elementdet == $key) {
3472 foreach ($val as $shipmentline_id => $shipmentline_var) {
3473 if ($shipmentline_var[
'shipment_id'] == $lines[$i]->fk_expedition) {
3479 $htmltooltip .=
'<br>';
3481 $shipment_static->fetch($shipmentline_var[
'shipment_id']);
3482 $htmltooltip .= $shipment_static->getNomUrl(1,
'', 0, 0, 1);
3483 $htmltooltip .=
' - ' . $shipmentline_var[
'qty_shipped'];
3484 $htmltooltip .=
' - ' . $langs->trans(
"DateValidation") .
' : ' . (empty($shipmentline_var[
'date_valid']) ? $langs->trans(
"Draft") :
dol_print_date($shipmentline_var[
'date_valid'],
'dayhour'));
3491 $qtyalreadysent += $shipmentline_var[
'qty_shipped'];
3494 $htmltooltip = $langs->trans(
"QtyInOtherShipments") .
'...<br><br>' . $htmltooltip .
'<br><input type="submit" name="dummyhiddenbuttontogetfocus" style="display:none" autofocus>';
3498 print $form->textwithpicto((
string) $qtyalreadysent, $htmltooltip, 1,
'info',
'', 0, 3,
'tooltip' . $lines[$i]->id);
3502 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3504 print
'<td colspan="' . $editColspan .
'" class="center"><table class="nobordernopadding centpercent">';
3505 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
3506 print
'<!-- case edit 1 -->';
3508 foreach ($lines[$i]->detail_batch as $detail_batch) {
3511 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>';
3513 if ($lines[$i]->entrepot_id == 0) {
3515 $line->fetch($detail_batch->fk_expeditiondet);
3517 $entrepot_id = !empty($detail_batch->entrepot_id) ? $detail_batch->entrepot_id : $lines[$i]->entrepot_id;
3518 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>';
3524 print
'<td><input class="qtyl" name="qtyl' . $line_id .
'_0" id="qtyl' . $line_id .
'_0" type="text" size="4" value="0"></td>';
3526 print
'<td>' . $formproduct->selectLotStock(
'',
'batchl' . $line_id .
'_0',
'', 1, 0, $lines[$i]->fk_product) .
'</td>';
3529 if ($lines[$i]->fk_product > 0) {
3530 if ($lines[$i]->entrepot_id > 0) {
3531 print
'<!-- case edit 2 -->';
3534 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>';
3536 print
'<td>' . $formproduct->selectWarehouses($lines[$i]->entrepot_id,
'entl' . $line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3540 print
' - ' . $langs->trans(
"NA");
3544 } elseif (count($lines[$i]->details_entrepot) > 1) {
3545 print
'<!-- case edit 3 -->';
3546 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3549 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>';
3551 print
'<td>' . $formproduct->selectWarehouses($detail_entrepot->entrepot_id,
'entl' . $detail_entrepot->line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3555 print
' - ' . $langs->trans(
"NA");
3561 print
'<!-- case edit 4 -->';
3564 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3565 print
'<td><span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span></td>';
3569 print
'<!-- case edit 5 -->';
3570 print
'<tr><td colspan="3">' . $langs->trans(
"ErrorStockIsNotEnough") .
'</td></tr>';
3573 print
'<!-- case edit 6 -->';
3576 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>';
3584 print
'<!-- case edit 7 -->';
3587 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3595 print
'</table></td>';
3598 print
'<td class="linecolqtytoship center">' . $lines[$i]->qty_shipped .
' ' . $unit_order .
'</td>';
3602 print
'<td class="linecolwarehousesource tdoverflowmax200">';
3604 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
3605 } elseif ($lines[$i]->entrepot_id > 0 && $lines[$i]->stockable_product == Product::ENABLED_STOCK) {
3606 $warehouse_id = $lines[$i]->entrepot_id;
3607 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3609 $warehouse->fetch($warehouse_id);
3610 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3612 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3614 print $warehouse->getNomUrl(1);
3615 } elseif (count($lines[$i]->details_entrepot) > 1) {
3617 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3618 $warehouse_id = $detail_entrepot->entrepot_id;
3619 if ($warehouse_id > 0) {
3620 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3622 $warehouse->fetch($warehouse_id);
3623 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3625 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3627 $detail .= $langs->trans(
"DetailWarehouseFormat", $warehouse->label, $detail_entrepot->qty_shipped) .
'<br>';
3630 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
"DetailWarehouseNumber"), $detail);
3631 } elseif (count($lines[$i]->detail_children ?? []) > 1) {
3633 foreach ($lines[$i]->detail_children as $child_product_id => $child_stock_list) {
3634 foreach ($child_stock_list as $warehouse_id => $total_qty) {
3636 $child_product_label =
'';
3637 if (!isset(
$conf->cache[
'product'][$child_product_id])) {
3639 $child_product->fetch($child_product_id);
3640 $conf->cache[
'product'][$child_product_id] = $child_product;
3642 $child_product =
$conf->cache[
'product'][$child_product_id];
3644 $child_product_label = $child_product->ref .
' ' . $child_product->label;
3647 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3649 $child_warehouse->fetch($warehouse_id);
3650 $conf->cache[
'warehouse'][$warehouse_id] = $child_warehouse;
3652 $child_warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3654 $detail .= $langs->trans(
'DetailChildrenFormat', $child_product_label, $child_warehouse->label,
price2num($total_qty,
'MS')) .
'<br>';
3657 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
'DetailWarehouseNumber'), $detail);
3664 if (isset($lines[$i]->detail_batch)) {
3665 print
'<!-- Detail of lot -->';
3666 print
'<td class="linecolbatch">';
3667 if ($lines[$i]->product_tobatch) {
3669 foreach ($lines[$i]->detail_batch as $dbatch) {
3670 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
3672 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
3675 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
3677 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
3680 print $form->textwithtooltip(
img_picto(
'',
'object_barcode') .
' ' . $langs->trans(
"DetailBatchNumber"), $detail);
3682 print $langs->trans(
"NA");
3686 print
'<td class="linecolbatch" ></td>';
3692 print
'<td class="center linecolweight">';
3694 print $lines[$i]->weight * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"weight", $lines[$i]->weight_units);
3701 print
'<td class="center linecolvolume">';
3703 print $lines[$i]->volume * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"volume", $lines[$i]->volume_units);
3714 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3715 print
'<td class="center" colspan="2" valign="middle">';
3716 print
'<input type="submit" class="button button-save" id="savelinebutton marginbottomonly" name="save" value="' . $langs->trans(
"Save") .
'"><br>';
3717 print
'<input type="submit" class="button button-cancel" id="cancellinebutton" name="cancel" value="' . $langs->trans(
"Cancel") .
'"><br>';
3720 print
'<td class="linecolmove tdlineupdown center"></td>';
3722 } elseif ($showmovecol) {
3723 $edit_url = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id;
3725 $product_id = $lines[$i]->fk_product;
3726 if (!isset(
$conf->cache[
'product'][$product_id])) {
3728 $product->fetch($product_id);
3729 $conf->cache[
'product'][$product_id] = $product;
3731 $product =
$conf->cache[
'product'][$product_id];
3734 if ($product->hasFatherOrChild(1)) {
3740 print
'<td class="linecoledit center">';
3741 print
'<a class="editfielda reposition" href="' . $edit_url .
'">' .
img_edit() .
'</a>';
3743 print
'<td class="linecoldelete" width="10">';
3744 print
'<a class="reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=deleteline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id .
'">' .
img_delete() .
'</a>';
3746 print
'<td class="linecolmove tdlineupdown center">';
3747 if ($usercancreate && $num_prod > 1) {
3749 print
'<a class="lineupdown" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=up&token=' .
newToken() .
'&rowid=' . $lines[$i]->id .
'">' .
img_up(
'default', 0,
'imgupforline') .
'</a>';
3751 if ($i < $num_prod - 1) {
3752 print
'<a class="lineupdown" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=down&token=' .
newToken() .
'&rowid=' . $lines[$i]->id .
'">' .
img_down(
'default', 0,
'imgdownforline') .
'</a>';
3757 if (!empty($rowExtrafieldsStart)) {
3758 print $rowExtrafieldsStart;
3759 print $rowExtrafieldsView;
3764 } elseif (empty($reshook) && $lines[$i]->product_type ==
"9") {
3766 $objectsrc->fetch($lines[$i]->origin_line_id);
3767 if ($objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) {
3769 require
dol_buildpath(
'/core/tpl/subtotal_expedition_view.tpl.php');
3774 if (empty($num_prod)) {
3775 print
'<tr><td colspan="8"><span class="opacitymedium">' . $langs->trans(
"NoLineGoOnTabToAddSome", $langs->transnoentitiesnoconv(
"ShipmentDistribution")) .
'</span></td></tr>';
3781 if ($action ==
'editline') {
3792 if (($user->socid == 0) && ($action !=
'presend')) {
3793 print
'<div class="tabsAction">';
3795 $parameters = array();
3796 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3798 if (empty($reshook)) {
3800 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
3801 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate'))
3805 print
dolGetButtonAction($langs->trans(
'NotAllowed'), $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3811 if ($user->hasRight(
'expedition',
'creer')) {
3816 if ($user->hasRight(
'expedition',
'creer')) {
3822 if (empty($user->socid)) {
3824 if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'expedition',
'shipping_advance',
'send')) {
3825 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3827 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3835 print
dolGetButtonAction(
'', $langs->trans(
'CreateDeliveryOrder'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=create_delivery&token=' .
newToken() .
'&id=' .
$object->id,
'');
3840 if (
$object->signed_status != Expedition::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
3841 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>';
3843 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>';
3849 if ($user->hasRight(
'facture',
'creer')) {
3851 print
dolGetButtonAction(
'', $langs->trans(
'CreateBill'),
'default', DOL_URL_ROOT .
'/compta/facture/card.php?action=create&origin=' .
$object->element .
'&originid=' .
$object->id .
'&socid=' .
$object->socid,
'');
3858 if ($user->hasRight(
'expedition',
'creer') &&
$object->status > 0) {
3860 print
dolGetButtonAction(
'', $langs->trans(
'ClassifyBilled'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifybilled&token=' .
newToken() .
'&id=' .
$object->id,
'');
3862 print
dolGetButtonAction(
'', $langs->trans(
"Close"),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifyclosed&token=' .
newToken() .
'&id=' .
$object->id,
'');
3868 if ($user->hasRight(
'expedition',
'creer')) {
3869 print
dolGetButtonAction(
'', $langs->trans(
'Cancel'),
'danger', $_SERVER[
"PHP_SELF"] .
'?action=cancel&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3874 if ($user->hasRight(
'expedition',
'supprimer')) {
3887 if ($action !=
'presend' && $action !=
'editline') {
3888 print
'<div class="fichecenter"><div class="fichehalfleft">';
3891 $filedir =
$conf->expedition->dir_output .
"/sending/" . $objectref;
3893 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3895 $genallowed = $user->hasRight(
'expedition',
'lire');
3896 $delallowed = $user->hasRight(
'expedition',
'creer');
3898 print $formfile->showdocuments(
'expedition', $objectref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $soc->default_lang);
3902 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'shipping'), 1);
3903 $linktoelem = $tmparray[
'linktoelem'];
3904 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3905 print $htmltoenteralink;
3907 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
3913 print
'<br><!-- Link to sign -->';
3914 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3915 print showOnlineSignatureUrl(
'expedition',
$object->ref, $object) .
'<br>';
3918 print
'</div><div class="fichehalfright">';
3922 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3927 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/expedition/messaging.php?id=' .
$object->id);
3929 $somethingshown = $formactions->showactions($object,
'shipping', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3930 print
'</div></div>';
3939 if (
GETPOST(
'modelselected')) {
3940 $action =
'presend';
3944 $modelmail =
'shipping_send';
3945 $defaulttopic =
'SendShippingRef';
3946 $diroutput =
$conf->expedition->dir_output .
'/sending';
3947 $trackid =
'shi' .
$object->id;
3949 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_CANCELED
Canceled 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.
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.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
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.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
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'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
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.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
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.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
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...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
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, $nodie=0, $mode='')
Check permissions of a user to show a page and an object.
shipping_prepare_head($object)
Prepare array with list of tabs.