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",
"deliveries",
"products",
"stocks",
"receptions"));
57if (isModEnabled(
'productbatch')) {
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();
102 if ($origin ==
'order_supplier' &&
$object->origin_object->id && (isModEnabled(
"fournisseur") && !
getDolGlobalString(
'MAIN_USE_NEW_SUPPLIERMOD') || isModEnabled(
"supplier_order"))) {
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')));
120if (!isModEnabled(
'stock')) {
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)) {
151 if (preg_match(
'/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
152 $modebatch =
"barcode";
153 } elseif (preg_match(
'/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
154 $modebatch =
"batch";
158 if ($modebatch ==
"barcode") {
159 $prod =
"product_".$reg[1].
'_'.$reg[2];
161 $prod =
'product_batch_'.$reg[1].
'_'.$reg[2];
163 $qty =
"qty_".$reg[1].
'_'.$reg[2];
164 $ent =
"entrepot_".$reg[1].
'_'.$reg[2];
165 $pu =
"pu_".$reg[1].
'_'.$reg[2];
166 $fk_commandefourndet =
"fk_commandefourndet_".$reg[1].
'_'.$reg[2];
167 $idline =
GETPOST(
"idline_".$reg[1].
'_'.$reg[2]);
171 if ($modebatch ==
"batch") {
172 $lot =
GETPOST(
'lot_number_'.$reg[1].
'_'.$reg[2]);
178 if (!isModEnabled(
"multicurrency") && empty(
$conf->dynamicprices->enabled)) {
179 $dto =
GETPOSTINT(
"dto_".$reg[1].
'_'.$reg[2]);
183 $saveprice =
"saveprice_".$reg[1].
'_'.$reg[2];
188 if (($modebatch ==
"batch" &&
GETPOST($qty) > 0) || ($modebatch ==
"barcode" &&
GETPOST($qty) != 0)) {
190 dol_syslog(
'No dispatch for line '.$key.
' as no warehouse was chosen.');
191 $text = $langs->transnoentities(
'Warehouse').
', '.$langs->transnoentities(
'Line').
' '.($numline);
192 setEventMessages($langs->trans(
'ErrorFieldRequired', $text),
null,
'errors');
198 $result = $supplierorderdispatch->fetch($idline);
200 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
203 $qtystart = $supplierorderdispatch->qty;
205 $supplierorderdispatch->fk_entrepot =
GETPOSTINT($ent);
206 if ($modebatch ==
"batch") {
207 $supplierorderdispatch->eatby = $dDLUO;
208 $supplierorderdispatch->sellby = $dDLC;
211 $result = $supplierorderdispatch->update($user);
213 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
257 $result = $objectsrc->dispatchProduct($user,
GETPOSTINT($prod),
GETPOST($qty),
GETPOSTINT($ent),
GETPOST($pu),
GETPOST(
'comment'), $dDLUO, $dDLC, $lot,
GETPOSTINT($fk_commandefourndet), 0,
$object->id);
264 if (!$error &&
getDolGlobalString(
'SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
265 if (!isModEnabled(
"multicurrency") && empty(
$conf->dynamicprices->enabled)) {
272 if (GETPOSTISSET($saveprice)) {
274 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"product_fournisseur_price";
275 $sql .=
" SET unitprice='".price2num(
GETPOST($pu),
'MU').
"'";
276 $sql .=
", price=".price2num(
GETPOST($pu),
'MU').
"*quantity";
277 $sql .=
", remise_percent = ".((float) $dto);
278 $sql .=
" WHERE fk_soc=".((int)
$object->socid);
279 $sql .=
" AND fk_product=".(GETPOSTINT($prod));
281 $resql = $db->query($sql);
296 header(
"Location: ".DOL_URL_ROOT.
'/reception/dispatch.php?id='.
$object->id);
308$form =
new Form($db);
310$warehouse_static =
new Entrepot($db);
313$title =
$object->ref.
" - ".$langs->trans(
'ReceptionDistribution');
314$help_url =
'EN:Module_Suppliers_Orders|FR:CommandeFournisseur|ES:Módulo_Pedidos_a_proveedores';
315$morejs = array(
'/fourn/js/lib_dispatch.js.php');
318llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs,
'',
'',
'mod-reception page-card_dispatch');
320if ($id > 0 || !empty($ref)) {
322 $object->origin =
'CommandeFournisseur';
325 $origin_id =
$object->origin_id;
331 $author =
new User($db);
332 $author->fetch(
$object->user_author_id);
336 $title = $langs->trans(
"SupplierOrder");
337 print
dol_get_fiche_head($head,
'dispatch', $langs->trans(
"Reception"), -1,
'dollyrevert');
343 if ($action ==
'ask_deleteline') {
344 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
348 $parameters = array(
'lineid' => $lineid);
350 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
351 if (empty($reshook)) {
352 $formconfirm .= $hookmanager->resPrint;
353 } elseif ($reshook > 0) {
354 $formconfirm = $hookmanager->resPrint;
361 $linkback =
'<a href="'.DOL_URL_ROOT.
'/reception/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
362 $morehtmlref =
'<div class="refidno">';
365 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'', 0, 1);
366 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'',
null,
null,
'', 1);
369 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
371 if (isModEnabled(
'project')) {
372 $langs->load(
"projects");
373 $morehtmlref .=
'<br>';
375 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
376 if ($action !=
'classify' && $permissiontoadd) {
377 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
379 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (!
getDolGlobalString(
'PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ?
$object->socid : -1),
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
381 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
383 $proj->fetch($objectsrc->fk_project);
384 $morehtmlref .= $proj->getNomUrl(1);
386 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
391 $morehtmlref .=
'</div>';
393 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
396 print
'<div class="fichecenter">';
397 print
'<div class="underbanner clearboth"></div>';
399 print
'<table class="border tableforfield" width="100%">';
402 if ($typeobject ==
'commande' &&
$object->origin_object->id && isModEnabled(
'order')) {
404 print $langs->trans(
"RefOrder").
'</td>';
405 print
'<td colspan="3">';
406 print $objectsrc->getNomUrl(1,
'commande');
410 if ($typeobject ==
'propal' &&
$object->origin_object->id && isModEnabled(
"propal")) {
412 print $langs->trans(
"RefProposal").
'</td>';
413 print
'<td colspan="3">';
414 print $objectsrc->getNomUrl(1,
'reception');
418 if ($typeobject ==
'CommandeFournisseur' &&
$object->origin_object->id && isModEnabled(
"propal")) {
420 print $langs->trans(
"SupplierOrder").
'</td>';
421 print
'<td colspan="3">';
422 print $objectsrc->getNomUrl(1,
'reception');
428 print
'<tr><td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
429 print
'<td colspan="3">'.dol_print_date(
$object->date_creation,
"dayhour",
"tzuserrel").
"</td>\n";
433 print
'<tr><td height="10">';
434 print
'<table class="nobordernopadding" width="100%"><tr><td>';
435 print $langs->trans(
'DateDeliveryPlanned');
437 print
'</tr></table>';
438 print
'</td><td colspan="2">';
444 print
'<br><br><center>';
445 print
'<a href="#" id="resetalltoexpected" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'autofill',
'class="pictofixedwidth"').$langs->trans(
"RestoreWithCurrentQtySaved").
'</a></td>';
447 print
'<a href="#" id="autoreset" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'eraser',
'class="pictofixedwidth"').$langs->trans(
"ClearQtys").
'</a></td>';
453 if (
$object->statut == Reception::STATUS_DRAFT || (
$object->statut == Reception::STATUS_VALIDATED && !
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION'))) {
454 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
456 $formproduct->loadWarehouses();
458 $listwarehouses = $entrepot->list_array(1);
460 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'">';
462 print
'<input type="hidden" name="token" value="'.newToken().
'">';
463 print
'<input type="hidden" name="action" value="updatelines">';
464 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
466 print
'<div class="div-table-responsive-no-min">';
467 print
'<table class="noborder centpercent">';
470 $products_dispatched = array();
471 $sql =
"SELECT l.rowid, cfd.fk_product, sum(cfd.qty) as qty";
472 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
473 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"receptiondet_batch as l on l.rowid = cfd.fk_elementdet";
474 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
475 $sql .=
" GROUP BY l.rowid, cfd.fk_product";
477 $resql = $db->query($sql);
479 $num = $db->num_rows($resql);
484 $objd = $db->fetch_object($resql);
485 $products_dispatched[$objd->rowid] =
price2num($objd->qty,
'MS');
494 $sql =
"SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, l.ref AS sref, l.qty as qty,";
495 $sql .=
" p.ref, p.label, p.tobatch, p.fk_default_warehouse";
497 $parameters = array();
498 $reshook = $hookmanager->executeHooks(
499 'printFieldListSelect',
507 $sql .= $hookmanager->resPrint;
508 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as l";
509 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON l.fk_product=p.rowid";
510 $sql .=
" WHERE l.fk_commande = ".((int) $objectsrc->id);
512 $sql .=
" AND l.product_type = 0";
515 $parameters = array();
516 $reshook = $hookmanager->executeHooks(
517 'printFieldListWhere',
525 $sql .= $hookmanager->resPrint;
528 $sql .=
" ORDER BY l.rang, p.ref, p.label";
530 $resql = $db->query($sql);
532 $num = $db->num_rows($resql);
536 print
'<tr class="liste_titre">';
538 print
'<td>'.$langs->trans(
"Description").
'</td>';
539 if (isModEnabled(
'productbatch')) {
540 print
'<td class="dispatch_batch_number_title">'.$langs->trans(
"batch_number").
'</td>';
542 print
'<td class="dispatch_dlc_title">'.$langs->trans(
"SellByDate").
'</td>';
545 print
'<td class="dispatch_dluo_title">'.$langs->trans(
"EatByDate").
'</td>';
552 print
'<td class="right">'.$langs->trans(
"SupplierRef").
'</td>';
553 print
'<td class="right">'.$langs->trans(
"QtyOrdered").
'</td>';
554 if (
$object->status == Reception::STATUS_DRAFT) {
555 print
'<td class="right">'.$langs->trans(
"QtyToReceive");
557 print
'<td class="right">'.$langs->trans(
"QtyDispatchedShort").
'</td>';
559 print
'<td class="right">'.$langs->trans(
"Details");
560 print
'<td width="32"></td>';
563 if (!isModEnabled(
"multicurrency") && empty(
$conf->dynamicprices->enabled)) {
564 print
'<td class="right">'.$langs->trans(
"Price").
'</td>';
565 print
'<td class="right">'.$langs->trans(
"ReductionShort").
' (%)</td>';
566 print
'<td class="right">'.$langs->trans(
"UpdatePrice").
'</td>';
570 print
'<td align="right">'.$langs->trans(
"Warehouse");
573 if (count($listwarehouses) > 1) {
574 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);
575 } elseif (count($listwarehouses) == 1) {
576 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);
582 $parameters = array();
583 $reshook = $hookmanager->executeHooks(
584 'printFieldListTitle',
592 print $hookmanager->resPrint;
601 $conf->cache[
'product'] = array();
605 $objp = $db->fetch_object($resql);
608 if (!$objp->fk_product > 0) {
611 $alreadydispatched = isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] : 0;
612 $remaintodispatch =
price2num($objp->qty, 5);
613 if ($remaintodispatch < 0 && !
getDolGlobalString(
'SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN')) {
614 $remaintodispatch = 0;
617 if ($remaintodispatch || !
getDolGlobalString(
'SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
626 print
'<!-- Line to dispatch '.$suffix.
' -->'.
"\n";
628 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$objp->qty.
'">';
629 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" data-dispatched="'.((float) $alreadydispatched).
'" value="'.(float) $alreadydispatched.
'">';
630 print
'<tr class="oddeven">';
632 if (empty(
$conf->cache[
'product'][$objp->fk_product])) {
633 $tmpproduct =
new Product($db);
634 $tmpproduct->fetch($objp->fk_product);
635 $conf->cache[
'product'][$objp->fk_product] = $tmpproduct;
637 $tmpproduct =
$conf->cache[
'product'][$objp->fk_product];
640 $linktoprod = $tmpproduct->getNomUrl(1);
641 $linktoprod .=
' - '.$objp->label.
"\n";
643 if (isModEnabled(
'productbatch')) {
644 if ($objp->tobatch) {
649 print
'<td class="dispatch_batch_number"></td>';
651 print
'<td class="dispatch_dlc"></td>';
654 print
'<td class="dispatch_dluo"></td>';
661 print
'<td class="dispatch_batch_number">';
662 print
'<span class="opacitymedium small">'.$langs->trans(
"ProductDoesNotUseBatchSerial").
'</small>';
665 print
'<td class="dispatch_dlc"></td>';
668 print
'<td class="dispatch_dluo"></td>';
672 print
'<td colspan="4">';
678 $up_ht_disc = $objp->subprice;
679 if (!empty($objp->remise_percent) && !
getDolGlobalString(
'STOCK_EXCLUDE_DISCOUNT_FOR_PMP')) {
680 $up_ht_disc =
price2num($up_ht_disc * (100 - $objp->remise_percent) / 100,
'MU');
684 print
'<td class="right">'.$objp->sref.
'</td>';
687 print
'<td class="right">'.$objp->qty.
'</td>';
690 print
'<td class="right">'.$alreadydispatched.
'</td>';
692 print
'<td class="right">';
698 $sql =
"SELECT cfd.rowid, cfd.qty, cfd.fk_entrepot, cfd.batch, cfd.eatby, cfd.sellby, cfd.fk_product";
699 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
700 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
701 $sql .=
" AND cfd.fk_element = ".((int) $objectsrc->id);
702 $sql .=
" AND cfd.fk_elementdet = ".(int) $objp->rowid;
705 $resultsql = $db->query($sql);
708 $numd = $db->num_rows($resultsql);
711 $suffix =
"_".$j.
"_".$i;
712 $objd = $db->fetch_object($resultsql);
714 if (isModEnabled(
'productbatch') && (!empty($objd->batch) || (is_null($objd->batch) && $tmpproduct->status_batch > 0))) {
720 'is_information_row' =>
true,
725 $reshook = $hookmanager->executeHooks(
726 'printFieldListValue',
734 print $hookmanager->resPrint;
738 print
'<!-- line for batch '.$numline.
' -->';
739 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
741 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
742 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
743 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
745 print
'<!-- This is a U.P. (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
747 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
749 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
755 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).
'">';
758 print
'<td class="nowraponall">';
760 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
764 print
'<td class="nowraponall">';
766 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
769 print
'<td colspan="3"> </td>';
779 'is_information_row' =>
true,
784 $reshook = $hookmanager->executeHooks(
785 'printFieldListValue',
793 print $hookmanager->resPrint;
797 print
'<!-- line no batch '.$numline.
' -->';
798 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
799 print
'<td colspan="'.$colspan.
'">';
800 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
801 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
802 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
804 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
806 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
808 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
814 print
'<td class="right">';
815 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
816 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.
'">';
819 if (isModEnabled(
'productbatch') && $objp->tobatch > 0) {
821 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
824 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
830 if (!isModEnabled(
"multicurrency") && empty(
$conf->dynamicprices->enabled)) {
832 print
'<td class="right">';
833 print
'<input id="pu'.$suffix.
'" name="pu'.$suffix.
'" type="text" size="8" value="'.
price((
GETPOST(
'pu'.$suffix) !=
'' ?
price2num(
GETPOST(
'pu'.$suffix)) : $up_ht_disc)).
'">';
837 print
'<td class="right">';
838 print
'<input id="dto'.$suffix.
'" name="dto'.$suffix.
'" type="text" size="8" value="'.(
GETPOST(
'dto'.$suffix) !=
'' ?
GETPOST(
'dto'.$suffix) :
'').
'">';
842 print
'<td class="center">';
843 print
'<input class="flat checkformerge" type="checkbox" name="saveprice'.$suffix.
'" value="'.(
GETPOST(
'saveprice'.$suffix) !=
'' ?
GETPOST(
'saveprice'.$suffix) :
'').
'">';
849 print
'<td class="right">';
850 if (count($listwarehouses) > 1) {
851 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 1, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
852 } elseif (count($listwarehouses) == 1) {
853 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 0, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
855 $langs->load(
"errors");
856 print $langs->trans(
"ErrorNoWarehouseDefined");
862 'is_information_row' =>
false,
867 $reshook = $hookmanager->executeHooks(
868 'printFieldListValue',
876 print $hookmanager->resPrint;
883 $suffix =
"_".$j.
"_".$i;
887 if (isModEnabled(
'productbatch') && !empty($objp->tobatch)) {
893 'is_information_row' =>
true,
898 $reshook = $hookmanager->executeHooks(
899 'printFieldListValue',
907 print $hookmanager->resPrint;
911 print
'<!-- line for batch '.$numline.
' (not dispatched line yet for this order line) -->';
912 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'">';
914 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
915 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
916 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
918 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
920 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
922 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
928 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.
GETPOST(
'lot_number'.$suffix).
'">';
931 print
'<td class="nowraponall">';
933 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
937 print
'<td class="nowraponall">';
939 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
942 print
'<td colspan="3"> </td>';
952 'is_information_row' =>
true,
957 $reshook = $hookmanager->executeHooks(
958 'printFieldListValue',
966 print $hookmanager->resPrint;
970 print
'<!-- line no batch '.$numline.
' (not dispatched line yet for this order line) -->';
971 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
972 print
'<td colspan="'.$colspan.
'">';
973 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
974 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
975 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
977 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
979 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" data-type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
981 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
987 print
'<td class="right">';
988 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
989 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.
'">';
992 if (isModEnabled(
'productbatch') && $objp->tobatch > 0) {
994 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" onClick="addDispatchLine('.$i.
', \''.$type.
'\')
"');
997 print img_picto($langs->trans('AddStockLocationLine'), 'split.png', 'class="splitbutton
" onClick="addDispatchLine(
'.$i.', \
''.$type.
'\')
"');
1002 if (getDolGlobalString('SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
1003 if (!isModEnabled("multicurrency
") && empty($conf->dynamicprices->enabled)) {
1005 print '<td class="right
">';
1006 print '<input id="pu
'.$suffix.'" name="pu
'.$suffix.'" type="text
" size="8
" value="'.price((GETPOST('pu
'.$suffix) != '' ? price2num(GETPOST('pu
'.$suffix)) : $up_ht_disc)).'">';
1010 print '<td class="right
">';
1011 print '<input id="dto
'.$suffix.'" name="dto
'.$suffix.'" type="text
" size="8
" value="'.(GETPOST('dto
'.$suffix) != '' ? GETPOST('dto
'.$suffix) : '').'">';
1015 print '<td class="center
">';
1016 print '<input class="flat checkformerge
" type="checkbox
" name="saveprice
'.$suffix.'" value="'.(GETPOST('saveprice
'.$suffix) != '' ? GETPOST('saveprice
'.$suffix) : '').'">';
1022 print '<td class="right
">';
1023 if (count($listwarehouses) > 1) {
1024 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);
1025 } elseif (count($listwarehouses) == 1) {
1026 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);
1028 $langs->load("errors
");
1029 print $langs->trans("ErrorNoWarehouseDefined
");
1033 // Enable hooks to append additional columns
1034 $parameters = array(
1035 'is_information_row' => false, // this is a dispatch form row
1037 'suffix' => $suffix,
1040 $reshook = $hookmanager->executeHooks(
1041 'printFieldListValue',
1047 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1049 print $hookmanager->resPrint;
1058 dol_print_error($db);
1065 print '<div class="center
">';
1066 $parameters = array();
1067 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1069 if (empty($reshook)) {
1070 /*$checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically
", $langs->transnoentitiesnoconv('StatusOrderReceivedAll'));
1072 if (empty($conf->reception->enabled)) {
1073 print $langs->trans("Comment").' : ';
1074 print '<input type="text
" class="minwidth400
" maxlength="128
" name="comment
" value="';
1075 print GETPOSTISSET("comment") ? GETPOST("comment") : $langs->trans("DispatchSupplierOrder", $object->ref);
1076 // print ' /
'.$object->ref_supplier; // Not yet available
1077 print '" class="flat
"><br>';
1079 print '<input type="checkbox
" checked="checked
" name="closeopenorder
"> '.$checkboxlabel;
1082 $dispatchBt = empty($conf->reception->enabled) ? $langs->trans("Receive
") : $langs->trans("CreateReception
");
1087 print '<input type="submit
" id="submitform
" class="button" name="dispatch
" value="'.$langs->trans("Save").'"';
1089 if (!$permissiontoreceive) {
1092 if (count($listwarehouses) <= 0) {
1104 // Message if nothing to dispatch
1107 if (!getDolGlobalString('SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
1108 print '<div class="opacitymedium
">'.$langs->trans("NoPredefinedProductToDispatch
").'</div>'; // No predefined line at all
1110 print '<div class="opacitymedium
">'.$langs->trans("NoMorePredefinedProductToDispatch
").'</div>'; // No predefined line that remain to be dispatched.
1117 print dol_get_fiche_end();
1119 // traitement entrepot par défaut
1120 print '<script type="text/javascript
">
1121 $(document).ready(function () {
1122 $("select[
name=fk_default_warehouse]
").change(function() {
1123 var fk_default_warehouse = $("option:selected
", this).val();
1124 $("select[
name^=entrepot_]
").val(fk_default_warehouse).change();
1127 $("#autoreset
").click(function() {
1128 $(".autoresettr
").each(function(){
1129 id = $(this).attr("name");
1130 idtab = id.split("_
");
1131 if ($(this).data("remove") == "clear
"){
1132 console.log("We clear the
object to expected value
")
1133 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val("");
1135 qtyexpected = $("#qty_
"+idtab[1]+"_
"+idtab[2]).data("expected
")
1136 console.log(qtyexpected);
1137 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val(qtyexpected);
1138 qtydispatched = $("#qty_dispatched_0_
"+idtab[2]).data("dispatched
")
1139 $("#qty_dispatched_0_
"+idtab[2]).val(qtydispatched);
1142 console.log("We
remove the
object")
1144 $("tr[
name^=\
'"+idtab[0]+"_\'][name$=\'_"+idtab[2]+"\']:last .splitbutton").show();
1150 $("#resetalltoexpected").click(function(){
1151 $(".qtydispatchinput").each(function(){
1152 console.log("We reset to expected "+$(this).attr("id")+" qty to dispatch");
1153 $(this).val($(this).data("expected"));
1158 $(".resetline").click(function(e){
1160 id = $(this).attr("id");
1161 id = id.split("reset_");
1162 console.log("Reset trigger for id = qty_"+id[1]);
1163 $("#qty_"+id[1]).val("");
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
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_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)
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)
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.
dol_now($mode='auto')
Return date for now.
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).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
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.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
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.
treeview li table
No Email.
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
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.