35require
'../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_order/modules_commandefournisseur.php';
37require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/lib/fourn.lib.php';
39require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.dispatch.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/lib/reception.lib.php';
44require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
55$langs->loadLangs(array(
"bills",
"orders",
"sendings",
"companies",
"products",
"stocks",
"receptions"));
58 $langs->load(
'productbatch');
65$action =
GETPOST(
'action',
'aZ09');
66$fk_default_warehouse =
GETPOSTINT(
'fk_default_warehouse');
67$cancel =
GETPOST(
'cancel',
'alpha');
68$confirm =
GETPOST(
'confirm',
'alpha');
74 $socid = $user->socid;
77$hookmanager->initHooks(array(
'ordersupplierdispatch'));
81if (GETPOSTISSET(
"projectid")) {
87if ($id > 0 || !empty($ref)) {
88 $result =
$object->fetch($id, $ref);
92 $result =
$object->fetch_thirdparty();
103 $origin_id =
$object->origin_object->id;
105 $objectsrc->fetch($origin_id);
109if (empty($conf->reception->enabled)) {
110 $permissiontoreceive = $user->hasRight(
'fournisseur',
'commande',
'receptionner');
111 $permissiontocontrol = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'fournisseur',
'commande',
'receptionner')) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'fournisseur',
'commande_advance',
'check')));
113 $permissiontoreceive = $user->hasRight(
'reception',
'creer');
114 $permissiontocontrol = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'creer')) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'reception_advance',
'validate')));
124$usercancreate = $user->hasRight(
'reception',
'creer');
125$permissiontoadd = $usercancreate;
132$parameters = array();
133$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
139if ($action ==
'updatelines' && $permissiontoreceive) {
146 foreach ($_POST as $key => $value) {
149 if (preg_match(
'/^product_.*([0-9]+)_([0-9]+)$/i', $key, $reg)) {
152 if (preg_match(
'/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
153 $modebatch =
"barcode";
154 } elseif (preg_match(
'/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
155 $modebatch =
"batch";
159 if ($modebatch ==
"barcode") {
160 $prod =
"product_".$reg[1].
'_'.$reg[2];
162 $prod =
'product_batch_'.$reg[1].
'_'.$reg[2];
164 $qty =
"qty_".$reg[1].
'_'.$reg[2];
165 $ent =
"entrepot_".$reg[1].
'_'.$reg[2];
166 $pu =
"pu_".$reg[1].
'_'.$reg[2];
167 $fk_commandefourndet =
"fk_commandefourndet_".$reg[1].
'_'.$reg[2];
168 $idline =
GETPOSTINT(
"idline_".$reg[1].
'_'.$reg[2]);
172 if ($modebatch ==
"batch") {
173 $lot =
GETPOST(
'lot_number_'.$reg[1].
'_'.$reg[2]);
178 $saveprice =
'__invalidsavepricekey__';
180 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
181 $dto =
GETPOSTINT(
"dto_".$reg[1].
'_'.$reg[2]);
185 $saveprice =
"saveprice_".$reg[1].
'_'.$reg[2];
190 if (($modebatch ==
"batch" &&
GETPOST($qty) > 0) || ($modebatch ==
"barcode" &&
GETPOST($qty) != 0)) {
192 dol_syslog(
'No dispatch for line '.$key.
' as no warehouse was chosen.');
193 $text = $langs->transnoentities(
'Warehouse').
', '.$langs->transnoentities(
'Line').
' '.($numline);
194 setEventMessages($langs->trans(
'ErrorFieldRequired', $text),
null,
'errors');
200 $result = $supplierorderdispatch->fetch($idline);
202 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
205 $qtystart = $supplierorderdispatch->qty;
207 $supplierorderdispatch->fk_entrepot =
GETPOSTINT($ent);
208 if ($modebatch ==
"batch") {
209 $supplierorderdispatch->eatby = $dDLUO;
210 $supplierorderdispatch->sellby = $dDLC;
213 $result = $supplierorderdispatch->update($user);
215 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
259 $result = $objectsrc->dispatchProduct($user,
GETPOSTINT($prod),
GETPOSTFLOAT($qty),
GETPOSTINT($ent),
GETPOSTFLOAT($pu),
GETPOST(
'comment'), $dDLUO, $dDLC, $lot,
GETPOSTINT($fk_commandefourndet), 0,
$object->id);
266 if (!$error &&
getDolGlobalString(
'SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
267 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
274 if (GETPOSTISSET($saveprice)) {
276 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"product_fournisseur_price";
277 $sql .=
" SET unitprice='".price2num(
GETPOST($pu),
'MU').
"'";
278 $sql .=
", price=".price2num(
GETPOST($pu),
'MU').
"*quantity";
279 $sql .=
", remise_percent = ".((float) $dto);
280 $sql .=
" WHERE fk_soc=".((int)
$object->socid);
281 $sql .=
" AND fk_product=".(GETPOSTINT($prod));
283 $resql = $db->query($sql);
298 header(
"Location: ".DOL_URL_ROOT.
'/reception/dispatch.php?id='.
$object->id);
310$form =
new Form($db);
312$warehouse_static =
new Entrepot($db);
315$title =
$object->ref.
" - ".$langs->trans(
'ReceptionDistribution');
316$help_url =
'EN:Module_Suppliers_Orders|FR:CommandeFournisseur|ES:Módulo_Pedidos_a_proveedores';
317$morejs = array(
'/fourn/js/lib_dispatch.js.php');
320llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs,
'',
'',
'mod-reception page-card_dispatch');
322if ($id > 0 || !empty($ref)) {
327 $origin_id =
$object->origin_id;
333 $author =
new User($db);
334 $author->fetch(
$object->user_author_id);
338 $title = $langs->trans(
"SupplierOrder");
339 print
dol_get_fiche_head($head,
'dispatch', $langs->trans(
"Reception"), -1,
'dollyrevert');
345 if ($action ==
'ask_deleteline') {
346 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
350 $parameters = array(
'lineid' => $lineid);
352 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
353 if (empty($reshook)) {
354 $formconfirm .= $hookmanager->resPrint;
355 } elseif ($reshook > 0) {
356 $formconfirm = $hookmanager->resPrint;
363 $linkback =
'<a href="'.DOL_URL_ROOT.
'/reception/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
364 $morehtmlref =
'<div class="refidno">';
367 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'', 0, 1);
368 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'',
null,
null,
'', 1);
371 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
374 $langs->load(
"projects");
375 $morehtmlref .=
'<br>';
377 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
378 if ($action !=
'classify' && $permissiontoadd) {
379 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
381 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (!
getDolGlobalString(
'PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ?
$object->socid : -1), (string)
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
383 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
385 $proj->fetch($objectsrc->fk_project);
386 $morehtmlref .= $proj->getNomUrl(1);
388 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
393 $morehtmlref .=
'</div>';
395 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
398 print
'<div class="fichecenter">';
399 print
'<div class="underbanner clearboth"></div>';
401 print
'<table class="border tableforfield" width="100%">';
406 print $langs->trans(
"RefOrder").
'</td>';
407 print
'<td colspan="3">';
408 print $objectsrc->getNomUrl(1,
'commande');
414 print $langs->trans(
"RefProposal").
'</td>';
415 print
'<td colspan="3">';
416 print $objectsrc->getNomUrl(1,
'reception');
420 if (($typeobject ==
'supplier_order' || $typeobject ==
'order_supplier') &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
422 print $langs->trans(
"SupplierOrder").
'</td>';
423 print
'<td colspan="3">';
424 print $objectsrc->getNomUrl(1,
'reception');
430 print
'<tr><td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
431 print
'<td colspan="3">'.dol_print_date(
$object->date_creation,
"dayhour",
"tzuserrel").
"</td>\n";
435 print
'<tr><td height="10">';
436 print
'<table class="nobordernopadding" width="100%"><tr><td>';
437 print $langs->trans(
'DateDeliveryPlanned');
439 print
'</tr></table>';
440 print
'</td><td colspan="2">';
446 print
'<br><br><center>';
447 print
'<a href="#" id="resetalltoexpected" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'autofill',
'class="pictofixedwidth"').$langs->trans(
"RestoreWithCurrentQtySaved").
'</a></td>';
449 print
'<a href="#" id="autoreset" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'eraser',
'class="pictofixedwidth"').$langs->trans(
"ClearQtys").
'</a></td>';
457 if (
$object->statut == Reception::STATUS_DRAFT || (
$object->statut == Reception::STATUS_VALIDATED && !
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION'))) {
458 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
460 $formproduct->loadWarehouses();
462 $listwarehouses = $entrepot->list_array(1);
464 print
'<form method="post" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
466 print
'<input type="hidden" name="token" value="'.newToken().
'">';
467 print
'<input type="hidden" name="action" value="updatelines">';
468 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
470 print
'<div class="div-table-responsive-no-min">';
471 print
'<table class="noborder centpercent">';
474 $products_dispatched = array();
475 $sql =
"SELECT l.rowid, cfd.fk_product, sum(cfd.qty) as qty";
476 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
477 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"receptiondet_batch as l on l.rowid = cfd.fk_elementdet";
478 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
479 $sql .=
" GROUP BY l.rowid, cfd.fk_product";
481 $resql = $db->query($sql);
483 $num = $db->num_rows($resql);
488 $objd = $db->fetch_object($resql);
489 $products_dispatched[$objd->rowid] =
price2num($objd->qty,
'MS');
498 $sql =
"SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, l.ref AS sref, l.qty as qty,";
499 $sql .=
" p.ref, p.label, p.tobatch, p.fk_default_warehouse";
501 $parameters = array();
502 $reshook = $hookmanager->executeHooks(
503 'printFieldListSelect',
511 $sql .= $hookmanager->resPrint;
512 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as l";
513 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON l.fk_product=p.rowid";
514 $sql .=
" WHERE l.fk_commande = ".((int) $objectsrc->id);
516 $sql .=
" AND l.product_type = 0";
519 $parameters = array();
520 $reshook = $hookmanager->executeHooks(
521 'printFieldListWhere',
529 $sql .= $hookmanager->resPrint;
532 $sql .=
" ORDER BY l.rang, p.ref, p.label";
534 $resql = $db->query($sql);
536 $num = $db->num_rows($resql);
540 print
'<tr class="liste_titre">';
542 print
'<td>'.$langs->trans(
"Description").
'</td>';
544 print
'<td class="dispatch_batch_number_title">'.$langs->trans(
"batch_number").
'</td>';
546 print
'<td class="dispatch_dlc_title">'.$langs->trans(
"SellByDate").
'</td>';
549 print
'<td class="dispatch_dluo_title">'.$langs->trans(
"EatByDate").
'</td>';
556 print
'<td class="right">'.$langs->trans(
"SupplierRef").
'</td>';
557 print
'<td class="right">'.$langs->trans(
"QtyOrdered").
'</td>';
558 if (
$object->status == Reception::STATUS_DRAFT) {
559 print
'<td class="right">'.$langs->trans(
"QtyToReceive");
561 print
'<td class="right">'.$langs->trans(
"QtyDispatchedShort").
'</td>';
563 print
'<td class="right">'.$langs->trans(
"Details");
564 print
'<td width="32"></td>';
567 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
568 print
'<td class="right">'.$langs->trans(
"Price").
'</td>';
569 print
'<td class="right">'.$langs->trans(
"ReductionShort").
' (%)</td>';
570 print
'<td class="right">'.$langs->trans(
"UpdatePrice").
'</td>';
574 print
'<td align="right">'.$langs->trans(
"Warehouse");
577 if (count($listwarehouses) > 1) {
578 print
'<br><span class="opacitymedium">'.$langs->trans(
"ForceTo").
'</span> '.$form->selectarray(
'fk_default_warehouse', $listwarehouses, $fk_default_warehouse, 1, 0, 0,
'', 0, 0, $disabled,
'',
'minwidth100 maxwidth300', 1);
579 } elseif (count($listwarehouses) == 1) {
580 print
'<br><span class="opacitymedium">'.$langs->trans(
"ForceTo").
'</span> '.$form->selectarray(
'fk_default_warehouse', $listwarehouses, $fk_default_warehouse, 0, 0, 0,
'', 0, 0, $disabled,
'',
'minwidth100 maxwidth300', 1);
586 $parameters = array();
587 $reshook = $hookmanager->executeHooks(
588 'printFieldListTitle',
596 print $hookmanager->resPrint;
604 $conf->cache[
'product'] = array();
608 $objp = $db->fetch_object($resql);
611 if (!$objp->fk_product > 0) {
614 $alreadydispatched = isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] : 0;
615 $remaintodispatch =
price2num($objp->qty, 5);
616 if ($remaintodispatch < 0 && !
getDolGlobalString(
'SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN')) {
617 $remaintodispatch = 0;
620 if ($remaintodispatch || !
getDolGlobalString(
'SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
629 print
'<!-- Line to dispatch '.$suffix.
' -->'.
"\n";
631 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$objp->qty.
'">';
632 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" data-dispatched="'.((float) $alreadydispatched).
'" value="'.(float) $alreadydispatched.
'">';
633 print
'<tr class="oddeven">';
635 if (empty($conf->cache[
'product'][$objp->fk_product])) {
636 $tmpproduct =
new Product($db);
637 $tmpproduct->fetch($objp->fk_product);
638 $conf->cache[
'product'][$objp->fk_product] = $tmpproduct;
640 $tmpproduct = $conf->cache[
'product'][$objp->fk_product];
643 $linktoprod = $tmpproduct->getNomUrl(1);
644 $linktoprod .=
' - '.$objp->label.
"\n";
647 if ($objp->tobatch) {
649 print
'<td class="tdoverflowmax200">';
652 print
'<td class="dispatch_batch_number"></td>';
654 print
'<td class="dispatch_dlc"></td>';
657 print
'<td class="dispatch_dluo"></td>';
661 print
'<td class="tdoverflowmax200">';
664 print
'<td class="dispatch_batch_number">';
665 print
'<span class="opacitymedium small">'.$form->textwithpicto($langs->transnoentitiesnoconv(
"NA"), $langs->transnoentitiesnoconv(
"ProductDoesNotUseBatchSerial")).
'</small>';
668 print
'<td class="dispatch_dlc"></td>';
671 print
'<td class="dispatch_dluo"></td>';
675 print
'<td colspan="4">';
681 $up_ht_disc = $objp->subprice;
682 if (!empty($objp->remise_percent) && !
getDolGlobalString(
'STOCK_EXCLUDE_DISCOUNT_FOR_PMP')) {
683 $up_ht_disc =
price2num($up_ht_disc * (100 - $objp->remise_percent) / 100,
'MU');
687 print
'<td class="right">'.$objp->sref.
'</td>';
690 print
'<td class="right">'.$objp->qty.
'</td>';
693 print
'<td class="right">'.$alreadydispatched.
'</td>';
695 print
'<td class="right">';
701 $sql =
"SELECT cfd.rowid, cfd.qty, cfd.fk_entrepot, cfd.batch, cfd.eatby, cfd.sellby, cfd.fk_product";
702 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
703 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
704 $sql .=
" AND cfd.fk_element = ".((int) $objectsrc->id);
705 $sql .=
" AND cfd.fk_elementdet = ".(int) $objp->rowid;
708 $resultsql = $db->query($sql);
711 $numd = $db->num_rows($resultsql);
714 $suffix =
"_".$j.
"_".$i;
715 $objd = $db->fetch_object($resultsql);
717 if (
isModEnabled(
'productbatch') && (!empty($objd->batch) || (is_null($objd->batch) && $tmpproduct->status_batch > 0))) {
723 'is_information_row' =>
true,
728 $reshook = $hookmanager->executeHooks(
729 'printFieldListValue',
737 print $hookmanager->resPrint;
741 print
'<!-- line for batch '.$numline.
' -->';
742 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
744 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
745 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
746 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
748 print
'<!-- This is a U.P. (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
750 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
752 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
758 print
'<input disabled="" type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.(GETPOSTISSET(
'lot_number'.$suffix) ?
GETPOST(
'lot_number'.$suffix) : $objd->batch).
'">';
761 print
'<td class="nowraponall">';
763 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
767 print
'<td class="nowraponall">';
769 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
772 print
'<td colspan="3"> </td>';
782 'is_information_row' =>
true,
787 $reshook = $hookmanager->executeHooks(
788 'printFieldListValue',
796 print $hookmanager->resPrint;
800 print
'<!-- line no batch '.$numline.
' -->';
801 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
802 print
'<td colspan="'.$colspan.
'">';
803 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
804 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
805 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
807 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
809 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
811 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
817 print
'<td class="right nowraponall">';
818 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
819 print
'<input id="qty'.$suffix.
'" onchange="onChangeDispatchLineQty($(this))" name="qty'.$suffix.
'" data-type="'.$type.
'" data-index="'.$i.
'" class="width50 right qtydispatchinput" value="'.(GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : $objd->qty).
'" data-expected="'.$objd->qty.
'">';
822 if (
isModEnabled(
'productbatch') && $objp->tobatch > 0) {
824 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
827 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
833 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
835 print
'<td class="right">';
836 print
'<input id="pu'.$suffix.
'" name="pu'.$suffix.
'" type="text" size="8" value="'.
price((
GETPOST(
'pu'.$suffix) !=
'' ?
price2num(
GETPOST(
'pu'.$suffix)) : $up_ht_disc)).
'">';
840 print
'<td class="right">';
841 print
'<input id="dto'.$suffix.
'" name="dto'.$suffix.
'" type="text" size="8" value="'.(
GETPOST(
'dto'.$suffix) !=
'' ?
GETPOST(
'dto'.$suffix) :
'').
'">';
845 print
'<td class="center">';
846 print
'<input class="flat checkformerge" type="checkbox" name="saveprice'.$suffix.
'" value="'.(
GETPOST(
'saveprice'.$suffix) !=
'' ?
GETPOST(
'saveprice'.$suffix) :
'').
'">';
852 print
'<td class="right">';
853 if (count($listwarehouses) > 1) {
854 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 1, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
855 } elseif (count($listwarehouses) == 1) {
856 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 0, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
858 $langs->load(
"errors");
859 print $langs->trans(
"ErrorNoWarehouseDefined");
865 'is_information_row' =>
false,
870 $reshook = $hookmanager->executeHooks(
871 'printFieldListValue',
879 print $hookmanager->resPrint;
886 $suffix =
"_".$j.
"_".$i;
890 if (
isModEnabled(
'productbatch') && !empty($objp->tobatch)) {
896 'is_information_row' =>
true,
901 $reshook = $hookmanager->executeHooks(
902 'printFieldListValue',
910 print $hookmanager->resPrint;
914 print
'<!-- line for batch '.$numline.
' (not dispatched line yet for this order line) -->';
915 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'">';
917 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
918 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
919 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
921 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
923 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
925 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
931 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.
GETPOST(
'lot_number'.$suffix).
'">';
934 print
'<td class="nowraponall">';
936 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
940 print
'<td class="nowraponall">';
942 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
945 print
'<td colspan="3"> </td>';
955 'is_information_row' =>
true,
960 $reshook = $hookmanager->executeHooks(
961 'printFieldListValue',
969 print $hookmanager->resPrint;
973 print
'<!-- line no batch '.$numline.
' (not dispatched line yet for this order line) -->';
974 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
975 print
'<td colspan="'.$colspan.
'">';
976 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
977 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
978 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
980 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
982 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" data-type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
984 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
990 print
'<td class="right">';
991 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
992 print
'<input id="qty'.$suffix.
'" onchange="onChangeDispatchLineQty($(this))" name="qty'.$suffix.
'" data-index="'.$i.
'" data-type="text" class="width50 right qtydispatchinput" value="'.(GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : (!
getDolGlobalString(
'SUPPLIER_ORDER_DISPATCH_FORCE_QTY_INPUT_TO_ZERO') ? $remaintodispatch : 0)).
'" data-expected="'.$remaintodispatch.
'">';
995 if (
isModEnabled(
'productbatch') && $objp->tobatch > 0) {
997 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" onClick="addDispatchLine('.$i.
', \''.$type.
'\')
"');
1000 print img_picto($langs->trans('AddStockLocationLine'), 'split', 'class="splitbutton
" onClick="addDispatchLine(
'.$i.', \
''.$type.
'\')
"');
1005 if (getDolGlobalString('SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
1006 if (!isModEnabled("multicurrency
") && empty($conf->dynamicprices->enabled)) {
1008 print '<td class="right
">';
1009 print '<input id="pu
'.$suffix.'" name="pu
'.$suffix.'" type="text
" size="8
" value="'.price((GETPOST('pu
'.$suffix) != '' ? price2num(GETPOST('pu
'.$suffix)) : $up_ht_disc)).'">';
1013 print '<td class="right
">';
1014 print '<input id="dto
'.$suffix.'" name="dto
'.$suffix.'" type="text
" size="8
" value="'.(GETPOST('dto
'.$suffix) != '' ? GETPOST('dto
'.$suffix) : '').'">';
1018 print '<td class="center
">';
1019 print '<input class="flat checkformerge
" type="checkbox
" name="saveprice
'.$suffix.'" value="'.(GETPOST('saveprice
'.$suffix) != '' ? GETPOST('saveprice
'.$suffix) : '').'">';
1025 print '<td class="right
">';
1026 if (count($listwarehouses) > 1) {
1027 print $formproduct->selectWarehouses(GETPOST("entrepot
".$suffix) ? GETPOST("entrepot
".$suffix) : ($objp->fk_default_warehouse ? $objp->fk_default_warehouse : ''), "entrepot
".$suffix, '', 1, 0, $objp->fk_product, '', 1, 0, array(), 'csswarehouse'.$suffix);
1028 } elseif (count($listwarehouses) == 1) {
1029 print $formproduct->selectWarehouses(GETPOST("entrepot
".$suffix) ? GETPOST("entrepot
".$suffix) : ($objp->fk_default_warehouse ? $objp->fk_default_warehouse : ''), "entrepot
".$suffix, '', 0, 0, $objp->fk_product, '', 1, 0, array(), 'csswarehouse'.$suffix);
1031 $langs->load("errors
");
1032 print $langs->trans("ErrorNoWarehouseDefined
");
1036 // Enable hooks to append additional columns
1037 $parameters = array(
1038 'is_information_row' => false, // this is a dispatch form row
1040 'suffix' => $suffix,
1043 $reshook = $hookmanager->executeHooks(
1044 'printFieldListValue',
1050 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1052 print $hookmanager->resPrint;
1061 dol_print_error($db);
1068 print '<div class="center
">';
1069 $parameters = array();
1070 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1072 if (empty($reshook)) {
1073 /*$checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically
", $langs->transnoentitiesnoconv('StatusOrderReceivedAll'));
1075 if (empty($conf->reception->enabled)) {
1076 print $langs->trans("Comment").' : ';
1077 print '<input type="text
" class="minwidth400
" maxlength="128
" name="comment
" value="';
1078 print GETPOSTISSET("comment") ? GETPOST("comment") : $langs->trans("DispatchSupplierOrder", $object->ref);
1079 // print ' /
'.$object->ref_supplier; // Not yet available
1080 print '" class="flat
"><br>';
1082 print '<input type="checkbox
" checked="checked
" name="closeopenorder
"> '.$checkboxlabel;
1085 $dispatchBt = empty($conf->reception->enabled) ? $langs->trans("Receive
") : $langs->trans("CreateReception
");
1090 print '<input type="submit
" id="submitform
" class="button" name="dispatch
" value="'.$langs->trans("Save").'"';
1092 if (!$permissiontoreceive) {
1095 if (count($listwarehouses) <= 0) {
1107 // Message if nothing to dispatch
1110 if (!getDolGlobalString('SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
1111 print '<div class="opacitymedium
">'.$langs->trans("NoPredefinedProductToDispatch
").'</div>'; // No predefined line at all
1113 print '<div class="opacitymedium
">'.$langs->trans("NoMorePredefinedProductToDispatch
").'</div>'; // No predefined line that remain to be dispatched.
1120 print dol_get_fiche_end();
1122 // traitement entrepot par défaut
1123 print '<script type="text/javascript
">
1124 $(document).ready(function () {
1125 $("select[
name=fk_default_warehouse]
").change(function() {
1126 var fk_default_warehouse = $("option:selected
", this).val();
1127 $("select[
name^=entrepot_]
").val(fk_default_warehouse).change();
1130 $("#autoreset
").click(function() {
1131 $(".autoresettr
").each(function(){
1132 id = $(this).attr("name");
1133 idtab = id.split("_
");
1134 if ($(this).data("remove") == "clear
"){
1135 console.log("We clear the
object to expected value
")
1136 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val("");
1138 qtyexpected = $("#qty_
"+idtab[1]+"_
"+idtab[2]).data("expected
")
1139 console.log(qtyexpected);
1140 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val(qtyexpected);
1141 qtydispatched = $("#qty_dispatched_0_
"+idtab[2]).data("dispatched
")
1142 $("#qty_dispatched_0_
"+idtab[2]).val(qtydispatched);
1145 console.log("We
remove the
object")
1147 $("tr[
name^=\
'"+idtab[0]+"_\'][name$=\'_"+idtab[2]+"\']:last .splitbutton").show();
1153 $("#resetalltoexpected").click(function(){
1154 $(".qtydispatchinput").each(function(){
1155 console.log("We reset to expected "+$(this).attr("id")+" qty to dispatch");
1156 $(this).val($(this).data("expected"));
1161 $(".resetline").click(function(e){
1163 id = $(this).attr("id");
1164 id = id.split("reset_");
1165 console.log("Reset trigger for id = qty_"+id[1]);
1166 $("#qty_"+id[1]).val("");
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage table ReceptionLineBatch.
Class to manage predefined suppliers products.
Class to manage warehouses.
Class to manage products or services.
Class to manage projects.
Class to manage receptions.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
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 '.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
treeview li table
No Email.
reception_prepare_head(Reception $object)
Prepare array with list of tabs.
$conf db name
Only used if Module[ID]Name translation string is not found.
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.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.