42require
'../main.inc.php';
52require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formfile.class.php';
53require_once DOL_DOCUMENT_ROOT .
'/expedition/class/expedition.class.php';
54require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
55require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
56require_once DOL_DOCUMENT_ROOT .
'/core/lib/sendings.lib.php';
57require_once DOL_DOCUMENT_ROOT .
'/core/modules/expedition/modules_expedition.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
59require_once DOL_DOCUMENT_ROOT .
'/core/class/extrafields.class.php';
60require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/entrepot.class.php';
61require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/productlot.class.php';
62require_once DOL_DOCUMENT_ROOT .
'/commande/class/commande.class.php';
64 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
67 require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
70 require_once DOL_DOCUMENT_ROOT .
'/product/class/productbatch.class.php';
73 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
74 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
78$langs->loadLangs(array(
"sendings",
"companies",
"bills",
'orders',
'stocks',
'other',
'propal',
'productbatch'));
81 $langs->load(
'incoterm');
84 $langs->load(
'productbatch');
88$origin =
GETPOST(
'origin',
'alpha');
93if (empty($origin_id) && !empty($origin)) {
96if (empty($origin_id) && !empty($origin)) {
105$action =
GETPOST(
'action',
'alpha');
106$confirm =
GETPOST(
'confirm',
'alpha');
107$cancel =
GETPOST(
'cancel',
'alpha');
110$backtopage =
GETPOST(
'backtopage',
'alpha');
122$extrafields->fetch_name_optionals_label(
$object->table_element);
123$extrafields->fetch_name_optionals_label(
$object->table_element_line);
124$extrafields->fetch_name_optionals_label($objectorder->table_element_line);
127include DOL_DOCUMENT_ROOT .
'/core/actions_fetchobject.inc.php';
130$usercanread = $user->hasRight(
"expedition",
"lire");
131$usercancreate = $user->hasRight(
"expedition",
"creer");
132$usercandelete = $user->hasRight(
"expedition",
"supprimer");
135$hookmanager->initHooks(array(
'expeditioncard',
'globalcard'));
146 $socid = $user->socid;
151$permissiondellink = $user->hasRight(
'expedition',
'delivery',
'creer');
152$permissiontoadd = $user->hasRight(
'expedition',
'creer');
153$permissiontoedit = $usercancreate;
154$permissiontoeditextra = $permissiontoadd;
155if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
157 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
160$upload_dir = $conf->expedition->dir_output .
'/sending';
166$shipping_method_id =
null;
176$parameters = array();
177$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
182if (empty($reshook)) {
183 $backurlforlist = DOL_URL_ROOT.
'/expedition/list.php';
185 if (empty($backtopage) || ($cancel && empty($id))) {
186 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
187 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
188 $backtopage = $backurlforlist;
190 $backtopage = DOL_URL_ROOT.
'/expedition/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
196 if (!empty($backtopageforcancel)) {
197 header(
"Location: ".$backtopageforcancel);
199 } elseif (!empty($backtopage)) {
200 header(
"Location: ".$backtopage);
208 if ($origin_id > 0) {
209 if ($origin ==
'commande') {
210 header(
"Location: " . DOL_URL_ROOT .
'/expedition/shipment.php?id=' . ((
int) $origin_id));
219 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
222 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
225 if ($action ==
'setdraft' && $permissiontoadd) {
227 $result =
$object->setDraft($user, 0);
231 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
236 if ($action ==
'reopen' && $permissiontoadd) {
242 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
248 if ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $permissiontoadd) {
252 if ($action ==
'setref_customer' && $permissiontoadd) {
258 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'SHIPPING_MODIFY');
261 $action =
'editref_customer';
263 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
268 if ($action ==
'update_extras' && $permissiontoeditextra) {
271 $attribute_name =
GETPOST(
'attribute',
'aZ09');
274 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
281 $result =
$object->updateExtraField($attribute_name,
'SHIPPING_MODIFY');
289 $action =
'edit_extras';
294 if ($action ==
'add' && $permissiontoadd) {
297 if ($origin && $origin_id > 0) {
299 $classname = ucfirst($origin);
300 $objectsrc =
new $classname($db);
301 '@phan-var-force Facture|Commande $objectsrc';
302 $objectsrc->fetch($origin_id);
303 $object->socid = $objectsrc->socid;
308 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
317 $object->origin_type = $origin;
318 $object->origin_id = $origin_id;
328 $object->date_delivery = $date_delivery;
329 $object->date_shipping = $date_shipping;
336 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
341 $ret = $extrafields->setOptionalsFromPost(
null, $object);
355 if ($origin && $origin_id > 0) {
357 $object->origin_type = $origin;
358 $object->origin_id = $origin_id;
368 $object->date_delivery = $date_delivery;
369 $object->date_shipping = $date_shipping;
376 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
379 $classname = ucfirst(
$object->origin_type);
380 $objectsrc =
new $classname($db);
381 '@phan-var-force Facture|Commande $objectsrc';
382 $objectsrc->fetch(
$object->origin_id);
384 $object->socid = $objectsrc->socid;
385 $object->fk_delivery_address = $objectsrc->fk_delivery_address;
389 $batch_line = array();
390 $stockLine = array();
391 $array_options = array();
393 $num = count($objectsrc->lines);
396 $product_batch_used = array();
398 for ($i = 0; $i < $num; $i++) {
406 $batch =
"batchl" . $i .
"_0";
407 $stockLocation =
"ent1" . $i .
"_0";
410 $is_batch_or_serial = 0;
411 if (!empty($objectsrc->lines[$i]->fk_product)) {
412 $resultFetch = $product->fetch($objectsrc->lines[$i]->fk_product,
'',
'',
'', 1, 1, 1);
413 if ($resultFetch < 0) {
416 $is_batch_or_serial = $product->status_batch;
420 if (
isModEnabled(
'productbatch') && $objectsrc->lines[$i]->product_tobatch) {
421 if (GETPOSTISSET($batch)) {
424 while (GETPOSTISSET($batch)) {
427 $sub_qty[$j][
'id_batch'] =
GETPOSTINT($batch);
428 $subtotalqty += $sub_qty[$j][
'q'];
430 if ($is_batch_or_serial == 2 && ($sub_qty[$j][
'q'] > 1 || ($sub_qty[$j][
'q'] > 0 && in_array($sub_qty[$j][
'id_batch'], $product_batch_used)))) {
431 setEventMessages($langs->trans(
"TooManyQtyForSerialNumber", $product->ref,
''),
null,
'errors');
436 if ($is_batch_or_serial == 2 && $sub_qty[$j][
'q'] > 0) {
438 $product_batch_used[$j] = $sub_qty[$j][
'id_batch'];
442 $batch =
"batchl" . $i .
"_" . $j;
443 $qty =
"qtyl" . $i .
'_' . $j;
446 $batch_line[$i][
'detail'] = $sub_qty;
447 $batch_line[$i][
'qty'] = $subtotalqty;
450 $totalqty += $subtotalqty;
457 setEventMessages($langs->trans(
"StockIsRequiredToChooseWhichLotToUse") .
' (' . $langs->trans(
"Line") .
' ' .
GETPOSTINT($idl) .
')',
null,
'errors');
461 } elseif (GETPOSTISSET($stockLocation)) {
464 while (GETPOSTISSET($stockLocation)) {
467 $stockLine[$i][$j][
'warehouse_id'] =
GETPOSTINT($stockLocation);
468 $stockLine[$i][$j][
'ix_l'] =
GETPOSTINT($idl);
474 $stockLocation =
"ent1" . $i .
"_" . $j;
475 $qty =
"qtyl" . $i .
'_' . $j;
486 if (
getDolGlobalInt(
"MAIN_DONT_SHIP_MORE_THAN_ORDERED") && $subtotalqty > $objectsrc->lines[$i]->qty) {
487 setEventMessages($langs->trans(
"ErrorTooMuchShipped", $i + 1),
null,
'errors');
493 $array_options[$i] = $extrafields->getOptionalsFromPost(
$object->table_element_line, (
string) $i);
495 if (isset($extrafields->attributes[
$object->table_element_line][
'label']) && is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
497 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
498 unset($_POST[
"options_" . $key]);
503 if (($totalqty > 0 ||
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS')) && !$error) {
504 $selected_subtotal_lines =
GETPOST(
'subtotal_toselect',
'array:int');
505 for ($i = 0; $i < $num; $i++) {
508 if (!isset($batch_line[$i])) {
510 if (isset($stockLine[$i])) {
512 $nbstockline = count($stockLine[$i]);
513 for ($j = 0; $j < $nbstockline; $j++) {
514 if ($stockLine[$i][$j][
'qty'] > 0 || ($stockLine[$i][$j][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
515 $ret =
$object->addline($stockLine[$i][$j][
'warehouse_id'], $stockLine[$i][$j][
'ix_l'], (
float) $stockLine[$i][$j][
'qty'], $array_options[$i]);
527 if ($entrepot_id < 0) {
530 if (!($objectsrc->lines[$i]->fk_product > 0)) {
541 if (
isModEnabled(
'subtotals') && $objectsrc->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE && in_array($objectsrc->lines[$i]->id, $selected_subtotal_lines)) {
542 $object->addSubtotalLine($langs, $objectsrc->lines[$i]->desc, (
int) $objectsrc->lines[$i]->qty, $objectsrc->lines[$i]->extraparams, $objectsrc->lines[$i]->id);
547 if ($batch_line[$i][
'qty'] > 0 || ($batch_line[$i][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
548 $origin_line_id = (int) $batch_line[$i][
'ix_l'];
550 $res = $origin_line->fetch($origin_line_id);
555 $ret =
$object->addline_batch($batch_line[$i], $array_options[$i], $origin_line);
564 $ret = $extrafields->setOptionalsFromPost(
null, $object);
577 $labelfieldmissing = $langs->transnoentitiesnoconv(
"QtyToShip");
579 $labelfieldmissing .=
'/' . $langs->transnoentitiesnoconv(
"Warehouse");
581 setEventMessages($langs->trans(
"ErrorFieldRequired", $labelfieldmissing),
null,
'errors');
588 foreach (
$object->lines as $line) {
589 $objectsrc_line =
new $objectsrc->class_element_line($db);
590 '@phan-var-force CommonObjectLine $objectsrc_line';
591 $objectsrc_line->fetch($line->origin_line_id);
592 $line->extraparams = $objectsrc_line->extraparams;
593 $line->setExtraParameters();
595 header(
"Location: card.php?id=" .
$object->id);
602 } elseif ($action ==
'create_delivery' &&
getDolGlobalInt(
'MAIN_SUBMODULE_DELIVERY') && $user->hasRight(
'expedition',
'delivery',
'creer')) {
606 $result =
$object->create_delivery($user);
610 header(
"Location: " . DOL_URL_ROOT .
'/delivery/card.php?action=create_delivery&token=' .
newToken() .
'&id=' . $result);
618 $action ==
'confirm_valid' && $confirm ==
'yes' && ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
619 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate')))
623 $result =
$object->valid($user);
630 $outputlangs = $langs;
633 $newlang =
GETPOST(
'lang_id',
'aZ09');
636 $newlang =
$object->thirdparty->default_lang;
638 if (!empty($newlang)) {
640 $outputlangs->setDefaultLang($newlang);
645 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
651 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
652 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
653 $result =
$object->cancel($user, 0, (
bool) $also_update_stock);
655 $result =
$object->setStatut(-1);
659 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'supprimer')) {
660 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
661 $result =
$object->delete($user, 0, (
bool) $also_update_stock);
663 header(
"Location: " . DOL_URL_ROOT .
'/expedition/index.php');
677 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $permissiontoadd) {
678 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'), $user);
681 $object->line_order(
true,
'ASC',
false);
683 $outputlangs = $langs;
686 $newlang =
GETPOST(
'lang_id',
'aZ09');
689 $newlang =
$object->thirdparty->default_lang;
691 if (!empty($newlang)) {
693 $outputlangs->setDefaultLang($newlang);
697 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
700 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
705 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
707 $result =
$object->deleteLine($user, $lineid);
712 $outputlangs = $langs;
715 $newlang =
GETPOST(
'lang_id',
'aZ09');
718 $newlang =
$object->thirdparty->default_lang;
720 if (!empty($newlang)) {
722 $outputlangs->setDefaultLang($newlang);
726 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
729 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
734 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
735 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
737 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
742 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
743 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
745 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
750 } elseif ($action ==
'setdate_livraison' && $user->hasRight(
'expedition',
'creer')) {
754 $result =
$object->setDeliveryDate($user, $datedelivery);
758 } elseif ($action ==
'setdate_shipping' && $user->hasRight(
'expedition',
'creer')) {
762 $result =
$object->setShippingDate($user, $dateshipping);
766 } elseif (in_array($action, array(
'settracking_number',
'settracking_url',
'settrueWeight',
'settrueWidth',
'settrueHeight',
'settrueDepth',
'setshipping_method_id')) && $user->hasRight(
'expedition',
'creer')) {
770 if ($action ==
'settracking_number') {
771 $object->tracking_number = trim(
GETPOST(
'tracking_number',
'alpha'));
773 if ($action ==
'settracking_url') {
774 $object->tracking_url = trim(
GETPOST(
'tracking_url',
'restricthtml'));
777 if ($action ==
'settrueWeight') {
781 if ($action ==
'settrueWidth') {
784 if ($action ==
'settrueHeight') {
788 if ($action ==
'settrueDepth') {
791 if ($action ==
'setshipping_method_id') {
795 if (
$object->update($user) >= 0) {
796 header(
"Location: card.php?id=" .
$object->id);
801 } elseif ($action ==
'classifybilled' && $permissiontoadd) {
803 $result =
$object->setBilled();
805 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
809 } elseif ($action ==
'classifyclosed' && $permissiontoadd) {
811 $result =
$object->setClosed();
813 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
817 } elseif ($action ==
'deleteline' && !empty($line_id) && $permissiontoadd) {
823 $line->fk_expedition =
$object->id;
825 $num_prod = count($lines);
826 for ($i = 0; $i < $num_prod; $i++) {
827 if ($lines[$i]->
id == $line_id) {
830 if (is_array($lines[$i]->details_entrepot) && count($lines[$i]->details_entrepot) > 1) {
832 foreach ($lines[$i]->details_entrepot as $details_entrepot) {
833 $line->id = $details_entrepot->line_id;
834 if (!$error && $line->delete($user) < 0) {
840 $line->id = $line_id;
841 if (!$error && $line->delete($user) < 0) {
846 unset($_POST[
"lineid"]);
850 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
855 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'save')) {
860 if (!
$object->fetch($id) > 0) {
865 $qty =
GETPOST(
'qty',
'alpha');
868 $element_type =
'shipping';
874 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
875 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
877 if (is_array($extralabelsline)) {
879 foreach ($extralabelsline as $key => $value) {
880 unset($_POST[
"options_" . $key]);
889 $result =
$object->updatelinefree(
GETPOSTINT(
'lineid'), (
float) $qty, $element_type, $fk_product,
GETPOSTINT(
'units'), $rang, $description, $fk_parent, 0, $array_options);
894 $outputlangs = $langs;
897 $newlang =
GETPOST(
'lang_id',
'aZ09');
900 $newlang =
$object->thirdparty->default_lang;
902 if (!empty($newlang)) {
904 $outputlangs->setDefaultLang($newlang);
905 $outputlangs->load(
'products');
909 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
911 unset($_POST[
'qty']);
912 unset($_POST[
'units']);
917 } elseif ($origin && $origin_id > 0) {
925 $num_prod = count($lines);
926 for ($i = 0; $i < $num_prod; $i++) {
927 if ($lines[$i]->
id == $line_id) {
928 $update_done =
false;
930 $line->fk_expedition =
$object->id;
933 $line->array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
935 if (is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
936 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
937 unset($_POST[
"options_" . $key]);
940 $line->fk_product = $lines[$i]->fk_product;
941 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
943 foreach ($lines[$i]->detail_batch as $detail_batch) {
945 $batch =
"batchl" . $detail_batch->fk_expeditiondet .
"_" . $detail_batch->fk_origin_stock;
946 $qty =
"qtyl" . $detail_batch->fk_expeditiondet .
'_' . $detail_batch->id;
949 if (!empty($batch_id)) {
950 if ($lotStock->fetch($batch_id) > 0 && $line->fetch($detail_batch->fk_expeditiondet) > 0) {
951 if ($lines[$i]->entrepot_id != 0) {
953 $line->entrepot_id = $lotStock->warehouseid;
957 if (empty($line->detail_batch)) {
958 $line->detail_batch =
new stdClass();
961 $line->detail_batch->fk_origin_stock = $batch_id;
962 $line->detail_batch->batch = $lotStock->batch;
963 $line->detail_batch->id = $detail_batch->id;
964 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
965 $line->detail_batch->qty = $batch_qty;
966 if ($line->update($user) < 0) {
977 unset($_POST[$batch]);
982 $batch =
"batchl" . $line_id .
"_0";
983 $qty =
"qtyl" . $line_id .
"_0";
987 if ($batch_qty > 0 && !empty($batch_id)) {
988 if ($lotStock->fetch($batch_id) > 0) {
990 if ($lines[$i]->entrepot_id > 0) {
992 if ($lines[$i]->entrepot_id == $lotStock->warehouseid) {
993 $lineIdToAddLot = $line_id;
995 } elseif (count($lines[$i]->details_entrepot) > 1) {
997 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
998 if ($detail_entrepot->entrepot_id == $lotStock->warehouseid) {
999 $lineIdToAddLot = $detail_entrepot->line_id;
1003 if ($lineIdToAddLot) {
1005 if ($line->fetch($lineIdToAddLot) > 0) {
1006 $line->detail_batch->fk_origin_stock = $batch_id;
1007 $line->detail_batch->batch = $lotStock->batch;
1008 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
1009 $line->detail_batch->qty = $batch_qty;
1010 if ($line->update($user) < 0) {
1014 $update_done =
true;
1022 $line->origin_line_id = $lines[$i]->origin_line_id;
1023 $line->entrepot_id = $lotStock->warehouseid;
1025 $line->detail_batch[0]->fk_origin_stock = $batch_id;
1026 $line->detail_batch[0]->batch = $lotStock->batch;
1027 $line->detail_batch[0]->entrepot_id = $lotStock->warehouseid;
1028 $line->detail_batch[0]->qty = $batch_qty;
1029 if (
$object->create_line_batch($line, $line->array_options) < 0) {
1033 $update_done =
true;
1042 if ($lines[$i]->fk_product > 0) {
1044 if ($lines[$i]->entrepot_id == 0) {
1046 $stockLocation =
"entl" . $line_id;
1047 $qty =
"qtyl" . $line_id;
1048 $line->id = $line_id;
1049 $line->entrepot_id =
GETPOSTINT((
string) $stockLocation);
1051 if ($line->update($user) < 0) {
1055 unset($_POST[$stockLocation]);
1056 unset($_POST[$qty]);
1057 } elseif ($lines[$i]->entrepot_id > 0) {
1059 $stockLocation =
"entl" . $line_id;
1060 $qty =
"qtyl" . $line_id;
1061 $line->id = $line_id;
1062 $line->entrepot_id =
GETPOSTINT($stockLocation);
1064 if ($line->update($user) < 0) {
1068 unset($_POST[$stockLocation]);
1069 unset($_POST[$qty]);
1070 } elseif (count($lines[$i]->details_entrepot) > 1) {
1072 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
1074 $stockLocation =
"entl" . $detail_entrepot->line_id;
1075 $qty =
"qtyl" . $detail_entrepot->line_id;
1077 if (!empty($warehouse)) {
1078 $line->id = $detail_entrepot->line_id;
1079 $line->entrepot_id = $warehouse;
1081 if ($line->update($user) < 0) {
1085 $update_done =
true;
1088 unset($_POST[$stockLocation]);
1089 unset($_POST[$qty]);
1093 $qty =
"qtyl" . $line_id;
1094 $line->id = $line_id;
1096 $line->entrepot_id = 0;
1097 if ($line->update($user) < 0) {
1101 $update_done =
true;
1103 unset($_POST[$qty]);
1107 $qty =
"qtyl" . $line_id;
1108 $line->id = $line_id;
1110 $line->entrepot_id = 0;
1111 if ($line->update($user) < 0) {
1115 $update_done =
true;
1117 unset($_POST[$qty]);
1121 if (empty($update_done)) {
1122 $line->id = $lines[$i]->id;
1123 $line->insertExtraFields();
1128 unset($_POST[
"lineid"]);
1133 $outputlangs = $langs;
1136 $newlang =
GETPOST(
'lang_id',
'aZ09');
1139 $newlang =
$object->thirdparty->default_lang;
1141 if (!empty($newlang)) {
1142 $outputlangs =
new Translate(
"", $conf);
1143 $outputlangs->setDefaultLang($newlang);
1147 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1150 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1154 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'cancel',
'alpha') == $langs->trans(
"Cancel")) {
1155 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1157 } elseif ($action ==
'addline' && !$origin &&
getDolGlobalString(
'SHIPMENT_STANDALONE') && $usercancreate) {
1158 $langs->load(
'errors');
1160 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1164 $fk_elementdet =
'';
1165 $element_type =
'shipping';
1171 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1172 if ($prod_entry_mode ==
'free') {
1177 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1185 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1186 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1188 if (is_array($extralabelsline)) {
1190 foreach ($extralabelsline as $key => $value) {
1191 unset($_POST[
"options_".$key]);
1195 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1196 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
1201 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1205 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1208 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1209 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
1213 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1214 if ($combinations =
GETPOST(
'combinations',
'array')) {
1218 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1219 $idprod = $res->fk_product_child;
1220 $fk_product = $idprod;
1222 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1228 if (!$error && ($qty >= 0) && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1230 if (!empty($idprod) && $idprod > 0) {
1232 $prod->fetch($idprod);
1233 $desc = $prod->label;
1234 $description = $desc;
1237 $outputlangs = $langs;
1239 if (
GETPOST(
'lang_id',
'aZ09')) {
1240 $newlang =
GETPOST(
'lang_id',
'aZ09');
1242 if (empty($newlang)) {
1243 $newlang =
$object->thirdparty->default_lang;
1245 if (!empty($newlang)) {
1246 $outputlangs =
new Translate(
"", $conf);
1247 $outputlangs->setDefaultLang($newlang);
1250 $description = (!empty($prod->multilangs[$outputlangs->defaultlang][
"description"])) ? $prod->multilangs[$outputlangs->defaultlang][
"description"] : $prod->
description;
1252 $description = $prod->description;
1257 $description = $line_desc;
1261 if (!
getDolGlobalString(
'MAIN_PRODUCT_DISABLE_CUSTOMCOUNTRYCODE') && (!empty($prod->customcode) || !empty($prod->country_code))) {
1264 $outputlangs = $langs;
1266 if (
GETPOST(
'lang_id',
'alpha')) {
1267 $newlang =
GETPOST(
'lang_id',
'alpha');
1269 if (empty($newlang)) {
1270 $newlang =
$object->thirdparty->default_lang;
1272 if (!empty($newlang)) {
1273 $outputlangs =
new Translate(
"", $conf);
1274 $outputlangs->setDefaultLang($newlang);
1275 $outputlangs->load(
'products');
1277 if (!empty($prod->customcode)) {
1278 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode").
': '.$prod->customcode;
1280 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1283 if (!empty($prod->country_code)) {
1284 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $outputlangs, 0);
1287 if (!empty($prod->customcode)) {
1288 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode").
': '.$prod->customcode;
1290 if (!empty($prod->customcode) && !empty($prod->country_code)) {
1293 if (!empty($prod->country_code)) {
1294 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry($prod->country_code,
'', $db, $langs, 0);
1300 $type = $prod->type;
1301 $fk_unit = $prod->fk_unit;
1303 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1306 $fk_unit =
GETPOST(
'units',
'alpha');
1307 $description = $desc;
1308 $fk_elementdet =
'';
1313 $result =
$object->addlinefree((
float) $qty, $element_type, $idprod, $fk_unit, min($rank, count(
$object->lines) + 1), $description, $fk_parent, $array_options);
1320 $outputlangs = $langs;
1321 $newlang =
GETPOST(
'lang_id',
'alpha');
1323 $newlang =
$object->thirdparty->default_lang;
1325 if (!empty($newlang)) {
1326 $outputlangs =
new Translate(
"", $conf);
1327 $outputlangs->setDefaultLang($newlang);
1329 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1332 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1336 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $permissiontoadd) {
1337 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
1341 $outputlangs = $langs;
1344 $newlang =
GETPOST(
'lang_id',
'aZ09');
1347 $newlang =
$object->thirdparty->default_lang;
1349 if (!empty($newlang)) {
1350 $outputlangs =
new Translate(
"", $conf);
1351 $outputlangs->setDefaultLang($newlang);
1353 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1356 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1361 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $permissiontoadd) {
1362 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
1366 $outputlangs = $langs;
1369 $newlang =
GETPOST(
'lang_id',
'aZ09');
1372 $newlang =
$object->thirdparty->default_lang;
1374 if (!empty($newlang)) {
1375 $outputlangs =
new Translate(
"", $conf);
1376 $outputlangs->setDefaultLang($newlang);
1378 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1381 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1388 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1394 $triggersendname =
'SHIPPING_SENTBYMAIL';
1396 $autocopy =
'MAIN_MAIL_AUTOCOPY_SHIPMENT_TO';
1397 $mode =
'emailfromshipment';
1398 $trackid =
'shi' .
$object->id;
1399 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1406$title =
$object->ref .
' - ' . $langs->trans(
"Card");
1407if ($action ==
'create') {
1408 $title = $langs->trans(
"NewSending");
1411$help_url =
'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Expediciones|DE:Modul_Lieferungen';
1413llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-expedition page-card');
1415if (empty($action)) {
1419$form =
new Form($db);
1425 $formproject =
null;
1428$product_static =
new Product($db);
1430$warehousestatic =
new Entrepot($db);
1435 print
'<br>' .$langs->trans(
"ShipmentCreationIsDoneFromOrder");
1442if ($action ==
'create' && $usercancreate) {
1450 $res = $soc->fetch($socid);
1453 $shipping_method_id = $soc->shipping_method_id;
1454 $note_private =
$object->getDefaultCreateValueFor(
'note_private');
1455 $note_public =
$object->getDefaultCreateValueFor(
'note_public');
1457 print
'<form name="crea_expedition" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
1458 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1459 print
'<input type="hidden" name="action" value="add">';
1460 print
'<input type="hidden" name="changecompany" value="0">';
1461 print
'<input type="hidden" name="originid" value="' .
$id .
'">';
1462 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
1466 print
'<table class="border centpercent">';
1470 print
'<td class="fieldrequired">' . $langs->trans(
'ThirdParty') .
'</td>';
1473 print $soc->getNomUrl(1);
1474 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1477 print
'<td class="valuefieldcreate">';
1478 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth175 maxwidth500 widthcentpercentminusxx');
1482 $(document).ready(function() {
1483 $("#socid").change(function() {
1484 console.log("We have changed the company - Reload page");
1485 var socid = $(this).val();
1487 $("input[name=action]").val("create");
1488 $("input[name=changecompany]").val("1");
1489 $("form[name=crea_expedition]").submit();
1494 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>';
1500 if (
isModEnabled(
'project') && is_object($formproject)) {
1502 if (empty($projectid) && !empty(
$object->fk_project)) {
1503 $projectid = (int)
$object->fk_project;
1506 $langs->load(
"projects");
1508 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1509 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1510 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1511 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>';
1517 print
'<tr><td>'.$langs->trans(
"DateShipping").
'</td>';
1518 print
'<td colspan="3">';
1519 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1520 $date_shipping = ($date_shipping ? $date_shipping :
$object->date_shipping);
1521 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1526 print
'<tr><td>'.$langs->trans(
"DateDeliveryPlanned").
'</td>';
1527 print
'<td colspan="3">';
1528 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1529 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1530 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1536 print $langs->trans(
"Weight");
1537 print
'</td><td colspan="3">';
1538 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1539 print
'<input name="weight" size="4" value="' .
GETPOST(
'weight') .
'"> ';
1540 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight",
GETPOST(
'weight_units'), 0, 2);
1541 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1542 print $form->textwithpicto($text, $htmltext);
1547 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1548 print
' </td><td colspan="3">';
1549 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1550 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1551 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1552 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1554 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1555 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1556 print $form->textwithpicto($text, $htmltext);
1560 print
"<tr><td>".$langs->trans(
"DeliveryMethod").
"</td>";
1561 print
'<td colspan="3">';
1562 $expe->fetch_delivery_methods();
1563 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1564 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1566 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1568 print
"</td></tr>\n";
1571 print
"<tr><td>".$langs->trans(
"TrackingNumber").
"</td>";
1572 print
'<td colspan="3">';
1573 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1574 print
'<input name="tracking_number" size="20" value="'.GETPOST(
'tracking_number',
'alpha').
'">';
1575 print
"</td></tr>\n";
1578 $parameters = array(
'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
'colspan' =>
' colspan="3"',
'cols' =>
'3',
'socid' => $socid);
1579 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $expe, $action);
1580 print $hookmanager->resPrint;
1582 if (empty($reshook)) {
1584 if (
$object->fetch_optionals() > 0) {
1585 $expe->array_options = array_merge($expe->array_options,
$object->array_options);
1587 print $expe->showOptionals($extrafields,
'edit', $parameters);
1593 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1).
'</label></td>';
1594 print
'<td colspan="3" class="maxwidthonsmartphone">';
1595 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1596 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1601 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
1603 if (is_array($list) && count($list) > 1) {
1604 print
"<tr><td>".$langs->trans(
"DefaultModel").
"</td>";
1605 print
'<td colspan="3">';
1606 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1607 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1608 print
"</td></tr>\n";
1614 print
'<td class="tdtop">';
1615 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext);
1617 print
'<td valign="top" colspan="2">';
1618 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1619 print $doleditor->Create(1);
1622 if (!$user->socid) {
1624 print
'<td class="tdtop">';
1625 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext);
1627 print
'<td valign="top" colspan="2">';
1628 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1629 print $doleditor->Create(1);
1637 print $form->buttonsSaveCancel(
"CreateDraft");
1640 } elseif ($origin) {
1641 $classname = ucfirst($origin);
1643 $object =
new $classname($db);
1645 '@phan-var-force Commande|Facture $object';
1648 if (
$object->fetch($origin_id)) {
1652 $author =
new User($db);
1653 $author->fetch(
$object->user_author_id);
1659 print
'<form action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
1660 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
1661 print
'<input type="hidden" name="action" value="add">';
1662 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
1663 print
'<input type="hidden" name="origin_id" value="' .
$object->id .
'">';
1665 print
'<input type="hidden" name="entrepot_id" value="' .
GETPOSTINT(
'entrepot_id') .
'">';
1670 print
'<table class="border centpercent">';
1673 print
'<tr><td class="titlefieldcreate fieldrequired">';
1675 print $langs->trans(
"RefOrder");
1678 print $langs->trans(
"RefProposal");
1680 print
'</td><td colspan="3">';
1687 if ($origin ==
'commande') {
1688 print $langs->trans(
'RefCustomerOrder');
1689 } elseif ($origin ==
'propal') {
1690 print $langs->trans(
'RefCustomerOrder');
1692 print $langs->trans(
'RefCustomer');
1694 print
'</td><td colspan="3">';
1695 print
'<input type="text" name="ref_customer" value="' .
$object->ref_client .
'" />';
1700 print
'<tr><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Company') .
'</td>';
1701 print
'<td colspan="3">' . $soc->getNomUrl(1) .
'</td>';
1702 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1706 if (
isModEnabled(
'project') && is_object($formproject)) {
1708 if (empty($projectid) && !empty(
$object->fk_project)) {
1709 $projectid = (int)
$object->fk_project;
1711 if ($origin ==
'project') {
1714 $langs->load(
"projects");
1716 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1717 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1718 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1719 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>';
1725 print
'<tr><td>' . $langs->trans(
"DateDeliveryPlanned") .
'</td>';
1726 print
'<td colspan="3">';
1727 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1728 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1729 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1734 print
'<tr><td>' . $langs->trans(
"DateShipping") .
'</td>';
1735 print
'<td colspan="3">';
1736 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1738 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1743 print
'<tr><td>' . $langs->trans(
"NotePublic") .
'</td>';
1744 print
'<td colspan="3">';
1745 $doleditor =
new DolEditor(
'note_public',
$object->note_public,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1746 print $doleditor->Create(1);
1750 if (
$object->note_private && !$user->socid) {
1751 print
'<tr><td>' . $langs->trans(
"NotePrivate") .
'</td>';
1752 print
'<td colspan="3">';
1753 $doleditor =
new DolEditor(
'note_private',
$object->note_private,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1754 print $doleditor->Create(1);
1760 print $langs->trans(
"Weight");
1761 print
'</td><td colspan="3">';
1762 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1765 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
GETPOST(
'weight_units'), 0, 2);
1766 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1767 print $form->textwithpicto($text, $htmltext);
1772 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1773 print
' </td><td colspan="3">';
1774 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1775 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1776 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1777 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1779 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1780 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1781 print $form->textwithpicto($text, $htmltext);
1785 print
"<tr><td>" . $langs->trans(
"DeliveryMethod") .
"</td>";
1786 print
'<td colspan="3">';
1787 $expe->fetch_delivery_methods();
1788 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1789 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1791 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1793 print
"</td></tr>\n";
1796 print
"<tr><td>" . $langs->trans(
"TrackingNumber") .
"</td>";
1797 print
'<td colspan="3">';
1798 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1799 print
'<input name="tracking_number" size="20" value="' .
GETPOST(
'tracking_number',
'alpha') .
'">';
1800 print
"</td></tr>\n";
1805 print
'<td><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1) .
'</label></td>';
1806 print
'<td colspan="3" class="maxwidthonsmartphone">';
1807 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1808 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1813 include_once DOL_DOCUMENT_ROOT .
'/core/modules/expedition/modules_expedition.php';
1815 if (is_array($list) && count($list) > 1) {
1816 print
"<tr><td>" . $langs->trans(
"DefaultModel") .
"</td>";
1817 print
'<td colspan="3">';
1818 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1819 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1820 print
"</td></tr>\n";
1828 if (isset($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && !empty($extrafields->attributes[
$object->table_element][
'label'])) {
1829 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
1830 if (array_key_exists(
'options_'.$key, $objectsav->array_options)) {
1831 $object->array_options[
'options_'.$key] = $objectsav->array_options[
'options_'.$key];
1835 $parameters = array(
1836 'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
1840 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
1850 $numAsked = count(
$object->lines);
1852 print
'<script type="text/javascript">' .
"\n";
1853 print
'jQuery(document).ready(function() {' .
"\n";
1854 print
'jQuery("#autofill").click(function() {';
1856 while ($i < $numAsked) {
1857 print
'jQuery("#qtyl' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1859 print
'jQuery("#qtyl' . $i .
'_' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1863 print
'return false; });' .
"\n";
1864 print
'jQuery("#autoreset").click(function() { console.log("Reset values to 0"); jQuery(".qtyl").val(0);' .
"\n";
1865 print
'return false; });' .
"\n";
1867 print
'</script>' .
"\n";
1871 print
'<div class="div-table-responsive-no-min">';
1872 print
'<table class="noborder centpercent">';
1877 $alreadyQtyBatchSetted = $alreadyQtySetted = array();
1879 $title_lines_to_disable = array();
1884 $title_lines_to_disable =
$object->getDisabledShippmentSubtotalLines();
1886 foreach (
$object->lines as $line) {
1887 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1888 $show_check_add_buttons =
true;
1893 print
'<tr class="liste_titre">';
1895 if (isset($show_check_add_buttons)) {
1896 print $form->showCheckAddButtons(
'checkforselect');
1898 print $langs->trans(
"Description");
1900 print
'<td class="center">' . $langs->trans(
"QtyOrdered") .
'</td>';
1901 print
'<td class="center">' . $langs->trans(
"QtyShipped") .
'</td>';
1902 print
'<td class="center">' . $langs->trans(
"QtyToShip");
1904 print
'<br><a href="#" id="autofill" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Autofill"),
'autofill',
'class="paddingrightonly"') .
'</a>';
1909 print
'<span id="autoreset" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Reset"),
'eraser') .
'</span>';
1913 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' (' . $langs->trans(
"Stock") .
')</td>';
1915 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' / ' . $langs->trans(
"Batch") .
' (' . $langs->trans(
"Stock") .
')</td>';
1919 print
'<td class="left">' . $langs->trans(
'StockEntryDate') .
'</td>';
1925 $warehousePicking = array();
1927 if ($warehouse_id > 0) {
1928 $warehousePicking[] = $warehouse_id;
1930 $warehouseObj->get_children_warehouses($warehouse_id, $warehousePicking);
1934 while ($indiceAsked < $numAsked) {
1937 $line =
$object->lines[$indiceAsked];
1939 $parameters = array(
'i' => $indiceAsked,
'line' => $line,
'num' => $numAsked);
1940 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
1945 if (empty($reshook) && $line->special_code != SUBTOTALS_SPECIAL_CODE) {
1947 $type = $line->product_type ? $line->product_type : $line->fk_product_type;
1949 if (!empty($line->date_start)) {
1952 if (!empty($line->date_end)) {
1956 print
'<!-- line for order line ' . $line->id .
' -->' .
"\n";
1957 print
'<tr class="oddeven" id="row-' . $line->id .
'">' .
"\n";
1959 $qtyProdCom = $line->qty;
1960 $productChildrenNb = 0;
1962 if ($line->fk_product > 0) {
1963 $res = $product->fetch($line->fk_product);
1968 $productChildrenNb = $product->hasFatherOrChild(1);
1970 if ($productChildrenNb > 0) {
1971 $product->loadStockForVirtualProduct(
'warehouseopen', $qtyProdCom);
1973 $product->load_stock(
'warehouseopen');
1978 print
'<a name="' . $line->id .
'"></a>';
1981 $product_static->type = $line->fk_product_type;
1982 $product_static->id = $line->fk_product;
1983 $product_static->ref = $line->ref;
1984 $product_static->status = $line->product_tosell;
1985 $product_static->status_buy = $line->product_tobuy;
1986 $product_static->status_batch = $line->product_tobatch;
1988 $showdescinproductdesc =
getDolGlobalString(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE');
1990 $text = $product_static->getNomUrl(1);
1991 $text .=
' - ' . (!empty($line->label) ? $line->label : $line->product_label);
1993 $description .= empty($product->stockable_product) ? $langs->trans(
'StockDisabled') : $langs->trans(
'StockEnabled');
1994 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
1997 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
2000 if ($showdescinproductdesc) {
2001 print ($line->desc && $line->desc != $line->product_label) ?
'<br>' .
dol_htmlentitiesbr($line->desc) :
'';
2008 $text =
img_object($langs->trans(
'Service'),
'service');
2010 $text =
img_object($langs->trans(
'Product'),
'product');
2013 if (!empty($line->label)) {
2014 $text .=
' <strong>' . $line->label .
'</strong>';
2015 print $form->textwithtooltip($text, $line->desc, 3, 0,
'', (
string) $i);
2017 print $text .
' ' . nl2br($line->desc);
2021 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
2032 print
'<td class="center">' . $line->qty;
2033 print
'<input name="qtyasked' . $indiceAsked .
'" id="qtyasked' . $indiceAsked .
'" type="hidden" value="' . $line->qty .
'">';
2035 print
' ' . $unit_order .
'</td>';
2039 print
'<td class="center">';
2040 $quantityDelivered = isset(
$object->expeditions[$line->id]) ?
$object->expeditions[$line->id] :
'';
2041 print $quantityDelivered;
2042 print
'<input name="qtydelivered' . $indiceAsked .
'" id="qtydelivered' . $indiceAsked .
'" type="hidden" value="' . $quantityDelivered .
'">';
2043 if ($quantityDelivered) {
2044 print
' ' . $unit_order .
'</td>';
2048 $quantityAsked = $line->qty;
2050 $quantityToBeDelivered = 0;
2052 if (is_numeric($quantityDelivered)) {
2053 $quantityToBeDelivered = $quantityAsked - $quantityDelivered;
2055 $quantityToBeDelivered = $quantityAsked;
2059 $warehouseObject =
null;
2060 if (count($warehousePicking) == 1 || !($line->fk_product > 0) || !
isModEnabled(
'stock')) {
2061 print
'<!-- Case warehouse already known or product not a predefined product -->';
2063 $stock = + (isset($product->stock_warehouse[$warehouse_id]->real) ? $product->stock_warehouse[$warehouse_id]->real : 0);
2065 $deliverableQty = $quantityToBeDelivered;
2067 $deliverableQty = min($quantityToBeDelivered, $stock);
2069 if ($deliverableQty < 0) {
2070 $deliverableQty = 0;
2072 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2074 print
'<td class="center">';
2076 if (GETPOSTISSET(
'qtyl'.$indiceAsked) &&
GETPOST(
'qtyl'.$indiceAsked) !==
'') {
2077 $deliverableQty =
GETPOSTFLOAT(
'qtyl'.$indiceAsked,
'MS');
2079 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2080 $qtylValue = $deliverableQty;
2083 } elseif (is_numeric($qtylValue)) {
2085 $qtylValue =
price($qtylValue);
2087 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" class="qtyl right" type="text" size="4" value="' . $qtylValue .
'">';
2090 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2091 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2094 print $langs->trans(
"NA");
2100 print
'<td class="left">';
2103 $ent =
"entl" . $indiceAsked;
2104 $idl =
"idl" . $indiceAsked;
2106 if ($line->fk_product > 0) {
2107 print
'<!-- Show warehouse selection -->';
2113 if ($productChildrenNb > 0) {
2114 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, 0,
'', 0, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2116 if ($product->stockable_product == Product::ENABLED_STOCK) {
2117 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, $line->fk_product,
'', 1, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2119 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2123 if ($tmpentrepot_id > 0 && $tmpentrepot_id == $warehouse_id) {
2125 if ($stock < $quantityToBeDelivered) {
2126 print
' ' .
img_warning($langs->trans(
"StockTooLow"));
2131 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span><input name="entl' . $indiceAsked .
'" id="entl' . $indiceAsked .
'" type="hidden" value="0">';
2142 $product->get_sousproduits_arbo();
2143 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2144 if (count($prods_arbo) > 0) {
2145 foreach ($prods_arbo as $key => $value) {
2148 if ($value[
'stock'] < $value[
'stock_alert']) {
2151 print
"<tr class=\"oddeven\"><td> ->
2152 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2153 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2154 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2164 print
'<td></td><td></td>';
2169 print
'<!-- Case product need lot -->';
2171 $staticwarehouse =
new Entrepot($db);
2172 if ($warehouse_id > 0) {
2173 $staticwarehouse->fetch($warehouse_id);
2179 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2180 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2184 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
2185 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2186 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2188 $batchStock = +$dbatch->qty;
2189 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2192 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2193 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2195 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2196 $alreadyQtyBatchSetted[$line->fk_product] = array();
2199 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2200 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2203 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2206 if ($deliverableQty < 0) {
2207 $deliverableQty = 0;
2210 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2211 if (GETPOSTISSET($inputName)) {
2212 $deliverableQty =
GETPOST($inputName,
'int');
2215 $tooltipClass = $tooltipTitle =
'';
2216 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2217 $tooltipClass =
' classfortooltip';
2218 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2220 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2222 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2224 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2225 print
'<td colspan="3" ></td><td class="center">';
2226 $qtylValue = $deliverableQty;
2229 } elseif (is_numeric($qtylValue)) {
2230 $qtylValue =
price($qtylValue);
2232 print
'<input class="qtyl ' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="' . $qtylValue .
'">';
2235 print
'<!-- Show details of lot -->';
2236 print
'<td class="left">';
2238 print $staticwarehouse->getNomUrl(0) .
' / ';
2240 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2243 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
2245 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2248 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2250 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
2254 $quantityToBeDelivered -= $deliverableQty;
2255 if ($quantityToBeDelivered < 0) {
2256 $quantityToBeDelivered = 0;
2261 print
'<td>' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2266 print
'<!-- Case there is no details of lot at all -->';
2267 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2268 print
'<input class="qtyl right" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="0" disabled="disabled"> ';
2271 print
'<td class="left">';
2272 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $staticwarehouse->label);
2282 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2283 print
'<!-- Case warehouse not already known and product does not need lot -->';
2284 print
'<td></td><td></td>';
2288 print
'</tr>' .
"\n";
2290 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2295 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2296 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2300 $tmpwarehouseObject =
new Entrepot($db);
2301 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2303 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2308 $tmpwarehouseObject->fetch($warehouse_id);
2309 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2310 $stock = +$stock_warehouse->real;
2311 $deliverableQty = min($quantityToBeDelivered, $stock);
2312 $deliverableQty = max(0, $deliverableQty);
2314 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2315 print
'<td colspan="3" ></td><td class="center"><!-- qty to ship (no lot management for product line indiceAsked=' . $indiceAsked .
') -->';
2321 $tooltipClass = $tooltipTitle =
'';
2322 if ($productChildrenNb <= 0) {
2323 if (isset($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2324 $deliverableQty = min($quantityToBeDelivered, $stock - $alreadyQtySetted[$line->fk_product][intval($warehouse_id)]);
2326 if (!isset($alreadyQtySetted[$line->fk_product])) {
2327 $alreadyQtySetted[$line->fk_product] = array();
2330 $deliverableQty = min($quantityToBeDelivered, $stock);
2333 if ($deliverableQty < 0) {
2334 $deliverableQty = 0;
2337 if (!empty($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2338 $tooltipClass =
' classfortooltip';
2339 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines').
' : '.$alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2341 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = 0;
2344 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = $deliverableQty + $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2347 $inputName =
'qtyl'.$indiceAsked.
'_'.$subj;
2348 if (GETPOSTISSET($inputName)) {
2351 $qtylValue = $deliverableQty;
2354 } elseif (is_numeric($qtylValue)) {
2355 $qtylValue =
price($qtylValue);
2357 print
'<input class="qtyl' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="text" size="4" value="' . $qtylValue .
'">';
2358 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_id .
'">';
2361 print
'<input name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2364 print $langs->trans(
"NA");
2369 print
'<td class="left">';
2371 if ($product->stockable_product == Product::ENABLED_STOCK || $productChildrenNb > 0) {
2372 print $tmpwarehouseObject->getNomUrl(0) .
' ';
2373 if ($productChildrenNb <= 0) {
2374 print
'<!-- Show details of stock -->';
2375 print
'(' . $stock .
')';
2378 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2381 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2384 $quantityToBeDelivered -= $deliverableQty;
2385 if ($quantityToBeDelivered < 0) {
2386 $quantityToBeDelivered = 0;
2397 $product->get_sousproduits_arbo();
2398 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2399 if (count($prods_arbo) > 0) {
2400 foreach ($prods_arbo as $key => $value) {
2403 if ($value[
'stock'] < $value[
'stock_alert']) {
2406 print
'<tr class"oddeven"><td>';
2407 print
" ->
2408 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2409 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2410 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2419 print
'<!-- Case warehouse not already known and product need lot -->';
2420 print
'<td></td><td></td>';
2427 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2429 $tmpwarehouseObject =
new Entrepot($db);
2434 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2435 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2436 $nbofsuggested += count($stock_warehouse->detail_batch);
2440 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2442 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2447 $tmpwarehouseObject->fetch($warehouse_id);
2448 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2449 foreach ($stock_warehouse->detail_batch as $dbatch) {
2450 $batchStock = +$dbatch->qty;
2451 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2452 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2454 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2455 $alreadyQtyBatchSetted[$line->fk_product] = array();
2458 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2459 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2462 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2465 if ($deliverableQty < 0) {
2466 $deliverableQty = 0;
2469 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2470 if (GETPOSTISSET($inputName)) {
2474 $tooltipClass = $tooltipTitle =
'';
2475 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2476 $tooltipClass =
' classfortooltip';
2477 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2479 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2481 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2483 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'><td colspan="3"></td><td class="center">';
2484 $qtylValue = $deliverableQty;
2487 } elseif (is_numeric($qtylValue)) {
2488 $qtylValue =
price($qtylValue);
2490 print
'<input class="qtyl right ' . $tooltipClass .
'" title="' . $tooltipTitle .
'" name="' . $inputName .
'" id="' . $inputName .
'" type="text" size="4" value="' . $qtylValue .
'">';
2493 print
'<td class="left">';
2495 print $tmpwarehouseObject->getNomUrl(0) .
' / ';
2497 print
'<!-- Show details of lot -->';
2498 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2499 print
'<input name="entl' . $indiceAsked .
'_'.$subj.
'" type="hidden" value="' . $tmpwarehouseObject->id .
'">';
2502 print $langs->trans(
"Batch") .
': ';
2503 $result = $productlotObject->fetch(0, $line->fk_product, $dbatch->batch);
2505 print $productlotObject->getNomUrl(1);
2507 print $langs->trans(
"TableLotIncompleteRunRepairWithParamStandardEqualConfirmed");
2510 print
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2513 print
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2515 print
' (' . $dbatch->qty .
')';
2516 $quantityToBeDelivered -= $deliverableQty;
2517 if ($quantityToBeDelivered < 0) {
2518 $quantityToBeDelivered = 0;
2524 print
'<td class="left">' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2532 $warehouse_selected_id =
GETPOSTINT(
'entrepot_id');
2534 print
'<!-- line not shown yet, we show it -->';
2535 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2540 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2541 $disabled =
'disabled="disabled"';
2542 $alt =
'Product need serial or batch number';
2544 if ($warehouse_selected_id <= 0) {
2545 $disabled =
'disabled="disabled"';
2548 if ($product->stockable_product == Product::ENABLED_STOCK) {
2551 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).
'"' :
'').
'> ';
2553 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2557 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2558 $disabled =
'disabled="disabled"';
2560 if ($warehouse_selected_id <= 0) {
2561 $disabled =
'disabled="disabled"';
2563 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="'.$quantityToBeDelivered.
'"'.($disabled ?
' '.$disabled :
'').
'> ';
2564 if (empty($disabled) && !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2565 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2568 print $langs->trans(
"NA");
2572 print
'<td class="left">';
2575 if (($warehouse_selected_id > 0 && $product->stockable_product == Product::ENABLED_STOCK)) {
2576 $warehouseObject =
new Entrepot($db);
2577 $warehouseObject->fetch($warehouse_selected_id);
2578 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $warehouseObject->label);
2580 if ($line->fk_product) {
2581 if ($product->stockable_product != Product::ENABLED_STOCK) {
2582 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2584 print
img_warning() .
' ' . $langs->trans(
'StockTooLow');
2591 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2607 $srcLine->id = $line->id;
2608 $srcLine->fetch_optionals();
2610 $expLine->array_options = array_merge($expLine->array_options, $srcLine->array_options);
2612 print $expLine->showOptionals($extrafields,
'edit', array(
'style' =>
'class="drag drop oddeven"',
'colspan' => $colspan), (
string) $indiceAsked,
'',
'1');
2613 } elseif (empty($reshook) && $line->special_code == SUBTOTALS_SPECIAL_CODE && !in_array($line->id, $title_lines_to_disable)) {
2614 require
dol_buildpath(
'/core/tpl/subtotalline_select.tpl.php');
2625 print $form->buttonsSaveCancel(
"Create");
2635 '@phan-var-force Expedition $object';
2641 $num_prod = count($lines);
2644 $typeobject =
$object->origin;
2646 $origin_id =
$object->origin_id;
2654 $res =
$object->fetch_optionals();
2662 if ($action ==
'delete') {
2663 $formquestion = array();
2665 $formquestion = array(
2667 'label' => $langs->trans(
'ShipmentIncrementStockOnDelete'),
2668 'name' =>
'alsoUpdateStock',
2669 'type' =>
'checkbox',
2674 $formconfirm = $form->formconfirm(
2675 $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
2676 $langs->trans(
'DeleteSending'),
2677 $langs->trans(
"ConfirmDeleteSending",
$object->ref),
2686 if ($action ==
'ask_subtotal_deleteline') {
2688 $langs->load(
"subtotals");
2689 $title =
"DeleteSubtotalLine";
2690 $question =
"ConfirmDeleteSubtotalLine";
2691 if (
GETPOST(
'type') ==
'title') {
2692 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2693 $title =
"DeleteTitleLine";
2694 $question =
"ConfirmDeleteTitleLine";
2696 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2700 if ($action ==
'valid') {
2701 $objectref = substr(
$object->ref, 1, 4);
2702 if ($objectref ==
'PROV') {
2703 $numref =
$object->getNextNumRef($soc);
2705 $numref = (string)
$object->ref;
2708 $text = $langs->trans(
"ConfirmValidateSending", $numref);
2710 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementWillBeRecorded") .
'.';
2712 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementNotYetRecorded") .
'.';
2716 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2717 $notify =
new Notify($db);
2719 $text .= $notify->confirmMessage(
'SHIPPING_VALIDATE',
$object->socid, $object);
2722 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $langs->trans(
'ValidateSending'), $text,
'confirm_valid',
'', 0, 1, 260);
2726 if ($action ==
'cancel') {
2727 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, $langs->trans(
'CancelSending'), $langs->trans(
"ConfirmCancelSending",
$object->ref),
'confirm_cancel',
'', 0, 1);
2731 if ($action ==
'sign') {
2732 $text = $langs->trans(
'ConfirmSignShipping');
2734 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2735 $notify =
new Notify($db);
2737 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2742 'name' =>
'signed_status',
2743 'select_show_empty' => 0,
2744 'label' =>
'<span class="fieldrequired">' . $langs->trans(
'SignStatus') .
'</span>',
2745 'values' =>
$object->getSignedStatusLocalisedArray()
2747 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SignShipping'), $text,
'confirm_sign', $formquestion, 0, 1);
2751 if ($action ==
'unsign') {
2752 $text = $langs->trans(
'ConfirmUnsignShipping');
2754 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2755 $notify =
new Notify($db);
2757 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2759 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'UnsignShipping'), $text,
'confirm_unsign',
'', 0, 1);
2763 $parameters = array(
'formConfirm' => $formconfirm);
2764 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
2765 if (empty($reshook)) {
2766 $formconfirm .= $hookmanager->resPrint;
2767 } elseif ($reshook > 0) {
2768 $formconfirm = $hookmanager->resPrint;
2776 $tmparray =
$object->getTotalWeightVolume();
2777 $totalWeight = $tmparray[
'weight'];
2778 $totalVolume = $tmparray[
'volume'];
2780 if (!empty($typeobject) && $typeobject ===
'commande' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2782 $objectsrc->fetch(
$object->origin_object->id);
2784 if (!empty($typeobject) && $typeobject ===
'propal' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2785 $objectsrc =
new Propal($db);
2786 $objectsrc->fetch(
$object->origin_object->id);
2790 $linkback =
'<a href="' . DOL_URL_ROOT .
'/expedition/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
2791 $morehtmlref =
'<div class="refidno">';
2793 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
2794 $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);
2797 $morehtmlref .=
'<br>' .
$object->thirdparty->getNomUrl(1);
2800 if ($origin && $origin_id > 0) {
2802 $langs->load(
"projects");
2803 $morehtmlref .=
'<br>';
2805 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2806 if ($action !=
'classify') {
2807 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2809 $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');
2811 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
2813 $proj->fetch($objectsrc->fk_project);
2814 $morehtmlref .= $proj->getNomUrl(1);
2816 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2824 $langs->load(
"projects");
2825 $morehtmlref .=
'<br>';
2826 if ($permissiontoadd) {
2827 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2828 if ($action !=
'classify') {
2829 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
2831 $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');
2833 if (!empty(
$object->fk_project)) {
2835 $proj->fetch(
$object->fk_project);
2836 $morehtmlref .= $proj->getNomUrl(1);
2838 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
2845 $morehtmlref .=
'</div>';
2846 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2848 print
'<div class="fichecenter">';
2849 print
'<div class="fichehalfleft">';
2850 print
'<div class="underbanner clearboth"></div>';
2852 print
'<table class="border tableforfield centpercent">';
2855 if (!empty($typeobject) && $typeobject ==
'commande' &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2857 print $langs->trans(
"RefOrder") .
'</td>';
2859 print $objectsrc->getNomUrl(1,
'commande');
2863 if (!empty($typeobject) && $typeobject ==
'propal' &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2865 print $langs->trans(
"RefProposal") .
'</td>';
2867 print $objectsrc->getNomUrl(1,
'expedition');
2873 print
'<tr><td class="titlefieldmiddle">' . $langs->trans(
"DateCreation") .
'</td>';
2878 print
'<tr><td height="10">';
2879 print
'<table class="nobordernopadding centpercent"><tr><td>';
2880 print $langs->trans(
'DateDeliveryPlanned');
2882 if ($action !=
'editdate_livraison') {
2883 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>';
2885 print
'</tr></table>';
2887 if ($action ==
'editdate_livraison') {
2888 print
'<form name="setdate_livraison" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2889 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2890 print
'<input type="hidden" name="action" value="setdate_livraison">';
2891 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
2892 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2901 print
'<tr><td height="10">';
2902 print
'<table class="nobordernopadding centpercent"><tr><td>';
2903 print $langs->trans(
'DateShipping');
2905 if ($action !=
'editdate_shipping') {
2906 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>';
2908 print
'</tr></table>';
2910 if ($action ==
'editdate_shipping') {
2911 print
'<form name="setdate_shipping" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2912 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2913 print
'<input type="hidden" name="action" value="setdate_shipping">';
2914 print $form->selectDate(
$object->date_shipping ?
$object->date_shipping : -1,
'ship_', 1, 1, 0,
"setdate_shipping", 1, 0);
2915 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2925 print $form->editfieldkey(
"Weight",
'trueWeight',
$object->trueWeight, $object, $user->hasRight(
'expedition',
'creer'));
2928 if ($action ==
'edittrueWeight') {
2929 print
'<form name="settrueweight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2930 print
'<input name="action" value="settrueWeight" type="hidden">';
2931 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2932 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2933 print
'<input id="trueWeight" name="trueWeight" value="' .
$object->trueWeight .
'" type="text" class="width50 valignmiddle">';
2934 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
$object->weight_units, 0, 2,
'maxwidth125 valignmiddle');
2935 print
' <input class="button smallpaddingimp valignmiddle" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2936 print
' <input class="button button-cancel smallpaddingimp valignmiddle" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
2944 if ($totalWeight > 0) {
2945 if (!empty(
$object->trueWeight)) {
2946 print
' (' . $langs->trans(
"SumOfProductWeights") .
': ';
2949 if (!empty(
$object->trueWeight)) {
2956 print
'<tr><td>' . $form->editfieldkey(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2957 print $form->editfieldval(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer'));
2962 print
'<tr><td>' . $form->editfieldkey(
"Height",
'trueHeight',
$object->trueHeight, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2963 if ($action ==
'edittrueHeight') {
2964 print
'<form name="settrueHeight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2965 print
'<input name="action" value="settrueHeight" type="hidden">';
2966 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2967 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2968 print
'<input id="trueHeight" name="trueHeight" value="' .
$object->trueHeight .
'" type="text" class="width50">';
2969 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
$object->size_units, 0, 2);
2970 print
' <input class="button smallpaddingimp" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2971 print
' <input class="button button-cancel smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
2981 print
'<tr><td>' . $form->editfieldkey(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2982 print $form->editfieldval(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer'));
2988 print $langs->trans(
"Volume");
2991 $calculatedVolume = 0;
2995 $volumeUnit =
$object->size_units * 3;
2998 if ($calculatedVolume > 0) {
2999 if ($volumeUnit < 50) {
3005 if ($totalVolume > 0) {
3006 if ($calculatedVolume) {
3007 print
' (' . $langs->trans(
"SumOfProductVolumes") .
': ';
3011 if ($calculatedVolume) {
3020 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3025 print
'<div class="fichehalfright">';
3026 print
'<div class="underbanner clearboth"></div>';
3028 print
'<table class="border centpercent tableforfield">';
3032 print
'<table class="nobordernopadding centpercent"><tr><td>';
3033 print $langs->trans(
'SendingMethod');
3036 if ($action !=
'editshipping_method_id' && $permissiontoadd) {
3037 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>';
3039 print
'</tr></table>';
3041 if ($action ==
'editshipping_method_id') {
3042 print
'<form name="setshipping_method_id" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3043 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3044 print
'<input type="hidden" name="action" value="setshipping_method_id">';
3045 $object->fetch_delivery_methods();
3046 print $form->selectarray(
"shipping_method_id",
$object->meths,
$object->shipping_method_id, 1, 0, 0,
"", 1);
3048 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
3050 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
3053 if (
$object->shipping_method_id > 0) {
3055 $code = $langs->getLabelFromKey($db, (
string)
$object->shipping_method_id,
'c_shipment_mode',
'rowid',
'code');
3056 print $langs->trans(
"SendingMethod" . strtoupper($code));
3063 print
'<tr><td class="titlefieldmiddle">' . $form->editfieldkey(
"TrackingNumber",
'tracking_number',
$object->tracking_number, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3064 print $form->editfieldval(
"TrackingNumber",
'tracking_number',
$object->tracking_url, $object, $user->hasRight(
'expedition',
'creer'),
'safehtmlstring',
$object->tracking_number);
3070 print
'<table class="nobordernopadding centpercent"><tr><td>';
3071 print $langs->trans(
'IncotermLabel');
3072 print
'<td><td class="right">';
3073 if ($permissiontoadd) {
3074 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/expedition/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3078 print
'</td></tr></table>';
3081 if ($action !=
'editincoterm') {
3082 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3084 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3090 $parameters = array();
3091 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3092 print $hookmanager->resPrint;
3099 print
'<div class="clearboth"></div>';
3108 if (!empty(
$object->table_element_line)) {
3110 $result =
$object->getLinesArray();
3112 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
3113 <input type="hidden" name="token" value="' .
newToken().
'">
3114 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3115 <input type="hidden" name="mode" value="">
3116 <input type="hidden" name="page_y" value="">
3117 <input type="hidden" name="id" value="' .
$object->id.
'">
3120 if (!empty($conf->use_javascript_ajax) &&
$object->status == 0) {
3121 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3124 print
'<div class="div-table-responsive-no-min">';
3125 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3126 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
3134 if (
$object->status == 0 && $permissiontoadd && $action !=
'selectlines') {
3135 if ($action !=
'editline') {
3138 $parameters = array();
3139 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3143 if (empty($reshook)) {
3149 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3160 if ($action ==
'editline') {
3161 print
' <form name="updateline" id="updateline" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $line_id .
'" method="POST">
3162 <input type="hidden" name="token" value="' .
newToken() .
'">
3163 <input type="hidden" name="action" value="updateline">
3164 <input type="hidden" name="mode" value="">
3165 <input type="hidden" name="id" value="' .
$object->id .
'">
3170 print
'<div class="div-table-responsive-no-min">';
3171 print
'<table class="noborder centpercent" id="tablelines" >';
3173 print
'<tr class="liste_titre">';
3176 print
'<td width="5" class="center linecolnum"> </td>';
3179 print
'<td class="linecoldescription" >' . $langs->trans(
"Products") .
'</td>';
3181 print
'<td class="center linecolqty">' . $langs->trans(
"QtyOrdered") .
'</td>';
3182 if ($origin_id > 0) {
3183 print
'<td class="center linecolqtyinothershipments">' . $langs->trans(
"QtyInOtherShipments") .
'</td>';
3185 if ($action ==
'editline') {
3193 print
'<td class="center linecoleditlineotherinfo" colspan="' . $editColspan .
'">';
3195 print $langs->trans(
"QtyToShip");
3197 print $langs->trans(
"QtyShipped");
3200 print
' - ' . $langs->trans(
"WarehouseSource");
3203 print
' - ' . $langs->trans(
"Batch");
3208 print
'<td class="center linecolqtytoship">' . $langs->trans(
"QtyToShip") .
'</td>';
3210 print
'<td class="center linecolqtyshipped">' . $langs->trans(
"QtyShipped") .
'</td>';
3213 print
'<td class="left linecolwarehousesource">' . $langs->trans(
"WarehouseSource") .
'</td>';
3217 print
'<td class="left linecolbatch">' . $langs->trans(
"Batch") .
'</td>';
3220 print
'<td class="center linecolweight">' . $langs->trans(
"CalculatedWeight") .
'</td>';
3221 print
'<td class="center linecolvolume">' . $langs->trans(
"CalculatedVolume") .
'</td>';
3224 print
'<td class="linecoledit"></td>';
3225 print
'<td class="linecoldelete" width="10"></td>';
3230 $outputlangs = $langs;
3235 if (
GETPOST(
'lang_id',
'aZ09')) {
3236 $newlang =
GETPOST(
'lang_id',
'aZ09');
3238 if (empty($newlang)) {
3239 $newlang =
$object->thirdparty->default_lang;
3241 if (!empty($newlang)) {
3242 $outputlangs =
new Translate(
"", $conf);
3243 $outputlangs->setDefaultLang($newlang);
3248 $alreadysent = array();
3249 if ($origin_id > 0) {
3250 $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";
3251 $sql .=
", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot";
3252 $sql .=
", e.rowid as shipment_id, e.ref as shipment_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_expedition";
3254 $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';
3255 $sql .=
', p.description as product_desc';
3256 $sql .=
" FROM " . MAIN_DB_PREFIX .
"expeditiondet as ed";
3257 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as e";
3258 $sql .=
", " . MAIN_DB_PREFIX . $origin .
"det as obj";
3260 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product as p ON obj.fk_product = p.rowid";
3261 $sql .=
" WHERE e.entity IN (" .
getEntity(
'expedition') .
")";
3262 $sql .=
" AND obj.fk_" . $origin .
" = " . ((int) $origin_id);
3263 $sql .=
" AND obj.rowid = ed.fk_elementdet";
3264 $sql .=
" AND ed.fk_expedition = e.rowid";
3266 $sql .=
" ORDER BY obj.fk_product";
3268 dol_syslog(
"expedition/card.php get list of shipment lines", LOG_DEBUG);
3269 $resql = $db->query($sql);
3271 $num = $db->num_rows($resql);
3275 $obj = $db->fetch_object($resql);
3278 $alreadysent[$obj->rowid][$obj->shipmentline_id] = array(
3279 'shipment_ref' => $obj->shipment_ref,
3280 'shipment_id' => $obj->shipment_id,
3281 'warehouse' => $obj->fk_entrepot,
3282 'qty_shipped' => $obj->qty_shipped,
3283 'product_tosell' => $obj->product_tosell,
3284 'product_tobuy' => $obj->product_tobuy,
3285 'product_tobatch' => $obj->product_tobatch,
3286 'date_valid' => $db->jdate($obj->date_valid),
3287 'date_delivery' => $db->jdate($obj->date_delivery));
3298 $conf->cache[
'product'] = array();
3299 $conf->cache[
'warehouse'] = array();
3300 for ($i = 0; $i < $num_prod; $i++) {
3301 $parameters = array(
'i' => $i,
'line' => $lines[$i],
'line_id' => $line_id,
'num' => $num_prod,
'alreadysent' => $alreadysent,
'editColspan' => !empty($editColspan) ? $editColspan : 0,
'outputlangs' => $outputlangs);
3302 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
3307 if (empty($reshook) && $lines[$i]->product_type !=
"9") {
3308 print
'<!-- origin line id = ' . $lines[$i]->origin_line_id .
' -->';
3309 print
'<tr class="oddeven" id="row-' . $lines[$i]->id .
'" data-id="' . $lines[$i]->id .
'" data-element="' . $lines[$i]->element .
'" >';
3313 print
'<td class="center linecolnum">' . ($i + 1) .
'</td>';
3317 if ($lines[$i]->fk_product > 0) {
3320 $product_id = $lines[$i]->fk_product;
3321 if (!isset($conf->cache[
'product'][$product_id])) {
3323 $prod->fetch($product_id);
3324 $conf->cache[
'product'][$product_id] = $prod;
3326 $prod = $conf->cache[
'product'][$product_id];
3328 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"label"])) ? $prod->multilangs[$outputlangs->defaultlang][
"label"] : $lines[$i]->product_label;
3330 $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label);
3333 print
'<td class="linecoldescription">';
3336 $product_static->type = $lines[$i]->fk_product_type;
3337 $product_static->id = $lines[$i]->fk_product;
3338 $product_static->ref = $lines[$i]->ref;
3339 $product_static->status = $lines[$i]->product_tosell;
3340 $product_static->status_buy = $lines[$i]->product_tobuy;
3341 $product_static->status_batch = $lines[$i]->product_tobatch;
3343 $product_static->weight = $lines[$i]->weight;
3344 $product_static->weight_units = $lines[$i]->weight_units;
3345 $product_static->length = $lines[$i]->length;
3346 $product_static->length_units = $lines[$i]->length_units;
3347 $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0;
3348 $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0;
3349 $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0;
3350 $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0;
3351 $product_static->surface = $lines[$i]->surface;
3352 $product_static->surface_units = $lines[$i]->surface_units;
3353 $product_static->volume = $lines[$i]->volume;
3354 $product_static->volume_units = $lines[$i]->volume_units;
3355 $product_static->stockable_product = $lines[$i]->stockable_product;
3357 $text = $product_static->getNomUrl(1);
3358 $text .=
' - ' . $label;
3360 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
3361 print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start :
'', !empty($lines[$i]->date_end) ? $lines[$i]->date_end :
'');
3367 print
'<td class="linecoldescription" >';
3369 $text =
img_object($langs->trans(
'Service'),
'service');
3371 $text =
img_object($langs->trans(
'Product'),
'product');
3374 if (!empty($lines[$i]->label)) {
3375 $text .=
' <strong>' . $lines[$i]->label .
'</strong>';
3376 print $form->textwithtooltip($text, $lines[$i]->
description, 3, 0,
'', (
string) $i);
3378 print $text .
' ' . nl2br($lines[$i]->
description);
3391 print
'<td class="center linecolqty">' . $lines[$i]->qty_asked .
' ' . $unit_order .
'</td>';
3394 if ($origin_id > 0) {
3395 print
'<td class="linecolqtyinothershipments center nowrap">';
3397 $qtyalreadysent = 0;
3398 foreach ($alreadysent as $key => $val) {
3399 if ($lines[$i]->fk_elementdet == $key) {
3401 foreach ($val as $shipmentline_id => $shipmentline_var) {
3402 if ($shipmentline_var[
'shipment_id'] == $lines[$i]->fk_expedition) {
3408 $htmltooltip .=
'<br>';
3410 $shipment_static->fetch($shipmentline_var[
'shipment_id']);
3411 $htmltooltip .= $shipment_static->getNomUrl(1,
'', 0, 0, 1);
3412 $htmltooltip .=
' - ' . $shipmentline_var[
'qty_shipped'];
3413 $htmltooltip .=
' - ' . $langs->trans(
"DateValidation") .
' : ' . (empty($shipmentline_var[
'date_valid']) ? $langs->trans(
"Draft") :
dol_print_date($shipmentline_var[
'date_valid'],
'dayhour'));
3420 $qtyalreadysent += $shipmentline_var[
'qty_shipped'];
3423 $htmltooltip = $langs->trans(
"QtyInOtherShipments") .
'...<br><br>' . $htmltooltip .
'<br><input type="submit" name="dummyhiddenbuttontogetfocus" style="display:none" autofocus>';
3427 print $form->textwithpicto((
string) $qtyalreadysent, $htmltooltip, 1,
'info',
'', 0, 3,
'tooltip' . $lines[$i]->id);
3431 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3433 print
'<td colspan="' . $editColspan .
'" class="center"><table class="nobordernopadding centpercent">';
3434 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
3435 print
'<!-- case edit 1 -->';
3437 foreach ($lines[$i]->detail_batch as $detail_batch) {
3440 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>';
3442 if ($lines[$i]->entrepot_id == 0) {
3444 $line->fetch($detail_batch->fk_expeditiondet);
3446 $entrepot_id = !empty($detail_batch->entrepot_id) ? $detail_batch->entrepot_id : $lines[$i]->entrepot_id;
3447 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>';
3453 print
'<td><input class="qtyl" name="qtyl' . $line_id .
'_0" id="qtyl' . $line_id .
'_0" type="text" size="4" value="0"></td>';
3455 print
'<td>' . $formproduct->selectLotStock(
'',
'batchl' . $line_id .
'_0',
'', 1, 0, $lines[$i]->fk_product) .
'</td>';
3458 if ($lines[$i]->fk_product > 0) {
3459 if ($lines[$i]->entrepot_id > 0) {
3460 print
'<!-- case edit 2 -->';
3463 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>';
3465 print
'<td>' . $formproduct->selectWarehouses($lines[$i]->entrepot_id,
'entl' . $line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3469 print
' - ' . $langs->trans(
"NA");
3473 } elseif (count($lines[$i]->details_entrepot) > 1) {
3474 print
'<!-- case edit 3 -->';
3475 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3478 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>';
3480 print
'<td>' . $formproduct->selectWarehouses($detail_entrepot->entrepot_id,
'entl' . $detail_entrepot->line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3484 print
' - ' . $langs->trans(
"NA");
3490 print
'<!-- case edit 4 -->';
3493 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3494 print
'<td><span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span></td>';
3498 print
'<!-- case edit 5 -->';
3499 print
'<tr><td colspan="3">' . $langs->trans(
"ErrorStockIsNotEnough") .
'</td></tr>';
3502 print
'<!-- case edit 6 -->';
3505 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>';
3513 print
'<!-- case edit 7 -->';
3516 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3524 print
'</table></td>';
3527 print
'<td class="linecolqtytoship center">' . $lines[$i]->qty_shipped .
' ' . $unit_order .
'</td>';
3531 print
'<td class="linecolwarehousesource tdoverflowmax200">';
3533 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
3534 } elseif ($lines[$i]->entrepot_id > 0 && $lines[$i]->stockable_product == Product::ENABLED_STOCK) {
3535 $warehouse_id = $lines[$i]->entrepot_id;
3536 if (!isset($conf->cache[
'warehouse'][$warehouse_id])) {
3538 $warehouse->fetch($warehouse_id);
3539 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3541 $warehouse = $conf->cache[
'warehouse'][$warehouse_id];
3543 print $warehouse->getNomUrl(1);
3544 } elseif (count($lines[$i]->details_entrepot) > 1) {
3546 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3547 $warehouse_id = $detail_entrepot->entrepot_id;
3548 if ($warehouse_id > 0) {
3549 if (!isset($conf->cache[
'warehouse'][$warehouse_id])) {
3551 $warehouse->fetch($warehouse_id);
3552 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3554 $warehouse = $conf->cache[
'warehouse'][$warehouse_id];
3556 $detail .= $langs->trans(
"DetailWarehouseFormat", $warehouse->label, $detail_entrepot->qty_shipped) .
'<br>';
3559 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
"DetailWarehouseNumber"), $detail);
3560 } elseif (count($lines[$i]->detail_children ?? []) > 1) {
3562 foreach ($lines[$i]->detail_children as $child_product_id => $child_stock_list) {
3563 foreach ($child_stock_list as $warehouse_id => $total_qty) {
3565 $child_product_label =
'';
3566 if (!isset($conf->cache[
'product'][$child_product_id])) {
3567 $child_product =
new Product($db);
3568 $child_product->fetch($child_product_id);
3569 $conf->cache[
'product'][$child_product_id] = $child_product;
3571 $child_product = $conf->cache[
'product'][$child_product_id];
3573 $child_product_label = $child_product->ref .
' ' . $child_product->label;
3576 if (!isset($conf->cache[
'warehouse'][$warehouse_id])) {
3577 $child_warehouse =
new Entrepot($db);
3578 $child_warehouse->fetch($warehouse_id);
3579 $conf->cache[
'warehouse'][$warehouse_id] = $child_warehouse;
3581 $child_warehouse = $conf->cache[
'warehouse'][$warehouse_id];
3583 $detail .= $langs->trans(
'DetailChildrenFormat', $child_product_label, $child_warehouse->label,
price2num($total_qty,
'MS')) .
'<br>';
3586 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
'DetailWarehouseNumber'), $detail);
3593 if (isset($lines[$i]->detail_batch)) {
3594 print
'<!-- Detail of lot -->';
3595 print
'<td class="linecolbatch">';
3596 if ($lines[$i]->product_tobatch) {
3598 foreach ($lines[$i]->detail_batch as $dbatch) {
3599 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
3601 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
3604 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
3606 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
3609 print $form->textwithtooltip(
img_picto(
'',
'object_barcode') .
' ' . $langs->trans(
"DetailBatchNumber"), $detail);
3611 print $langs->trans(
"NA");
3615 print
'<td class="linecolbatch" ></td>';
3621 print
'<td class="center linecolweight">';
3623 print $lines[$i]->weight * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"weight", $lines[$i]->weight_units);
3630 print
'<td class="center linecolvolume">';
3632 print $lines[$i]->volume * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"volume", $lines[$i]->volume_units);
3641 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3642 print
'<td class="center" colspan="2" valign="middle">';
3643 print
'<input type="submit" class="button button-save" id="savelinebutton marginbottomonly" name="save" value="' . $langs->trans(
"Save") .
'"><br>';
3644 print
'<input type="submit" class="button button-cancel" id="cancellinebutton" name="cancel" value="' . $langs->trans(
"Cancel") .
'"><br>';
3647 $edit_url = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id;
3649 $product_id = $lines[$i]->fk_product;
3650 if (!isset($conf->cache[
'product'][$product_id])) {
3652 $product->fetch($product_id);
3653 $conf->cache[
'product'][$product_id] = $product;
3655 $product = $conf->cache[
'product'][$product_id];
3658 if ($product->hasFatherOrChild(1)) {
3664 print
'<td class="linecoledit center">';
3665 print
'<a class="editfielda reposition" href="' . $edit_url .
'">' .
img_edit() .
'</a>';
3667 print
'<td class="linecoldelete" width="10">';
3668 print
'<a class="reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=deleteline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id .
'">' .
img_delete() .
'</a>';
3672 if (!empty($rowExtrafieldsStart)) {
3673 print $rowExtrafieldsStart;
3674 print $rowExtrafieldsView;
3684 if ($origin_id > 0) {
3695 $line->fetch_optionals();
3698 if ($action ==
'editline' && $line->id == $line_id) {
3699 print $lines[$i]->showOptionals($extrafields,
'edit', array(
'colspan' => $colspan), !empty($indiceAsked) ? $indiceAsked :
'',
'',
'',
'card');
3701 print $lines[$i]->showOptionals($extrafields,
'view', array(
'colspan' => $colspan), !empty($indiceAsked) ? $indiceAsked :
'',
'',
'',
'card');
3703 } elseif (empty($reshook) && $lines[$i]->product_type ==
"9") {
3705 $objectsrc->fetch($lines[$i]->origin_line_id);
3706 if ($objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) {
3708 require
dol_buildpath(
'/core/tpl/subtotal_expedition_view.tpl.php');
3713 if (empty($num_prod)) {
3714 print
'<tr><td colspan="8"><span class="opacitymedium">' . $langs->trans(
"NoLineGoOnTabToAddSome", $langs->transnoentitiesnoconv(
"ShipmentDistribution")) .
'</span></td></tr>';
3728 if (($user->socid == 0) && ($action !=
'presend')) {
3729 print
'<div class="tabsAction">';
3731 $parameters = array();
3732 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3734 if (empty($reshook)) {
3736 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
3737 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate'))
3741 print
dolGetButtonAction($langs->trans(
'NotAllowed'), $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3747 if ($user->hasRight(
'expedition',
'creer')) {
3752 if ($user->hasRight(
'expedition',
'creer')) {
3758 if (empty($user->socid)) {
3760 if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'expedition',
'shipping_advance',
'send')) {
3761 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3763 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3771 print
dolGetButtonAction(
'', $langs->trans(
'CreateDeliveryOrder'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=create_delivery&token=' .
newToken() .
'&id=' .
$object->id,
'');
3776 if (
$object->signed_status != Expedition::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
3777 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>';
3779 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>';
3785 if ($user->hasRight(
'facture',
'creer')) {
3787 print
dolGetButtonAction(
'', $langs->trans(
'CreateBill'),
'default', DOL_URL_ROOT .
'/compta/facture/card.php?action=create&origin=' .
$object->element .
'&originid=' .
$object->id .
'&socid=' .
$object->socid,
'');
3794 if ($user->hasRight(
'expedition',
'creer') &&
$object->status > 0) {
3796 print
dolGetButtonAction(
'', $langs->trans(
'ClassifyBilled'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifybilled&token=' .
newToken() .
'&id=' .
$object->id,
'');
3798 print
dolGetButtonAction(
'', $langs->trans(
"Close"),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifyclosed&token=' .
newToken() .
'&id=' .
$object->id,
'');
3804 if ($user->hasRight(
'expedition',
'creer')) {
3805 print
dolGetButtonAction(
'', $langs->trans(
'Cancel'),
'danger', $_SERVER[
"PHP_SELF"] .
'?action=cancel&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3810 if ($user->hasRight(
'expedition',
'supprimer')) {
3823 if ($action !=
'presend' && $action !=
'editline') {
3824 print
'<div class="fichecenter"><div class="fichehalfleft">';
3827 $filedir = $conf->expedition->dir_output .
"/sending/" . $objectref;
3829 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3831 $genallowed = $user->hasRight(
'expedition',
'lire');
3832 $delallowed = $user->hasRight(
'expedition',
'creer');
3834 print $formfile->showdocuments(
'expedition', $objectref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $soc->default_lang);
3838 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'shipping'), 1);
3839 $linktoelem = $tmparray[
'linktoelem'];
3840 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3841 print $htmltoenteralink;
3843 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
3849 print
'<br><!-- Link to sign -->';
3850 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3851 print showOnlineSignatureUrl(
'expedition',
$object->ref, $object) .
'<br>';
3854 print
'</div><div class="fichehalfright">';
3858 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3863 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/expedition/messaging.php?id=' .
$object->id);
3865 $somethingshown = $formactions->showactions($object,
'shipping', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3866 print
'</div></div>';
3875 if (
GETPOST(
'modelselected')) {
3876 $action =
'presend';
3880 $modelmail =
'shipping_send';
3881 $defaulttopic =
'SendShippingRef';
3882 $diroutput = $conf->expedition->dir_output .
'/sending';
3883 $trackid =
'shi' .
$object->id;
3885 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage customers orders.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
const STATUS_DRAFT
Draft status.
const STATUS_CLOSED
Closed status -> parcel was received by customer / end of process prev status : validated or shipment...
const STATUS_VALIDATED
Validated status -> parcel is ready to be sent prev status : draft next status : closed or shipment_i...
Class to manage lines of shipment.
CRUD class for batch number management within shipment.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class to manage order lines.
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage products or services.
const DISABLED_STOCK
Stockable product.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Manage record for batch number management.
Class with list of lots and properties.
Class to manage projects.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dolBuildUrl($url, $params=[], $addtoken=false)
Return path of url.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dolPrintHTMLForAttribute($s, $escapeonlyhtmltags=0, $allowothertags=array())
Return a string ready to be output into an HTML attribute (alt, title, data-html, ....
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
shipping_prepare_head($object)
Prepare array with list of tabs.