42require
'../main.inc.php';
52require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formfile.class.php';
53require_once DOL_DOCUMENT_ROOT .
'/expedition/class/expedition.class.php';
54require_once DOL_DOCUMENT_ROOT .
'/product/class/html.formproduct.class.php';
55require_once DOL_DOCUMENT_ROOT .
'/core/lib/product.lib.php';
56require_once DOL_DOCUMENT_ROOT .
'/core/lib/sendings.lib.php';
57require_once DOL_DOCUMENT_ROOT .
'/core/modules/expedition/modules_expedition.php';
58require_once DOL_DOCUMENT_ROOT .
'/core/class/doleditor.class.php';
59require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/entrepot.class.php';
60require_once DOL_DOCUMENT_ROOT .
'/product/stock/class/productlot.class.php';
61require_once DOL_DOCUMENT_ROOT .
'/commande/class/commande.class.php';
63 require_once DOL_DOCUMENT_ROOT .
'/product/class/product.class.php';
66 require_once DOL_DOCUMENT_ROOT .
'/comm/propal/class/propal.class.php';
69 require_once DOL_DOCUMENT_ROOT .
'/product/class/productbatch.class.php';
72 require_once DOL_DOCUMENT_ROOT .
'/projet/class/project.class.php';
73 require_once DOL_DOCUMENT_ROOT .
'/core/class/html.formprojet.class.php';
77$langs->loadLangs(array(
"sendings",
"companies",
"bills",
'orders',
'stocks',
'other',
'propal',
'productbatch'));
80 $langs->load(
'incoterm');
83 $langs->load(
'productbatch');
87$origin =
GETPOST(
'origin',
'alpha');
92if (empty($origin_id) && !empty($origin)) {
95if (empty($origin_id) && !empty($origin)) {
104$action =
GETPOST(
'action',
'alpha');
105$confirm =
GETPOST(
'confirm',
'alpha');
106$cancel =
GETPOST(
'cancel',
'alpha');
109$backtopage =
GETPOST(
'backtopage',
'alpha');
120$extrafields->fetch_name_optionals_label(
$object->table_element);
121$extrafields->fetch_name_optionals_label(
$object->table_element_line);
122$extrafields->fetch_name_optionals_label($objectorder->table_element_line);
125include DOL_DOCUMENT_ROOT .
'/core/actions_fetchobject.inc.php';
127if (empty($origin) && !empty(
$object->origin_type) &&
$object->origin_id > 0) {
128 $origin =
$object->origin_type;
129} elseif (empty($origin) && is_string(
$object->origin) &&
$object->origin !==
'' &&
$object->origin_id > 0) {
132if (empty($origin_id) &&
$object->origin_id > 0) {
133 $origin_id =
$object->origin_id;
135$origin_type = is_string($origin) ? $origin :
'';
138$usercanread = $user->hasRight(
"expedition",
"lire");
139$usercancreate = $user->hasRight(
"expedition",
"creer");
140$usercandelete = $user->hasRight(
"expedition",
"supprimer");
143$hookmanager->initHooks(array(
'expeditioncard',
'globalcard'));
153 $socid = $user->socid;
158$permissiondellink = $user->hasRight(
'expedition',
'delivery',
'creer');
159$permissiontoadd = $user->hasRight(
'expedition',
'creer');
160$permissiontoedit = $usercancreate;
161$permissiontoeditextra = $permissiontoadd;
162if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
164 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
167$upload_dir =
$conf->expedition->dir_output .
'/sending';
173$shipping_method_id =
null;
183$parameters = array();
184$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
189if (empty($reshook)) {
190 $backurlforlist = DOL_URL_ROOT.
'/expedition/list.php';
192 if (empty($backtopage) || ($cancel && empty($id))) {
193 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
194 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
195 $backtopage = $backurlforlist;
197 $backtopage = DOL_URL_ROOT.
'/expedition/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
203 if (!empty($backtopageforcancel)) {
204 header(
"Location: ".$backtopageforcancel);
206 } elseif (!empty($backtopage)) {
207 header(
"Location: ".$backtopage);
215 if ($origin_id > 0) {
216 if ($origin ==
'commande') {
217 header(
"Location: " . DOL_URL_ROOT .
'/expedition/shipment.php?id=' . ((
int) $origin_id));
226 include DOL_DOCUMENT_ROOT .
'/core/actions_dellink.inc.php';
229 include DOL_DOCUMENT_ROOT .
'/core/actions_builddoc.inc.php';
232 if ($action ==
'setdraft' && $permissiontoadd) {
234 $result =
$object->setDraft($user, 0);
238 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
243 if ($action ==
'reopen' && $permissiontoadd) {
249 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
255 if ($action ==
'set_incoterms' &&
isModEnabled(
'incoterm') && $permissiontoadd) {
259 if ($action ==
'setref_customer' && $permissiontoadd) {
265 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'SHIPPING_MODIFY');
268 $action =
'editref_customer';
270 header(
"Location: " . $_SERVER[
'PHP_SELF'] .
"?id=" .
$object->id);
275 if ($action ==
'update_extras' && $permissiontoeditextra) {
278 $attribute_name =
GETPOST(
'attribute',
'aZ09');
281 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
288 $result =
$object->updateExtraField($attribute_name,
'SHIPPING_MODIFY');
296 $action =
'edit_extras';
301 if ($action ==
'add' && $permissiontoadd) {
304 if ($origin && $origin_id > 0) {
306 $classname = ucfirst($origin);
307 $objectsrc =
new $classname(
$db);
308 '@phan-var-force Facture|Commande $objectsrc';
309 $objectsrc->fetch($origin_id);
310 $object->socid = $objectsrc->socid;
315 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ThirdParty")),
null,
'errors');
324 $object->origin_type = $origin_type;
325 $object->origin_id = $origin_id;
335 $object->date_delivery = $date_delivery;
336 $object->date_shipping = $date_shipping;
343 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
348 $ret = $extrafields->setOptionalsFromPost(
null, $object);
362 if ($origin && $origin_id > 0) {
364 $object->origin_type = $origin_type;
365 $object->origin_id = $origin_id;
375 $object->date_delivery = $date_delivery;
376 $object->date_shipping = $date_shipping;
383 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
386 $classname = ucfirst(
$object->origin_type);
387 $objectsrc =
new $classname(
$db);
388 '@phan-var-force Facture|Commande $objectsrc';
389 $objectsrc->fetch(
$object->origin_id);
391 $object->socid = $objectsrc->socid;
392 $object->fk_delivery_address = $objectsrc->fk_delivery_address;
396 $batch_line = array();
397 $stockLine = array();
398 $array_options = array();
400 $num = count($objectsrc->lines);
403 $product_batch_used = array();
405 for ($i = 0; $i < $num; $i++) {
413 $batch =
"batchl" . $i .
"_0";
414 $stockLocation =
"ent1" . $i .
"_0";
417 $is_batch_or_serial = 0;
418 if (!empty($objectsrc->lines[$i]->fk_product)) {
419 $resultFetch = $product->fetch($objectsrc->lines[$i]->fk_product,
'',
'',
'', 1, 1, 1);
420 if ($resultFetch < 0) {
423 $is_batch_or_serial = $product->status_batch;
427 if (
isModEnabled(
'productbatch') && $objectsrc->lines[$i]->product_tobatch) {
428 if (GETPOSTISSET($batch)) {
431 while (GETPOSTISSET($batch)) {
434 $sub_qty[$j][
'id_batch'] =
GETPOSTINT($batch);
435 $subtotalqty += $sub_qty[$j][
'q'];
437 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)))) {
438 setEventMessages($langs->trans(
"TooManyQtyForSerialNumber", $product->ref,
''),
null,
'errors');
443 if ($is_batch_or_serial == 2 && $sub_qty[$j][
'q'] > 0) {
445 $product_batch_used[$j] = $sub_qty[$j][
'id_batch'];
449 $batch =
"batchl" . $i .
"_" . $j;
450 $qty =
"qtyl" . $i .
'_' . $j;
453 $batch_line[$i][
'detail'] = $sub_qty;
454 $batch_line[$i][
'qty'] = $subtotalqty;
457 $totalqty += $subtotalqty;
464 setEventMessages($langs->trans(
"StockIsRequiredToChooseWhichLotToUse") .
' (' . $langs->trans(
"Line") .
' ' .
GETPOSTINT($idl) .
')',
null,
'errors');
468 } elseif (GETPOSTISSET($stockLocation)) {
471 while (GETPOSTISSET($stockLocation)) {
474 $stockLine[$i][$j][
'warehouse_id'] =
GETPOSTINT($stockLocation);
475 $stockLine[$i][$j][
'ix_l'] =
GETPOSTINT($idl);
481 $stockLocation =
"ent1" . $i .
"_" . $j;
482 $qty =
"qtyl" . $i .
'_' . $j;
493 if (
getDolGlobalInt(
"MAIN_DONT_SHIP_MORE_THAN_ORDERED") && $subtotalqty > $objectsrc->lines[$i]->qty) {
494 setEventMessages($langs->trans(
"ErrorTooMuchShipped", $i + 1),
null,
'errors');
500 $array_options[$i] = $extrafields->getOptionalsFromPost(
$object->table_element_line, (
string) $i);
502 if (isset($extrafields->attributes[
$object->table_element_line][
'label']) && is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
504 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
505 unset($_POST[
"options_" . $key]);
510 if (($totalqty > 0 ||
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS')) && !$error) {
511 $selected_subtotal_lines =
GETPOST(
'subtotal_toselect',
'array:int');
512 for ($i = 0; $i < $num; $i++) {
515 if (!isset($batch_line[$i])) {
517 if (isset($stockLine[$i])) {
519 $nbstockline = count($stockLine[$i]);
520 for ($j = 0; $j < $nbstockline; $j++) {
521 if ($stockLine[$i][$j][
'qty'] > 0 || ($stockLine[$i][$j][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
522 $ret =
$object->addline($stockLine[$i][$j][
'warehouse_id'], $stockLine[$i][$j][
'ix_l'], (
float) $stockLine[$i][$j][
'qty'], $array_options[$i]);
534 if ($entrepot_id < 0) {
537 if (!($objectsrc->lines[$i]->fk_product > 0)) {
548 if (
isModEnabled(
'subtotals') && $objectsrc->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE && in_array($objectsrc->lines[$i]->id, $selected_subtotal_lines)) {
549 $object->addSubtotalLine($langs, $objectsrc->lines[$i]->desc, (
int) $objectsrc->lines[$i]->qty, $objectsrc->lines[$i]->extraparams, $objectsrc->lines[$i]->id);
554 if ($batch_line[$i][
'qty'] > 0 || ($batch_line[$i][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
555 $origin_line_id = (int) $batch_line[$i][
'ix_l'];
557 $res = $origin_line->fetch($origin_line_id);
562 $ret =
$object->addline_batch($batch_line[$i], $array_options[$i], $origin_line);
571 $ret = $extrafields->setOptionalsFromPost(
null, $object);
584 $labelfieldmissing = $langs->transnoentitiesnoconv(
"QtyToShip");
586 $labelfieldmissing .=
'/' . $langs->transnoentitiesnoconv(
"Warehouse");
588 setEventMessages($langs->trans(
"ErrorFieldRequired", $labelfieldmissing),
null,
'errors');
595 foreach (
$object->lines as $line) {
596 $objectsrc_line =
new $objectsrc->class_element_line(
$db);
597 '@phan-var-force CommonObjectLine $objectsrc_line';
598 $objectsrc_line->fetch($line->origin_line_id);
599 $line->extraparams = $objectsrc_line->extraparams;
600 $line->setExtraParameters();
602 header(
"Location: card.php?id=" .
$object->id);
609 } elseif ($action ==
'create_delivery' &&
getDolGlobalInt(
'MAIN_SUBMODULE_DELIVERY') && $user->hasRight(
'expedition',
'delivery',
'creer')) {
613 $result =
$object->create_delivery($user);
617 header(
"Location: " . DOL_URL_ROOT .
'/delivery/card.php?action=create_delivery&token=' . newToken() .
'&id=' . $result);
625 $action ==
'confirm_valid' && $confirm ==
'yes' && ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
626 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate')))
630 $result =
$object->valid($user);
637 $outputlangs = $langs;
640 $newlang =
GETPOST(
'lang_id',
'aZ09');
643 $newlang =
$object->thirdparty->default_lang;
645 if (!empty($newlang)) {
647 $outputlangs->setDefaultLang($newlang);
652 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
658 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
659 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
660 $result =
$object->cancel($user, 0, (
bool) $also_update_stock);
666 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'supprimer')) {
667 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
668 $result =
$object->delete($user, 0, (
bool) $also_update_stock);
670 header(
"Location: " . DOL_URL_ROOT .
'/expedition/index.php');
684 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $permissiontoadd) {
685 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'), $user);
688 $object->line_order(
true,
'ASC',
false);
690 $outputlangs = $langs;
693 $newlang =
GETPOST(
'lang_id',
'aZ09');
696 $newlang =
$object->thirdparty->default_lang;
698 if (!empty($newlang)) {
700 $outputlangs->setDefaultLang($newlang);
704 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
707 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
712 } elseif ($action ==
'confirm_deleteline' && $confirm ==
'yes' && $usercancreate) {
714 $result =
$object->deleteLine($user, $lineid);
719 $outputlangs = $langs;
722 $newlang =
GETPOST(
'lang_id',
'aZ09');
725 $newlang =
$object->thirdparty->default_lang;
727 if (!empty($newlang)) {
729 $outputlangs->setDefaultLang($newlang);
733 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
736 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
741 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
742 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
744 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
749 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
750 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
752 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
757 } elseif ($action ==
'setdate_livraison' && $user->hasRight(
'expedition',
'creer')) {
761 $result =
$object->setDeliveryDate($user, $datedelivery);
765 } elseif ($action ==
'setdate_shipping' && $user->hasRight(
'expedition',
'creer')) {
769 $result =
$object->setShippingDate($user, $dateshipping);
773 } elseif (in_array($action, array(
'settracking_number',
'settracking_url',
'settrueWeight',
'settrueWidth',
'settrueHeight',
'settrueDepth',
'setshipping_method_id')) && $user->hasRight(
'expedition',
'creer')) {
777 if ($action ==
'settracking_number') {
778 $object->tracking_number = trim(
GETPOST(
'tracking_number',
'alpha'));
779 $object->tracking_number = preg_replace(
'/\s+/',
'',
$object->tracking_number);
781 if ($action ==
'settracking_url') {
782 $object->tracking_url = trim(
GETPOST(
'tracking_url',
'restricthtml'));
785 if ($action ==
'settrueWeight') {
789 if ($action ==
'settrueWidth') {
792 if ($action ==
'settrueHeight') {
796 if ($action ==
'settrueDepth') {
799 if ($action ==
'setshipping_method_id') {
803 if (
$object->update($user) >= 0) {
804 header(
"Location: card.php?id=" .
$object->id);
809 } elseif ($action ==
'classifybilled' && $permissiontoadd) {
811 $result =
$object->setBilled();
813 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
817 } elseif ($action ==
'classifyclosed' && $permissiontoadd) {
819 $result =
$object->setClosed();
821 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
825 } elseif ($action ==
'deleteline' && !empty($line_id) && $permissiontoadd) {
830 $line->fk_expedition =
$object->id;
832 $num_prod = count($lines);
833 for ($i = 0; $i < $num_prod; $i++) {
834 if ($lines[$i]->
id == $line_id) {
835 if (count($lines[$i]->details_entrepot) > 1) {
837 foreach ($lines[$i]->details_entrepot as $details_entrepot) {
838 $line->id = $details_entrepot->line_id;
839 if (!$error && $line->delete($user) < 0) {
845 $line->id = $line_id;
846 if (!$error && $line->delete($user) < 0) {
851 unset($_POST[
"lineid"]);
855 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
860 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'cancel',
'alpha') != $langs->trans(
"Cancel")) {
865 if (!
$object->fetch($id) > 0) {
870 $qty =
GETPOST(
'qty',
'alpha');
873 $element_type =
'shipping';
879 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
880 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
882 if (is_array($extralabelsline)) {
884 foreach ($extralabelsline as $key => $value) {
885 unset($_POST[
"options_" . $key]);
894 $result =
$object->updatelinefree(
GETPOSTINT(
'lineid'), (
float) $qty, $element_type, $fk_product,
GETPOSTINT(
'units'), $rang, $description, $fk_parent, 0, $array_options);
899 $outputlangs = $langs;
902 $newlang =
GETPOST(
'lang_id',
'aZ09');
905 $newlang =
$object->thirdparty->default_lang;
907 if (!empty($newlang)) {
909 $outputlangs->setDefaultLang($newlang);
910 $outputlangs->load(
'products');
914 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
916 unset($_POST[
'qty']);
917 unset($_POST[
'units']);
922 } elseif ($origin && $origin_id > 0) {
930 $num_prod = count($lines);
931 for ($i = 0; $i < $num_prod; $i++) {
932 if ($lines[$i]->
id == $line_id) {
933 $update_done =
false;
935 $line->fk_expedition =
$object->id;
938 $line->array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
940 if (is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
941 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
942 unset($_POST[
"options_" . $key]);
945 $line->fk_product = $lines[$i]->fk_product;
946 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
948 foreach ($lines[$i]->detail_batch as $detail_batch) {
950 $batch =
"batchl" . $detail_batch->fk_expeditiondet .
"_" . $detail_batch->fk_origin_stock;
951 $qty =
"qtyl" . $detail_batch->fk_expeditiondet .
'_' . $detail_batch->id;
954 if (!empty($batch_id)) {
955 if ($lotStock->fetch($batch_id) > 0 && $line->fetch($detail_batch->fk_expeditiondet) > 0) {
956 if ($lines[$i]->entrepot_id != 0) {
958 $line->entrepot_id = $lotStock->warehouseid;
962 if (empty($line->detail_batch)) {
963 $line->detail_batch =
new stdClass();
966 $line->detail_batch->fk_origin_stock = $batch_id;
967 $line->detail_batch->batch = $lotStock->batch;
968 $line->detail_batch->id = $detail_batch->id;
969 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
970 $line->detail_batch->qty = $batch_qty;
971 if ($line->update($user) < 0) {
982 unset($_POST[$batch]);
987 $batch =
"batchl" . $line_id .
"_0";
988 $qty =
"qtyl" . $line_id .
"_0";
992 if ($batch_qty > 0 && !empty($batch_id)) {
993 if ($lotStock->fetch($batch_id) > 0) {
995 if ($lines[$i]->entrepot_id > 0) {
997 if ($lines[$i]->entrepot_id == $lotStock->warehouseid) {
998 $lineIdToAddLot = $line_id;
1000 } elseif (count($lines[$i]->details_entrepot) > 1) {
1002 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
1003 if ($detail_entrepot->entrepot_id == $lotStock->warehouseid) {
1004 $lineIdToAddLot = $detail_entrepot->line_id;
1008 if ($lineIdToAddLot) {
1010 if ($line->fetch($lineIdToAddLot) > 0) {
1011 $line->detail_batch->fk_origin_stock = $batch_id;
1012 $line->detail_batch->batch = $lotStock->batch;
1013 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
1014 $line->detail_batch->qty = $batch_qty;
1015 if ($line->update($user) < 0) {
1019 $update_done =
true;
1027 $line->origin_line_id = $lines[$i]->origin_line_id;
1028 $line->entrepot_id = $lotStock->warehouseid;
1030 $line->detail_batch[0]->fk_origin_stock = $batch_id;
1031 $line->detail_batch[0]->batch = $lotStock->batch;
1032 $line->detail_batch[0]->entrepot_id = $lotStock->warehouseid;
1033 $line->detail_batch[0]->qty = $batch_qty;
1034 if (
$object->create_line_batch($line, $line->array_options) < 0) {
1038 $update_done =
true;
1047 if ($lines[$i]->fk_product > 0) {
1049 if ($lines[$i]->entrepot_id == 0) {
1051 $stockLocation =
"entl" . $line_id;
1052 $qty =
"qtyl" . $line_id;
1053 $line->id = $line_id;
1054 $line->entrepot_id =
GETPOSTINT((
string) $stockLocation);
1056 if ($line->update($user) < 0) {
1060 $update_done =
true;
1062 unset($_POST[$stockLocation]);
1063 unset($_POST[$qty]);
1064 } elseif ($lines[$i]->entrepot_id > 0) {
1066 $stockLocation =
"entl" . $line_id;
1067 $qty =
"qtyl" . $line_id;
1068 $line->id = $line_id;
1069 $line->entrepot_id =
GETPOSTINT($stockLocation);
1071 if ($line->update($user) < 0) {
1075 $update_done =
true;
1077 unset($_POST[$stockLocation]);
1078 unset($_POST[$qty]);
1079 } elseif (count($lines[$i]->details_entrepot) > 1) {
1081 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
1083 $stockLocation =
"entl" . $detail_entrepot->line_id;
1084 $qty =
"qtyl" . $detail_entrepot->line_id;
1086 if (!empty($warehouse)) {
1087 $line->id = $detail_entrepot->line_id;
1088 $line->entrepot_id = $warehouse;
1090 if ($line->update($user) < 0) {
1094 $update_done =
true;
1097 unset($_POST[$stockLocation]);
1098 unset($_POST[$qty]);
1102 $qty =
"qtyl" . $line_id;
1103 $line->id = $line_id;
1105 $line->entrepot_id = 0;
1106 if ($line->update($user) < 0) {
1110 $update_done =
true;
1112 unset($_POST[$qty]);
1116 $qty =
"qtyl" . $line_id;
1117 $line->id = $line_id;
1119 $line->entrepot_id = 0;
1120 if ($line->update($user) < 0) {
1124 $update_done =
true;
1126 unset($_POST[$qty]);
1130 if (empty($update_done)) {
1131 $line->id = $lines[$i]->id;
1132 $resultInsertExtraFields = $line->insertExtraFields();
1133 if ($resultInsertExtraFields < 0) {
1136 } elseif ($resultInsertExtraFields > 0) {
1137 $update_done =
true;
1141 if (empty($update_done) && !$error) {
1142 setEventMessages($langs->trans(
'NoShipmentLineChangeDetected'),
null,
'warnings');
1147 unset($_POST[
"lineid"]);
1152 $outputlangs = $langs;
1155 $newlang =
GETPOST(
'lang_id',
'aZ09');
1158 $newlang =
$object->thirdparty->default_lang;
1160 if (!empty($newlang)) {
1162 $outputlangs->setDefaultLang($newlang);
1166 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1169 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1173 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'cancel',
'alpha') == $langs->trans(
"Cancel")) {
1174 header(
'Location: ' . $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
1176 } elseif ($action ==
'addline' && !$origin &&
getDolGlobalString(
'SHIPMENT_STANDALONE') && $usercancreate) {
1177 $langs->load(
'errors');
1179 $line_desc = (GETPOSTISSET(
'dp_desc') ?
GETPOST(
'dp_desc',
'restricthtml') :
'');
1183 $fk_elementdet =
'';
1184 $element_type =
'shipping';
1190 $prod_entry_mode =
GETPOST(
'prod_entry_mode',
'aZ09');
1191 if ($prod_entry_mode ==
'free') {
1196 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"ProductOrService")),
null,
'errors');
1204 $extralabelsline = $extrafields->fetch_name_optionals_label(
$object->table_element_line);
1205 $array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line, $predef);
1207 if (is_array($extralabelsline)) {
1209 foreach ($extralabelsline as $key => $value) {
1210 unset($_POST[
"options_".$key]);
1214 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) &&
GETPOST(
'type') < 0) {
1215 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Type')),
null,
'errors');
1220 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1224 setEventMessages($langs->trans(
'FieldCannotBeNegative', $langs->transnoentitiesnoconv(
'Qty')),
null,
'errors');
1227 if ($prod_entry_mode ==
'free' && (empty($idprod) || $idprod < 0) && empty($line_desc)) {
1228 setEventMessages($langs->trans(
'ErrorFieldRequired', $langs->transnoentitiesnoconv(
'Description')),
null,
'errors');
1232 if (!$error &&
isModEnabled(
'variants') && $prod_entry_mode !=
'free') {
1233 if ($combinations =
GETPOST(
'combinations',
'array')) {
1237 if ($res = $prodcomb->fetchByProductCombination2ValuePairs($idprod, $combinations)) {
1238 $idprod = $res->fk_product_child;
1239 $fk_product = $idprod;
1241 setEventMessages($langs->trans(
'ErrorProductCombinationNotFound'),
null,
'errors');
1247 if (!$error && ($qty >= 0) && (!empty($line_desc) || (!empty($idprod) && $idprod > 0))) {
1249 if (!empty($idprod) && $idprod > 0) {
1251 $prod->fetch($idprod);
1252 $desc =
$prod->label;
1253 $description = $desc;
1256 $outputlangs = $langs;
1258 if (
GETPOST(
'lang_id',
'aZ09')) {
1259 $newlang =
GETPOST(
'lang_id',
'aZ09');
1261 if (empty($newlang)) {
1262 $newlang =
$object->thirdparty->default_lang;
1264 if (!empty($newlang)) {
1266 $outputlangs->setDefaultLang($newlang);
1269 $description = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"description"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"description"] :
$prod->
description;
1271 $description =
$prod->description;
1276 $description = $line_desc;
1283 $outputlangs = $langs;
1285 if (
GETPOST(
'lang_id',
'alpha')) {
1286 $newlang =
GETPOST(
'lang_id',
'alpha');
1288 if (empty($newlang)) {
1289 $newlang =
$object->thirdparty->default_lang;
1291 if (!empty($newlang)) {
1293 $outputlangs->setDefaultLang($newlang);
1294 $outputlangs->load(
'products');
1296 if (!empty(
$prod->customcode)) {
1297 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
1299 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1302 if (!empty(
$prod->country_code)) {
1303 $tmptxt .= $outputlangs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'',
$db, $outputlangs, 0);
1306 if (!empty(
$prod->customcode)) {
1307 $tmptxt .= $langs->transnoentitiesnoconv(
"CustomsCode").
': '.
$prod->customcode;
1309 if (!empty(
$prod->customcode) && !empty(
$prod->country_code)) {
1312 if (!empty(
$prod->country_code)) {
1313 $tmptxt .= $langs->transnoentitiesnoconv(
"CountryOrigin").
': '.
getCountry(
$prod->country_code,
'',
$db, $langs, 0);
1319 $type =
$prod->type;
1320 $fk_unit =
$prod->fk_unit;
1322 $label = (
GETPOST(
'product_label') ?
GETPOST(
'product_label') :
'');
1325 $fk_unit =
GETPOST(
'units',
'alpha');
1326 $description = $desc;
1327 $fk_elementdet =
'';
1332 $result =
$object->addlinefree((
float) $qty, $element_type, $idprod, $fk_unit, min($rank, count(
$object->lines) + 1), $description, $fk_parent, $array_options);
1339 $outputlangs = $langs;
1340 $newlang =
GETPOST(
'lang_id',
'alpha');
1342 $newlang =
$object->thirdparty->default_lang;
1344 if (!empty($newlang)) {
1346 $outputlangs->setDefaultLang($newlang);
1348 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1351 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
1355 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $permissiontoadd) {
1356 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
1360 $outputlangs = $langs;
1363 $newlang =
GETPOST(
'lang_id',
'aZ09');
1366 $newlang =
$object->thirdparty->default_lang;
1368 if (!empty($newlang)) {
1370 $outputlangs->setDefaultLang($newlang);
1372 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1375 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1380 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $permissiontoadd) {
1381 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
1385 $outputlangs = $langs;
1388 $newlang =
GETPOST(
'lang_id',
'aZ09');
1391 $newlang =
$object->thirdparty->default_lang;
1393 if (!empty($newlang)) {
1395 $outputlangs->setDefaultLang($newlang);
1397 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
1400 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
1407 include DOL_DOCUMENT_ROOT .
'/core/actions_printing.inc.php';
1413 $triggersendname =
'SHIPPING_SENTBYMAIL';
1415 $autocopy =
'MAIN_MAIL_AUTOCOPY_SHIPMENT_TO';
1416 $mode =
'emailfromshipment';
1417 $trackid =
'shi' .
$object->id;
1418 include DOL_DOCUMENT_ROOT .
'/core/actions_sendmails.inc.php';
1425$title =
$object->ref .
' - ' . $langs->trans(
"Card");
1426if ($action ==
'create') {
1427 $title = $langs->trans(
"NewSending");
1430$help_url =
'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Expediciones|DE:Modul_Lieferungen';
1432llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-expedition page-card');
1434if (empty($action)) {
1444 $formproject =
null;
1454 print
'<br>' .$langs->trans(
"ShipmentCreationIsDoneFromOrder");
1461if ($action ==
'create' && $usercancreate) {
1469 $res = $soc->fetch($socid);
1472 $shipping_method_id = $soc->shipping_method_id;
1473 $note_private =
$object->getDefaultCreateValueFor(
'note_private');
1474 $note_public =
$object->getDefaultCreateValueFor(
'note_public');
1476 print
'<form name="crea_expedition" action="' . $_SERVER[
"PHP_SELF"] .
'" method="POST">';
1477 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
1478 print
'<input type="hidden" name="action" value="add">';
1479 print
'<input type="hidden" name="changecompany" value="0">';
1480 print
'<input type="hidden" name="originid" value="' .
$id .
'">';
1481 print
'<input type="hidden" name="backtopage" value="' . $backtopage .
'">';
1485 print
'<table class="border centpercent">';
1489 print
'<td class="fieldrequired">' . $langs->trans(
'ThirdParty') .
'</td>';
1492 print $soc->getNomUrl(1);
1493 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1496 print
'<td class="valuefieldcreate">';
1497 print
img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
'',
'socid',
'',
'SelectThirdParty', 1, 0, array(), 0,
'minwidth175 maxwidth500 widthcentpercentminusxx');
1501 $(document).ready(function() {
1502 $("#socid").change(function() {
1503 console.log("We have changed the company - Reload page");
1504 var socid = $(this).val();
1506 $("input[name=action]").val("create");
1507 $("input[name=changecompany]").val("1");
1508 $("form[name=crea_expedition]").submit();
1513 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>';
1519 if (
isModEnabled(
'project') && is_object($formproject)) {
1521 if (empty($projectid) && !empty(
$object->fk_project)) {
1522 $projectid = (int)
$object->fk_project;
1525 $langs->load(
"projects");
1527 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1528 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1529 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1530 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>';
1536 print
'<tr><td>'.$langs->trans(
"DateShipping").
'</td>';
1537 print
'<td colspan="3">';
1538 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1539 $date_shipping = ($date_shipping ? $date_shipping :
$object->date_shipping);
1540 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1545 print
'<tr><td>'.$langs->trans(
"DateDeliveryPlanned").
'</td>';
1546 print
'<td colspan="3">';
1547 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1548 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1549 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1555 print $langs->trans(
"Weight");
1556 print
'</td><td colspan="3">';
1557 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1558 print
'<input name="weight" size="4" value="' .
GETPOST(
'weight') .
'"> ';
1559 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight",
GETPOST(
'weight_units'), 0, 2);
1560 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1561 print $form->textwithpicto($text, $htmltext);
1566 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1567 print
' </td><td colspan="3">';
1568 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1569 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1570 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1571 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1573 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1574 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1575 print $form->textwithpicto($text, $htmltext);
1579 print
"<tr><td>".$langs->trans(
"DeliveryMethod").
"</td>";
1580 print
'<td colspan="3">';
1581 $expe->fetch_delivery_methods();
1582 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1583 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1585 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1587 print
"</td></tr>\n";
1590 print
"<tr><td>".$langs->trans(
"TrackingNumber").
"</td>";
1591 print
'<td colspan="3">';
1592 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1593 print
'<input name="tracking_number" size="20" value="'.GETPOST(
'tracking_number',
'alpha').
'">';
1594 print
"</td></tr>\n";
1597 $parameters = array(
'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
'colspan' =>
' colspan="3"',
'cols' =>
'3',
'socid' => $socid);
1598 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $expe, $action);
1599 print $hookmanager->resPrint;
1601 if (empty($reshook)) {
1603 if (
$object->fetch_optionals() > 0) {
1604 $expe->array_options = array_merge($expe->array_options,
$object->array_options);
1606 print $expe->showOptionals($extrafields,
'edit', $parameters);
1612 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1).
'</label></td>';
1613 print
'<td colspan="3" class="maxwidthonsmartphone">';
1614 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1615 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1620 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
1622 if (is_array($list) && count($list) > 1) {
1623 print
"<tr><td>".$langs->trans(
"DefaultModel").
"</td>";
1624 print
'<td colspan="3">';
1625 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1626 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1627 print
"</td></tr>\n";
1633 print
'<td class="tdtop">';
1634 print $form->textwithpicto($langs->trans(
'NotePublic'), $htmltext);
1636 print
'<td valign="top" colspan="2">';
1637 $doleditor =
new DolEditor(
'note_public', (
string) $note_public,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1638 print $doleditor->Create(1);
1641 if (!$user->socid) {
1643 print
'<td class="tdtop">';
1644 print $form->textwithpicto($langs->trans(
'NotePrivate'), $htmltext);
1646 print
'<td valign="top" colspan="2">';
1647 $doleditor =
new DolEditor(
'note_private', (
string) $note_private,
'', 80,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1648 print $doleditor->Create(1);
1656 print $form->buttonsSaveCancel(
"CreateDraft");
1659 } elseif ($origin) {
1660 $classname = ucfirst($origin);
1664 '@phan-var-force Commande|Facture $object';
1667 if (
$object->fetch($origin_id)) {
1672 $author->fetch(
$object->user_author_id);
1678 print
'<form action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
1679 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
1680 print
'<input type="hidden" name="action" value="add">';
1681 print
'<input type="hidden" name="origin" value="' . $origin .
'">';
1682 print
'<input type="hidden" name="origin_id" value="' .
$object->id .
'">';
1684 print
'<input type="hidden" name="entrepot_id" value="' .
GETPOSTINT(
'entrepot_id') .
'">';
1689 print
'<table class="border centpercent">';
1692 print
'<tr><td class="titlefieldcreate fieldrequired">';
1694 print $langs->trans(
"RefOrder");
1697 print $langs->trans(
"RefProposal");
1699 print
'</td><td colspan="3">';
1706 if ($origin ==
'commande') {
1707 print $langs->trans(
'RefCustomerOrder');
1708 } elseif ($origin ==
'propal') {
1709 print $langs->trans(
'RefCustomerOrder');
1711 print $langs->trans(
'RefCustomer');
1713 print
'</td><td colspan="3">';
1714 print
'<input type="text" name="ref_customer" value="' .
$object->ref_client .
'" />';
1719 print
'<tr><td class="titlefieldcreate fieldrequired">' . $langs->trans(
'Company') .
'</td>';
1720 print
'<td colspan="3">' . $soc->getNomUrl(1) .
'</td>';
1721 print
'<input type="hidden" name="socid" value="' . $soc->id .
'">';
1725 if (
isModEnabled(
'project') && is_object($formproject)) {
1727 if (empty($projectid) && !empty(
$object->fk_project)) {
1728 $projectid = (int)
$object->fk_project;
1730 if ($origin ==
'project') {
1733 $langs->load(
"projects");
1735 print
'<td>' . $langs->trans(
"Project") .
'</td><td colspan="2">';
1736 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1737 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1738 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>';
1744 print
'<tr><td>' . $langs->trans(
"DateDeliveryPlanned") .
'</td>';
1745 print
'<td colspan="3">';
1746 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1747 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1748 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1753 print
'<tr><td>' . $langs->trans(
"DateShipping") .
'</td>';
1754 print
'<td colspan="3">';
1755 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1757 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1762 print
'<tr><td>' . $langs->trans(
"NotePublic") .
'</td>';
1763 print
'<td colspan="3">';
1764 $doleditor =
new DolEditor(
'note_public',
$object->note_public,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1765 print $doleditor->Create(1);
1769 if (
$object->note_private && !$user->socid) {
1770 print
'<tr><td>' . $langs->trans(
"NotePrivate") .
'</td>';
1771 print
'<td colspan="3">';
1772 $doleditor =
new DolEditor(
'note_private',
$object->note_private,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1773 print $doleditor->Create(1);
1779 print $langs->trans(
"Weight");
1780 print
'</td><td colspan="3">';
1781 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1784 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
GETPOST(
'weight_units'), 0, 2);
1785 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1786 print $form->textwithpicto($text, $htmltext);
1791 print $langs->trans(
"Width") .
' x ' . $langs->trans(
"Height") .
' x ' . $langs->trans(
"Depth");
1792 print
' </td><td colspan="3">';
1793 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1794 print
'<input name="sizeW" size="4" value="' .
GETPOST(
'sizeW') .
'">';
1795 print
' x <input name="sizeH" size="4" value="' .
GETPOST(
'sizeH') .
'">';
1796 print
' x <input name="sizeS" size="4" value="' .
GETPOST(
'sizeS') .
'">';
1798 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size",
GETPOST(
'size_units'), 0, 2);
1799 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1800 print $form->textwithpicto($text, $htmltext);
1804 print
"<tr><td>" . $langs->trans(
"DeliveryMethod") .
"</td>";
1805 print
'<td colspan="3">';
1806 $expe->fetch_delivery_methods();
1807 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1808 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1810 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1812 print
"</td></tr>\n";
1815 print
"<tr><td>" . $langs->trans(
"TrackingNumber") .
"</td>";
1816 print
'<td colspan="3">';
1817 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1818 print
'<input name="tracking_number" size="20" value="' .
GETPOST(
'tracking_number',
'alpha') .
'">';
1819 print
"</td></tr>\n";
1824 print
'<td><label for="incoterm_id">' . $form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1) .
'</label></td>';
1825 print
'<td colspan="3" class="maxwidthonsmartphone">';
1826 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1827 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1832 include_once DOL_DOCUMENT_ROOT .
'/core/modules/expedition/modules_expedition.php';
1834 if (is_array($list) && count($list) > 1) {
1835 print
"<tr><td>" . $langs->trans(
"DefaultModel") .
"</td>";
1836 print
'<td colspan="3">';
1837 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1838 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1839 print
"</td></tr>\n";
1847 if (isset($extrafields->attributes[
$object->table_element][
'label']) && is_array($extrafields->attributes[
$object->table_element][
'label']) && !empty($extrafields->attributes[
$object->table_element][
'label'])) {
1848 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
1849 if (array_key_exists(
'options_'.$key, $objectsav->array_options)) {
1850 $object->array_options[
'options_'.$key] = $objectsav->array_options[
'options_'.$key];
1854 $parameters = array(
1855 'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
1859 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
1869 $numAsked = count(
$object->lines);
1871 print
'<script type="text/javascript">' .
"\n";
1872 print
'jQuery(document).ready(function() {' .
"\n";
1873 print
'jQuery("#autofill").click(function() {';
1875 while ($i < $numAsked) {
1876 print
'jQuery("#qtyl' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1878 print
'jQuery("#qtyl' . $i .
'_' . $i .
'").val(jQuery("#qtyasked' . $i .
'").val() - jQuery("#qtydelivered' . $i .
'").val());' .
"\n";
1882 print
'return false; });' .
"\n";
1883 print
'jQuery("#autoreset").click(function() { console.log("Reset values to 0"); jQuery(".qtyl").val(0);' .
"\n";
1884 print
'return false; });' .
"\n";
1886 print
'</script>' .
"\n";
1890 print
'<div class="div-table-responsive-no-min">';
1891 print
'<table class="noborder centpercent">';
1896 $alreadyQtyBatchSetted = $alreadyQtySetted = array();
1898 $title_lines_to_disable = array();
1903 $title_lines_to_disable =
$object->getDisabledShippmentSubtotalLines();
1905 foreach (
$object->lines as $line) {
1906 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1907 $show_check_add_buttons =
true;
1912 print
'<tr class="liste_titre">';
1914 if (isset($show_check_add_buttons)) {
1915 print $form->showCheckAddButtons(
'checkforselect');
1917 print $langs->trans(
"Description");
1919 print
'<td class="center">' . $langs->trans(
"QtyOrdered") .
'</td>';
1920 print
'<td class="center">' . $langs->trans(
"QtyShipped") .
'</td>';
1921 print
'<td class="center">' . $langs->trans(
"QtyToShip");
1923 print
'<br><a href="#" id="autofill" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Autofill"),
'autofill',
'class="paddingrightonly"') .
'</a>';
1928 print
'<span id="autoreset" class="opacitymedium link cursor cursorpointer">' .
img_picto($langs->trans(
"Reset"),
'eraser') .
'</span>';
1932 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' (' . $langs->trans(
"Stock") .
')</td>';
1934 print
'<td class="left">' . $langs->trans(
"Warehouse") .
' / ' . $langs->trans(
"Batch") .
' (' . $langs->trans(
"Stock") .
')</td>';
1938 print
'<td class="left">' . $langs->trans(
'StockEntryDate') .
'</td>';
1944 $warehousePicking = array();
1946 if ($warehouse_id > 0) {
1947 $warehousePicking[] = $warehouse_id;
1949 $warehouseObj->get_children_warehouses($warehouse_id, $warehousePicking);
1953 while ($indiceAsked < $numAsked) {
1956 $line =
$object->lines[$indiceAsked];
1958 $parameters = array(
'i' => $indiceAsked,
'line' => $line,
'num' => $numAsked);
1959 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
1964 if (empty($reshook) && $line->special_code != SUBTOTALS_SPECIAL_CODE) {
1966 $type = $line->product_type ? $line->product_type : $line->fk_product_type;
1968 if (!empty($line->date_start)) {
1971 if (!empty($line->date_end)) {
1975 print
'<!-- line for order line ' . $line->id .
' -->' .
"\n";
1976 print
'<tr class="oddeven" id="row-' . $line->id .
'">' .
"\n";
1978 $qtyProdCom = $line->qty;
1979 $productChildrenNb = 0;
1981 if ($line->fk_product > 0) {
1982 $res = $product->fetch($line->fk_product);
1987 $productChildrenNb = $product->hasFatherOrChild(1);
1989 if ($productChildrenNb > 0) {
1990 $product->loadStockForVirtualProduct(
'warehouseopen', $qtyProdCom);
1992 $product->load_stock(
'warehouseopen');
1997 print
'<a name="' . $line->id .
'"></a>';
2000 $product_static->type = $line->fk_product_type;
2001 $product_static->id = $line->fk_product;
2002 $product_static->ref = $line->ref;
2003 $product_static->status = $line->product_tosell;
2004 $product_static->status_buy = $line->product_tobuy;
2005 $product_static->status_batch = $line->product_tobatch;
2007 $showdescinproductdesc =
getDolGlobalString(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE');
2009 $text = $product_static->getNomUrl(1);
2010 $text .=
' - ' . (!empty($line->label) ? $line->label : $line->product_label);
2012 $description .= empty($product->stockable_product) ? $langs->trans(
'StockDisabled') : $langs->trans(
'StockEnabled');
2013 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
2019 if ($showdescinproductdesc) {
2020 print ($line->desc && $line->desc != $line->product_label) ?
'<br>' .
dol_htmlentitiesbr($line->desc) :
'';
2025 $srcLine->id = $line->id;
2026 $srcLine->fetch_optionals();
2027 $expLine->array_options = array_merge($expLine->array_options, $srcLine->array_options);
2028 $lineExtrafieldsHtml = $expLine->showOptionals($extrafields,
'edit', array(), (
string) $indiceAsked,
'',
'1',
'line');
2029 if (!empty($lineExtrafieldsHtml)) {
2030 print
'<div style="padding-top: 10px" id="extrafield_lines_area_create_' . $indiceAsked .
'" name="extrafield_lines_area_create_' . $indiceAsked .
'">';
2031 print $lineExtrafieldsHtml;
2039 $text =
img_object($langs->trans(
'Service'),
'service');
2041 $text =
img_object($langs->trans(
'Product'),
'product');
2044 if (!empty($line->label)) {
2045 $text .=
' <strong>' . $line->label .
'</strong>';
2046 print $form->textwithtooltip($text, $line->desc, 3, 0,
'', (
string) $i);
2048 print $text .
' ' . nl2br($line->desc);
2056 $srcLine->id = $line->id;
2057 $srcLine->fetch_optionals();
2058 $expLine->array_options = array_merge($expLine->array_options, $srcLine->array_options);
2059 $lineExtrafieldsHtml = $expLine->showOptionals($extrafields,
'edit', array(), (
string) $indiceAsked,
'',
'1',
'line');
2060 if (!empty($lineExtrafieldsHtml)) {
2061 print
'<div style="padding-top: 10px" id="extrafield_lines_area_create_' . $indiceAsked .
'" name="extrafield_lines_area_create_' . $indiceAsked .
'">';
2062 print $lineExtrafieldsHtml;
2075 print
'<td class="center">' . $line->qty;
2076 print
'<input name="qtyasked' . $indiceAsked .
'" id="qtyasked' . $indiceAsked .
'" type="hidden" value="' . $line->qty .
'">';
2078 print
' ' . $unit_order .
'</td>';
2082 print
'<td class="center">';
2083 $quantityDelivered = isset(
$object->expeditions[$line->id]) ?
$object->expeditions[$line->id] :
'';
2084 print $quantityDelivered;
2085 print
'<input name="qtydelivered' . $indiceAsked .
'" id="qtydelivered' . $indiceAsked .
'" type="hidden" value="' . $quantityDelivered .
'">';
2086 if ($quantityDelivered) {
2087 print
' ' . $unit_order .
'</td>';
2091 $quantityAsked = $line->qty;
2093 $quantityToBeDelivered = 0;
2095 if (is_numeric($quantityDelivered)) {
2096 $quantityToBeDelivered = $quantityAsked - $quantityDelivered;
2098 $quantityToBeDelivered = $quantityAsked;
2102 $warehouseObject =
null;
2103 if (count($warehousePicking) == 1 || !($line->fk_product > 0) || !
isModEnabled(
'stock')) {
2104 print
'<!-- Case warehouse already known or product not a predefined product -->';
2106 $stock = + (isset($product->stock_warehouse[$warehouse_id]->real) ? $product->stock_warehouse[$warehouse_id]->real : 0);
2108 $deliverableQty = $quantityToBeDelivered;
2110 $deliverableQty = min($quantityToBeDelivered, $stock);
2112 if ($deliverableQty < 0) {
2113 $deliverableQty = 0;
2115 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2117 print
'<td class="center">';
2119 if (GETPOSTISSET(
'qtyl'.$indiceAsked) &&
GETPOST(
'qtyl'.$indiceAsked) !==
'') {
2120 $deliverableQty =
GETPOSTFLOAT(
'qtyl'.$indiceAsked,
'MS');
2122 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2123 $qtylValue = $deliverableQty;
2126 } elseif (is_numeric($qtylValue)) {
2128 $qtylValue =
price($qtylValue);
2130 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" class="qtyl right" type="text" size="4" value="' . $qtylValue .
'">';
2133 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2134 print
'<input name="qtyl' . $indiceAsked .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2137 print $langs->trans(
"NA");
2143 print
'<td class="left">';
2146 $ent =
"entl" . $indiceAsked;
2147 $idl =
"idl" . $indiceAsked;
2149 if ($line->fk_product > 0) {
2150 print
'<!-- Show warehouse selection -->';
2156 if ($productChildrenNb > 0) {
2157 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, 0,
'', 0, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2159 if ($product->stockable_product == Product::ENABLED_STOCK) {
2160 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl' . $indiceAsked,
'', 1, 0, $line->fk_product,
'', 1, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
2162 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2166 if ($tmpentrepot_id > 0 && $tmpentrepot_id == $warehouse_id) {
2168 if ($stock < $quantityToBeDelivered) {
2169 print
' ' .
img_warning($langs->trans(
"StockTooLow"));
2174 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span><input name="entl' . $indiceAsked .
'" id="entl' . $indiceAsked .
'" type="hidden" value="0">';
2185 $product->get_sousproduits_arbo();
2186 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2187 if (count($prods_arbo) > 0) {
2188 foreach ($prods_arbo as $key => $value) {
2191 if ($value[
'stock'] < $value[
'stock_alert']) {
2194 print
"<tr class=\"oddeven\"><td> ->
2195 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2196 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2197 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2207 print
'<td></td><td></td>';
2212 print
'<!-- Case product need lot -->';
2215 if ($warehouse_id > 0) {
2216 $staticwarehouse->fetch($warehouse_id);
2222 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2223 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2227 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
2228 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
2229 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
2231 $batchStock = +$dbatch->qty;
2232 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2235 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2236 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2238 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2239 $alreadyQtyBatchSetted[$line->fk_product] = array();
2242 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2243 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2246 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2249 if ($deliverableQty < 0) {
2250 $deliverableQty = 0;
2253 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2254 if (GETPOSTISSET($inputName)) {
2255 $deliverableQty =
GETPOST($inputName,
'int');
2258 $tooltipClass = $tooltipTitle =
'';
2259 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2260 $tooltipClass =
' classfortooltip';
2261 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2263 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2265 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2267 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2268 print
'<td colspan="3" ></td><td class="center">';
2269 $qtylValue = $deliverableQty;
2272 } elseif (is_numeric($qtylValue)) {
2273 $qtylValue =
price($qtylValue);
2275 print
'<input class="qtyl ' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="' . $qtylValue .
'">';
2278 print
'<!-- Show details of lot -->';
2279 print
'<td class="left">';
2281 print $staticwarehouse->getNomUrl(0) .
' / ';
2283 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2286 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
2288 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2291 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2293 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
2297 $quantityToBeDelivered -= $deliverableQty;
2298 if ($quantityToBeDelivered < 0) {
2299 $quantityToBeDelivered = 0;
2304 print
'<td>' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2309 print
'<!-- Case there is no details of lot at all -->';
2310 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2311 print
'<input class="qtyl right" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'_' . $subj .
'" type="text" size="4" value="0" disabled="disabled"> ';
2314 print
'<td class="left">';
2315 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $staticwarehouse->label);
2325 if (!
isModEnabled(
'productbatch') || !$product->hasbatch()) {
2326 print
'<!-- Case warehouse not already known and product does not need lot -->';
2327 print
'<td></td><td></td>';
2331 print
'</tr>' .
"\n";
2333 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2338 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2339 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2344 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2346 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2351 $tmpwarehouseObject->fetch($warehouse_id);
2352 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2353 $stock = +$stock_warehouse->real;
2354 $deliverableQty = min($quantityToBeDelivered, $stock);
2355 $deliverableQty = max(0, $deliverableQty);
2357 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'>';
2358 print
'<td colspan="3" ></td><td class="center"><!-- qty to ship (no lot management for product line indiceAsked=' . $indiceAsked .
') -->';
2360 if (isset($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2361 $deliverableQty = min($quantityToBeDelivered, $stock - $alreadyQtySetted[$line->fk_product][intval($warehouse_id)]);
2363 if (!isset($alreadyQtySetted[$line->fk_product])) {
2364 $alreadyQtySetted[$line->fk_product] = array();
2367 $deliverableQty = min($quantityToBeDelivered, $stock);
2370 if ($deliverableQty < 0) {
2371 $deliverableQty = 0;
2374 $tooltipClass = $tooltipTitle =
'';
2375 if (!empty($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2376 $tooltipClass =
' classfortooltip';
2377 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2379 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = 0;
2382 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = $deliverableQty + $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2384 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2385 if (GETPOSTISSET($inputName)) {
2388 $qtylValue = $deliverableQty;
2391 } elseif (is_numeric($qtylValue)) {
2392 $qtylValue =
price($qtylValue);
2394 print
'<input class="qtyl' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="text" size="4" value="' . $qtylValue .
'">';
2395 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_id .
'">';
2398 print
'<input name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2401 print $langs->trans(
"NA");
2406 print
'<td class="left">';
2408 if ($product->stockable_product == Product::ENABLED_STOCK || $productChildrenNb > 0) {
2409 print $tmpwarehouseObject->getNomUrl(0) .
' ';
2410 if ($productChildrenNb <= 0) {
2411 print
'<!-- Show details of stock -->';
2412 print
'(' . $stock .
')';
2415 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2418 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2421 $quantityToBeDelivered -= $deliverableQty;
2422 if ($quantityToBeDelivered < 0) {
2423 $quantityToBeDelivered = 0;
2434 $product->get_sousproduits_arbo();
2435 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2436 if (count($prods_arbo) > 0) {
2437 foreach ($prods_arbo as $key => $value) {
2440 if ($value[
'stock'] < $value[
'stock_alert']) {
2443 print
'<tr class"oddeven"><td>';
2444 print
" ->
2445 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2446 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2447 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2456 print
'<!-- Case warehouse not already known and product need lot -->';
2457 print
'<td></td><td></td>';
2464 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2471 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2472 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2473 $nbofsuggested += count($stock_warehouse->detail_batch);
2477 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2479 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2484 $tmpwarehouseObject->fetch($warehouse_id);
2485 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2486 foreach ($stock_warehouse->detail_batch as $dbatch) {
2487 $batchStock = +$dbatch->qty;
2488 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2489 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2491 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2492 $alreadyQtyBatchSetted[$line->fk_product] = array();
2495 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2496 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2499 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2502 if ($deliverableQty < 0) {
2503 $deliverableQty = 0;
2506 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2507 if (GETPOSTISSET($inputName)) {
2511 $tooltipClass = $tooltipTitle =
'';
2512 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2513 $tooltipClass =
' classfortooltip';
2514 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2516 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2518 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2520 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'><td colspan="3"></td><td class="center">';
2521 $qtylValue = $deliverableQty;
2524 } elseif (is_numeric($qtylValue)) {
2525 $qtylValue =
price($qtylValue);
2527 print
'<input class="qtyl right ' . $tooltipClass .
'" title="' . $tooltipTitle .
'" name="' . $inputName .
'" id="' . $inputName .
'" type="text" size="4" value="' . $qtylValue .
'">';
2530 print
'<td class="left">';
2532 print $tmpwarehouseObject->getNomUrl(0) .
' / ';
2534 print
'<!-- Show details of lot -->';
2535 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2536 print
'<input name="entl' . $indiceAsked .
'_'.$subj.
'" type="hidden" value="' . $tmpwarehouseObject->id .
'">';
2539 print $langs->trans(
"Batch") .
': ';
2540 $result = $productlotObject->fetch(0, $line->fk_product, $dbatch->batch);
2542 print $productlotObject->getNomUrl(1);
2544 print $langs->trans(
"TableLotIncompleteRunRepairWithParamStandardEqualConfirmed");
2547 print
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2550 print
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2552 print
' (' . $dbatch->qty .
')';
2553 $quantityToBeDelivered -= $deliverableQty;
2554 if ($quantityToBeDelivered < 0) {
2555 $quantityToBeDelivered = 0;
2561 print
'<td class="left">' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2569 $warehouse_selected_id =
GETPOSTINT(
'entrepot_id');
2571 print
'<!-- line not shown yet, we show it -->';
2572 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2577 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2578 $disabled =
'disabled="disabled"';
2579 $alt =
'Product need serial or batch number';
2581 if ($warehouse_selected_id <= 0) {
2582 $disabled =
'disabled="disabled"';
2585 if ($product->stockable_product == Product::ENABLED_STOCK) {
2588 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).
'"' :
'').
'> ';
2590 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2594 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2595 $disabled =
'disabled="disabled"';
2597 if ($warehouse_selected_id <= 0) {
2598 $disabled =
'disabled="disabled"';
2600 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="'.$quantityToBeDelivered.
'"'.($disabled ?
' '.$disabled :
'').
'> ';
2601 if (empty($disabled) && !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2602 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2605 print $langs->trans(
"NA");
2609 print
'<td class="left">';
2612 if (($warehouse_selected_id > 0 && $product->stockable_product == Product::ENABLED_STOCK)) {
2614 $warehouseObject->fetch($warehouse_selected_id);
2615 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $warehouseObject->label);
2617 if ($line->fk_product) {
2618 if ($product->stockable_product != Product::ENABLED_STOCK) {
2619 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2621 print
img_warning() .
' ' . $langs->trans(
'StockTooLow');
2628 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2637 } elseif (empty($reshook) && $line->special_code == SUBTOTALS_SPECIAL_CODE && !in_array($line->id, $title_lines_to_disable)) {
2638 require
dol_buildpath(
'/core/tpl/subtotalline_select.tpl.php');
2649 print $form->buttonsSaveCancel(
"Create");
2659 '@phan-var-force Expedition $object';
2665 $num_prod = count($lines);
2668 $typeobject =
$object->origin;
2670 $origin_id =
$object->origin_id;
2678 $res =
$object->fetch_optionals();
2686 if ($action ==
'delete') {
2687 $formquestion = array();
2689 $formquestion = array(
2691 'label' => $langs->trans(
'ShipmentIncrementStockOnDelete'),
2692 'name' =>
'alsoUpdateStock',
2693 'type' =>
'checkbox',
2698 $formconfirm = $form->formconfirm(
2699 $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
2700 $langs->trans(
'DeleteSending'),
2701 $langs->trans(
"ConfirmDeleteSending",
$object->ref),
2710 if ($action ==
'ask_subtotal_deleteline') {
2712 $langs->load(
"subtotals");
2713 $title =
"DeleteSubtotalLine";
2714 $question =
"ConfirmDeleteSubtotalLine";
2715 if (
GETPOST(
'type') ==
'title') {
2716 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2717 $title =
"DeleteTitleLine";
2718 $question =
"ConfirmDeleteTitleLine";
2720 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2724 if ($action ==
'valid') {
2725 $objectref = substr(
$object->ref, 1, 4);
2726 if ($objectref ==
'PROV') {
2727 $numref =
$object->getNextNumRef($soc);
2732 $text = $langs->trans(
"ConfirmValidateSending", $numref);
2734 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementWillBeRecorded") .
'.';
2736 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementNotYetRecorded") .
'.';
2740 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2743 $text .= $notify->confirmMessage(
'SHIPPING_VALIDATE',
$object->socid, $object);
2746 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $langs->trans(
'ValidateSending'), $text,
'confirm_valid',
'', 0, 1, 260);
2750 if ($action ==
'cancel') {
2751 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, $langs->trans(
'CancelSending'), $langs->trans(
"ConfirmCancelSending",
$object->ref),
'confirm_cancel',
'', 0, 1);
2755 if ($action ==
'sign') {
2756 $text = $langs->trans(
'ConfirmSignShipping');
2758 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2761 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2766 'name' =>
'signed_status',
2767 'select_show_empty' => 0,
2768 'label' =>
'<span class="fieldrequired">' . $langs->trans(
'SignStatus') .
'</span>',
2769 'values' =>
$object->getSignedStatusLocalisedArray()
2771 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SignShipping'), $text,
'confirm_sign', $formquestion, 0, 1);
2775 if ($action ==
'unsign') {
2776 $text = $langs->trans(
'ConfirmUnsignShipping');
2778 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2781 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2783 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'UnsignShipping'), $text,
'confirm_unsign',
'', 0, 1);
2787 $parameters = array(
'formConfirm' => $formconfirm);
2788 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
2789 if (empty($reshook)) {
2790 $formconfirm .= $hookmanager->resPrint;
2791 } elseif ($reshook > 0) {
2792 $formconfirm = $hookmanager->resPrint;
2800 $tmparray =
$object->getTotalWeightVolume();
2801 $totalWeight = $tmparray[
'weight'];
2802 $totalVolume = $tmparray[
'volume'];
2804 if (!empty($typeobject) && $typeobject ===
'commande' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2806 $objectsrc->fetch(
$object->origin_object->id);
2808 if (!empty($typeobject) && $typeobject ===
'propal' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2810 $objectsrc->fetch(
$object->origin_object->id);
2814 $linkback =
'<a href="' . DOL_URL_ROOT .
'/expedition/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
2815 $morehtmlref =
'<div class="refidno">';
2817 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
2818 $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);
2821 $morehtmlref .=
'<br>' .
$object->thirdparty->getNomUrl(1);
2824 if ($origin && $origin_id > 0) {
2826 $langs->load(
"projects");
2827 $morehtmlref .=
'<br>';
2829 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2830 if ($action !=
'classify') {
2831 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2833 $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');
2835 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
2837 $proj->fetch($objectsrc->fk_project);
2838 $morehtmlref .= $proj->getNomUrl(1);
2840 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2848 $langs->load(
"projects");
2849 $morehtmlref .=
'<br>';
2850 if ($permissiontoadd) {
2851 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2852 if ($action !=
'classify') {
2853 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' . newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
2855 $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');
2857 if (!empty(
$object->fk_project)) {
2859 $proj->fetch(
$object->fk_project);
2860 $morehtmlref .= $proj->getNomUrl(1);
2862 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
2869 $morehtmlref .=
'</div>';
2870 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2872 print
'<div class="fichecenter">';
2873 print
'<div class="fichehalfleft">';
2874 print
'<div class="underbanner clearboth"></div>';
2876 print
'<table class="border tableforfield centpercent">';
2879 if (!empty($typeobject) && $typeobject ==
'commande' &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2881 print $langs->trans(
"RefOrder") .
'</td>';
2883 print $objectsrc->getNomUrl(1,
'commande');
2887 if (!empty($typeobject) && $typeobject ==
'propal' &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2889 print $langs->trans(
"RefProposal") .
'</td>';
2891 print $objectsrc->getNomUrl(1,
'expedition');
2897 print
'<tr><td class="titlefieldmiddle">' . $langs->trans(
"DateCreation") .
'</td>';
2902 print
'<tr><td height="10">';
2903 print
'<table class="nobordernopadding centpercent"><tr><td>';
2904 print $langs->trans(
'DateDeliveryPlanned');
2906 if ($action !=
'editdate_livraison') {
2907 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>';
2909 print
'</tr></table>';
2911 if ($action ==
'editdate_livraison') {
2912 print
'<form name="setdate_livraison" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2913 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
2914 print
'<input type="hidden" name="action" value="setdate_livraison">';
2915 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
2916 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2925 print
'<tr><td height="10">';
2926 print
'<table class="nobordernopadding centpercent"><tr><td>';
2927 print $langs->trans(
'DateShipping');
2929 if ($action !=
'editdate_shipping') {
2930 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>';
2932 print
'</tr></table>';
2934 if ($action ==
'editdate_shipping') {
2935 print
'<form name="setdate_shipping" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2936 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
2937 print
'<input type="hidden" name="action" value="setdate_shipping">';
2938 print $form->selectDate(
$object->date_shipping ?
$object->date_shipping : -1,
'ship_', 1, 1, 0,
"setdate_shipping", 1, 0);
2939 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2949 print $form->editfieldkey(
"Weight",
'trueWeight',
$object->trueWeight, $object, $user->hasRight(
'expedition',
'creer'));
2952 if ($action ==
'edittrueWeight') {
2953 print
'<form name="settrueweight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2954 print
'<input name="action" value="settrueWeight" type="hidden">';
2955 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2956 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
2957 print
'<input id="trueWeight" name="trueWeight" value="' .
$object->trueWeight .
'" type="text" class="width50 valignmiddle">';
2958 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
$object->weight_units, 0, 2,
'maxwidth125 valignmiddle');
2959 print
' <input class="button smallpaddingimp valignmiddle" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2960 print
' <input class="button button-cancel smallpaddingimp valignmiddle" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
2968 if ($totalWeight > 0) {
2969 if (!empty(
$object->trueWeight)) {
2970 print
' (' . $langs->trans(
"SumOfProductWeights") .
': ';
2973 if (!empty(
$object->trueWeight)) {
2980 print
'<tr><td>' . $form->editfieldkey(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2981 print $form->editfieldval(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer'));
2986 print
'<tr><td>' . $form->editfieldkey(
"Height",
'trueHeight',
$object->trueHeight, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2987 if ($action ==
'edittrueHeight') {
2988 print
'<form name="settrueHeight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2989 print
'<input name="action" value="settrueHeight" type="hidden">';
2990 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2991 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
2992 print
'<input id="trueHeight" name="trueHeight" value="' .
$object->trueHeight .
'" type="text" class="width50">';
2993 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
$object->size_units, 0, 2);
2994 print
' <input class="button smallpaddingimp" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2995 print
' <input class="button button-cancel smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
3005 print
'<tr><td>' . $form->editfieldkey(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3006 print $form->editfieldval(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer'));
3012 print $langs->trans(
"Volume");
3015 $calculatedVolume = 0;
3019 $volumeUnit =
$object->size_units * 3;
3022 if ($calculatedVolume > 0) {
3023 if ($volumeUnit < 50) {
3029 if ($totalVolume > 0) {
3030 if ($calculatedVolume) {
3031 print
' (' . $langs->trans(
"SumOfProductVolumes") .
': ';
3035 if ($calculatedVolume) {
3044 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3049 print
'<div class="fichehalfright">';
3050 print
'<div class="underbanner clearboth"></div>';
3052 print
'<table class="border centpercent tableforfield">';
3056 print
'<table class="nobordernopadding centpercent"><tr><td>';
3057 print $langs->trans(
'SendingMethod');
3060 if ($action !=
'editshipping_method_id' && $permissiontoadd) {
3061 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>';
3063 print
'</tr></table>';
3065 if ($action ==
'editshipping_method_id') {
3066 print
'<form name="setshipping_method_id" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3067 print
'<input type="hidden" name="token" value="' . newToken() .
'">';
3068 print
'<input type="hidden" name="action" value="setshipping_method_id">';
3069 $object->fetch_delivery_methods();
3070 print $form->selectarray(
"shipping_method_id",
$object->meths,
$object->shipping_method_id, 1, 0, 0,
"", 1);
3072 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
3074 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
3077 if (
$object->shipping_method_id > 0) {
3079 $code = $langs->getLabelFromKey(
$db, (
string)
$object->shipping_method_id,
'c_shipment_mode',
'rowid',
'code');
3080 print $langs->trans(
"SendingMethod" . strtoupper($code));
3087 print
'<tr><td class="titlefieldmiddle">' . $form->editfieldkey(
"TrackingNumber",
'tracking_number',
$object->tracking_number, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3088 print $form->editfieldval(
"TrackingNumber",
'tracking_number',
$object->tracking_url, $object, $user->hasRight(
'expedition',
'creer'),
'safehtmlstring',
$object->tracking_number);
3094 print
'<table class="nobordernopadding centpercent"><tr><td>';
3095 print $langs->trans(
'IncotermLabel');
3096 print
'<td><td class="right">';
3097 if ($permissiontoadd) {
3098 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/expedition/card.php?id=' .
$object->id .
'&action=editincoterm&token=' . newToken() .
'">' .
img_edit() .
'</a>';
3102 print
'</td></tr></table>';
3105 if ($action !=
'editincoterm') {
3106 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3108 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3114 $parameters = array();
3115 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3116 print $hookmanager->resPrint;
3123 print
'<div class="clearboth"></div>';
3132 if (!empty(
$object->table_element_line)) {
3134 $result =
$object->getLinesArray();
3136 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
3137 <input type="hidden" name="token" value="' . newToken().
'">
3138 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3139 <input type="hidden" name="mode" value="">
3140 <input type="hidden" name="page_y" value="">
3141 <input type="hidden" name="id" value="' .
$object->id.
'">
3144 if (!empty(
$conf->use_javascript_ajax) &&
$object->status == 0) {
3145 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3148 print
'<div class="div-table-responsive-no-min">';
3149 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3150 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
3158 if (
$object->status == 0 && $permissiontoadd && $action !=
'selectlines') {
3159 if ($action !=
'editline') {
3162 $parameters = array();
3163 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3167 if (empty($reshook)) {
3173 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3184 if ($action ==
'editline') {
3185 print
' <form name="updateline" id="updateline" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $line_id .
'" method="POST">
3186 <input type="hidden" name="token" value="' . newToken() .
'">
3187 <input type="hidden" name="action" value="updateline">
3188 <input type="hidden" name="mode" value="">
3189 <input type="hidden" name="id" value="' .
$object->id .
'">
3194 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3197 print
'<div class="div-table-responsive-no-min">';
3198 print
'<table class="noborder centpercent" id="tablelines" >';
3200 print
'<tr class="liste_titre">';
3203 print
'<td width="5" class="center linecolnum"> </td>';
3206 print
'<td class="linecoldescription" >' . $langs->trans(
"Products") .
'</td>';
3208 print
'<td class="center linecolqty">' . $langs->trans(
"QtyOrdered") .
'</td>';
3209 if ($origin_id > 0) {
3210 print
'<td class="center linecolqtyinothershipments">' . $langs->trans(
"QtyInOtherShipments") .
'</td>';
3212 if ($action ==
'editline') {
3220 print
'<td class="center linecoleditlineotherinfo" colspan="' . $editColspan .
'">';
3222 print $langs->trans(
"QtyToShip");
3224 print $langs->trans(
"QtyShipped");
3227 print
' - ' . $langs->trans(
"WarehouseSource");
3230 print
' - ' . $langs->trans(
"Batch");
3235 print
'<td class="center linecolqtytoship">' . $langs->trans(
"QtyToShip") .
'</td>';
3237 print
'<td class="center linecolqtyshipped">' . $langs->trans(
"QtyShipped") .
'</td>';
3240 print
'<td class="left linecolwarehousesource">' . $langs->trans(
"WarehouseSource") .
'</td>';
3244 print
'<td class="left linecolbatch">' . $langs->trans(
"Batch") .
'</td>';
3247 print
'<td class="center linecolweight">' . $langs->trans(
"CalculatedWeight") .
'</td>';
3248 print
'<td class="center linecolvolume">' . $langs->trans(
"CalculatedVolume") .
'</td>';
3251 print
'<td class="linecoledit"></td>';
3252 print
'<td class="linecoldelete" width="10"></td>';
3253 print
'<td class="linecolmove"></td>';
3258 $outputlangs = $langs;
3263 if (
GETPOST(
'lang_id',
'aZ09')) {
3264 $newlang =
GETPOST(
'lang_id',
'aZ09');
3266 if (empty($newlang)) {
3267 $newlang =
$object->thirdparty->default_lang;
3269 if (!empty($newlang)) {
3271 $outputlangs->setDefaultLang($newlang);
3276 $alreadysent = array();
3277 if ($origin_id > 0) {
3278 $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";
3279 $sql .=
", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot";
3280 $sql .=
", e.rowid as shipment_id, e.ref as shipment_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_expedition";
3281 $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';
3282 $sql .=
', p.description as product_desc';
3283 $sql .=
" FROM " . MAIN_DB_PREFIX .
"expeditiondet as ed";
3284 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as e";
3285 $sql .=
", " . MAIN_DB_PREFIX .
$db->sanitize((
string) $origin) .
"det as obj";
3286 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product as p ON obj.fk_product = p.rowid";
3287 $sql .=
" WHERE e.entity IN (" .
getEntity(
'expedition') .
")";
3288 $sql .=
" AND obj.fk_" .
$db->sanitize((
string) $origin) .
" = " . ((int) $origin_id);
3289 $sql .=
" AND obj.rowid = ed.fk_elementdet";
3290 $sql .=
" AND ed.fk_expedition = e.rowid";
3292 $sql .=
" ORDER BY obj.fk_product";
3294 dol_syslog(
"expedition/card.php get list of shipment lines", LOG_DEBUG);
3295 $resql =
$db->query($sql);
3297 $num =
$db->num_rows($resql);
3301 $obj =
$db->fetch_object($resql);
3304 $alreadysent[$obj->rowid][$obj->shipmentline_id] = array(
3305 'shipment_ref' => $obj->shipment_ref,
3306 'shipment_id' => $obj->shipment_id,
3307 'warehouse' => $obj->fk_entrepot,
3308 'qty_shipped' => $obj->qty_shipped,
3309 'product_tosell' => $obj->product_tosell,
3310 'product_tobuy' => $obj->product_tobuy,
3311 'product_tobatch' => $obj->product_tobatch,
3312 'date_valid' =>
$db->jdate($obj->date_valid),
3313 'date_delivery' =>
$db->jdate($obj->date_delivery));
3324 $conf->cache[
'product'] = array();
3325 $conf->cache[
'warehouse'] = array();
3326 for ($i = 0; $i < $num_prod; $i++) {
3327 $parameters = array(
'i' => $i,
'line' => $lines[$i],
'line_id' => $line_id,
'num' => $num_prod,
'alreadysent' => $alreadysent,
'editColspan' => !empty($editColspan) ? $editColspan : 0,
'outputlangs' => $outputlangs);
3328 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
3333 if (empty($reshook) && $lines[$i]->product_type !=
"9") {
3334 print
'<!-- origin line id = ' . $lines[$i]->origin_line_id .
' -->';
3335 print
'<tr class="oddeven" id="row-' . $lines[$i]->id .
'" data-id="' . $lines[$i]->id .
'" data-element="' . $lines[$i]->element .
'" >';
3337 $line->fetch_optionals();
3341 print
'<td class="center linecolnum">' . ($i + 1) .
'</td>';
3345 if ($lines[$i]->fk_product > 0) {
3348 $product_id = $lines[$i]->fk_product;
3349 if (!isset(
$conf->cache[
'product'][$product_id])) {
3351 $prod->fetch($product_id);
3352 $conf->cache[
'product'][$product_id] =
$prod;
3354 $prod =
$conf->cache[
'product'][$product_id];
3356 $label = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"label"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"label"] : $lines[$i]->product_label;
3358 $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label);
3361 print
'<td class="linecoldescription">';
3364 $product_static->type = $lines[$i]->fk_product_type;
3365 $product_static->id = $lines[$i]->fk_product;
3366 $product_static->ref = $lines[$i]->ref;
3367 $product_static->status = $lines[$i]->product_tosell;
3368 $product_static->status_buy = $lines[$i]->product_tobuy;
3369 $product_static->status_batch = $lines[$i]->product_tobatch;
3371 $product_static->weight = $lines[$i]->weight;
3372 $product_static->weight_units = $lines[$i]->weight_units;
3373 $product_static->length = $lines[$i]->length;
3374 $product_static->length_units = $lines[$i]->length_units;
3375 $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0;
3376 $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0;
3377 $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0;
3378 $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0;
3379 $product_static->surface = $lines[$i]->surface;
3380 $product_static->surface_units = $lines[$i]->surface_units;
3381 $product_static->volume = $lines[$i]->volume;
3382 $product_static->volume_units = $lines[$i]->volume_units;
3383 $product_static->stockable_product = $lines[$i]->stockable_product;
3385 $text = $product_static->getNomUrl(1);
3386 $text .=
' - ' . $label;
3388 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
3389 print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start :
'', !empty($lines[$i]->date_end) ? $lines[$i]->date_end :
'');
3393 $lineExtrafieldsHtml = $line->showOptionals($extrafields, ($action ==
'editline' && $line->id == $line_id) ?
'edit' :
'view', array(),
'',
'',
'1',
'line');
3394 if (!empty($lineExtrafieldsHtml)) {
3395 print
'<div style="padding-top: 10px" id="extrafield_lines_area_' . $line->id .
'" name="extrafield_lines_area_' . $line->id .
'">';
3396 print $lineExtrafieldsHtml;
3401 print
'<td class="linecoldescription" >';
3403 $text =
img_object($langs->trans(
'Service'),
'service');
3405 $text =
img_object($langs->trans(
'Product'),
'product');
3408 if (!empty($lines[$i]->label)) {
3409 $text .=
' <strong>' . $lines[$i]->label .
'</strong>';
3410 print $form->textwithtooltip($text, $lines[$i]->
description, 3, 0,
'', (
string) $i);
3412 print $text .
' ' . nl2br($lines[$i]->
description);
3416 $lineExtrafieldsHtml = $line->showOptionals($extrafields, ($action ==
'editline' && $line->id == $line_id) ?
'edit' :
'view', array(),
'',
'',
'1',
'line');
3417 if (!empty($lineExtrafieldsHtml)) {
3418 print
'<div style="padding-top: 10px" id="extrafield_lines_area_' . $line->id .
'" name="extrafield_lines_area_' . $line->id .
'">';
3419 print $lineExtrafieldsHtml;
3431 print
'<td class="center linecolqty">' . $lines[$i]->qty_asked .
' ' . $unit_order .
'</td>';
3434 if ($origin_id > 0) {
3435 print
'<td class="linecolqtyinothershipments center nowrap">';
3437 $qtyalreadysent = 0;
3438 foreach ($alreadysent as $key => $val) {
3439 if ($lines[$i]->fk_elementdet == $key) {
3441 foreach ($val as $shipmentline_id => $shipmentline_var) {
3442 if ($shipmentline_var[
'shipment_id'] == $lines[$i]->fk_expedition) {
3448 $htmltooltip .=
'<br>';
3450 $shipment_static->fetch($shipmentline_var[
'shipment_id']);
3451 $htmltooltip .= $shipment_static->getNomUrl(1,
'', 0, 0, 1);
3452 $htmltooltip .=
' - ' . $shipmentline_var[
'qty_shipped'];
3453 $htmltooltip .=
' - ' . $langs->trans(
"DateValidation") .
' : ' . (empty($shipmentline_var[
'date_valid']) ? $langs->trans(
"Draft") :
dol_print_date($shipmentline_var[
'date_valid'],
'dayhour'));
3460 $qtyalreadysent += $shipmentline_var[
'qty_shipped'];
3463 $htmltooltip = $langs->trans(
"QtyInOtherShipments") .
'...<br><br>' . $htmltooltip .
'<br><input type="submit" name="dummyhiddenbuttontogetfocus" style="display:none" autofocus>';
3467 print $form->textwithpicto((
string) $qtyalreadysent, $htmltooltip, 1,
'info',
'', 0, 3,
'tooltip' . $lines[$i]->id);
3471 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3473 print
'<td colspan="' . $editColspan .
'" class="center"><table class="nobordernopadding centpercent">';
3474 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
3475 print
'<!-- case edit 1 -->';
3477 foreach ($lines[$i]->detail_batch as $detail_batch) {
3480 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>';
3482 if ($lines[$i]->entrepot_id == 0) {
3484 $line->fetch($detail_batch->fk_expeditiondet);
3486 $entrepot_id = !empty($detail_batch->entrepot_id) ? $detail_batch->entrepot_id : $lines[$i]->entrepot_id;
3487 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>';
3493 print
'<td><input class="qtyl" name="qtyl' . $line_id .
'_0" id="qtyl' . $line_id .
'_0" type="text" size="4" value="0"></td>';
3495 print
'<td>' . $formproduct->selectLotStock(
'',
'batchl' . $line_id .
'_0',
'', 1, 0, $lines[$i]->fk_product) .
'</td>';
3498 if ($lines[$i]->fk_product > 0) {
3499 if ($lines[$i]->entrepot_id > 0) {
3500 print
'<!-- case edit 2 -->';
3503 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>';
3505 print
'<td>' . $formproduct->selectWarehouses($lines[$i]->entrepot_id,
'entl' . $line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3509 print
' - ' . $langs->trans(
"NA");
3513 } elseif (count($lines[$i]->details_entrepot) > 1) {
3514 print
'<!-- case edit 3 -->';
3515 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3518 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>';
3520 print
'<td>' . $formproduct->selectWarehouses($detail_entrepot->entrepot_id,
'entl' . $detail_entrepot->line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3524 print
' - ' . $langs->trans(
"NA");
3530 print
'<!-- case edit 4 -->';
3533 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3534 print
'<td><span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span></td>';
3538 print
'<!-- case edit 5 -->';
3539 print
'<tr><td colspan="3">' . $langs->trans(
"ErrorStockIsNotEnough") .
'</td></tr>';
3542 print
'<!-- case edit 6 -->';
3545 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>';
3553 print
'<!-- case edit 7 -->';
3556 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3564 print
'</table></td>';
3567 print
'<td class="linecolqtytoship center">' . $lines[$i]->qty_shipped .
' ' . $unit_order .
'</td>';
3571 print
'<td class="linecolwarehousesource tdoverflowmax200">';
3573 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
3574 } elseif ($lines[$i]->entrepot_id > 0 && $lines[$i]->stockable_product == Product::ENABLED_STOCK) {
3575 $warehouse_id = $lines[$i]->entrepot_id;
3576 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3578 $warehouse->fetch($warehouse_id);
3579 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3581 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3583 print $warehouse->getNomUrl(1);
3584 } elseif (count($lines[$i]->details_entrepot) > 1) {
3586 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3587 $warehouse_id = $detail_entrepot->entrepot_id;
3588 if ($warehouse_id > 0) {
3589 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3591 $warehouse->fetch($warehouse_id);
3592 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3594 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3596 $detail .= $langs->trans(
"DetailWarehouseFormat", $warehouse->label, $detail_entrepot->qty_shipped) .
'<br>';
3599 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
"DetailWarehouseNumber"), $detail);
3600 } elseif (count($lines[$i]->detail_children ?? []) > 1) {
3602 foreach ($lines[$i]->detail_children as $child_product_id => $child_stock_list) {
3603 foreach ($child_stock_list as $warehouse_id => $total_qty) {
3605 $child_product_label =
'';
3606 if (!isset(
$conf->cache[
'product'][$child_product_id])) {
3608 $child_product->fetch($child_product_id);
3609 $conf->cache[
'product'][$child_product_id] = $child_product;
3611 $child_product =
$conf->cache[
'product'][$child_product_id];
3613 $child_product_label = $child_product->ref .
' ' . $child_product->label;
3616 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3618 $child_warehouse->fetch($warehouse_id);
3619 $conf->cache[
'warehouse'][$warehouse_id] = $child_warehouse;
3621 $child_warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3623 $detail .= $langs->trans(
'DetailChildrenFormat', $child_product_label, $child_warehouse->label,
price2num($total_qty,
'MS')) .
'<br>';
3626 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
'DetailWarehouseNumber'), $detail);
3633 if (isset($lines[$i]->detail_batch)) {
3634 print
'<!-- Detail of lot -->';
3635 print
'<td class="linecolbatch">';
3636 if ($lines[$i]->product_tobatch) {
3638 foreach ($lines[$i]->detail_batch as $dbatch) {
3639 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
3641 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
3644 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
3646 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
3649 print $form->textwithtooltip(
img_picto(
'',
'object_barcode') .
' ' . $langs->trans(
"DetailBatchNumber"), $detail);
3651 print $langs->trans(
"NA");
3655 print
'<td class="linecolbatch" ></td>';
3661 print
'<td class="center linecolweight">';
3663 print $lines[$i]->weight * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"weight", $lines[$i]->weight_units);
3670 print
'<td class="center linecolvolume">';
3672 print $lines[$i]->volume * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"volume", $lines[$i]->volume_units);
3683 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3684 print
'<td class="center" colspan="2" valign="middle">';
3685 print
'<input type="submit" class="button button-save" id="savelinebutton marginbottomonly" name="save" value="' . $langs->trans(
"Save") .
'"><br>';
3686 print
'<input type="submit" class="button button-cancel" id="cancellinebutton" name="cancel" value="' . $langs->trans(
"Cancel") .
'"><br>';
3689 print
'<td class="linecolmove tdlineupdown center"></td>';
3691 } elseif ($showmovecol) {
3692 $edit_url = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&token=' . newToken() .
'&lineid=' . $lines[$i]->id;
3694 $product_id = $lines[$i]->fk_product;
3695 if (!isset(
$conf->cache[
'product'][$product_id])) {
3697 $product->fetch($product_id);
3698 $conf->cache[
'product'][$product_id] = $product;
3700 $product =
$conf->cache[
'product'][$product_id];
3703 if ($product->hasFatherOrChild(1)) {
3709 print
'<td class="linecoledit center">';
3710 print
'<a class="editfielda reposition" href="' . $edit_url .
'">' .
img_edit() .
'</a>';
3712 print
'<td class="linecoldelete" width="10">';
3713 print
'<a class="reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=deleteline&token=' . newToken() .
'&lineid=' . $lines[$i]->id .
'">' .
img_delete() .
'</a>';
3715 print
'<td class="linecolmove tdlineupdown center">';
3716 if ($usercancreate && $num_prod > 1) {
3718 print
'<a class="lineupdown" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=up&token=' . newToken() .
'&rowid=' . $lines[$i]->id .
'">' .
img_up(
'default', 0,
'imgupforline') .
'</a>';
3720 if ($i < $num_prod - 1) {
3721 print
'<a class="lineupdown" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=down&token=' . newToken() .
'&rowid=' . $lines[$i]->id .
'">' .
img_down(
'default', 0,
'imgdownforline') .
'</a>';
3726 if (!empty($rowExtrafieldsStart)) {
3727 print $rowExtrafieldsStart;
3728 print $rowExtrafieldsView;
3733 } elseif (empty($reshook) && $lines[$i]->product_type ==
"9") {
3735 $objectsrc->fetch($lines[$i]->origin_line_id);
3736 if ($objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) {
3738 require
dol_buildpath(
'/core/tpl/subtotal_expedition_view.tpl.php');
3743 if (empty($num_prod)) {
3744 print
'<tr><td colspan="8"><span class="opacitymedium">' . $langs->trans(
"NoLineGoOnTabToAddSome", $langs->transnoentitiesnoconv(
"ShipmentDistribution")) .
'</span></td></tr>';
3750 if ($action ==
'editline') {
3761 if (($user->socid == 0) && ($action !=
'presend')) {
3762 print
'<div class="tabsAction">';
3764 $parameters = array();
3765 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3767 if (empty($reshook)) {
3769 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
3770 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate'))
3772 print dolGetButtonAction(
'', $langs->trans(
'Validate'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=valid&token=' . newToken() .
'&id=' .
$object->id,
'');
3774 print dolGetButtonAction($langs->trans(
'NotAllowed'), $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3780 if ($user->hasRight(
'expedition',
'creer')) {
3781 print dolGetButtonAction(
'', $langs->trans(
'SetToDraft'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=setdraft&token=' . newToken() .
'&id=' .
$object->id,
'');
3785 if ($user->hasRight(
'expedition',
'creer')) {
3786 print dolGetButtonAction(
'', $langs->trans(
'ReOpen'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=reopen&token=' . newToken() .
'&id=' .
$object->id,
'');
3791 if (empty($user->socid)) {
3793 if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'expedition',
'shipping_advance',
'send')) {
3794 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' . newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3796 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3804 print dolGetButtonAction(
'', $langs->trans(
'CreateDeliveryOrder'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=create_delivery&token=' . newToken() .
'&id=' .
$object->id,
'');
3809 if (
$object->signed_status != Expedition::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
3810 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>';
3812 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>';
3818 if ($user->hasRight(
'facture',
'creer')) {
3820 print dolGetButtonAction(
'', $langs->trans(
'CreateBill'),
'default', DOL_URL_ROOT .
'/compta/facture/card.php?action=create&origin=' .
$object->element .
'&originid=' .
$object->id .
'&socid=' .
$object->socid,
'');
3827 if ($user->hasRight(
'expedition',
'creer') &&
$object->status > 0) {
3829 print dolGetButtonAction(
'', $langs->trans(
'ClassifyBilled'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifybilled&token=' . newToken() .
'&id=' .
$object->id,
'');
3831 print dolGetButtonAction(
'', $langs->trans(
"Close"),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifyclosed&token=' . newToken() .
'&id=' .
$object->id,
'');
3837 if ($user->hasRight(
'expedition',
'creer')) {
3838 print dolGetButtonAction(
'', $langs->trans(
'Cancel'),
'danger', $_SERVER[
"PHP_SELF"] .
'?action=cancel&token=' . newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3843 if ($user->hasRight(
'expedition',
'supprimer')) {
3844 print dolGetButtonAction(
'', $langs->trans(
'Delete'),
'delete', $_SERVER[
"PHP_SELF"] .
'?action=delete&token=' . newToken() .
'&id=' .
$object->id,
'');
3856 if ($action !=
'presend' && $action !=
'editline') {
3857 print
'<div class="fichecenter"><div class="fichehalfleft">';
3860 $filedir =
$conf->expedition->dir_output .
"/sending/" . $objectref;
3862 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3864 $genallowed = $user->hasRight(
'expedition',
'lire');
3865 $delallowed = $user->hasRight(
'expedition',
'creer');
3867 print $formfile->showdocuments(
'expedition', $objectref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $soc->default_lang);
3871 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'shipping'), 1);
3872 $linktoelem = $tmparray[
'linktoelem'];
3873 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3874 print $htmltoenteralink;
3876 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
3882 print
'<br><!-- Link to sign -->';
3883 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3884 print showOnlineSignatureUrl(
'expedition',
$object->ref, $object) .
'<br>';
3887 print
'</div><div class="fichehalfright">';
3891 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3896 $morehtmlcenter = dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/expedition/messaging.php?id=' .
$object->id);
3898 $somethingshown = $formactions->showactions($object,
'shipping', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3899 print
'</div></div>';
3908 if (
GETPOST(
'modelselected')) {
3909 $action =
'presend';
3913 $modelmail =
'shipping_send';
3914 $defaulttopic =
'SendShippingRef';
3915 $diroutput =
$conf->expedition->dir_output .
'/sending';
3916 $trackid =
'shi' .
$object->id;
3918 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage customers orders.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
const STATUS_DRAFT
Draft status.
const STATUS_CANCELED
Canceled status.
const STATUS_CLOSED
Closed status -> parcel was received by customer / end of process prev status : validated or shipment...
const STATUS_VALIDATED
Validated status -> parcel is ready to be sent prev status : draft next status : closed or shipment_i...
Class to manage lines of shipment.
CRUD class for batch number management within shipment.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class to manage order lines.
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage products or services.
const DISABLED_STOCK
Stockable product.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Manage record for batch number management.
Class with list of lots and properties.
Class to manage projects.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='')
Show information in HTML for admin users or standard users.
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.
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 '.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
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.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
shipping_prepare_head($object)
Prepare array with list of tabs.