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) {
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');
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');
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">';
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;
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 .
') -->';
2364 $tooltipClass = $tooltipTitle =
'';
2365 if ($productChildrenNb <= 0) {
2366 if (isset($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2367 $deliverableQty = min($quantityToBeDelivered, $stock - $alreadyQtySetted[$line->fk_product][intval($warehouse_id)]);
2369 if (!isset($alreadyQtySetted[$line->fk_product])) {
2370 $alreadyQtySetted[$line->fk_product] = array();
2373 $deliverableQty = min($quantityToBeDelivered, $stock);
2376 if ($deliverableQty < 0) {
2377 $deliverableQty = 0;
2380 if (!empty($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
2381 $tooltipClass =
' classfortooltip';
2382 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines').
' : '.$alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2384 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = 0;
2387 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = $deliverableQty + $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
2390 $inputName =
'qtyl'.$indiceAsked.
'_'.$subj;
2394 $qtylValue = $deliverableQty;
2397 } elseif (is_numeric($qtylValue)) {
2398 $qtylValue =
price($qtylValue);
2400 print
'<input class="qtyl' . $tooltipClass .
' right" title="' . $tooltipTitle .
'" name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="text" size="4" value="' . $qtylValue .
'">';
2401 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_id .
'">';
2404 print
'<input name="qtyl' . $indiceAsked .
'_' . $subj .
'" id="qtyl' . $indiceAsked .
'" type="hidden" value="0">';
2407 print $langs->trans(
"NA");
2412 print
'<td class="left">';
2414 if ($product->stockable_product == Product::ENABLED_STOCK || $productChildrenNb > 0) {
2415 print $tmpwarehouseObject->getNomUrl(0) .
' ';
2416 if ($productChildrenNb <= 0) {
2417 print
'<!-- Show details of stock -->';
2418 print
'(' . $stock .
')';
2421 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2424 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2427 $quantityToBeDelivered -= $deliverableQty;
2428 if ($quantityToBeDelivered < 0) {
2429 $quantityToBeDelivered = 0;
2440 $product->get_sousproduits_arbo();
2441 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
2442 if (count($prods_arbo) > 0) {
2443 foreach ($prods_arbo as $key => $value) {
2446 if ($value[
'stock'] < $value[
'stock_alert']) {
2449 print
'<tr class"oddeven"><td>';
2450 print
" ->
2451 <a href=\"" . DOL_URL_ROOT .
"/product/card.php?id=" . $value[
'id'] .
"\">" . $value[
'fullpath'] .
"
2452 </a> (" . $value[
'nb'] .
")</td><td class=\"center\"> " . $value[
'nb_total'] .
"</td><td> </td><td> </td>
2453 <td class=\"center\">" . $value[
'stock'] .
" " . $img .
"</td>";
2462 print
'<!-- Case warehouse not already known and product need lot -->';
2463 print
'<td></td><td></td>';
2470 print
'<input name="idl' . $indiceAsked .
'" type="hidden" value="' . $line->id .
'">';
2477 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2478 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2479 $nbofsuggested += count($stock_warehouse->detail_batch);
2483 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
2485 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
2490 $tmpwarehouseObject->fetch($warehouse_id);
2491 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
2492 foreach ($stock_warehouse->detail_batch as $dbatch) {
2493 $batchStock = +$dbatch->qty;
2494 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2495 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
2497 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
2498 $alreadyQtyBatchSetted[$line->fk_product] = array();
2501 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
2502 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
2505 $deliverableQty = min($quantityToBeDelivered, $batchStock);
2508 if ($deliverableQty < 0) {
2509 $deliverableQty = 0;
2512 $inputName =
'qtyl' . $indiceAsked .
'_' . $subj;
2517 $tooltipClass = $tooltipTitle =
'';
2518 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
2519 $tooltipClass =
' classfortooltip';
2520 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines') .
' : ' . $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2522 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0;
2524 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
2526 print
'<!-- subj=' . $subj .
'/' . $nbofsuggested .
' --><tr ' . ((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'') .
'><td colspan="3"></td><td class="center">';
2527 $qtylValue = $deliverableQty;
2530 } elseif (is_numeric($qtylValue)) {
2531 $qtylValue =
price($qtylValue);
2533 print
'<input class="qtyl right ' . $tooltipClass .
'" title="' . $tooltipTitle .
'" name="' . $inputName .
'" id="' . $inputName .
'" type="text" size="4" value="' . $qtylValue .
'">';
2536 print
'<td class="left">';
2538 print $tmpwarehouseObject->getNomUrl(0) .
' / ';
2540 print
'<!-- Show details of lot -->';
2541 print
'<input name="batchl' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $dbatch->id .
'">';
2542 print
'<input name="entl' . $indiceAsked .
'_'.$subj.
'" type="hidden" value="' . $tmpwarehouseObject->id .
'">';
2545 print $langs->trans(
"Batch") .
': ';
2546 $result = $productlotObject->fetch(0, $line->fk_product, $dbatch->batch);
2548 print $productlotObject->getNomUrl(1);
2550 print $langs->trans(
"TableLotIncompleteRunRepairWithParamStandardEqualConfirmed");
2553 print
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
2556 print
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
2558 print
' (' . $dbatch->qty .
')';
2559 $quantityToBeDelivered -= $deliverableQty;
2560 if ($quantityToBeDelivered < 0) {
2561 $quantityToBeDelivered = 0;
2567 print
'<td class="left">' .
dol_print_date($dbatch->context[
'stock_entry_date'],
'day') .
'</td>';
2575 $warehouse_selected_id =
GETPOSTINT(
'entrepot_id');
2577 print
'<!-- line not shown yet, we show it -->';
2578 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
2583 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2584 $disabled =
'disabled="disabled"';
2585 $alt =
'Product need serial or batch number';
2587 if ($warehouse_selected_id <= 0) {
2588 $disabled =
'disabled="disabled"';
2591 if ($product->stockable_product == Product::ENABLED_STOCK) {
2594 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).
'"' :
'').
'> ';
2596 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2600 if (
isModEnabled(
'productbatch') && $product->hasbatch()) {
2601 $disabled =
'disabled="disabled"';
2603 if ($warehouse_selected_id <= 0) {
2604 $disabled =
'disabled="disabled"';
2606 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="'.$quantityToBeDelivered.
'"'.($disabled ?
' '.$disabled :
'').
'> ';
2607 if (empty($disabled) && !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
2608 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
2611 print $langs->trans(
"NA");
2615 print
'<td class="left">';
2618 if (($warehouse_selected_id > 0 && $product->stockable_product == Product::ENABLED_STOCK)) {
2620 $warehouseObject->fetch($warehouse_selected_id);
2621 print
img_warning() .
' ' . $langs->trans(
"NoProductToShipFoundIntoStock", $warehouseObject->label);
2623 if ($line->fk_product) {
2624 if ($product->stockable_product != Product::ENABLED_STOCK) {
2625 print
img_warning() .
' ' . $langs->trans(
'StockDisabled');
2627 print
img_warning() .
' ' . $langs->trans(
'StockTooLow');
2634 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
2643 } elseif (empty($reshook) && $line->special_code == SUBTOTALS_SPECIAL_CODE && !in_array($line->id, $title_lines_to_disable)) {
2644 require
dol_buildpath(
'/core/tpl/subtotalline_select.tpl.php');
2655 print $form->buttonsSaveCancel(
"Create");
2665 '@phan-var-force Expedition $object';
2671 $num_prod = count($lines);
2674 $typeobject =
$object->origin;
2676 $origin_id =
$object->origin_id;
2684 $res =
$object->fetch_optionals();
2692 if ($action ==
'delete') {
2693 $formquestion = array();
2695 $formquestion = array(
2697 'label' => $langs->trans(
'ShipmentIncrementStockOnDelete'),
2698 'name' =>
'alsoUpdateStock',
2699 'type' =>
'checkbox',
2704 $formconfirm = $form->formconfirm(
2705 $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id,
2706 $langs->trans(
'DeleteSending'),
2707 $langs->trans(
"ConfirmDeleteSending",
$object->ref),
2716 if ($action ==
'ask_subtotal_deleteline') {
2718 $langs->load(
"subtotals");
2719 $title =
"DeleteSubtotalLine";
2720 $question =
"ConfirmDeleteSubtotalLine";
2721 if (
GETPOST(
'type') ==
'title') {
2722 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2723 $title =
"DeleteTitleLine";
2724 $question =
"ConfirmDeleteTitleLine";
2726 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2730 if ($action ==
'valid') {
2731 $objectref = substr(
$object->ref, 1, 4);
2732 if ($objectref ==
'PROV') {
2733 $numref =
$object->getNextNumRef($soc);
2738 $text = $langs->trans(
"ConfirmValidateSending", $numref);
2740 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementWillBeRecorded") .
'.';
2742 $text .=
'<br>' .
img_picto(
'',
'movement',
'class="pictofixedwidth"') . $langs->trans(
"StockMovementNotYetRecorded") .
'.';
2746 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2749 $text .= $notify->confirmMessage(
'SHIPPING_VALIDATE',
$object->socid, $object);
2752 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $langs->trans(
'ValidateSending'), $text,
'confirm_valid',
'', 0, 1, 260);
2756 if ($action ==
'cancel') {
2757 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id, $langs->trans(
'CancelSending'), $langs->trans(
"ConfirmCancelSending",
$object->ref),
'confirm_cancel',
'', 0, 1);
2761 if ($action ==
'sign') {
2762 $text = $langs->trans(
'ConfirmSignShipping');
2764 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2767 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2772 'name' =>
'signed_status',
2773 'select_show_empty' => 0,
2774 'label' =>
'<span class="fieldrequired">' . $langs->trans(
'SignStatus') .
'</span>',
2775 'values' =>
$object->getSignedStatusLocalisedArray()
2777 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'SignShipping'), $text,
'confirm_sign', $formquestion, 0, 1);
2781 if ($action ==
'unsign') {
2782 $text = $langs->trans(
'ConfirmUnsignShipping');
2784 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2787 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid, $object);
2789 $formconfirm = $form->formconfirm(
dolBuildUrl($_SERVER[
"PHP_SELF"], [
'id' =>
$object->id]), $langs->trans(
'UnsignShipping'), $text,
'confirm_unsign',
'', 0, 1);
2793 $parameters = array(
'formConfirm' => $formconfirm);
2794 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
2795 if (empty($reshook)) {
2796 $formconfirm .= $hookmanager->resPrint;
2797 } elseif ($reshook > 0) {
2798 $formconfirm = $hookmanager->resPrint;
2806 $tmparray =
$object->getTotalWeightVolume();
2807 $totalWeight = $tmparray[
'weight'];
2808 $totalVolume = $tmparray[
'volume'];
2810 if (!empty($typeobject) && $typeobject ===
'commande' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2812 $objectsrc->fetch(
$object->origin_object->id);
2814 if (!empty($typeobject) && $typeobject ===
'propal' && is_object(
$object->origin_object) &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2816 $objectsrc->fetch(
$object->origin_object->id);
2820 $linkback =
'<a href="' . DOL_URL_ROOT .
'/expedition/list.php?restore_lastsearch_values=1' . (!empty($socid) ?
'&socid=' . $socid :
'') .
'">' . $langs->trans(
"BackToList") .
'</a>';
2821 $morehtmlref =
'<div class="refidno">';
2823 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
2824 $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);
2827 $morehtmlref .=
'<br>' .
$object->thirdparty->getNomUrl(1);
2830 if ($origin && $origin_id > 0) {
2832 $langs->load(
"projects");
2833 $morehtmlref .=
'<br>';
2835 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2836 if ($action !=
'classify') {
2837 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2839 $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');
2841 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
2843 $proj->fetch($objectsrc->fk_project);
2844 $morehtmlref .= $proj->getNomUrl(1);
2846 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2854 $langs->load(
"projects");
2855 $morehtmlref .=
'<br>';
2856 if ($permissiontoadd) {
2857 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2858 if ($action !=
'classify') {
2859 $morehtmlref .=
'<a class="editfielda" href="' . $_SERVER[
'PHP_SELF'] .
'?action=classify&token=' .
newToken() .
'&id=' .
$object->id .
'">' .
img_edit($langs->transnoentitiesnoconv(
'SetProject')) .
'</a> ';
2861 $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');
2863 if (!empty(
$object->fk_project)) {
2865 $proj->fetch(
$object->fk_project);
2866 $morehtmlref .= $proj->getNomUrl(1);
2868 $morehtmlref .=
'<span class="opacitymedium"> - ' .
dol_escape_htmltag($proj->title) .
'</span>';
2875 $morehtmlref .=
'</div>';
2876 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2878 print
'<div class="fichecenter">';
2879 print
'<div class="fichehalfleft">';
2880 print
'<div class="underbanner clearboth"></div>';
2882 print
'<table class="border tableforfield centpercent">';
2885 if (!empty($typeobject) && $typeobject ==
'commande' &&
$object->origin_object->id &&
isModEnabled(
'order')) {
2887 print $langs->trans(
"RefOrder") .
'</td>';
2889 print $objectsrc->getNomUrl(1,
'commande');
2893 if (!empty($typeobject) && $typeobject ==
'propal' &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
2895 print $langs->trans(
"RefProposal") .
'</td>';
2897 print $objectsrc->getNomUrl(1,
'expedition');
2903 print
'<tr><td class="titlefieldmiddle">' . $langs->trans(
"DateCreation") .
'</td>';
2908 print
'<tr><td height="10">';
2909 print
'<table class="nobordernopadding centpercent"><tr><td>';
2910 print $langs->trans(
'DateDeliveryPlanned');
2912 if ($action !=
'editdate_livraison') {
2913 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>';
2915 print
'</tr></table>';
2917 if ($action ==
'editdate_livraison') {
2918 print
'<form name="setdate_livraison" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2919 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2920 print
'<input type="hidden" name="action" value="setdate_livraison">';
2921 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
2922 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2931 print
'<tr><td height="10">';
2932 print
'<table class="nobordernopadding centpercent"><tr><td>';
2933 print $langs->trans(
'DateShipping');
2935 if ($action !=
'editdate_shipping') {
2936 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>';
2938 print
'</tr></table>';
2940 if ($action ==
'editdate_shipping') {
2941 print
'<form name="setdate_shipping" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
2942 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2943 print
'<input type="hidden" name="action" value="setdate_shipping">';
2944 print $form->selectDate(
$object->date_shipping ?
$object->date_shipping : -1,
'ship_', 1, 1, 0,
"setdate_shipping", 1, 0);
2945 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
2955 print $form->editfieldkey(
"Weight",
'trueWeight',
$object->trueWeight, $object, $user->hasRight(
'expedition',
'creer'));
2958 if ($action ==
'edittrueWeight') {
2959 print
'<form name="settrueweight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2960 print
'<input name="action" value="settrueWeight" type="hidden">';
2961 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2962 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2963 print
'<input id="trueWeight" name="trueWeight" value="' .
$object->trueWeight .
'" type="text" class="width50 valignmiddle">';
2964 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
$object->weight_units, 0, 2,
'maxwidth125 valignmiddle');
2965 print
' <input class="button smallpaddingimp valignmiddle" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
2966 print
' <input class="button button-cancel smallpaddingimp valignmiddle" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
2974 if ($totalWeight > 0) {
2975 if (!empty(
$object->trueWeight)) {
2976 print
' (' . $langs->trans(
"SumOfProductWeights") .
': ';
2979 if (!empty(
$object->trueWeight)) {
2986 print
'<tr><td>' . $form->editfieldkey(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2987 print $form->editfieldval(
"Width",
'trueWidth',
$object->trueWidth, $object, $user->hasRight(
'expedition',
'creer'));
2992 print
'<tr><td>' . $form->editfieldkey(
"Height",
'trueHeight',
$object->trueHeight, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
2993 if ($action ==
'edittrueHeight') {
2994 print
'<form name="settrueHeight" action="' . $_SERVER[
"PHP_SELF"] .
'" method="post">';
2995 print
'<input name="action" value="settrueHeight" type="hidden">';
2996 print
'<input name="id" value="' .
$object->id .
'" type="hidden">';
2997 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
2998 print
'<input id="trueHeight" name="trueHeight" value="' .
$object->trueHeight .
'" type="text" class="width50">';
2999 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
$object->size_units, 0, 2);
3000 print
' <input class="button smallpaddingimp" name="modify" value="' . $langs->trans(
"Modify") .
'" type="submit">';
3001 print
' <input class="button button-cancel smallpaddingimp" name="cancel" value="' . $langs->trans(
"Cancel") .
'" type="submit">';
3011 print
'<tr><td>' . $form->editfieldkey(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3012 print $form->editfieldval(
"Depth",
'trueDepth',
$object->trueDepth, $object, $user->hasRight(
'expedition',
'creer'));
3018 print $langs->trans(
"Volume");
3021 $calculatedVolume = 0;
3025 $volumeUnit =
$object->size_units * 3;
3028 if ($calculatedVolume > 0) {
3029 if ($volumeUnit < 50) {
3035 if ($totalVolume > 0) {
3036 if ($calculatedVolume) {
3037 print
' (' . $langs->trans(
"SumOfProductVolumes") .
': ';
3041 if ($calculatedVolume) {
3050 include DOL_DOCUMENT_ROOT .
'/core/tpl/extrafields_view.tpl.php';
3055 print
'<div class="fichehalfright">';
3056 print
'<div class="underbanner clearboth"></div>';
3058 print
'<table class="border centpercent tableforfield">';
3062 print
'<table class="nobordernopadding centpercent"><tr><td>';
3063 print $langs->trans(
'SendingMethod');
3066 if ($action !=
'editshipping_method_id' && $permissiontoadd) {
3067 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>';
3069 print
'</tr></table>';
3071 if ($action ==
'editshipping_method_id') {
3072 print
'<form name="setshipping_method_id" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'" method="post">';
3073 print
'<input type="hidden" name="token" value="' .
newToken() .
'">';
3074 print
'<input type="hidden" name="action" value="setshipping_method_id">';
3075 $object->fetch_delivery_methods();
3076 print $form->selectarray(
"shipping_method_id",
$object->meths,
$object->shipping_method_id, 1, 0, 0,
"", 1);
3078 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
3080 print
'<input type="submit" class="button button-edit smallpaddingimp" value="' . $langs->trans(
'Modify') .
'">';
3083 if (
$object->shipping_method_id > 0) {
3085 $code = $langs->getLabelFromKey(
$db, (
string)
$object->shipping_method_id,
'c_shipment_mode',
'rowid',
'code');
3086 print $langs->trans(
"SendingMethod" . strtoupper($code));
3093 print
'<tr><td class="titlefieldmiddle">' . $form->editfieldkey(
"TrackingNumber",
'tracking_number',
$object->tracking_number, $object, $user->hasRight(
'expedition',
'creer')) .
'</td><td>';
3094 print $form->editfieldval(
"TrackingNumber",
'tracking_number',
$object->tracking_url, $object, $user->hasRight(
'expedition',
'creer'),
'safehtmlstring',
$object->tracking_number);
3100 print
'<table class="nobordernopadding centpercent"><tr><td>';
3101 print $langs->trans(
'IncotermLabel');
3102 print
'<td><td class="right">';
3103 if ($permissiontoadd) {
3104 print
'<a class="editfielda" href="' . DOL_URL_ROOT .
'/expedition/card.php?id=' .
$object->id .
'&action=editincoterm&token=' .
newToken() .
'">' .
img_edit() .
'</a>';
3108 print
'</td></tr></table>';
3111 if ($action !=
'editincoterm') {
3112 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
3114 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'] .
'?id=' .
$object->id);
3120 $parameters = array();
3121 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
3122 print $hookmanager->resPrint;
3129 print
'<div class="clearboth"></div>';
3138 if (!empty(
$object->table_element_line)) {
3140 $result =
$object->getLinesArray();
3142 print
' <form name="addproduct" id="addproduct" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.(($action !=
'editline') ?
'' :
'#line_'.
GETPOSTINT(
'lineid')).
'" method="POST">
3143 <input type="hidden" name="token" value="' .
newToken().
'">
3144 <input type="hidden" name="action" value="' . (($action !=
'editline') ?
'addline' :
'updateline').
'">
3145 <input type="hidden" name="mode" value="">
3146 <input type="hidden" name="page_y" value="">
3147 <input type="hidden" name="id" value="' .
$object->id.
'">
3150 if (!empty(
$conf->use_javascript_ajax) &&
$object->status == 0) {
3151 include DOL_DOCUMENT_ROOT.
'/core/tpl/ajaxrow.tpl.php';
3154 print
'<div class="div-table-responsive-no-min">';
3155 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3156 print
'<table id="tablelines" class="noborder noshadow" width="100%">';
3164 if (
$object->status == 0 && $permissiontoadd && $action !=
'selectlines') {
3165 if ($action !=
'editline') {
3168 $parameters = array();
3169 $reshook = $hookmanager->executeHooks(
'formAddObjectLine', $parameters, $object, $action);
3173 if (empty($reshook)) {
3179 if (!empty(
$object->lines) || (
$object->status == $object::STATUS_DRAFT && $permissiontoadd && $action !=
'selectlines' && $action !=
'editline')) {
3190 if ($action ==
'editline') {
3191 print
' <form name="updateline" id="updateline" action="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&lineid=' . $line_id .
'" method="POST">
3192 <input type="hidden" name="token" value="' .
newToken() .
'">
3193 <input type="hidden" name="action" value="updateline">
3194 <input type="hidden" name="mode" value="">
3195 <input type="hidden" name="id" value="' .
$object->id .
'">
3200 include DOL_DOCUMENT_ROOT .
'/core/tpl/ajaxrow.tpl.php';
3203 print
'<div class="div-table-responsive-no-min">';
3204 print
'<table class="noborder centpercent" id="tablelines" >';
3206 print
'<tr class="liste_titre">';
3209 print
'<td width="5" class="center linecolnum"> </td>';
3212 print
'<td class="linecoldescription" >' . $langs->trans(
"Products") .
'</td>';
3214 print
'<td class="center linecolqty">' . $langs->trans(
"QtyOrdered") .
'</td>';
3215 if ($origin_id > 0) {
3216 print
'<td class="center linecolqtyinothershipments">' . $langs->trans(
"QtyInOtherShipments") .
'</td>';
3218 if ($action ==
'editline') {
3226 print
'<td class="center linecoleditlineotherinfo" colspan="' . $editColspan .
'">';
3228 print $langs->trans(
"QtyToShip");
3230 print $langs->trans(
"QtyShipped");
3233 print
' - ' . $langs->trans(
"WarehouseSource");
3236 print
' - ' . $langs->trans(
"Batch");
3241 print
'<td class="center linecolqtytoship">' . $langs->trans(
"QtyToShip") .
'</td>';
3243 print
'<td class="center linecolqtyshipped">' . $langs->trans(
"QtyShipped") .
'</td>';
3246 print
'<td class="left linecolwarehousesource">' . $langs->trans(
"WarehouseSource") .
'</td>';
3250 print
'<td class="left linecolbatch">' . $langs->trans(
"Batch") .
'</td>';
3253 print
'<td class="center linecolweight">' . $langs->trans(
"CalculatedWeight") .
'</td>';
3254 print
'<td class="center linecolvolume">' . $langs->trans(
"CalculatedVolume") .
'</td>';
3257 print
'<td class="linecoledit"></td>';
3258 print
'<td class="linecoldelete" width="10"></td>';
3259 print
'<td class="linecolmove"></td>';
3264 $outputlangs = $langs;
3269 if (
GETPOST(
'lang_id',
'aZ09')) {
3270 $newlang =
GETPOST(
'lang_id',
'aZ09');
3272 if (empty($newlang)) {
3273 $newlang =
$object->thirdparty->default_lang;
3275 if (!empty($newlang)) {
3277 $outputlangs->setDefaultLang($newlang);
3282 $alreadysent = array();
3283 if ($origin_id > 0) {
3284 $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";
3285 $sql .=
", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot";
3286 $sql .=
", e.rowid as shipment_id, e.ref as shipment_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_expedition";
3287 $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';
3288 $sql .=
', p.description as product_desc';
3289 $sql .=
" FROM " . MAIN_DB_PREFIX .
"expeditiondet as ed";
3290 $sql .=
", " . MAIN_DB_PREFIX .
"expedition as e";
3291 $sql .=
", " . MAIN_DB_PREFIX .
$db->sanitize((
string) $origin) .
"det as obj";
3292 $sql .=
" LEFT JOIN " . MAIN_DB_PREFIX .
"product as p ON obj.fk_product = p.rowid";
3293 $sql .=
" WHERE e.entity IN (" .
getEntity(
'expedition') .
")";
3294 $sql .=
" AND obj.fk_" .
$db->sanitize((
string) $origin) .
" = " . ((int) $origin_id);
3295 $sql .=
" AND obj.rowid = ed.fk_elementdet";
3296 $sql .=
" AND ed.fk_expedition = e.rowid";
3298 $sql .=
" ORDER BY obj.fk_product";
3300 dol_syslog(
"expedition/card.php get list of shipment lines", LOG_DEBUG);
3301 $resql =
$db->query($sql);
3303 $num =
$db->num_rows($resql);
3307 $obj =
$db->fetch_object($resql);
3310 $alreadysent[$obj->rowid][$obj->shipmentline_id] = array(
3311 'shipment_ref' => $obj->shipment_ref,
3312 'shipment_id' => $obj->shipment_id,
3313 'warehouse' => $obj->fk_entrepot,
3314 'qty_shipped' => $obj->qty_shipped,
3315 'product_tosell' => $obj->product_tosell,
3316 'product_tobuy' => $obj->product_tobuy,
3317 'product_tobatch' => $obj->product_tobatch,
3318 'date_valid' =>
$db->jdate($obj->date_valid),
3319 'date_delivery' =>
$db->jdate($obj->date_delivery));
3330 $conf->cache[
'product'] = array();
3331 $conf->cache[
'warehouse'] = array();
3332 for ($i = 0; $i < $num_prod; $i++) {
3333 $parameters = array(
'i' => $i,
'line' => $lines[$i],
'line_id' => $line_id,
'num' => $num_prod,
'alreadysent' => $alreadysent,
'editColspan' => !empty($editColspan) ? $editColspan : 0,
'outputlangs' => $outputlangs);
3334 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters, $object, $action);
3339 if (empty($reshook) && $lines[$i]->product_type !=
"9") {
3340 print
'<!-- origin line id = ' . $lines[$i]->origin_line_id .
' -->';
3341 print
'<tr class="oddeven" id="row-' . $lines[$i]->id .
'" data-id="' . $lines[$i]->id .
'" data-element="' . $lines[$i]->element .
'" >';
3343 $line->fetch_optionals();
3347 print
'<td class="center linecolnum">' . ($i + 1) .
'</td>';
3351 if ($lines[$i]->fk_product > 0) {
3354 $product_id = $lines[$i]->fk_product;
3355 if (!isset(
$conf->cache[
'product'][$product_id])) {
3357 $prod->fetch($product_id);
3358 $conf->cache[
'product'][$product_id] =
$prod;
3360 $prod =
$conf->cache[
'product'][$product_id];
3362 $label = (!empty(
$prod->multilangs[$outputlangs->defaultlang][
"label"])) ?
$prod->multilangs[$outputlangs->defaultlang][
"label"] : $lines[$i]->product_label;
3364 $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label);
3367 print
'<td class="linecoldescription">';
3370 $product_static->type = $lines[$i]->fk_product_type;
3371 $product_static->id = $lines[$i]->fk_product;
3372 $product_static->ref = $lines[$i]->ref;
3373 $product_static->status = $lines[$i]->product_tosell;
3374 $product_static->status_buy = $lines[$i]->product_tobuy;
3375 $product_static->status_batch = $lines[$i]->product_tobatch;
3377 $product_static->weight = $lines[$i]->weight;
3378 $product_static->weight_units = $lines[$i]->weight_units;
3379 $product_static->length = $lines[$i]->length;
3380 $product_static->length_units = $lines[$i]->length_units;
3381 $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0;
3382 $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0;
3383 $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0;
3384 $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0;
3385 $product_static->surface = $lines[$i]->surface;
3386 $product_static->surface_units = $lines[$i]->surface_units;
3387 $product_static->volume = $lines[$i]->volume;
3388 $product_static->volume_units = $lines[$i]->volume_units;
3389 $product_static->stockable_product = $lines[$i]->stockable_product;
3391 $text = $product_static->getNomUrl(1);
3392 $text .=
' - ' . $label;
3394 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
3395 print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start :
'', !empty($lines[$i]->date_end) ? $lines[$i]->date_end :
'');
3399 $lineExtrafieldsHtml = $line->showOptionals($extrafields, ($action ==
'editline' && $line->id == $line_id) ?
'edit' :
'view', array(),
'',
'',
'1',
'line');
3400 if (!empty($lineExtrafieldsHtml)) {
3401 print
'<div style="padding-top: 10px" id="extrafield_lines_area_' . $line->id .
'" name="extrafield_lines_area_' . $line->id .
'">';
3402 print $lineExtrafieldsHtml;
3407 print
'<td class="linecoldescription" >';
3409 $text =
img_object($langs->trans(
'Service'),
'service');
3411 $text =
img_object($langs->trans(
'Product'),
'product');
3414 if (!empty($lines[$i]->label)) {
3415 $text .=
' <strong>' . $lines[$i]->label .
'</strong>';
3416 print $form->textwithtooltip($text, $lines[$i]->
description, 3, 0,
'', (
string) $i);
3418 print $text .
' ' . nl2br($lines[$i]->
description);
3422 $lineExtrafieldsHtml = $line->showOptionals($extrafields, ($action ==
'editline' && $line->id == $line_id) ?
'edit' :
'view', array(),
'',
'',
'1',
'line');
3423 if (!empty($lineExtrafieldsHtml)) {
3424 print
'<div style="padding-top: 10px" id="extrafield_lines_area_' . $line->id .
'" name="extrafield_lines_area_' . $line->id .
'">';
3425 print $lineExtrafieldsHtml;
3437 print
'<td class="center linecolqty">' . $lines[$i]->qty_asked .
' ' . $unit_order .
'</td>';
3440 if ($origin_id > 0) {
3441 print
'<td class="linecolqtyinothershipments center nowrap">';
3443 $qtyalreadysent = 0;
3444 foreach ($alreadysent as $key => $val) {
3445 if ($lines[$i]->fk_elementdet == $key) {
3447 foreach ($val as $shipmentline_id => $shipmentline_var) {
3448 if ($shipmentline_var[
'shipment_id'] == $lines[$i]->fk_expedition) {
3454 $htmltooltip .=
'<br>';
3456 $shipment_static->fetch($shipmentline_var[
'shipment_id']);
3457 $htmltooltip .= $shipment_static->getNomUrl(1,
'', 0, 0, 1);
3458 $htmltooltip .=
' - ' . $shipmentline_var[
'qty_shipped'];
3459 $htmltooltip .=
' - ' . $langs->trans(
"DateValidation") .
' : ' . (empty($shipmentline_var[
'date_valid']) ? $langs->trans(
"Draft") :
dol_print_date($shipmentline_var[
'date_valid'],
'dayhour'));
3466 $qtyalreadysent += $shipmentline_var[
'qty_shipped'];
3469 $htmltooltip = $langs->trans(
"QtyInOtherShipments") .
'...<br><br>' . $htmltooltip .
'<br><input type="submit" name="dummyhiddenbuttontogetfocus" style="display:none" autofocus>';
3473 print $form->textwithpicto((
string) $qtyalreadysent, $htmltooltip, 1,
'info',
'', 0, 3,
'tooltip' . $lines[$i]->id);
3477 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3479 print
'<td colspan="' . $editColspan .
'" class="center"><table class="nobordernopadding centpercent">';
3480 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
3481 print
'<!-- case edit 1 -->';
3483 foreach ($lines[$i]->detail_batch as $detail_batch) {
3486 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>';
3488 if ($lines[$i]->entrepot_id == 0) {
3490 $line->fetch($detail_batch->fk_expeditiondet);
3492 $entrepot_id = !empty($detail_batch->entrepot_id) ? $detail_batch->entrepot_id : $lines[$i]->entrepot_id;
3493 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>';
3499 print
'<td><input class="qtyl" name="qtyl' . $line_id .
'_0" id="qtyl' . $line_id .
'_0" type="text" size="4" value="0"></td>';
3501 print
'<td>' . $formproduct->selectLotStock(
'',
'batchl' . $line_id .
'_0',
'', 1, 0, $lines[$i]->fk_product) .
'</td>';
3504 if ($lines[$i]->fk_product > 0) {
3505 if ($lines[$i]->entrepot_id > 0) {
3506 print
'<!-- case edit 2 -->';
3509 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>';
3511 print
'<td>' . $formproduct->selectWarehouses($lines[$i]->entrepot_id,
'entl' . $line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3515 print
' - ' . $langs->trans(
"NA");
3519 } elseif (count($lines[$i]->details_entrepot) > 1) {
3520 print
'<!-- case edit 3 -->';
3521 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3524 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>';
3526 print
'<td>' . $formproduct->selectWarehouses($detail_entrepot->entrepot_id,
'entl' . $detail_entrepot->line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200') .
'</td>';
3530 print
' - ' . $langs->trans(
"NA");
3536 print
'<!-- case edit 4 -->';
3539 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3540 print
'<td><span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span></td>';
3544 print
'<!-- case edit 5 -->';
3545 print
'<tr><td colspan="3">' . $langs->trans(
"ErrorStockIsNotEnough") .
'</td></tr>';
3548 print
'<!-- case edit 6 -->';
3551 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>';
3559 print
'<!-- case edit 7 -->';
3562 print
'<td><input class="qtyl right" name="qtyl' . $line_id .
'" id="qtyl' . $line_id .
'" type="text" size="4" value="' . $lines[$i]->qty_shipped .
'"></td>';
3570 print
'</table></td>';
3573 print
'<td class="linecolqtytoship center">' . $lines[$i]->qty_shipped .
' ' . $unit_order .
'</td>';
3577 print
'<td class="linecolwarehousesource tdoverflowmax200">';
3579 print
'<span class="opacitymedium">(' . $langs->trans(
"Service") .
')</span>';
3580 } elseif ($lines[$i]->entrepot_id > 0 && $lines[$i]->stockable_product == Product::ENABLED_STOCK) {
3581 $warehouse_id = $lines[$i]->entrepot_id;
3582 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3584 $warehouse->fetch($warehouse_id);
3585 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3587 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3589 print $warehouse->getNomUrl(1);
3590 } elseif (count($lines[$i]->details_entrepot) > 1) {
3592 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
3593 $warehouse_id = $detail_entrepot->entrepot_id;
3594 if ($warehouse_id > 0) {
3595 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3597 $warehouse->fetch($warehouse_id);
3598 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
3600 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3602 $detail .= $langs->trans(
"DetailWarehouseFormat", $warehouse->label, $detail_entrepot->qty_shipped) .
'<br>';
3605 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
"DetailWarehouseNumber"), $detail);
3606 } elseif (count($lines[$i]->detail_children ?? []) > 1) {
3608 foreach ($lines[$i]->detail_children as $child_product_id => $child_stock_list) {
3609 foreach ($child_stock_list as $warehouse_id => $total_qty) {
3611 $child_product_label =
'';
3612 if (!isset(
$conf->cache[
'product'][$child_product_id])) {
3614 $child_product->fetch($child_product_id);
3615 $conf->cache[
'product'][$child_product_id] = $child_product;
3617 $child_product =
$conf->cache[
'product'][$child_product_id];
3619 $child_product_label = $child_product->ref .
' ' . $child_product->label;
3622 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
3624 $child_warehouse->fetch($warehouse_id);
3625 $conf->cache[
'warehouse'][$warehouse_id] = $child_warehouse;
3627 $child_warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
3629 $detail .= $langs->trans(
'DetailChildrenFormat', $child_product_label, $child_warehouse->label,
price2num($total_qty,
'MS')) .
'<br>';
3632 print $form->textwithtooltip(
img_picto(
'',
'object_stock') .
' ' . $langs->trans(
'DetailWarehouseNumber'), $detail);
3639 if (isset($lines[$i]->detail_batch)) {
3640 print
'<!-- Detail of lot -->';
3641 print
'<td class="linecolbatch">';
3642 if ($lines[$i]->product_tobatch) {
3644 foreach ($lines[$i]->detail_batch as $dbatch) {
3645 $detail .= $langs->trans(
"Batch") .
': ' . $dbatch->batch;
3647 $detail .=
' - ' . $langs->trans(
"SellByDate") .
': ' .
dol_print_date($dbatch->sellby,
"day");
3650 $detail .=
' - ' . $langs->trans(
"EatByDate") .
': ' .
dol_print_date($dbatch->eatby,
"day");
3652 $detail .=
' - ' . $langs->trans(
"Qty") .
': ' . $dbatch->qty;
3655 print $form->textwithtooltip(
img_picto(
'',
'object_barcode') .
' ' . $langs->trans(
"DetailBatchNumber"), $detail);
3657 print $langs->trans(
"NA");
3661 print
'<td class="linecolbatch" ></td>';
3667 print
'<td class="center linecolweight">';
3669 print $lines[$i]->weight * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"weight", $lines[$i]->weight_units);
3676 print
'<td class="center linecolvolume">';
3678 print $lines[$i]->volume * $lines[$i]->qty_shipped .
' ' .
measuringUnitString(0,
"volume", $lines[$i]->volume_units);
3689 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
3690 print
'<td class="center" colspan="2" valign="middle">';
3691 print
'<input type="submit" class="button button-save" id="savelinebutton marginbottomonly" name="save" value="' . $langs->trans(
"Save") .
'"><br>';
3692 print
'<input type="submit" class="button button-cancel" id="cancellinebutton" name="cancel" value="' . $langs->trans(
"Cancel") .
'"><br>';
3695 print
'<td class="linecolmove tdlineupdown center"></td>';
3697 } elseif ($showmovecol) {
3698 $edit_url = $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=editline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id;
3700 $product_id = $lines[$i]->fk_product;
3701 if (!isset(
$conf->cache[
'product'][$product_id])) {
3703 $product->fetch($product_id);
3704 $conf->cache[
'product'][$product_id] = $product;
3706 $product =
$conf->cache[
'product'][$product_id];
3709 if ($product->hasFatherOrChild(1)) {
3715 print
'<td class="linecoledit center">';
3716 print
'<a class="editfielda reposition" href="' . $edit_url .
'">' .
img_edit() .
'</a>';
3718 print
'<td class="linecoldelete" width="10">';
3719 print
'<a class="reposition" href="' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id .
'&action=deleteline&token=' .
newToken() .
'&lineid=' . $lines[$i]->id .
'">' .
img_delete() .
'</a>';
3721 print
'<td class="linecolmove tdlineupdown center">';
3722 if ($usercancreate && $num_prod > 1) {
3724 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>';
3726 if ($i < $num_prod - 1) {
3727 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>';
3732 if (!empty($rowExtrafieldsStart)) {
3733 print $rowExtrafieldsStart;
3734 print $rowExtrafieldsView;
3739 } elseif (empty($reshook) && $lines[$i]->product_type ==
"9") {
3741 $objectsrc->fetch($lines[$i]->origin_line_id);
3742 if ($objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) {
3744 require
dol_buildpath(
'/core/tpl/subtotal_expedition_view.tpl.php');
3749 if (empty($num_prod)) {
3750 print
'<tr><td colspan="8"><span class="opacitymedium">' . $langs->trans(
"NoLineGoOnTabToAddSome", $langs->transnoentitiesnoconv(
"ShipmentDistribution")) .
'</span></td></tr>';
3756 if ($action ==
'editline') {
3767 if (($user->socid == 0) && ($action !=
'presend')) {
3768 print
'<div class="tabsAction">';
3770 $parameters = array();
3771 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
3773 if (empty($reshook)) {
3775 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
3776 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate'))
3780 print
dolGetButtonAction($langs->trans(
'NotAllowed'), $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3786 if ($user->hasRight(
'expedition',
'creer')) {
3791 if ($user->hasRight(
'expedition',
'creer')) {
3797 if (empty($user->socid)) {
3799 if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'expedition',
'shipping_advance',
'send')) {
3800 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"] .
'?action=presend&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3802 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
'PHP_SELF'] .
'#',
'',
false);
3810 print
dolGetButtonAction(
'', $langs->trans(
'CreateDeliveryOrder'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=create_delivery&token=' .
newToken() .
'&id=' .
$object->id,
'');
3815 if (
$object->signed_status != Expedition::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
3816 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>';
3818 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>';
3824 if ($user->hasRight(
'facture',
'creer')) {
3826 print
dolGetButtonAction(
'', $langs->trans(
'CreateBill'),
'default', DOL_URL_ROOT .
'/compta/facture/card.php?action=create&origin=' .
$object->element .
'&originid=' .
$object->id .
'&socid=' .
$object->socid,
'');
3833 if ($user->hasRight(
'expedition',
'creer') &&
$object->status > 0) {
3835 print
dolGetButtonAction(
'', $langs->trans(
'ClassifyBilled'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifybilled&token=' .
newToken() .
'&id=' .
$object->id,
'');
3837 print
dolGetButtonAction(
'', $langs->trans(
"Close"),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifyclosed&token=' .
newToken() .
'&id=' .
$object->id,
'');
3843 if ($user->hasRight(
'expedition',
'creer')) {
3844 print
dolGetButtonAction(
'', $langs->trans(
'Cancel'),
'danger', $_SERVER[
"PHP_SELF"] .
'?action=cancel&token=' .
newToken() .
'&id=' .
$object->id .
'&mode=init#formmailbeforetitle',
'');
3849 if ($user->hasRight(
'expedition',
'supprimer')) {
3862 if ($action !=
'presend' && $action !=
'editline') {
3863 print
'<div class="fichecenter"><div class="fichehalfleft">';
3866 $filedir =
$conf->expedition->dir_output .
"/sending/" . $objectref;
3868 $urlsource = $_SERVER[
"PHP_SELF"] .
"?id=" .
$object->id;
3870 $genallowed = $user->hasRight(
'expedition',
'lire');
3871 $delallowed = $user->hasRight(
'expedition',
'creer');
3873 print $formfile->showdocuments(
'expedition', $objectref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $soc->default_lang);
3877 $tmparray = $form->showLinkToObjectBlock($object, array(), array(
'shipping'), 1);
3878 $linktoelem = $tmparray[
'linktoelem'];
3879 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3880 print $htmltoenteralink;
3882 $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem);
3888 print
'<br><!-- Link to sign -->';
3889 require_once DOL_DOCUMENT_ROOT .
'/core/lib/signature.lib.php';
3890 print showOnlineSignatureUrl(
'expedition',
$object->ref, $object) .
'<br>';
3893 print
'</div><div class="fichehalfright">';
3897 include_once DOL_DOCUMENT_ROOT .
'/core/class/html.formactions.class.php';
3902 $morehtmlcenter =
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT .
'/expedition/messaging.php?id=' .
$object->id);
3904 $somethingshown = $formactions->showactions($object,
'shipping', $socid, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
3905 print
'</div></div>';
3914 if (
GETPOST(
'modelselected')) {
3915 $action =
'presend';
3919 $modelmail =
'shipping_send';
3920 $defaulttopic =
'SendShippingRef';
3921 $diroutput =
$conf->expedition->dir_output .
'/sending';
3922 $trackid =
'shi' .
$object->id;
3924 include DOL_DOCUMENT_ROOT .
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage customers orders.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
const STATUS_DRAFT
Draft status.
const STATUS_CANCELED
Canceled status.
const STATUS_CLOSED
Closed status -> parcel was received by customer / end of process prev status : validated or shipment...
const STATUS_VALIDATED
Validated status -> parcel is ready to be sent prev status : draft next status : closed or shipment_i...
Class to manage lines of shipment.
CRUD class for batch number management within shipment.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class to manage order lines.
Class ProductCombination Used to represent the relation between a product and one of its variants.
Class to manage products or services.
const DISABLED_STOCK
Stockable product.
const TYPE_PRODUCT
Regular product.
const TYPE_SERVICE
Service.
Manage record for batch number management.
Class with list of lots and properties.
Class to manage projects.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
getCountry($searchkey, $withcode='', $dbtouse=null, $outputlangs=null, $entconv=1, $searchlabel='')
Return country label, code or id from an id, code or label.
print $script_file $mode $langs defaultlang(is_numeric($duration_value) ? " delay=". $duration_value :"").(is_numeric($duration_value2) ? " after cd cd cd description as description
Only used if Module[ID]Desc translation string is not found.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dolBuildUrl($url, $params=[], $addtoken=false, $anchor='')
Return path of url.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $allowothertags=array())
Show a picto called object_picto (generic function)
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
img_down($titlealt='default', $selected=0, $moreclass='')
Show down arrow logo.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
showDimensionInBestUnit($dimension, $unit, $type, $outputlangs, $round=-1, $forceunitoutput='no', $use_short_label=0)
Output a dimension with best unit.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
dol_htmlcleanlastbr($stringtodecode)
This function remove all ending and br at end.
dol_concatdesc($text1, $text2, $forxml=false, $invert=false)
Concat 2 descriptions with a new line between them (second operand after first one with appropriate n...
dolPrintHTMLForAttribute($s, $escapeonlyhtmltags=0, $allowothertags=array())
Return a string ready to be output into an HTML attribute (alt, title, data-html, ....
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
img_up($titlealt='default', $selected=0, $moreclass='')
Show top arrow logo.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='', $textonpictotooltip='', $cssfordropdown='info_admin')
Show information in HTML for admin users or standard users.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
getEntity($element, $shared=1, $currentobject=null)
Get list of entity id to use.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
measuringUnitString($unitid, $measuring_style='', $unitscale=null, $use_short_label=0, $outputlangs=null)
Return translation label of a unit key.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
shipping_prepare_head($object)
Prepare array with list of tabs.