40require
'../main.inc.php';
41require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/expedition/class/expedition.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/core/lib/product.lib.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/lib/sendings.lib.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/class/extrafields.class.php';
49require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
50require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
51require_once DOL_DOCUMENT_ROOT.
'/commande/class/commande.class.php';
52if (isModEnabled(
"product") || isModEnabled(
"service")) {
53 require_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
55if (isModEnabled(
"propal")) {
56 require_once DOL_DOCUMENT_ROOT.
'/comm/propal/class/propal.class.php';
58if (isModEnabled(
'productbatch')) {
59 require_once DOL_DOCUMENT_ROOT.
'/product/class/productbatch.class.php';
61if (isModEnabled(
'project')) {
62 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
63 require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
75$langs->loadLangs(array(
"sendings",
"companies",
"bills",
'deliveries',
'orders',
'stocks',
'other',
'propal',
'productbatch'));
77if (isModEnabled(
'incoterm')) {
78 $langs->load(
'incoterm');
80if (isModEnabled(
'productbatch')) {
81 $langs->load(
'productbatch');
84$origin =
GETPOST(
'origin',
'alpha') ?
GETPOST(
'origin',
'alpha') :
'expedition';
87if (empty($origin_id)) {
90if (empty($origin_id)) {
97$action =
GETPOST(
'action',
'alpha');
98$confirm =
GETPOST(
'confirm',
'alpha');
99$cancel =
GETPOST(
'cancel',
'alpha');
111$extrafields->fetch_name_optionals_label(
$object->table_element);
112$extrafields->fetch_name_optionals_label(
$object->table_element_line);
113$extrafields->fetch_name_optionals_label($objectorder->table_element_line);
116include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
119$hookmanager->initHooks(array(
'expeditioncard',
'globalcard'));
125if ($id > 0 || !empty($ref)) {
133 $socid = $user->socid;
138$permissiondellink = $user->hasRight(
'expedition',
'delivery',
'creer');
139$permissiontoadd = $user->hasRight(
'expedition',
'creer');
140$permissiontoeditextra = $permissiontoadd;
141if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
143 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
146$upload_dir =
$conf->expedition->dir_output.
'/sending';
158$parameters = array();
159$reshook = $hookmanager->executeHooks(
'doActions', $parameters,
$object, $action);
164if (empty($reshook)) {
166 if ($origin && $origin_id > 0) {
167 if ($origin ==
'commande') {
168 header(
"Location: ".DOL_URL_ROOT.
'/expedition/shipment.php?id='.((
int) $origin_id));
177 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
180 include DOL_DOCUMENT_ROOT.
'/core/actions_builddoc.inc.php';
183 if ($action ==
'setdraft' && $permissiontoadd) {
185 $result =
$object->setDraft($user, 0);
189 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
194 if ($action ==
'reopen' && $permissiontoadd) {
200 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
206 if ($action ==
'set_incoterms' && isModEnabled(
'incoterm') && $permissiontoadd) {
210 if ($action ==
'setref_customer' && $permissiontoadd) {
216 $result =
$object->setValueFrom(
'ref_customer',
GETPOST(
'ref_customer',
'alpha'),
'',
null,
'text',
'', $user,
'SHIPPING_MODIFY');
219 $action =
'editref_customer';
221 header(
"Location: ".$_SERVER[
'PHP_SELF'].
"?id=".
$object->id);
226 if ($action ==
'update_extras' && $permissiontoeditextra) {
229 $attribute_name =
GETPOST(
'attribute',
'aZ09');
232 $ret = $extrafields->setOptionalsFromPost(
null,
$object, $attribute_name);
239 $result =
$object->updateExtraField($attribute_name,
'SHIPPING_MODIFY');
247 $action =
'edit_extras';
252 if ($action ==
'add' && $permissiontoadd) {
256 $object->origin_type = $origin;
257 $object->origin_id = $origin_id;
272 $classname = ucfirst(
$object->origin_type);
273 $objectsrc =
new $classname($db);
274 '@phan-var-force Facture|Commande $objectsrc';
275 $objectsrc->fetch(
$object->origin_id);
277 $object->socid = $objectsrc->socid;
280 $object->date_delivery = $date_delivery;
281 $object->date_shipping = $date_shipping;
282 $object->fk_delivery_address = $objectsrc->fk_delivery_address;
289 $object->location_incoterms =
GETPOST(
'location_incoterms',
'alpha');
291 $batch_line = array();
292 $stockLine = array();
293 $array_options = array();
295 $num = count($objectsrc->lines);
298 $product_batch_used = array();
300 for ($i = 0; $i < $num; $i++) {
308 $batch =
"batchl".$i.
"_0";
309 $stockLocation =
"ent1".$i.
"_0";
312 $is_batch_or_serial = 0;
313 if (!empty($objectsrc->lines[$i]->fk_product)) {
314 $resultFetch = $product->fetch($objectsrc->lines[$i]->fk_product,
'',
'',
'', 1, 1, 1);
315 if ($resultFetch < 0) {
318 $is_batch_or_serial = $product->status_batch;
322 if (isModEnabled(
'productbatch') && $objectsrc->lines[$i]->product_tobatch) {
323 if (GETPOSTISSET($batch)) {
326 while (GETPOSTISSET($batch)) {
329 $sub_qty[$j][
'id_batch'] =
GETPOSTINT($batch);
330 $subtotalqty += $sub_qty[$j][
'q'];
332 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)))) {
333 setEventMessages($langs->trans(
"TooManyQtyForSerialNumber", $product->ref,
''),
null,
'errors');
338 if ($is_batch_or_serial == 2 && $sub_qty[$j][
'q'] > 0) {
340 $product_batch_used[$j] = $sub_qty[$j][
'id_batch'];
344 $batch =
"batchl".$i.
"_".$j;
345 $qty =
"qtyl".$i.
'_'.$j;
348 $batch_line[$i][
'detail'] = $sub_qty;
349 $batch_line[$i][
'qty'] = $subtotalqty;
352 $totalqty += $subtotalqty;
359 setEventMessages($langs->trans(
"StockIsRequiredToChooseWhichLotToUse").
' ('.$langs->trans(
"Line").
' '.
GETPOSTINT($idl).
')',
null,
'errors');
363 } elseif (GETPOSTISSET($stockLocation)) {
366 while (GETPOSTISSET($stockLocation)) {
369 $stockLine[$i][$j][
'warehouse_id'] =
GETPOSTINT($stockLocation);
370 $stockLine[$i][$j][
'ix_l'] =
GETPOSTINT($idl);
376 $stockLocation =
"ent1".$i.
"_".$j;
377 $qty =
"qtyl".$i.
'_'.$j;
388 if (
getDolGlobalInt(
"MAIN_DONT_SHIP_MORE_THAN_ORDERED") && $subtotalqty > $objectsrc->lines[$i]->qty) {
389 setEventMessages($langs->trans(
"ErrorTooMuchShipped", $i + 1),
null,
'errors');
395 $array_options[$i] = $extrafields->getOptionalsFromPost(
$object->table_element_line, (
string) $i);
397 if (isset($extrafields->attributes[
$object->table_element_line][
'label']) && is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
399 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
400 unset($_POST[
"options_".$key]);
405 if (($totalqty > 0 ||
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS')) && !$error) {
406 $selected_subtotal_lines =
GETPOST(
'subtotal_toselect',
'array');
407 for ($i = 0; $i < $num; $i++) {
410 if (!isset($batch_line[$i])) {
412 if (isset($stockLine[$i])) {
414 $nbstockline = count($stockLine[$i]);
415 for ($j = 0; $j < $nbstockline; $j++) {
416 if ($stockLine[$i][$j][
'qty'] > 0 || ($stockLine[$i][$j][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
417 $ret =
$object->addline($stockLine[$i][$j][
'warehouse_id'], $stockLine[$i][$j][
'ix_l'], (
float) $stockLine[$i][$j][
'qty'], $array_options[$i]);
429 if ($entrepot_id < 0) {
432 if (!($objectsrc->lines[$i]->fk_product > 0)) {
442 if (isModEnabled(
'subtotals') && $objectsrc->lines[$i]->special_code == SUBTOTALS_SPECIAL_CODE && in_array($objectsrc->lines[$i]->id, $selected_subtotal_lines)) {
443 $object->addSubtotalLine($langs, $objectsrc->lines[$i]->desc, (
int) $objectsrc->lines[$i]->qty, $objectsrc->lines[$i]->extraparams, $objectsrc->lines[$i]->id);
448 if ($batch_line[$i][
'qty'] > 0 || ($batch_line[$i][
'qty'] == 0 &&
getDolGlobalString(
'SHIPMENT_GETS_ALL_ORDER_PRODUCTS'))) {
449 $origin_line_id = (int) $batch_line[$i][
'ix_l'];
451 $res = $origin_line->fetch($origin_line_id);
456 $ret =
$object->addline_batch($batch_line[$i], $array_options[$i], $origin_line);
465 $ret = $extrafields->setOptionalsFromPost(
null,
$object);
478 $labelfieldmissing = $langs->transnoentitiesnoconv(
"QtyToShip");
479 if (isModEnabled(
'stock')) {
480 $labelfieldmissing .=
'/'.$langs->transnoentitiesnoconv(
"Warehouse");
482 setEventMessages($langs->trans(
"ErrorFieldRequired", $labelfieldmissing),
null,
'errors');
489 foreach (
$object->lines as $line) {
490 $objectsrc_line =
new $objectsrc->class_element_line($db);
491 '@phan-var-force CommonObjectLine $objectsrc_line';
492 $objectsrc_line->fetch($line->origin_line_id);
493 $line->extraparams = $objectsrc_line->extraparams;
494 $line->setExtraParameters();
496 header(
"Location: card.php?id=".
$object->id);
503 } elseif ($action ==
'create_delivery' &&
getDolGlobalInt(
'MAIN_SUBMODULE_DELIVERY') && $user->hasRight(
'expedition',
'delivery',
'creer')) {
507 $result =
$object->create_delivery($user);
511 header(
"Location: ".DOL_URL_ROOT.
'/delivery/card.php?action=create_delivery&token='.
newToken().
'&id='.$result);
518 } elseif ($action ==
'confirm_valid' && $confirm ==
'yes' && ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
519 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate')))
523 $result =
$object->valid($user);
530 $outputlangs = $langs;
533 $newlang =
GETPOST(
'lang_id',
'aZ09');
536 $newlang =
$object->thirdparty->default_lang;
538 if (!empty($newlang)) {
540 $outputlangs->setDefaultLang($newlang);
545 $result =
$object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref);
551 } elseif ($action ==
'confirm_cancel' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'supprimer')) {
552 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
553 $result =
$object->cancel(0, (
bool) $also_update_stock);
555 $result =
$object->setStatut(-1);
559 } elseif ($action ==
'confirm_delete' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'supprimer')) {
560 $also_update_stock = (
GETPOST(
'alsoUpdateStock',
'alpha') ? 1 : 0);
561 $result =
$object->delete($user, 0, (
bool) $also_update_stock);
563 header(
"Location: ".DOL_URL_ROOT.
'/expedition/index.php');
577 } elseif ($action ==
'confirm_delete_subtotalline' && $confirm ==
'yes' && $permissiontoadd) {
578 $result =
$object->deleteSubtotalLine($langs,
GETPOSTINT(
'lineid'), (
bool)
GETPOST(
'deletecorrespondingsubtotalline'), $user);
581 $object->line_order(
true,
'ASC',
false);
583 $outputlangs = $langs;
586 $newlang =
GETPOST(
'lang_id',
'aZ09');
589 $newlang =
$object->thirdparty->default_lang;
591 if (!empty($newlang)) {
593 $outputlangs->setDefaultLang($newlang);
597 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
600 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
605 } elseif ($action ==
'confirm_sign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
606 $result =
$object->setSignedStatus($user,
GETPOSTINT(
'signed_status'), 0,
'SHIPPING_MODIFY');
608 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
613 } elseif ($action ==
'confirm_unsign' && $confirm ==
'yes' && $user->hasRight(
'expedition',
'creer')) {
614 $result =
$object->setSignedStatus($user, Expedition::$SIGNED_STATUSES[
'STATUS_NO_SIGNATURE'], 0,
'SHIPPING_MODIFY');
616 header(
'Location: ' . $_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id);
621 } elseif ($action ==
'setdate_livraison' && $user->hasRight(
'expedition',
'creer')) {
625 $result =
$object->setDeliveryDate($user, $datedelivery);
629 } elseif ($action ==
'setdate_shipping' && $user->hasRight(
'expedition',
'creer')) {
633 $result =
$object->setShippingDate($user, $dateshipping);
637 } elseif (in_array($action, array(
'settracking_number',
'settracking_url',
'settrueWeight',
'settrueWidth',
'settrueHeight',
'settrueDepth',
'setshipping_method_id')) && $user->hasRight(
'expedition',
'creer')) {
641 if ($action ==
'settracking_number') {
642 $object->tracking_number = trim(
GETPOST(
'tracking_number',
'alpha'));
644 if ($action ==
'settracking_url') {
645 $object->tracking_url = trim(
GETPOST(
'tracking_url',
'restricthtml'));
648 if ($action ==
'settrueWeight') {
652 if ($action ==
'settrueWidth') {
655 if ($action ==
'settrueHeight') {
659 if ($action ==
'settrueDepth') {
662 if ($action ==
'setshipping_method_id') {
667 if (
$object->update($user) >= 0) {
668 header(
"Location: card.php?id=".
$object->id);
675 } elseif ($action ==
'classifybilled' && $permissiontoadd) {
677 $result =
$object->setBilled();
679 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
683 } elseif ($action ==
'classifyclosed' && $permissiontoadd) {
685 $result =
$object->setClosed();
687 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
691 } elseif ($action ==
'deleteline' && !empty($line_id) && $permissiontoadd) {
696 $line->fk_expedition =
$object->id;
698 $num_prod = count($lines);
699 for ($i = 0; $i < $num_prod; $i++) {
700 if ($lines[$i]->
id == $line_id) {
701 if (count($lines[$i]->details_entrepot) > 1) {
703 foreach ($lines[$i]->details_entrepot as $details_entrepot) {
704 $line->id = $details_entrepot->line_id;
705 if (!$error && $line->delete($user) < 0) {
711 $line->id = $line_id;
712 if (!$error && $line->delete($user) < 0) {
717 unset($_POST[
"lineid"]);
721 header(
'Location: '.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
726 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'save')) {
733 $num_prod = count($lines);
734 for ($i = 0; $i < $num_prod; $i++) {
735 if ($lines[$i]->
id == $line_id) {
736 $update_done =
false;
738 $line->fk_expedition =
$object->id;
741 $line->array_options = $extrafields->getOptionalsFromPost(
$object->table_element_line);
743 if (is_array($extrafields->attributes[
$object->table_element_line][
'label'])) {
744 foreach ($extrafields->attributes[
$object->table_element_line][
'label'] as $key => $value) {
745 unset($_POST[
"options_".$key]);
748 $line->fk_product = $lines[$i]->fk_product;
749 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
751 foreach ($lines[$i]->detail_batch as $detail_batch) {
753 $batch =
"batchl".$detail_batch->fk_expeditiondet.
"_".$detail_batch->fk_origin_stock;
754 $qty =
"qtyl".$detail_batch->fk_expeditiondet.
'_'.$detail_batch->id;
757 if (!empty($batch_id)) {
758 if ($lotStock->fetch($batch_id) > 0 && $line->fetch($detail_batch->fk_expeditiondet) > 0) {
759 if ($lines[$i]->entrepot_id != 0) {
761 $line->entrepot_id = $lotStock->warehouseid;
765 if (empty($line->detail_batch)) {
766 $line->detail_batch =
new stdClass();
769 $line->detail_batch->fk_origin_stock = $batch_id;
770 $line->detail_batch->batch = $lotStock->batch;
771 $line->detail_batch->id = $detail_batch->id;
772 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
773 $line->detail_batch->qty = $batch_qty;
774 if ($line->update($user) < 0) {
785 unset($_POST[$batch]);
790 $batch =
"batchl".$line_id.
"_0";
791 $qty =
"qtyl".$line_id.
"_0";
795 if ($batch_qty > 0 && !empty($batch_id)) {
796 if ($lotStock->fetch($batch_id) > 0) {
798 if ($lines[$i]->entrepot_id > 0) {
800 if ($lines[$i]->entrepot_id == $lotStock->warehouseid) {
801 $lineIdToAddLot = $line_id;
803 } elseif (count($lines[$i]->details_entrepot) > 1) {
805 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
806 if ($detail_entrepot->entrepot_id == $lotStock->warehouseid) {
807 $lineIdToAddLot = $detail_entrepot->line_id;
811 if ($lineIdToAddLot) {
813 if ($line->fetch($lineIdToAddLot) > 0) {
814 $line->detail_batch->fk_origin_stock = $batch_id;
815 $line->detail_batch->batch = $lotStock->batch;
816 $line->detail_batch->entrepot_id = $lotStock->warehouseid;
817 $line->detail_batch->qty = $batch_qty;
818 if ($line->update($user) < 0) {
830 $line->origin_line_id = $lines[$i]->origin_line_id;
831 $line->entrepot_id = $lotStock->warehouseid;
833 $line->detail_batch[0]->fk_origin_stock = $batch_id;
834 $line->detail_batch[0]->batch = $lotStock->batch;
835 $line->detail_batch[0]->entrepot_id = $lotStock->warehouseid;
836 $line->detail_batch[0]->qty = $batch_qty;
837 if (
$object->create_line_batch($line, $line->array_options) < 0) {
850 if ($lines[$i]->fk_product > 0) {
852 if ($lines[$i]->entrepot_id == 0) {
854 $stockLocation =
"entl".$line_id;
855 $qty =
"qtyl".$line_id;
856 $line->id = $line_id;
857 $line->entrepot_id =
GETPOSTINT((
string) $stockLocation);
859 if ($line->update($user) < 0) {
863 unset($_POST[$stockLocation]);
865 } elseif ($lines[$i]->entrepot_id > 0) {
867 $stockLocation =
"entl".$line_id;
868 $qty =
"qtyl".$line_id;
869 $line->id = $line_id;
870 $line->entrepot_id =
GETPOSTINT($stockLocation);
872 if ($line->update($user) < 0) {
876 unset($_POST[$stockLocation]);
878 } elseif (count($lines[$i]->details_entrepot) > 1) {
880 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
882 $stockLocation =
"entl".$detail_entrepot->line_id;
883 $qty =
"qtyl".$detail_entrepot->line_id;
885 if (!empty($warehouse)) {
886 $line->id = $detail_entrepot->line_id;
887 $line->entrepot_id = $warehouse;
889 if ($line->update($user) < 0) {
896 unset($_POST[$stockLocation]);
900 } elseif (!isModEnabled(
'stock') && empty(
$conf->productbatch->enabled)) {
901 $qty =
"qtyl".$line_id;
902 $line->id = $line_id;
904 $line->entrepot_id = 0;
905 if ($line->update($user) < 0) {
915 $qty =
"qtyl".$line_id;
916 $line->id = $line_id;
918 $line->entrepot_id = 0;
919 if ($line->update($user) < 0) {
929 if (empty($update_done)) {
930 $line->id = $lines[$i]->id;
931 $line->insertExtraFields();
936 unset($_POST[
"lineid"]);
941 $outputlangs = $langs;
944 $newlang =
GETPOST(
'lang_id',
'aZ09');
947 $newlang =
$object->thirdparty->default_lang;
949 if (!empty($newlang)) {
951 $outputlangs->setDefaultLang($newlang);
955 $object->generateDocument(
$object->model_pdf, $outputlangs, $hidedetails, $hidedesc, $hideref);
958 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
961 } elseif ($action ==
'updateline' && $permissiontoadd &&
GETPOST(
'cancel',
'alpha') == $langs->trans(
"Cancel")) {
962 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
966 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
972 $triggersendname =
'SHIPPING_SENTBYMAIL';
974 $autocopy =
'MAIN_MAIL_AUTOCOPY_SHIPMENT_TO';
975 $mode =
'emailfromshipment';
976 $trackid =
'shi'.$object->id;
977 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
985$title =
$object->ref.
' - '.$langs->trans(
"Shipment");
986if ($action ==
'create2') {
987 $title = $langs->trans(
"CreateShipment");
989$help_url =
'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Expediciones|DE:Modul_Lieferungen';
991llxHeader(
'', $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-expedition page-card');
997$form =
new Form($db);
1000if (isModEnabled(
'project')) {
1003 $formproject =
null;
1006$product_static =
new Product($db);
1008$warehousestatic =
new Entrepot($db);
1010if ($action ==
'create2') {
1013 print
'<br>'.$langs->trans(
"ShipmentCreationIsDoneFromOrder");
1020if ($action ==
'create') {
1030 $classname = ucfirst($origin);
1032 $object =
new $classname($db);
1034 '@phan-var-force Commande|Facture $object';
1036 if (
$object->fetch($origin_id)) {
1040 $author =
new User($db);
1041 $author->fetch(
$object->user_author_id);
1043 if (isModEnabled(
'stock')) {
1047 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
1048 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1049 print
'<input type="hidden" name="action" value="add">';
1050 print
'<input type="hidden" name="origin" value="'.$origin.
'">';
1051 print
'<input type="hidden" name="origin_id" value="'.$object->id.
'">';
1053 print
'<input type="hidden" name="entrepot_id" value="'.GETPOSTINT(
'entrepot_id').
'">';
1058 print
'<table class="border centpercent">';
1061 print
'<tr><td class="titlefieldcreate fieldrequired">';
1062 if ($origin ==
'commande' && isModEnabled(
'order')) {
1063 print $langs->trans(
"RefOrder");
1065 if ($origin ==
'propal' && isModEnabled(
"propal")) {
1066 print $langs->trans(
"RefProposal");
1068 print
'</td><td colspan="3">';
1075 if ($origin ==
'commande') {
1076 print $langs->trans(
'RefCustomerOrder');
1077 } elseif ($origin ==
'propal') {
1078 print $langs->trans(
'RefCustomerOrder');
1080 print $langs->trans(
'RefCustomer');
1082 print
'</td><td colspan="3">';
1083 print
'<input type="text" name="ref_customer" value="'.$object->ref_client.
'" />';
1088 print
'<tr><td class="titlefieldcreate fieldrequired">'.$langs->trans(
'Company').
'</td>';
1089 print
'<td colspan="3">'.$soc->getNomUrl(1).
'</td>';
1093 if (isModEnabled(
'project') && is_object($formproject)) {
1095 if (empty($projectid) && !empty(
$object->fk_project)) {
1096 $projectid =
$object->fk_project;
1098 if ($origin ==
'project') {
1102 $langs->load(
"projects");
1104 print
'<td>'.$langs->trans(
"Project").
'</td><td colspan="2">';
1105 print
img_picto(
'',
'project',
'class="pictofixedwidth"');
1106 print $formproject->select_projects($soc->id, $projectid,
'projectid', 0, 0, 1, 0, 0, 0, 0,
'', 1, 0,
'widthcentpercentminusxx');
1107 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>';
1113 print
'<tr><td>'.$langs->trans(
"DateDeliveryPlanned").
'</td>';
1114 print
'<td colspan="3">';
1115 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1116 $date_delivery = ($date_delivery ? $date_delivery :
$object->delivery_date);
1117 print $form->selectDate($date_delivery ? $date_delivery : -1,
'date_delivery', 1, 1, 1);
1122 print
'<tr><td>' . $langs->trans(
"DateShipping") .
'</td>';
1123 print
'<td colspan="3">';
1124 print
img_picto(
'',
'action',
'class="pictofixedwidth"');
1126 print $form->selectDate($date_shipping ? $date_shipping : -1,
'date_shipping', 1, 1, 1);
1131 print
'<tr><td>'.$langs->trans(
"NotePublic").
'</td>';
1132 print
'<td colspan="3">';
1133 $doleditor =
new DolEditor(
'note_public',
$object->note_public,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PUBLIC') ? 0 : 1, ROWS_3,
'90%');
1134 print $doleditor->Create(1);
1138 if (
$object->note_private && !$user->socid) {
1139 print
'<tr><td>'.$langs->trans(
"NotePrivate").
'</td>';
1140 print
'<td colspan="3">';
1141 $doleditor =
new DolEditor(
'note_private',
$object->note_private,
'', 60,
'dolibarr_notes',
'In',
false,
false, !
getDolGlobalString(
'FCKEDITOR_ENABLE_NOTE_PRIVATE') ? 0 : 1, ROWS_3,
'90%');
1142 print $doleditor->Create(1);
1148 print $langs->trans(
"Weight");
1149 print
'</td><td colspan="3">';
1150 print
img_picto(
'',
'fa-balance-scale',
'class="pictofixedwidth"');
1151 print
'<input name="weight" size="4" value="'.dol_escape_htmltag(
GETPOST(
'weight',
'alpha')).
'"> ';
1152 $text = $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
GETPOSTINT(
'weight_units'), 0, 2);
1153 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1154 print $form->textwithpicto($text, $htmltext);
1158 print $langs->trans(
"Width").
' x '.$langs->trans(
"Height").
' x '.$langs->trans(
"Depth");
1159 print
' </td><td colspan="3">';
1160 print
img_picto(
'',
'fa-ruler',
'class="pictofixedwidth"');
1161 print
'<input name="sizeW" size="4" value="'.GETPOSTINT(
'sizeW').
'">';
1162 print
' x <input name="sizeH" size="4" value="'.GETPOSTINT(
'sizeH').
'">';
1163 print
' x <input name="sizeS" size="4" value="'.GETPOSTINT(
'sizeS').
'">';
1165 $text = $formproduct->selectMeasuringUnits(
"size_units",
"size", (
string)
GETPOSTINT(
'size_units'), 0, 2);
1166 $htmltext = $langs->trans(
"KeepEmptyForAutoCalculation");
1167 print $form->textwithpicto($text, $htmltext);
1171 print
"<tr><td>".$langs->trans(
"DeliveryMethod").
"</td>";
1172 print
'<td colspan="3">';
1173 $expe->fetch_delivery_methods();
1174 print
img_picto(
'',
'dolly',
'class="pictofixedwidth"');
1175 print $form->selectarray(
"shipping_method_id", $expe->meths,
GETPOSTINT(
'shipping_method_id'), 1, 0, 0,
"", 1, 0, 0,
'',
'widthcentpercentminusxx');
1177 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
1179 print
"</td></tr>\n";
1182 print
"<tr><td>".$langs->trans(
"TrackingNumber").
"</td>";
1183 print
'<td colspan="3">';
1184 print
img_picto(
'',
'barcode',
'class="pictofixedwidth"');
1185 print
'<input name="tracking_number" size="20" value="'.GETPOST(
'tracking_number',
'alpha').
'">';
1186 print
"</td></tr>\n";
1189 if (isModEnabled(
'incoterm')) {
1191 print
'<td><label for="incoterm_id">'.$form->textwithpicto($langs->trans(
"IncotermLabel"),
$object->label_incoterms, 1).
'</label></td>';
1192 print
'<td colspan="3" class="maxwidthonsmartphone">';
1193 print
img_picto(
'',
'incoterm',
'class="pictofixedwidth"');
1194 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''));
1199 include_once DOL_DOCUMENT_ROOT.
'/core/modules/expedition/modules_expedition.php';
1201 if (is_array($list) && count($list) > 1) {
1202 print
"<tr><td>".$langs->trans(
"DefaultModel").
"</td>";
1203 print
'<td colspan="3">';
1204 print
img_picto(
'',
'pdf',
'class="pictofixedwidth"');
1205 print $form->selectarray(
'model', $list,
getDolGlobalString(
'EXPEDITION_ADDON_PDF'), 0, 0, 0,
'', 0, 0, 0,
'',
'widthcentpercentminusx');
1206 print
"</td></tr>\n";
1214 if (isset($extrafields->attributes[
$object->table_element][
'label'])) {
1215 foreach ($extrafields->attributes[
$object->table_element][
'label'] as $key => $val) {
1216 if (array_key_exists(
'options_' . $key, $objectsav->array_options)) {
1217 $object->array_options[
'options_' . $key] = $objectsav->array_options[
'options_' . $key];
1221 $parameters = array(
'objectsrc' => isset($objectsrc) ? $objectsrc :
'',
'cols' =>
'3',
'socid' => $socid);
1222 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_add.tpl.php';
1232 $numAsked = count(
$object->lines);
1234 print
'<script type="text/javascript">'.
"\n";
1235 print
'jQuery(document).ready(function() {'.
"\n";
1236 print
'jQuery("#autofill").click(function() {';
1238 while ($i < $numAsked) {
1239 print
'jQuery("#qtyl'.$i.
'").val(jQuery("#qtyasked'.$i.
'").val() - jQuery("#qtydelivered'.$i.
'").val());'.
"\n";
1240 if (isModEnabled(
'productbatch')) {
1241 print
'jQuery("#qtyl'.$i.
'_'.$i.
'").val(jQuery("#qtyasked'.$i.
'").val() - jQuery("#qtydelivered'.$i.
'").val());'.
"\n";
1245 print
'return false; });'.
"\n";
1246 print
'jQuery("#autoreset").click(function() { console.log("Reset values to 0"); jQuery(".qtyl").val(0);'.
"\n";
1247 print
'return false; });'.
"\n";
1249 print
'</script>'.
"\n";
1253 print
'<div class="div-table-responsive-no-min">';
1254 print
'<table class="noborder centpercent">';
1260 $alreadyQtyBatchSetted = $alreadyQtySetted = array();
1262 $title_lines_to_disable = array();
1265 if (isModEnabled(
'subtotals')) {
1267 $title_lines_to_disable =
$object->getDisabledShippmentSubtotalLines();
1269 $selectedLines =
GETPOST(
'subtotal_toselect',
'array:int');
1270 foreach (
$object->lines as $line) {
1271 if ($line->special_code == SUBTOTALS_SPECIAL_CODE) {
1272 $show_check_add_buttons =
true;
1277 print
'<tr class="liste_titre">';
1279 if (isset($show_check_add_buttons)) {
1280 print $form->showCheckAddButtons(
'checkforselect');
1282 print $langs->trans(
"Description");
1284 print
'<td class="center">'.$langs->trans(
"QtyOrdered").
'</td>';
1285 print
'<td class="center">'.$langs->trans(
"QtyShipped").
'</td>';
1286 print
'<td class="center">'.$langs->trans(
"QtyToShip");
1287 if (empty(
$conf->productbatch->enabled)) {
1288 print
'<br><a href="#" id="autofill" class="opacitymedium link cursor cursorpointer">'.img_picto($langs->trans(
"Autofill"),
'autofill',
'class="paddingrightonly"').
'</a>';
1293 print
'<span id="autoreset" class="opacitymedium link cursor cursorpointer">'.img_picto($langs->trans(
"Reset"),
'eraser').
'</span>';
1295 if (isModEnabled(
'stock')) {
1296 if (empty(
$conf->productbatch->enabled)) {
1297 print
'<td class="left">'.$langs->trans(
"Warehouse").
' ('.$langs->trans(
"Stock").
')</td>';
1299 print
'<td class="left">'.$langs->trans(
"Warehouse").
' / '.$langs->trans(
"Batch").
' ('.$langs->trans(
"Stock").
')</td>';
1303 print
'<td class="left">'.$langs->trans(
'StockEntryDate').
'</td>';
1309 $warehousePicking = array();
1311 if ($warehouse_id > 0) {
1312 $warehousePicking[] = $warehouse_id;
1314 $warehouseObj->get_children_warehouses($warehouse_id, $warehousePicking);
1318 while ($indiceAsked < $numAsked) {
1321 $line =
$object->lines[$indiceAsked];
1323 $parameters = array(
'i' => $indiceAsked,
'line' => $line,
'num' => $numAsked);
1324 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters,
$object, $action);
1329 if (empty($reshook) && $line->special_code != SUBTOTALS_SPECIAL_CODE) {
1331 $type = $line->product_type ? $line->product_type : $line->fk_product_type;
1334 if (!empty($line->date_start)) {
1337 if (!empty($line->date_end)) {
1341 print
'<!-- line for order line '.$line->id.
' -->'.
"\n";
1342 print
'<tr class="oddeven" id="row-'.$line->id.
'">'.
"\n";
1344 $qtyProdCom = $line->qty;
1345 $productChildrenNb = 0;
1347 if ($line->fk_product > 0) {
1348 $res = $product->fetch($line->fk_product);
1353 $productChildrenNb = $product->hasFatherOrChild(1);
1355 if ($productChildrenNb > 0) {
1356 $product->loadStockForVirtualProduct(
'warehouseopen', $qtyProdCom);
1358 $product->load_stock(
'warehouseopen');
1363 print
'<a name="'.$line->id.
'"></a>';
1366 $product_static->type = $line->fk_product_type;
1367 $product_static->id = $line->fk_product;
1368 $product_static->ref = $line->ref;
1369 $product_static->status = $line->product_tosell;
1370 $product_static->status_buy = $line->product_tobuy;
1371 $product_static->status_batch = $line->product_tobatch;
1373 $showdescinproductdesc =
getDolGlobalString(
'PRODUIT_DESC_IN_FORM_ACCORDING_TO_DEVICE');
1375 $text = $product_static->getNomUrl(1);
1376 $text .=
' - '.(!empty($line->label) ? $line->label : $line->product_label);
1378 $description .= empty($product->stockable_product) ? $langs->trans(
'StockDisabled') : $langs->trans(
'StockEnabled');
1379 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
1382 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
1385 if ($showdescinproductdesc) {
1386 print ($line->desc && $line->desc != $line->product_label) ?
'<br>'.dol_htmlentitiesbr($line->desc) :
'';
1393 $text =
img_object($langs->trans(
'Service'),
'service');
1395 $text =
img_object($langs->trans(
'Product'),
'product');
1398 if (!empty($line->label)) {
1399 $text .=
' <strong>'.$line->label.
'</strong>';
1400 print $form->textwithtooltip($text, $line->desc, 3, 0,
'', (
string) $i);
1402 print $text.
' '.nl2br($line->desc);
1406 print_date_range($db->jdate($line->date_start), $db->jdate($line->date_end));
1417 print
'<td class="center">'.$line->qty;
1418 print
'<input name="qtyasked'.$indiceAsked.
'" id="qtyasked'.$indiceAsked.
'" type="hidden" value="'.$line->qty.
'">';
1419 print
''.$unit_order.
'</td>';
1422 print
'<td class="center">';
1423 $quantityDelivered = isset(
$object->expeditions[$line->id]) ?
$object->expeditions[$line->id] :
'';
1424 print $quantityDelivered;
1425 print
'<input name="qtydelivered'.$indiceAsked.
'" id="qtydelivered'.$indiceAsked.
'" type="hidden" value="'.$quantityDelivered.
'">';
1426 print
''.$unit_order.
'</td>';
1429 $quantityAsked = $line->qty;
1431 $quantityToBeDelivered = 0;
1433 if (is_numeric($quantityDelivered)) {
1434 $quantityToBeDelivered = $quantityAsked - $quantityDelivered;
1436 $quantityToBeDelivered = $quantityAsked;
1440 $warehouseObject =
null;
1441 if (count($warehousePicking) == 1 || !($line->fk_product > 0) || !isModEnabled(
'stock')) {
1442 print
'<!-- Case warehouse already known or product not a predefined product -->';
1444 $stock = + (isset($product->stock_warehouse[$warehouse_id]->real) ? $product->stock_warehouse[$warehouse_id]->real : 0);
1446 $deliverableQty = $quantityToBeDelivered;
1448 $deliverableQty = min($quantityToBeDelivered, $stock);
1450 if ($deliverableQty < 0) {
1451 $deliverableQty = 0;
1453 if (empty(
$conf->productbatch->enabled) || !$product->hasbatch()) {
1455 print
'<td class="center">';
1457 if (GETPOSTISSET(
'qtyl'.$indiceAsked) &&
GETPOST(
'qtyl'.$indiceAsked) !==
'') {
1458 $deliverableQty =
GETPOSTFLOAT(
'qtyl'.$indiceAsked,
'MS');
1460 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
1461 $qtylValue = $deliverableQty;
1465 print
'<input name="qtyl'.$indiceAsked.
'" id="qtyl'.$indiceAsked.
'" class="qtyl right" type="text" size="4" value="'.$qtylValue.
'">';
1468 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
1469 print
'<input name="qtyl'.$indiceAsked.
'" id="qtyl'.$indiceAsked.
'" type="hidden" value="0">';
1472 print $langs->trans(
"NA");
1477 if (isModEnabled(
'stock')) {
1478 print
'<td class="left">';
1481 $ent =
"entl".$indiceAsked;
1482 $idl =
"idl".$indiceAsked;
1484 if ($line->fk_product > 0) {
1485 print
'<!-- Show warehouse selection -->';
1491 if ($productChildrenNb > 0) {
1492 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl'.$indiceAsked,
'', 1, 0, 0,
'', 0, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
1494 if ($product->stockable_product == Product::ENABLED_STOCK) {
1495 print $formproduct->selectWarehouses($tmpentrepot_id,
'entl'.$indiceAsked,
'', 1, 0, $line->fk_product,
'', 1, 0, array(),
'minwidth200', array(), 1, $stockMin,
'stock DESC, e.ref');
1497 print
img_warning().
' '.$langs->trans(
'StockDisabled');
1501 if ($tmpentrepot_id > 0 && $tmpentrepot_id == $warehouse_id) {
1503 if ($stock < $quantityToBeDelivered) {
1504 print
' '.img_warning($langs->trans(
"StockTooLow"));
1509 print
'<span class="opacitymedium">('.$langs->trans(
"Service").
')</span><input name="entl'.$indiceAsked.
'" id="entl'.$indiceAsked.
'" type="hidden" value="0">';
1520 $product->get_sousproduits_arbo();
1521 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
1522 if (count($prods_arbo) > 0) {
1523 foreach ($prods_arbo as $key => $value) {
1526 if ($value[
'stock'] < $value[
'stock_alert']) {
1529 print
"<tr class=\"oddeven\"><td> ->
1530 <a href=\"".DOL_URL_ROOT.
"/product/card.php?id=".$value[
'id'].
"\">".$value[
'fullpath'].
"
1531 </a> (".$value[
'nb'].
")</td><td class=\"center\"> ".$value[
'nb_total'].
"</td><td> </td><td> </td>
1532 <td class=\"center\">".$value[
'stock'].
" ".$img.
"</td>";
1542 print
'<td></td><td></td>';
1547 print
'<!-- Case product need lot -->';
1549 $staticwarehouse =
new Entrepot($db);
1550 if ($warehouse_id > 0) {
1551 $staticwarehouse->fetch($warehouse_id);
1557 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
1558 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
1562 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
1563 if (is_object($product->stock_warehouse[$warehouse_id]) && !empty($product->stock_warehouse[$warehouse_id]->detail_batch)) {
1564 foreach ($product->stock_warehouse[$warehouse_id]->detail_batch as $dbatch) {
1566 $batchStock = + $dbatch->qty;
1567 $deliverableQty = min($quantityToBeDelivered, $batchStock);
1570 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
1571 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
1573 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
1574 $alreadyQtyBatchSetted[$line->fk_product] = array();
1577 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
1578 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
1581 $deliverableQty = min($quantityToBeDelivered, $batchStock);
1584 if ($deliverableQty < 0) {
1585 $deliverableQty = 0;
1588 $inputName =
'qtyl'.$indiceAsked.
'_'.$subj;
1589 if (GETPOSTISSET($inputName)) {
1590 $deliverableQty =
GETPOST($inputName,
'int');
1593 $tooltipClass = $tooltipTitle =
'';
1594 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
1595 $tooltipClass =
' classfortooltip';
1596 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines').
' : '.$alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
1598 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0 ;
1600 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
1602 print
'<!-- subj='.$subj.
'/'.$nbofsuggested.
' --><tr '.((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'').
'>';
1603 print
'<td colspan="3" ></td><td class="center">';
1604 $qtylValue = $deliverableQty;
1608 print
'<input class="qtyl '.$tooltipClass.
' right" title="'.$tooltipTitle.
'" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="'.$qtylValue.
'">';
1611 print
'<!-- Show details of lot -->';
1612 print
'<td class="left">';
1614 print $staticwarehouse->getNomUrl(0).
' / ';
1616 print
'<input name="batchl'.$indiceAsked.
'_'.$subj.
'" type="hidden" value="'.$dbatch->id.
'">';
1619 $detail .= $langs->trans(
"Batch").
': '.$dbatch->batch;
1621 $detail .=
' - '.$langs->trans(
"SellByDate").
': '.
dol_print_date($dbatch->sellby,
"day");
1624 $detail .=
' - '.$langs->trans(
"EatByDate").
': '.
dol_print_date($dbatch->eatby,
"day");
1626 $detail .=
' - '.$langs->trans(
"Qty").
': '.$dbatch->qty;
1630 $quantityToBeDelivered -= $deliverableQty;
1631 if ($quantityToBeDelivered < 0) {
1632 $quantityToBeDelivered = 0;
1637 print
'<td>'.dol_print_date($dbatch->context[
'stock_entry_date'],
'day').
'</td>';
1642 print
'<!-- Case there is no details of lot at all -->';
1643 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
1644 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="0" disabled="disabled"> ';
1647 print
'<td class="left">';
1648 print
img_warning().
' '.$langs->trans(
"NoProductToShipFoundIntoStock", $staticwarehouse->label);
1658 if (empty(
$conf->productbatch->enabled) || !$product->hasbatch()) {
1659 print
'<!-- Case warehouse not already known and product does not need lot -->';
1660 print
'<td></td><td></td>';
1666 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
1671 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
1672 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
1676 $tmpwarehouseObject =
new Entrepot($db);
1677 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
1679 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
1684 $tmpwarehouseObject->fetch($warehouse_id);
1685 if ($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
1686 $stock = + $stock_warehouse->real;
1687 $deliverableQty = min($quantityToBeDelivered, $stock);
1688 $deliverableQty = max(0, $deliverableQty);
1690 print
'<!-- subj='.$subj.
'/'.$nbofsuggested.
' --><tr '.((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'').
'>';
1691 print
'<td colspan="3" ></td><td class="center"><!-- qty to ship (no lot management for product line indiceAsked='.$indiceAsked.
') -->';
1697 $tooltipClass = $tooltipTitle =
'';
1698 if ($productChildrenNb <= 0) {
1699 if (isset($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
1700 $deliverableQty = min($quantityToBeDelivered, $stock - $alreadyQtySetted[$line->fk_product][intval($warehouse_id)]);
1702 if (!isset($alreadyQtySetted[$line->fk_product])) {
1703 $alreadyQtySetted[$line->fk_product] = array();
1706 $deliverableQty = min($quantityToBeDelivered, $stock);
1709 if ($deliverableQty < 0) {
1710 $deliverableQty = 0;
1713 if (!empty($alreadyQtySetted[$line->fk_product][intval($warehouse_id)])) {
1714 $tooltipClass =
' classfortooltip';
1715 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines').
' : '.$alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
1717 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = 0;
1720 $alreadyQtySetted[$line->fk_product][intval($warehouse_id)] = $deliverableQty + $alreadyQtySetted[$line->fk_product][intval($warehouse_id)];
1723 $inputName =
'qtyl'.$indiceAsked.
'_'.$subj;
1724 if (GETPOSTISSET($inputName)) {
1727 $qtylValue = $deliverableQty;
1731 print
'<input class="qtyl'.$tooltipClass.
' right" title="'.$tooltipTitle.
'" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'" type="text" size="4" value="'.$qtylValue.
'">';
1732 print
'<input name="ent1'.$indiceAsked.
'_'.$subj.
'" type="hidden" value="'.$warehouse_id.
'">';
1735 print
'<input name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'" type="hidden" value="0">';
1738 print $langs->trans(
"NA");
1743 if (isModEnabled(
'stock')) {
1744 print
'<td class="left">';
1746 if ($product->stockable_product == Product::ENABLED_STOCK || $productChildrenNb > 0) {
1747 print $tmpwarehouseObject->getNomUrl(0).
' ';
1748 if ($productChildrenNb <= 0) {
1749 print
'<!-- Show details of stock -->';
1750 print
'('.$stock.
')';
1753 print
img_warning().
' '.$langs->trans(
'StockDisabled');
1756 print
'<span class="opacitymedium">('.$langs->trans(
"Service").
')</span>';
1760 $quantityToBeDelivered -= $deliverableQty;
1761 if ($quantityToBeDelivered < 0) {
1762 $quantityToBeDelivered = 0;
1773 $product->get_sousproduits_arbo();
1774 $prods_arbo = $product->get_arbo_each_prod($qtyProdCom);
1775 if (count($prods_arbo) > 0) {
1776 foreach ($prods_arbo as $key => $value) {
1779 if ($value[
'stock'] < $value[
'stock_alert']) {
1782 print
'<tr class"oddeven"><td>';
1783 print
" ->
1784 <a href=\"".DOL_URL_ROOT.
"/product/card.php?id=".$value[
'id'].
"\">".$value[
'fullpath'].
"
1785 </a> (".$value[
'nb'].
")</td><td class=\"center\"> ".$value[
'nb_total'].
"</td><td> </td><td> </td>
1786 <td class=\"center\">".$value[
'stock'].
" ".$img.
"</td>";
1795 print
'<!-- Case warehouse not already known and product need lot -->';
1796 print
'<td></td><td></td>';
1803 print
'<input name="idl'.$indiceAsked.
'" type="hidden" value="'.$line->id.
'">';
1805 $tmpwarehouseObject =
new Entrepot($db);
1810 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
1811 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
1812 $nbofsuggested += count($stock_warehouse->detail_batch);
1816 foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
1818 if (!empty($warehousePicking) && !in_array($warehouse_id, $warehousePicking)) {
1823 $tmpwarehouseObject->fetch($warehouse_id);
1824 if (($stock_warehouse->real > 0 || !
getDolGlobalInt(
'STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (!empty($stock_warehouse->detail_batch))) {
1825 foreach ($stock_warehouse->detail_batch as $dbatch) {
1826 $batchStock = + $dbatch->qty;
1827 if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
1828 $deliverableQty = min($quantityToBeDelivered, $batchStock - $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)]);
1830 if (!isset($alreadyQtyBatchSetted[$line->fk_product])) {
1831 $alreadyQtyBatchSetted[$line->fk_product] = array();
1834 if (!isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch])) {
1835 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch] = array();
1838 $deliverableQty = min($quantityToBeDelivered, $batchStock);
1841 if ($deliverableQty < 0) {
1842 $deliverableQty = 0;
1845 $inputName =
'qtyl'.$indiceAsked.
'_'.$subj;
1846 if (GETPOSTISSET($inputName)) {
1850 $tooltipClass = $tooltipTitle =
'';
1851 if (!empty($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
1852 $tooltipClass =
' classfortooltip';
1853 $tooltipTitle = $langs->trans(
'StockQuantitiesAlreadyAllocatedOnPreviousLines').
' : '.$alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
1855 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = 0 ;
1857 $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)] = $deliverableQty + $alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)];
1859 print
'<!-- subj='.$subj.
'/'.$nbofsuggested.
' --><tr '.((($subj + 1) == $nbofsuggested) ?
'oddeven' :
'').
'><td colspan="3"></td><td class="center">';
1860 $qtylValue = $deliverableQty;
1864 print
'<input class="qtyl right '.$tooltipClass.
'" title="'.$tooltipTitle.
'" name="'.$inputName.
'" id="'.$inputName.
'" type="text" size="4" value="'.$qtylValue.
'">';
1867 print
'<td class="left">';
1869 print $tmpwarehouseObject->getNomUrl(0).
' / ';
1871 print
'<!-- Show details of lot -->';
1872 print
'<input name="batchl'.$indiceAsked.
'_'.$subj.
'" type="hidden" value="'.$dbatch->id.
'">';
1875 print $langs->trans(
"Batch").
': ';
1876 $result = $productlotObject->fetch(0, $line->fk_product, $dbatch->batch);
1878 print $productlotObject->getNomUrl(1);
1880 print $langs->trans(
"TableLotIncompleteRunRepairWithParamStandardEqualConfirmed");
1883 print
' - '.$langs->trans(
"SellByDate").
': '.
dol_print_date($dbatch->sellby,
"day");
1886 print
' - '.$langs->trans(
"EatByDate").
': '.
dol_print_date($dbatch->eatby,
"day");
1888 print
' ('.$dbatch->qty.
')';
1889 $quantityToBeDelivered -= $deliverableQty;
1890 if ($quantityToBeDelivered < 0) {
1891 $quantityToBeDelivered = 0;
1897 print
'<td class="left">'.dol_print_date($dbatch->context[
'stock_entry_date'],
'day').
'</td>';
1905 $warehouse_selected_id =
GETPOSTINT(
'entrepot_id');
1907 print
'<!-- line not shown yet, we show it -->';
1908 print
'<tr class="oddeven"><td colspan="3"></td><td class="center">';
1912 if (isModEnabled(
'productbatch') && $product->hasbatch()) {
1913 $disabled =
'disabled="disabled"';
1915 if ($warehouse_selected_id <= 0) {
1916 $disabled =
'disabled="disabled"';
1922 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="0"'.($disabled ?
' '.$disabled :
'').
'> ';
1924 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
1928 if (isModEnabled(
'productbatch') && $product->hasbatch()) {
1929 $disabled =
'disabled="disabled"';
1931 if ($warehouse_selected_id <= 0) {
1932 $disabled =
'disabled="disabled"';
1934 print
'<input class="qtyl right" name="qtyl'.$indiceAsked.
'_'.$subj.
'" id="qtyl'.$indiceAsked.
'_'.$subj.
'" type="text" size="4" value="'.$quantityToBeDelivered.
'"'.($disabled ?
' '.$disabled :
'').
'> ';
1935 if (empty($disabled)) {
1936 print
'<input name="ent1' . $indiceAsked .
'_' . $subj .
'" type="hidden" value="' . $warehouse_selected_id .
'">';
1939 print $langs->trans(
"NA");
1943 print
'<td class="left">';
1945 if ($warehouse_selected_id > 0 && $product->stockable_product == Product::ENABLED_STOCK) {
1946 $warehouseObject =
new Entrepot($db);
1947 $warehouseObject->fetch($warehouse_selected_id);
1948 print
img_warning().
' '.$langs->trans(
"NoProductToShipFoundIntoStock", $warehouseObject->label);
1950 if ($line->fk_product) {
1951 if ($product->stockable_product == Product::ENABLED_STOCK) {
1952 print
img_warning().
' '.$langs->trans(
'StockTooLow');
1954 print
img_warning().
' '.$langs->trans(
'StockDisabled');
1961 print
'<span class="opacitymedium">('.$langs->trans(
"Service").
')</span>';
1973 if (!empty($extrafields)) {
1979 $srcLine->id = $line->id;
1980 $srcLine->fetch_optionals();
1982 $expLine->array_options = array_merge($expLine->array_options, $srcLine->array_options);
1984 print $expLine->showOptionals($extrafields,
'edit', array(
'style' =>
'class="drag drop oddeven"',
'colspan' => $colspan), (
string) $indiceAsked,
'',
'1');
1986 } elseif (empty($reshook) && $line->special_code == SUBTOTALS_SPECIAL_CODE && !in_array($line->id, $title_lines_to_disable)) {
1987 require
dol_buildpath(
'/core/tpl/subtotalline_select.tpl.php');
1998 print $form->buttonsSaveCancel(
"Create");
2008 '@phan-var-force Expedition $object';
2014 $num_prod = count($lines);
2017 $typeobject =
$object->origin;
2019 $origin_id =
$object->origin_id;
2027 $res =
$object->fetch_optionals();
2035 if ($action ==
'delete') {
2036 $formquestion = array();
2038 $formquestion = array(
2040 'label' => $langs->trans(
'ShipmentIncrementStockOnDelete'),
2041 'name' =>
'alsoUpdateStock',
2042 'type' =>
'checkbox',
2047 $formconfirm = $form->formconfirm(
2048 $_SERVER[
'PHP_SELF'].
'?id='.
$object->id,
2049 $langs->trans(
'DeleteSending'),
2050 $langs->trans(
"ConfirmDeleteSending",
$object->ref),
2059 if ($action ==
'ask_subtotal_deleteline') {
2061 $langs->load(
"subtotals");
2062 $title =
"DeleteSubtotalLine";
2063 $question =
"ConfirmDeleteSubtotalLine";
2064 if (
GETPOST(
'type') ==
'title') {
2065 $formconfirm = array(array(
'type' =>
'checkbox',
'name' =>
'deletecorrespondingsubtotalline',
'label' => $langs->trans(
"DeleteCorrespondingSubtotalLine"),
'value' => 0));
2066 $title =
"DeleteTitleLine";
2067 $question =
"ConfirmDeleteTitleLine";
2069 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans($title), $langs->trans($question),
'confirm_delete_subtotalline', $formconfirm,
'no', 1);
2073 if ($action ==
'valid') {
2074 $objectref = substr(
$object->ref, 1, 4);
2075 if ($objectref ==
'PROV') {
2076 $numref =
$object->getNextNumRef($soc);
2081 $text = $langs->trans(
"ConfirmValidateSending", $numref);
2083 $text .=
'<br>'.img_picto(
'',
'movement',
'class="pictofixedwidth"').$langs->trans(
"StockMovementWillBeRecorded").
'.';
2085 $text .=
'<br>'.img_picto(
'',
'movement',
'class="pictofixedwidth"').$langs->trans(
"StockMovementNotYetRecorded").
'.';
2088 if (isModEnabled(
'notification')) {
2089 require_once DOL_DOCUMENT_ROOT.
'/core/class/notify.class.php';
2090 $notify =
new Notify($db);
2092 $text .= $notify->confirmMessage(
'SHIPPING_VALIDATE',
$object->socid,
$object);
2095 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $langs->trans(
'ValidateSending'), $text,
'confirm_valid',
'', 0, 1, 260);
2099 if ($action ==
'cancel') {
2100 $formconfirm = $form->formconfirm($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, $langs->trans(
'CancelSending'), $langs->trans(
"ConfirmCancelSending",
$object->ref),
'confirm_cancel',
'', 0, 1);
2104 if ($action ==
'sign') {
2105 $text = $langs->trans(
'ConfirmSignShipping');
2106 if (isModEnabled(
'notification')) {
2107 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2108 $notify =
new Notify($db);
2110 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid,
$object);
2115 'name' =>
'signed_status',
2116 'select_show_empty' => 0,
2117 'label' =>
'<span class="fieldrequired">' . $langs->trans(
'SignStatus') .
'</span>',
2118 'values' =>
$object->getSignedStatusLocalisedArray()
2120 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id, $langs->trans(
'SignShipping'), $text,
'confirm_sign', $formquestion, 0, 1);
2124 if ($action ==
'unsign') {
2125 $text = $langs->trans(
'ConfirmUnsignShipping');
2126 if (isModEnabled(
'notification')) {
2127 require_once DOL_DOCUMENT_ROOT .
'/core/class/notify.class.php';
2128 $notify =
new Notify($db);
2130 $text .= $notify->confirmMessage(
'SHIPPING_MODIFY',
$object->socid,
$object);
2132 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"] .
'?id=' .
$object->id, $langs->trans(
'UnsignShipping'), $text,
'confirm_unsign',
'', 0, 1);
2136 $parameters = array(
'formConfirm' => $formconfirm);
2137 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters,
$object, $action);
2138 if (empty($reshook)) {
2139 $formconfirm .= $hookmanager->resPrint;
2140 } elseif ($reshook > 0) {
2141 $formconfirm = $hookmanager->resPrint;
2149 $tmparray =
$object->getTotalWeightVolume();
2150 $totalWeight = $tmparray[
'weight'];
2151 $totalVolume = $tmparray[
'volume'];
2153 if (!empty($typeobject) && $typeobject ===
'commande' && is_object(
$object->origin_object) &&
$object->origin_object->id && isModEnabled(
'order')) {
2155 $objectsrc->fetch(
$object->origin_object->id);
2157 if (!empty($typeobject) && $typeobject ===
'propal' && is_object(
$object->origin_object) &&
$object->origin_object->id && isModEnabled(
"propal")) {
2158 $objectsrc =
new Propal($db);
2159 $objectsrc->fetch(
$object->origin_object->id);
2163 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expedition/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
2164 $morehtmlref =
'<div class="refidno">';
2166 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer,
$object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
2167 $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);
2169 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
2171 if (isModEnabled(
'project')) {
2172 $langs->load(
"projects");
2173 $morehtmlref .=
'<br>';
2175 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
2176 if ($action !=
'classify') {
2177 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
2179 $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');
2181 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
2183 $proj->fetch($objectsrc->fk_project);
2184 $morehtmlref .= $proj->getNomUrl(1);
2186 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
2191 $morehtmlref .=
'</div>';
2194 dol_banner_tab(
$object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
2197 print
'<div class="fichecenter">';
2198 print
'<div class="fichehalfleft">';
2199 print
'<div class="underbanner clearboth"></div>';
2201 print
'<table class="border tableforfield centpercent">';
2204 if (!empty($typeobject) && $typeobject ==
'commande' &&
$object->origin_object->id && isModEnabled(
'order')) {
2206 print $langs->trans(
"RefOrder").
'</td>';
2208 print $objectsrc->getNomUrl(1,
'commande');
2212 if (!empty($typeobject) && $typeobject ==
'propal' &&
$object->origin_object->id && isModEnabled(
"propal")) {
2214 print $langs->trans(
"RefProposal").
'</td>';
2216 print $objectsrc->getNomUrl(1,
'expedition');
2222 print
'<tr><td class="titlefieldmiddle">'.$langs->trans(
"DateCreation").
'</td>';
2223 print
'<td>'.dol_print_date(
$object->date_creation,
"dayhour").
"</td>\n";
2227 print
'<tr><td height="10">';
2228 print
'<table class="nobordernopadding centpercent"><tr><td>';
2229 print $langs->trans(
'DateDeliveryPlanned');
2231 if ($action !=
'editdate_livraison') {
2232 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>';
2234 print
'</tr></table>';
2236 if ($action ==
'editdate_livraison') {
2237 print
'<form name="setdate_livraison" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2238 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2239 print
'<input type="hidden" name="action" value="setdate_livraison">';
2240 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
2241 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
2250 print
'<tr><td height="10">';
2251 print
'<table class="nobordernopadding centpercent"><tr><td>';
2252 print $langs->trans(
'DateShipping');
2254 if ($action !=
'editdate_shipping') {
2255 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>';
2257 print
'</tr></table>';
2259 if ($action ==
'editdate_shipping') {
2260 print
'<form name="setdate_shipping" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2261 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2262 print
'<input type="hidden" name="action" value="setdate_shipping">';
2263 print $form->selectDate(
$object->date_shipping ?
$object->date_shipping : -1,
'ship_', 1, 1, 0,
"setdate_shipping", 1, 0);
2264 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
2274 print $form->editfieldkey(
"Weight",
'trueWeight',
$object->trueWeight,
$object, $user->hasRight(
'expedition',
'creer'));
2277 if ($action ==
'edittrueWeight') {
2278 print
'<form name="settrueweight" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
2279 print
'<input name="action" value="settrueWeight" type="hidden">';
2280 print
'<input name="id" value="'.$object->id.
'" type="hidden">';
2281 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2282 print
'<input id="trueWeight" name="trueWeight" value="'.$object->trueWeight.
'" type="text" class="width50 valignmiddle">';
2283 print $formproduct->selectMeasuringUnits(
"weight_units",
"weight", (
string)
$object->weight_units, 0, 2,
'maxwidth125 valignmiddle');
2284 print
' <input class="button smallpaddingimp valignmiddle" name="modify" value="'.$langs->trans(
"Modify").
'" type="submit">';
2285 print
' <input class="button button-cancel smallpaddingimp valignmiddle" name="cancel" value="'.$langs->trans(
"Cancel").
'" type="submit">';
2289 print (
$object->trueWeight &&
$object->weight_units !=
'') ?
' '.measuringUnitString(0,
"weight",
$object->weight_units) :
'';
2293 if ($totalWeight > 0) {
2294 if (!empty(
$object->trueWeight)) {
2295 print
' ('.$langs->trans(
"SumOfProductWeights").
': ';
2298 if (!empty(
$object->trueWeight)) {
2305 print
'<tr><td>'.$form->editfieldkey(
"Width",
'trueWidth',
$object->trueWidth,
$object, $user->hasRight(
'expedition',
'creer')).
'</td><td>';
2306 print $form->editfieldval(
"Width",
'trueWidth',
$object->trueWidth,
$object, $user->hasRight(
'expedition',
'creer'));
2307 print (
$object->trueWidth &&
$object->width_units !=
'') ?
' '.measuringUnitString(0,
"size",
$object->width_units) :
'';
2311 print
'<tr><td>'.$form->editfieldkey(
"Height",
'trueHeight',
$object->trueHeight,
$object, $user->hasRight(
'expedition',
'creer')).
'</td><td>';
2312 if ($action ==
'edittrueHeight') {
2313 print
'<form name="settrueHeight" action="'.$_SERVER[
"PHP_SELF"].
'" method="post">';
2314 print
'<input name="action" value="settrueHeight" type="hidden">';
2315 print
'<input name="id" value="'.$object->id.
'" type="hidden">';
2316 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2317 print
'<input id="trueHeight" name="trueHeight" value="'.$object->trueHeight.
'" type="text" class="width50">';
2318 print $formproduct->selectMeasuringUnits(
"size_units",
"size",
$object->size_units, 0, 2);
2319 print
' <input class="button smallpaddingimp" name="modify" value="'.$langs->trans(
"Modify").
'" type="submit">';
2320 print
' <input class="button button-cancel smallpaddingimp" name="cancel" value="'.$langs->trans(
"Cancel").
'" type="submit">';
2324 print (
$object->trueHeight &&
$object->height_units !=
'') ?
' '.measuringUnitString(0,
"size",
$object->height_units) :
'';
2330 print
'<tr><td>'.$form->editfieldkey(
"Depth",
'trueDepth',
$object->trueDepth,
$object, $user->hasRight(
'expedition',
'creer')).
'</td><td>';
2331 print $form->editfieldval(
"Depth",
'trueDepth',
$object->trueDepth,
$object, $user->hasRight(
'expedition',
'creer'));
2332 print (
$object->trueDepth &&
$object->depth_units !=
'') ?
' '.measuringUnitString(0,
"size",
$object->depth_units) :
'';
2337 print $langs->trans(
"Volume");
2340 $calculatedVolume = 0;
2344 $volumeUnit =
$object->size_units * 3;
2347 if ($calculatedVolume > 0) {
2348 if ($volumeUnit < 50) {
2354 if ($totalVolume > 0) {
2355 if ($calculatedVolume) {
2356 print
' ('.$langs->trans(
"SumOfProductVolumes").
': ';
2360 if ($calculatedVolume) {
2369 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
2374 print
'<div class="fichehalfright">';
2375 print
'<div class="underbanner clearboth"></div>';
2377 print
'<table class="border centpercent tableforfield">';
2381 print
'<table class="nobordernopadding centpercent"><tr><td>';
2382 print $langs->trans(
'SendingMethod');
2385 if ($action !=
'editshipping_method_id' && $permissiontoadd) {
2386 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>';
2388 print
'</tr></table>';
2390 if ($action ==
'editshipping_method_id') {
2391 print
'<form name="setshipping_method_id" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
2392 print
'<input type="hidden" name="token" value="'.newToken().
'">';
2393 print
'<input type="hidden" name="action" value="setshipping_method_id">';
2394 $object->fetch_delivery_methods();
2395 print $form->selectarray(
"shipping_method_id",
$object->meths,
$object->shipping_method_id, 1, 0, 0,
"", 1);
2397 print
info_admin($langs->trans(
"YouCanChangeValuesForThisListFromDictionarySetup"), 1);
2399 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
2402 if (
$object->shipping_method_id > 0) {
2404 $code = $langs->getLabelFromKey($db, (
string)
$object->shipping_method_id,
'c_shipment_mode',
'rowid',
'code');
2405 print $langs->trans(
"SendingMethod".strtoupper($code));
2412 print
'<tr><td class="titlefieldmiddle">'.$form->editfieldkey(
"TrackingNumber",
'tracking_number',
$object->tracking_number,
$object, $user->hasRight(
'expedition',
'creer')).
'</td><td>';
2413 print $form->editfieldval(
"TrackingNumber",
'tracking_number',
$object->tracking_url,
$object, $user->hasRight(
'expedition',
'creer'),
'safehtmlstring',
$object->tracking_number);
2417 if (isModEnabled(
'incoterm')) {
2419 print
'<table class="nobordernopadding centpercent"><tr><td>';
2420 print $langs->trans(
'IncotermLabel');
2421 print
'<td><td class="right">';
2422 if ($permissiontoadd) {
2423 print
'<a class="editfielda" href="'.DOL_URL_ROOT.
'/expedition/card.php?id='.
$object->id.
'&action=editincoterm&token='.
newToken().
'">'.
img_edit().
'</a>';
2427 print
'</td></tr></table>';
2430 if ($action !=
'editincoterm') {
2431 print $form->textwithpicto(
$object->display_incoterms(),
$object->label_incoterms, 1);
2433 print $form->select_incoterms((!empty(
$object->fk_incoterms) ?
$object->fk_incoterms :
''), (!empty(
$object->location_incoterms) ?
$object->location_incoterms :
''), $_SERVER[
'PHP_SELF'].
'?id='.
$object->id);
2439 $parameters = array();
2440 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters,
$object, $action);
2441 print $hookmanager->resPrint;
2448 print
'<div class="clearboth"></div>';
2453 if ($action ==
'editline') {
2454 print
' <form name="updateline" id="updateline" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$line_id.
'" method="POST">
2455 <input type="hidden" name="token" value="' .
newToken().
'">
2456 <input type="hidden" name="action" value="updateline">
2457 <input type="hidden" name="mode" value="">
2458 <input type="hidden" name="id" value="' .
$object->id.
'">
2463 print
'<div class="div-table-responsive-no-min">';
2464 print
'<table class="noborder centpercent" id="tablelines" >';
2466 print
'<tr class="liste_titre">';
2469 print
'<td width="5" class="center linecolnum"> </td>';
2472 print
'<td class="linecoldescription" >'.$langs->trans(
"Products").
'</td>';
2474 print
'<td class="center linecolqty">'.$langs->trans(
"QtyOrdered").
'</td>';
2475 if ($origin && $origin_id > 0) {
2476 print
'<td class="center linecolqtyinothershipments">'.$langs->trans(
"QtyInOtherShipments").
'</td>';
2478 if ($action ==
'editline') {
2480 if (!isModEnabled(
'stock')) {
2483 if (empty(
$conf->productbatch->enabled)) {
2486 print
'<td class="center linecoleditlineotherinfo" colspan="'.$editColspan.
'">';
2488 print $langs->trans(
"QtyToShip");
2490 print $langs->trans(
"QtyShipped");
2492 if (isModEnabled(
'stock')) {
2493 print
' - '.$langs->trans(
"WarehouseSource");
2495 if (isModEnabled(
'productbatch')) {
2496 print
' - '.$langs->trans(
"Batch");
2501 print
'<td class="center linecolqtytoship">'.$langs->trans(
"QtyToShip").
'</td>';
2503 print
'<td class="center linecolqtyshipped">'.$langs->trans(
"QtyShipped").
'</td>';
2505 if (isModEnabled(
'stock')) {
2506 print
'<td class="left linecolwarehousesource">'.$langs->trans(
"WarehouseSource").
'</td>';
2509 if (isModEnabled(
'productbatch')) {
2510 print
'<td class="left linecolbatch">'.$langs->trans(
"Batch").
'</td>';
2513 print
'<td class="center linecolweight">'.$langs->trans(
"CalculatedWeight").
'</td>';
2514 print
'<td class="center linecolvolume">'.$langs->trans(
"CalculatedVolume").
'</td>';
2517 print
'<td class="linecoledit"></td>';
2518 print
'<td class="linecoldelete" width="10"></td>';
2523 $outputlangs = $langs;
2528 if (
GETPOST(
'lang_id',
'aZ09')) {
2529 $newlang =
GETPOST(
'lang_id',
'aZ09');
2531 if (empty($newlang)) {
2532 $newlang =
$object->thirdparty->default_lang;
2534 if (!empty($newlang)) {
2536 $outputlangs->setDefaultLang($newlang);
2541 $alreadysent = array();
2542 if ($origin && $origin_id > 0) {
2543 $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";
2544 $sql .=
", ed.rowid as shipmentline_id, ed.qty as qty_shipped, ed.fk_expedition as expedition_id, ed.fk_elementdet, ed.fk_entrepot";
2545 $sql .=
", e.rowid as shipment_id, e.ref as shipment_ref, e.date_creation, e.date_valid, e.date_delivery, e.date_expedition";
2547 $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';
2548 $sql .=
', p.description as product_desc';
2549 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expeditiondet as ed";
2550 $sql .=
", ".MAIN_DB_PREFIX.
"expedition as e";
2551 $sql .=
", ".MAIN_DB_PREFIX.$origin.
"det as obj";
2553 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON obj.fk_product = p.rowid";
2554 $sql .=
" WHERE e.entity IN (".getEntity(
'expedition').
")";
2555 $sql .=
" AND obj.fk_".$origin.
" = ".((int) $origin_id);
2556 $sql .=
" AND obj.rowid = ed.fk_elementdet";
2557 $sql .=
" AND ed.fk_expedition = e.rowid";
2559 $sql .=
" ORDER BY obj.fk_product";
2561 dol_syslog(
"expedition/card.php get list of shipment lines", LOG_DEBUG);
2562 $resql = $db->query($sql);
2564 $num = $db->num_rows($resql);
2568 $obj = $db->fetch_object($resql);
2571 $alreadysent[$obj->rowid][$obj->shipmentline_id] = array(
2572 'shipment_ref' => $obj->shipment_ref,
'shipment_id' => $obj->shipment_id,
'warehouse' => $obj->fk_entrepot,
'qty_shipped' => $obj->qty_shipped,
2573 'product_tosell' => $obj->product_tosell,
'product_tobuy' => $obj->product_tobuy,
'product_tobatch' => $obj->product_tobatch,
2574 'date_valid' => $db->jdate($obj->date_valid),
'date_delivery' => $db->jdate($obj->date_delivery));
2585 $conf->cache[
'product'] = array();
2586 $conf->cache[
'warehouse'] = array();
2587 for ($i = 0; $i < $num_prod; $i++) {
2588 $parameters = array(
'i' => $i,
'line' => $lines[$i],
'line_id' => $line_id,
'num' => $num_prod,
'alreadysent' => $alreadysent,
'editColspan' => !empty($editColspan) ? $editColspan : 0,
'outputlangs' => $outputlangs);
2589 $reshook = $hookmanager->executeHooks(
'printObjectLine', $parameters,
$object, $action);
2594 if (empty($reshook) && $lines[$i]->product_type !=
"9") {
2595 print
'<!-- origin line id = '.$lines[$i]->origin_line_id.
' -->';
2596 print
'<tr class="oddeven" id="row-'.$lines[$i]->id.
'" data-id="'.$lines[$i]->id.
'" data-element="'.$lines[$i]->element.
'" >';
2600 print
'<td class="center linecolnum">'.($i + 1).
'</td>';
2604 if ($lines[$i]->fk_product > 0) {
2607 $product_id = $lines[$i]->fk_product;
2608 if (!isset(
$conf->cache[
'product'][$product_id])) {
2610 $prod->fetch($product_id);
2611 $conf->cache[
'product'][$product_id] = $prod;
2613 $prod =
$conf->cache[
'product'][$product_id];
2615 $label = (!empty($prod->multilangs[$outputlangs->defaultlang][
"label"])) ? $prod->multilangs[$outputlangs->defaultlang][
"label"] : $lines[$i]->product_label;
2617 $label = (!empty($lines[$i]->label) ? $lines[$i]->label : $lines[$i]->product_label);
2620 print
'<td class="linecoldescription">';
2623 $product_static->type = $lines[$i]->fk_product_type;
2624 $product_static->id = $lines[$i]->fk_product;
2625 $product_static->ref = $lines[$i]->ref;
2626 $product_static->status = $lines[$i]->product_tosell;
2627 $product_static->status_buy = $lines[$i]->product_tobuy;
2628 $product_static->status_batch = $lines[$i]->product_tobatch;
2630 $product_static->weight = $lines[$i]->weight;
2631 $product_static->weight_units = $lines[$i]->weight_units;
2632 $product_static->length = $lines[$i]->length;
2633 $product_static->length_units = $lines[$i]->length_units;
2634 $product_static->width = !empty($lines[$i]->width) ? $lines[$i]->width : 0;
2635 $product_static->width_units = !empty($lines[$i]->width_units) ? $lines[$i]->width_units : 0;
2636 $product_static->height = !empty($lines[$i]->height) ? $lines[$i]->height : 0;
2637 $product_static->height_units = !empty($lines[$i]->height_units) ? $lines[$i]->height_units : 0;
2638 $product_static->surface = $lines[$i]->surface;
2639 $product_static->surface_units = $lines[$i]->surface_units;
2640 $product_static->volume = $lines[$i]->volume;
2641 $product_static->volume_units = $lines[$i]->volume_units;
2642 $product_static->stockable_product = $lines[$i]->stockable_product;
2644 $text = $product_static->getNomUrl(1);
2645 $text .=
' - '.$label;
2647 print $form->textwithtooltip($text, $description, 3, 0,
'', (
string) $i);
2648 print_date_range(!empty($lines[$i]->date_start) ? $lines[$i]->date_start :
'', !empty($lines[$i]->date_end) ? $lines[$i]->date_end :
'');
2654 print
'<td class="linecoldescription" >';
2656 $text =
img_object($langs->trans(
'Service'),
'service');
2658 $text =
img_object($langs->trans(
'Product'),
'product');
2661 if (!empty($lines[$i]->label)) {
2662 $text .=
' <strong>'.$lines[$i]->label.
'</strong>';
2663 print $form->textwithtooltip($text, $lines[$i]->
description, 3, 0,
'', (
string) $i);
2678 print
'<td class="center linecolqty">'.$lines[$i]->qty_asked.
' '.$unit_order.
'</td>';
2681 if ($origin && $origin_id > 0) {
2682 print
'<td class="linecolqtyinothershipments center nowrap">';
2684 $qtyalreadysent = 0;
2685 foreach ($alreadysent as $key => $val) {
2686 if ($lines[$i]->fk_elementdet == $key) {
2688 foreach ($val as $shipmentline_id => $shipmentline_var) {
2689 if ($shipmentline_var[
'shipment_id'] == $lines[$i]->fk_expedition) {
2695 $htmltooltip .=
'<br>';
2697 $shipment_static->fetch($shipmentline_var[
'shipment_id']);
2698 $htmltooltip .= $shipment_static->getNomUrl(1,
'', 0, 0, 1);
2699 $htmltooltip .=
' - '.$shipmentline_var[
'qty_shipped'];
2700 $htmltooltip .=
' - '.$langs->trans(
"DateValidation").
' : '.(empty($shipmentline_var[
'date_valid']) ? $langs->trans(
"Draft") :
dol_print_date($shipmentline_var[
'date_valid'],
'dayhour'));
2707 $qtyalreadysent += $shipmentline_var[
'qty_shipped'];
2710 $htmltooltip = $langs->trans(
"QtyInOtherShipments").
'...<br><br>'.$htmltooltip.
'<br><input type="submit" name="dummyhiddenbuttontogetfocus" style="display:none" autofocus>';
2714 print $form->textwithpicto((
string) $qtyalreadysent, $htmltooltip, 1,
'info',
'', 0, 3,
'tooltip'.$lines[$i]->
id);
2718 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
2720 print
'<td colspan="'.$editColspan.
'" class="center"><table class="nobordernopadding centpercent">';
2721 if (is_array($lines[$i]->detail_batch) && count($lines[$i]->detail_batch) > 0) {
2722 print
'<!-- case edit 1 -->';
2724 foreach ($lines[$i]->detail_batch as $detail_batch) {
2727 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>';
2729 if ($lines[$i]->entrepot_id == 0) {
2731 $line->fetch($detail_batch->fk_expeditiondet);
2733 $entrepot_id = !empty($detail_batch->entrepot_id) ? $detail_batch->entrepot_id : $lines[$i]->entrepot_id;
2734 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>';
2740 print
'<td><input class="qtyl" name="qtyl'.$line_id.
'_0" id="qtyl'.$line_id.
'_0" type="text" size="4" value="0"></td>';
2742 print
'<td>'.$formproduct->selectLotStock(
'',
'batchl'.$line_id.
'_0',
'', 1, 0, $lines[$i]->fk_product).
'</td>';
2744 } elseif (isModEnabled(
'stock')) {
2745 if ($lines[$i]->fk_product > 0) {
2746 if ($lines[$i]->entrepot_id > 0) {
2747 print
'<!-- case edit 2 -->';
2750 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>';
2752 print
'<td>'.$formproduct->selectWarehouses($lines[$i]->entrepot_id,
'entl'.$line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200').
'</td>';
2755 if (isModEnabled(
'productbatch')) {
2756 print
' - '.$langs->trans(
"NA");
2760 } elseif (count($lines[$i]->details_entrepot) > 1) {
2761 print
'<!-- case edit 3 -->';
2762 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
2765 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>';
2767 print
'<td>'.$formproduct->selectWarehouses($detail_entrepot->entrepot_id,
'entl'.$detail_entrepot->line_id,
'', 1, 0, $lines[$i]->fk_product,
'', 1, 0, array(),
'minwidth200').
'</td>';
2770 if (isModEnabled(
'productbatch')) {
2771 print
' - '.$langs->trans(
"NA");
2777 print
'<!-- case edit 4 -->';
2780 print
'<td><input class="qtyl right" name="qtyl'.$line_id.
'" id="qtyl'.$line_id.
'" type="text" size="4" value="'.$lines[$i]->qty_shipped.
'"></td>';
2781 print
'<td><span class="opacitymedium">('.$langs->trans(
"Service").
')</span></td>';
2785 print
'<!-- case edit 5 -->';
2786 print
'<tr><td colspan="3">'.$langs->trans(
"ErrorStockIsNotEnough").
'</td></tr>';
2789 print
'<!-- case edit 6 -->';
2792 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>';
2799 } elseif (!isModEnabled(
'stock') && empty(
$conf->productbatch->enabled)) {
2800 print
'<!-- case edit 7 -->';
2803 print
'<td><input class="qtyl right" name="qtyl'.$line_id.
'" id="qtyl'.$line_id.
'" type="text" size="4" value="'.$lines[$i]->qty_shipped.
'"></td>';
2811 print
'</table></td>';
2814 print
'<td class="linecolqtytoship center">'.$lines[$i]->qty_shipped.
' '.$unit_order.
'</td>';
2817 if (isModEnabled(
'stock')) {
2818 print
'<td class="linecolwarehousesource tdoverflowmax200">';
2820 print
'<span class="opacitymedium">('.$langs->trans(
"Service").
')</span>';
2821 } elseif ($lines[$i]->entrepot_id > 0 && $lines[$i]->stockable_product == Product::ENABLED_STOCK) {
2822 $warehouse_id = $lines[$i]->entrepot_id;
2823 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
2825 $warehouse->fetch($warehouse_id);
2826 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
2828 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
2830 print $warehouse->getNomUrl(1);
2831 } elseif (count($lines[$i]->details_entrepot) > 1) {
2833 foreach ($lines[$i]->details_entrepot as $detail_entrepot) {
2834 $warehouse_id = $detail_entrepot->entrepot_id;
2835 if ($warehouse_id > 0) {
2836 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
2838 $warehouse->fetch($warehouse_id);
2839 $conf->cache[
'warehouse'][$warehouse_id] = $warehouse;
2841 $warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
2843 $detail .= $langs->trans(
"DetailWarehouseFormat", $warehouse->label, $detail_entrepot->qty_shipped).
'<br>';
2846 print $form->textwithtooltip(
img_picto(
'',
'object_stock').
' '.$langs->trans(
"DetailWarehouseNumber"), $detail);
2847 } elseif (count($lines[$i]->detail_children ?? []) > 1) {
2849 foreach ($lines[$i]->detail_children as $child_product_id => $child_stock_list) {
2850 foreach ($child_stock_list as $warehouse_id => $total_qty) {
2852 $child_product_label =
'';
2853 if (!isset(
$conf->cache[
'product'][$child_product_id])) {
2854 $child_product =
new Product($db);
2855 $child_product->fetch($child_product_id);
2856 $conf->cache[
'product'][$child_product_id] = $child_product;
2858 $child_product =
$conf->cache[
'product'][$child_product_id];
2860 $child_product_label = $child_product->ref .
' ' . $child_product->label;
2863 if (!isset(
$conf->cache[
'warehouse'][$warehouse_id])) {
2864 $child_warehouse =
new Entrepot($db);
2865 $child_warehouse->fetch($warehouse_id);
2866 $conf->cache[
'warehouse'][$warehouse_id] = $child_warehouse;
2868 $child_warehouse =
$conf->cache[
'warehouse'][$warehouse_id];
2871 $detail .= $langs->trans(
'DetailChildrenFormat', $child_product_label, $child_warehouse->label,
price2num($total_qty,
'MS')).
'<br>';
2874 print $form->textwithtooltip(
img_picto(
'',
'object_stock').
' '.$langs->trans(
'DetailWarehouseNumber'), $detail);
2880 if (isModEnabled(
'productbatch')) {
2881 if (isset($lines[$i]->detail_batch)) {
2882 print
'<!-- Detail of lot -->';
2883 print
'<td class="linecolbatch">';
2884 if ($lines[$i]->product_tobatch) {
2886 foreach ($lines[$i]->detail_batch as $dbatch) {
2887 $detail .= $langs->trans(
"Batch").
': '.$dbatch->batch;
2889 $detail .=
' - '.$langs->trans(
"SellByDate").
': '.
dol_print_date($dbatch->sellby,
"day");
2892 $detail .=
' - '.$langs->trans(
"EatByDate").
': '.
dol_print_date($dbatch->eatby,
"day");
2894 $detail .=
' - '.$langs->trans(
"Qty").
': '.$dbatch->qty;
2897 print $form->textwithtooltip(
img_picto(
'',
'object_barcode').
' '.$langs->trans(
"DetailBatchNumber"), $detail);
2899 print $langs->trans(
"NA");
2903 print
'<td class="linecolbatch" ></td>';
2909 print
'<td class="center linecolweight">';
2911 print $lines[$i]->weight * $lines[$i]->qty_shipped.
' '.
measuringUnitString(0,
"weight", $lines[$i]->weight_units);
2918 print
'<td class="center linecolvolume">';
2920 print $lines[$i]->volume * $lines[$i]->qty_shipped.
' '.
measuringUnitString(0,
"volume", $lines[$i]->volume_units);
2929 if ($action ==
'editline' && $lines[$i]->
id == $line_id) {
2930 print
'<td class="center" colspan="2" valign="middle">';
2931 print
'<input type="submit" class="button button-save" id="savelinebutton marginbottomonly" name="save" value="'.$langs->trans(
"Save").
'"><br>';
2932 print
'<input type="submit" class="button button-cancel" id="cancellinebutton" name="cancel" value="'.$langs->trans(
"Cancel").
'"><br>';
2935 $edit_url = $_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=editline&token='.
newToken().
'&lineid='.$lines[$i]->id;
2937 $product_id = $lines[$i]->fk_product;
2938 if (!isset(
$conf->cache[
'product'][$product_id])) {
2940 $product->fetch($product_id);
2941 $conf->cache[
'product'][$product_id] = $product;
2943 $product =
$conf->cache[
'product'][$product_id];
2946 if ($product->hasFatherOrChild(1)) {
2952 print
'<td class="linecoledit center">';
2953 print
'<a class="editfielda reposition" href="'.$edit_url.
'">'.
img_edit().
'</a>';
2955 print
'<td class="linecoldelete" width="10">';
2956 print
'<a class="reposition" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=deleteline&token='.
newToken().
'&lineid='.$lines[$i]->id.
'">'.
img_delete().
'</a>';
2960 if (!empty($rowExtrafieldsStart)) {
2961 print $rowExtrafieldsStart;
2962 print $rowExtrafieldsView;
2970 if (!empty($extrafields)) {
2972 if ($origin && $origin_id > 0) {
2975 if (isModEnabled(
'productbatch')) {
2978 if (isModEnabled(
'stock')) {
2983 $line->fetch_optionals();
2986 if ($action ==
'editline' && $line->id == $line_id) {
2987 print $lines[$i]->showOptionals($extrafields,
'edit', array(
'colspan' => $colspan), !empty($indiceAsked) ? $indiceAsked :
'',
'',
'',
'card');
2989 print $lines[$i]->showOptionals($extrafields,
'view', array(
'colspan' => $colspan), !empty($indiceAsked) ? $indiceAsked :
'',
'',
'',
'card');
2992 } elseif (empty($reshook) && $lines[$i]->product_type ==
"9") {
2994 $objectsrc->fetch($lines[$i]->origin_line_id);
2995 if ($objectsrc->special_code == SUBTOTALS_SPECIAL_CODE) {
2997 require
dol_buildpath(
'/core/tpl/subtotal_expedition_view.tpl.php');
3004 if (empty($num_prod)) {
3005 print
'<tr><td colspan="8"><span class="opacitymedium">'.$langs->trans(
"NoLineGoOnTabToAddSome", $langs->transnoentitiesnoconv(
"ShipmentDistribution")).
'</span></td></tr>';
3023 if (($user->socid == 0) && ($action !=
'presend')) {
3024 print
'<div class="tabsAction">';
3026 $parameters = array();
3027 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters,
$object, $action);
3029 if (empty($reshook)) {
3031 if ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'creer'))
3032 || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'expedition',
'shipping_advance',
'validate'))) {
3035 print
dolGetButtonAction($langs->trans(
'NotAllowed'), $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
3041 if ($user->hasRight(
'expedition',
'creer')) {
3046 if ($user->hasRight(
'expedition',
'creer')) {
3052 if (empty($user->socid)) {
3054 if (!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') || $user->hasRight(
'expedition',
'shipping_advance',
'send')) {
3055 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'');
3057 print
dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
3065 print
dolGetButtonAction(
'', $langs->trans(
'CreateDeliveryOrder'),
'default', $_SERVER[
"PHP_SELF"] .
'?action=create_delivery&token=' .
newToken() .
'&id=' .
$object->id,
'');
3070 if (
$object->signed_status != Expedition::$SIGNED_STATUSES[
'STATUS_SIGNED_ALL']) {
3071 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>';
3073 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>';
3079 if ($user->hasRight(
'facture',
'creer')) {
3081 print
dolGetButtonAction(
'', $langs->trans(
'CreateBill'),
'default', DOL_URL_ROOT.
'/compta/facture/card.php?action=create&origin='.
$object->element.
'&originid='.
$object->id.
'&socid='.
$object->socid,
'');
3088 if ($user->hasRight(
'expedition',
'creer') &&
$object->status > 0) {
3090 print
dolGetButtonAction(
'', $langs->trans(
'ClassifyBilled'),
'default', $_SERVER[
"PHP_SELF"].
'?action=classifybilled&token='.
newToken().
'&id='.
$object->id,
'');
3092 print
dolGetButtonAction(
'', $langs->trans(
"Close"),
'default', $_SERVER[
"PHP_SELF"] .
'?action=classifyclosed&token=' .
newToken() .
'&id=' .
$object->id,
'');
3098 if ($user->hasRight(
'expedition',
'creer')) {
3099 print
dolGetButtonAction(
'', $langs->trans(
'Cancel'),
'danger', $_SERVER[
"PHP_SELF"].
'?action=cancel&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'');
3104 if ($user->hasRight(
'expedition',
'supprimer')) {
3117 if ($action !=
'presend' && $action !=
'editline') {
3118 print
'<div class="fichecenter"><div class="fichehalfleft">';
3121 $filedir =
$conf->expedition->dir_output.
"/sending/".$objectref;
3123 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
3125 $genallowed = $user->hasRight(
'expedition',
'lire');
3126 $delallowed = $user->hasRight(
'expedition',
'creer');
3128 print $formfile->showdocuments(
'expedition', $objectref, $filedir, $urlsource, $genallowed, $delallowed,
$object->model_pdf, 1, 0, 0, 28, 0,
'',
'',
'', $soc->default_lang);
3132 $tmparray = $form->showLinkToObjectBlock(
$object, array(), array(
'shipping'), 1);
3133 $linktoelem = $tmparray[
'linktoelem'];
3134 $htmltoenteralink = $tmparray[
'htmltoenteralink'];
3135 print $htmltoenteralink;
3137 $somethingshown = $form->showLinkedObjectBlock(
$object, $linktoelem);
3143 print
'<br><!-- Link to sign -->';
3144 require_once DOL_DOCUMENT_ROOT.
'/core/lib/signature.lib.php';
3145 print showOnlineSignatureUrl(
'expedition',
$object->ref,
$object).
'<br>';
3148 print
'</div><div class="fichehalfright">';
3151 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
3153 $somethingshown = $formactions->showactions(
$object,
'shipping', $socid, 1);
3155 print
'</div></div>';
3164 if (
GETPOST(
'modelselected')) {
3165 $action =
'presend';
3169 $modelmail =
'shipping_send';
3170 $defaulttopic =
'SendShippingRef';
3171 $diroutput =
$conf->expedition->dir_output.
'/sending';
3172 $trackid =
'shi'.$object->id;
3174 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage customers orders.
Class to manage a WYSIWYG editor.
Class to manage warehouses.
const STATUS_DRAFT
Draft status.
const STATUS_CLOSED
Closed status -> parcel was received by customer / end of process prev status : validated or shipment...
const STATUS_VALIDATED
Validated status -> parcel is ready to be sent prev status : draft next status : closed or shipment_i...
Class to manage lines of shipment.
CRUD class for batch number management within shipment.
static liste_modeles($db, $maxfilenamelength=0)
Return list of active generation modules.
Class to manage the table of subscription to notifications.
Class to manage order lines.
Class 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.
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...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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 '.
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)
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
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'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
print_date_range($date_start, $date_end, $format='', $outputlangs=null)
Format output for start and end date.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
getDolGlobalBool($key, $default=false)
Return a Dolibarr global constant boolean value.
dol_clone($object, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
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...
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0)
Clean a string to use it as a file name.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
info_admin($text, $infoonimgalt=0, $nodiv=0, $admin='1', $morecss='hideonsmartphone', $textfordropdown='', $picto='')
Show information in HTML for admin users or standard users.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
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.