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'));
88if ($id > 0 || !empty($ref)) {
89 $result =
$object->fetch($id, $ref);
93 $result =
$object->fetch_thirdparty();
105 $origin_id =
$object->origin_object->id;
107 $objectsrc->fetch($origin_id);
111if (empty(
$conf->reception->enabled)) {
112 $permissiontoreceive = $user->hasRight(
'fournisseur',
'commande',
'receptionner');
113 $permissiontocontrol = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'fournisseur',
'commande',
'receptionner')) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'fournisseur',
'commande_advance',
'check')));
115 $permissiontoreceive = $user->hasRight(
'reception',
'creer');
116 $permissiontocontrol = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'creer')) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'reception_advance',
'validate')));
126$usercancreate = $user->hasRight(
'reception',
'creer');
127$permissiontoadd = $usercancreate;
134$parameters = array();
135$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
137 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
141if ($action ==
'updatelines' && $permissiontoreceive) {
148 foreach ($_POST as $key => $value) {
151 if (preg_match(
'/^product_.*([0-9]+)_([0-9]+)$/i', $key, $reg)) {
154 if (preg_match(
'/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
155 $modebatch =
"barcode";
156 } elseif (preg_match(
'/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
157 $modebatch =
"batch";
161 if ($modebatch ==
"barcode") {
162 $prod =
"product_".$reg[1].
'_'.$reg[2];
164 $prod =
'product_batch_'.$reg[1].
'_'.$reg[2];
166 $qty =
"qty_".$reg[1].
'_'.$reg[2];
167 $ent =
"entrepot_".$reg[1].
'_'.$reg[2];
168 $pu =
"pu_".$reg[1].
'_'.$reg[2];
169 $fk_commandefourndet =
"fk_commandefourndet_".$reg[1].
'_'.$reg[2];
170 $idline =
GETPOSTINT(
"idline_".$reg[1].
'_'.$reg[2]);
174 if ($modebatch ==
"batch") {
175 $lot =
GETPOST(
'lot_number_'.$reg[1].
'_'.$reg[2]);
180 $saveprice =
'__invalidsavepricekey__';
183 $dto =
GETPOSTINT(
"dto_".$reg[1].
'_'.$reg[2]);
187 $saveprice =
"saveprice_".$reg[1].
'_'.$reg[2];
192 if (($modebatch ==
"batch" &&
GETPOST($qty) > 0) || ($modebatch ==
"barcode" &&
GETPOST($qty) != 0)) {
194 dol_syslog(
'No dispatch for line '.$key.
' as no warehouse was chosen.');
195 $text = $langs->transnoentities(
'Warehouse').
', '.$langs->transnoentities(
'Line').
' '.($numline);
196 setEventMessages($langs->trans(
'ErrorFieldRequired', $text),
null,
'errors');
202 $result = $supplierorderdispatch->fetch($idline);
203 if ($result > 0 && (
int) $supplierorderdispatch->fk_reception !== (
int)
$object->id) {
205 $supplierorderdispatch->error = $langs->trans(
'ErrorRecordNotFound');
209 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
212 $qtystart = $supplierorderdispatch->qty;
214 $supplierorderdispatch->fk_entrepot =
GETPOSTINT($ent);
215 if ($modebatch ==
"batch") {
216 $supplierorderdispatch->eatby = $dDLUO;
217 $supplierorderdispatch->sellby = $dDLC;
220 $result = $supplierorderdispatch->update($user);
222 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
266 $result = $objectsrc->dispatchProduct($user,
GETPOSTINT(
$prod),
GETPOSTFLOAT($qty),
GETPOSTINT($ent),
GETPOSTFLOAT($pu),
GETPOST(
'comment'), $dDLUO, $dDLC, $lot,
GETPOSTINT($fk_commandefourndet), 0,
$object->id);
268 setEventMessages($objectsrc->error, $objectsrc->errors,
'errors');
273 if (!$error &&
getDolGlobalString(
'SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
283 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"product_fournisseur_price";
284 $sql .=
" SET unitprice='".price2num(
GETPOST($pu),
'MU').
"'";
285 $sql .=
", price=".price2num(
GETPOST($pu),
'MU').
"*quantity";
286 $sql .=
", remise_percent = ".((float) $dto);
287 $sql .=
" WHERE fk_soc=".((int)
$object->socid);
288 $sql .=
" AND fk_product=".(GETPOSTINT(
$prod));
290 $resql = $db->query($sql);
300 setEventMessages($langs->trans(
"Error"), $errors,
'errors');
303 setEventMessages($langs->trans(
"ReceptionUpdated"),
null);
305 header(
"Location: ".DOL_URL_ROOT.
'/reception/dispatch.php?id='.
$object->id);
317$form =
new Form($db);
319$warehouse_static =
new Entrepot($db);
322$title =
$object->ref.
" - ".$langs->trans(
'ReceptionDistribution');
323$help_url =
'EN:Module_Suppliers_Orders|FR:CommandeFournisseur|ES:Módulo_Pedidos_a_proveedores';
324$morejs = array(
'/fourn/js/lib_dispatch.js.php');
327llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs,
'',
'',
'mod-reception page-card_dispatch');
329if ($id > 0 || !empty($ref)) {
334 $origin_id =
$object->origin_id;
340 $author =
new User($db);
341 $author->fetch(
$object->user_author_id);
345 $title = $langs->trans(
"SupplierOrder");
346 print
dol_get_fiche_head($head,
'dispatch', $langs->trans(
"Reception"), -1,
'dollyrevert');
352 if ($action ==
'ask_deleteline') {
353 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
357 $parameters = array(
'lineid' => $lineid);
359 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
360 if (empty($reshook)) {
361 $formconfirm .= $hookmanager->resPrint;
362 } elseif ($reshook > 0) {
363 $formconfirm = $hookmanager->resPrint;
370 $linkback =
'<a href="'.DOL_URL_ROOT.
'/reception/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
371 $morehtmlref =
'<div class="refidno">';
374 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'', 0, 1);
375 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'',
null,
null,
'', 1);
378 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
381 $langs->load(
"projects");
382 $morehtmlref .=
'<br>';
384 $morehtmlref .= img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
385 if ($action !=
'classify' && $permissiontoadd) {
386 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
388 $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');
390 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
392 $proj->fetch($objectsrc->fk_project);
393 $morehtmlref .= $proj->getNomUrl(1);
395 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
400 $morehtmlref .=
'</div>';
402 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
405 print
'<div class="fichecenter">';
406 print
'<div class="underbanner clearboth"></div>';
408 print
'<table class="border tableforfield" width="100%">';
413 print $langs->trans(
"RefOrder").
'</td>';
414 print
'<td colspan="3">';
415 print $objectsrc->getNomUrl(1,
'commande');
421 print $langs->trans(
"RefProposal").
'</td>';
422 print
'<td colspan="3">';
423 print $objectsrc->getNomUrl(1,
'reception');
427 if (($typeobject ==
'supplier_order' || $typeobject ==
'order_supplier') &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
429 print $langs->trans(
"SupplierOrder").
'</td>';
430 print
'<td colspan="3">';
431 print $objectsrc->getNomUrl(1,
'reception');
437 print
'<tr><td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
438 print
'<td colspan="3">'.dol_print_date(
$object->date_creation,
"dayhour",
"tzuserrel").
"</td>\n";
442 print
'<tr><td height="10">';
443 print
'<table class="nobordernopadding" width="100%"><tr><td>';
444 print $langs->trans(
'DateDeliveryPlanned');
446 print
'</tr></table>';
447 print
'</td><td colspan="2">';
453 print
'<br><br><center>';
454 print
'<a href="#" id="resetalltoexpected" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'autofill',
'class="pictofixedwidth"').$langs->trans(
"RestoreWithCurrentQtySaved").
'</a></td>';
456 print
'<a href="#" id="autoreset" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'eraser',
'class="pictofixedwidth"').$langs->trans(
"ClearQtys").
'</a></td>';
464 if (
$object->statut == Reception::STATUS_DRAFT || (
$object->statut == Reception::STATUS_VALIDATED && !
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION'))) {
465 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
467 $formproduct->loadWarehouses();
469 $listwarehouses = $entrepot->list_array(1);
471 print
'<form method="post" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
473 print
'<input type="hidden" name="token" value="'.newToken().
'">';
474 print
'<input type="hidden" name="action" value="updatelines">';
475 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
477 print
'<div class="div-table-responsive-no-min">';
478 print
'<table class="noborder centpercent">';
481 $products_dispatched = array();
482 $sql =
"SELECT l.rowid, cfd.fk_product, sum(cfd.qty) as qty";
483 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
484 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"receptiondet_batch as l on l.rowid = cfd.fk_elementdet";
485 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
486 $sql .=
" GROUP BY l.rowid, cfd.fk_product";
488 $resql = $db->query($sql);
490 $num = $db->num_rows($resql);
495 $objd = $db->fetch_object($resql);
496 $products_dispatched[$objd->rowid] =
price2num($objd->qty,
'MS');
505 $sql =
"SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, l.ref AS sref, l.qty as qty,";
506 $sql .=
" p.ref, p.label, p.tobatch, p.fk_default_warehouse";
508 $parameters = array();
509 $reshook = $hookmanager->executeHooks(
510 'printFieldListSelect',
516 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
518 $sql .= $hookmanager->resPrint;
519 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as l";
520 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON l.fk_product=p.rowid";
521 $sql .=
" WHERE l.fk_commande = ".((int) $objectsrc->id);
523 $sql .=
" AND l.product_type = 0";
526 $parameters = array();
527 $reshook = $hookmanager->executeHooks(
528 'printFieldListWhere',
534 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
536 $sql .= $hookmanager->resPrint;
539 $sql .=
" ORDER BY l.rang, p.ref, p.label";
541 $resql = $db->query($sql);
543 $num = $db->num_rows($resql);
547 print
'<tr class="liste_titre">';
549 print
'<td>'.$langs->trans(
"Description").
'</td>';
551 print
'<td class="dispatch_batch_number_title">'.$langs->trans(
"batch_number").
'</td>';
553 print
'<td class="dispatch_dlc_title">'.$langs->trans(
"SellByDate").
'</td>';
556 print
'<td class="dispatch_dluo_title">'.$langs->trans(
"EatByDate").
'</td>';
563 print
'<td class="right">'.$langs->trans(
"SupplierRef").
'</td>';
564 print
'<td class="right">'.$langs->trans(
"QtyOrdered").
'</td>';
565 if (
$object->status == Reception::STATUS_DRAFT) {
566 print
'<td class="right">'.$langs->trans(
"QtyToReceive");
568 print
'<td class="right">'.$langs->trans(
"QtyDispatchedShort").
'</td>';
570 print
'<td class="right">'.$langs->trans(
"Details");
571 print
'<td width="32"></td>';
575 print
'<td class="right">'.$langs->trans(
"Price").
'</td>';
576 print
'<td class="right">'.$langs->trans(
"ReductionShort").
' (%)</td>';
577 print
'<td class="right">'.$langs->trans(
"UpdatePrice").
'</td>';
581 print
'<td align="right">'.$langs->trans(
"Warehouse");
584 if (count($listwarehouses) > 1) {
585 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);
586 } elseif (count($listwarehouses) == 1) {
587 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);
593 $parameters = array();
594 $reshook = $hookmanager->executeHooks(
595 'printFieldListTitle',
601 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
603 print $hookmanager->resPrint;
611 $conf->cache[
'product'] = array();
615 $objp = $db->fetch_object($resql);
618 if (!$objp->fk_product > 0) {
621 $alreadydispatched = isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] : 0;
622 $remaintodispatch =
price2num($objp->qty, 5);
623 if ($remaintodispatch < 0 && !
getDolGlobalString(
'SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN')) {
624 $remaintodispatch = 0;
627 if ($remaintodispatch || !
getDolGlobalString(
'SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
636 print
'<!-- Line to dispatch '.$suffix.
' -->'.
"\n";
638 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$objp->qty.
'">';
639 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" data-dispatched="'.((float) $alreadydispatched).
'" value="'.(float) $alreadydispatched.
'">';
640 print
'<tr class="oddeven">';
642 if (empty(
$conf->cache[
'product'][$objp->fk_product])) {
643 $tmpproduct =
new Product($db);
644 $tmpproduct->fetch($objp->fk_product);
645 $conf->cache[
'product'][$objp->fk_product] = $tmpproduct;
647 $tmpproduct =
$conf->cache[
'product'][$objp->fk_product];
650 $linktoprod = $tmpproduct->getNomUrl(1);
651 $linktoprod .=
' - '.$objp->label.
"\n";
654 if ($objp->tobatch) {
656 print
'<td class="tdoverflowmax200">';
659 print
'<td class="dispatch_batch_number"></td>';
661 print
'<td class="dispatch_dlc"></td>';
664 print
'<td class="dispatch_dluo"></td>';
668 print
'<td class="tdoverflowmax200">';
671 print
'<td class="dispatch_batch_number">';
672 print
'<span class="opacitymedium small">'.$form->textwithpicto($langs->transnoentitiesnoconv(
"NA"), $langs->transnoentitiesnoconv(
"ProductDoesNotUseBatchSerial")).
'</small>';
675 print
'<td class="dispatch_dlc"></td>';
678 print
'<td class="dispatch_dluo"></td>';
682 print
'<td colspan="4">';
688 $up_ht_disc = $objp->subprice;
689 if (!empty($objp->remise_percent) && !
getDolGlobalString(
'STOCK_EXCLUDE_DISCOUNT_FOR_PMP')) {
690 $up_ht_disc =
price2num($up_ht_disc * (100 - $objp->remise_percent) / 100,
'MU');
694 print
'<td class="right">'.$objp->sref.
'</td>';
697 print
'<td class="right">'.$objp->qty.
'</td>';
700 print
'<td class="right">'.$alreadydispatched.
'</td>';
702 print
'<td class="right">';
708 $sql =
"SELECT cfd.rowid, cfd.qty, cfd.fk_entrepot, cfd.batch, cfd.eatby, cfd.sellby, cfd.fk_product";
709 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
710 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
711 $sql .=
" AND cfd.fk_element = ".((int) $objectsrc->id);
712 $sql .=
" AND cfd.fk_elementdet = ".(int) $objp->rowid;
715 $resultsql = $db->query($sql);
718 $numd = $db->num_rows($resultsql);
721 $suffix =
"_".$j.
"_".$i;
722 $objd = $db->fetch_object($resultsql);
724 if (
isModEnabled(
'productbatch') && (!empty($objd->batch) || (is_null($objd->batch) && $tmpproduct->status_batch > 0))) {
730 'is_information_row' =>
true,
735 $reshook = $hookmanager->executeHooks(
736 'printFieldListValue',
742 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
744 print $hookmanager->resPrint;
748 print
'<!-- line for batch '.$numline.
' -->';
749 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
751 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
752 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
753 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
755 print
'<!-- This is a U.P. (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
757 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
759 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
765 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).
'">';
768 print
'<td class="nowraponall">';
770 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
774 print
'<td class="nowraponall">';
776 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
779 print
'<td colspan="3"> </td>';
789 'is_information_row' =>
true,
794 $reshook = $hookmanager->executeHooks(
795 'printFieldListValue',
801 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
803 print $hookmanager->resPrint;
807 print
'<!-- line no batch '.$numline.
' -->';
808 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
809 print
'<td colspan="'.$colspan.
'">';
810 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
811 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
812 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
814 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
816 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
818 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
824 print
'<td class="right nowraponall">';
825 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
826 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.
'">';
829 if (
isModEnabled(
'productbatch') && $objp->tobatch > 0) {
831 print img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
832 if ($objp->tobatch == 2) {
834 print img_picto($langs->trans(
'EnterMultipleSerialNumbers'),
'barcode',
'class="splitbutton marginleftonly" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLinesFromSerialList('.$i.
', \''.$type.
'\')"');
838 print img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
846 print
'<td class="right">';
847 print
'<input id="pu'.$suffix.
'" name="pu'.$suffix.
'" type="text" size="8" value="'.
price((
GETPOST(
'pu'.$suffix) !=
'' ?
price2num(
GETPOST(
'pu'.$suffix)) : $up_ht_disc)).
'">';
851 print
'<td class="right">';
852 print
'<input id="dto'.$suffix.
'" name="dto'.$suffix.
'" type="text" size="8" value="'.(
GETPOST(
'dto'.$suffix) !=
'' ?
GETPOST(
'dto'.$suffix) :
'').
'">';
856 print
'<td class="center">';
857 print
'<input class="flat checkformerge" type="checkbox" name="saveprice'.$suffix.
'" value="'.(
GETPOST(
'saveprice'.$suffix) !=
'' ?
GETPOST(
'saveprice'.$suffix) :
'').
'">';
863 print
'<td class="right">';
864 if (count($listwarehouses) > 1) {
865 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 1, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
866 } elseif (count($listwarehouses) == 1) {
867 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 0, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
869 $langs->load(
"errors");
870 print $langs->trans(
"ErrorNoWarehouseDefined");
876 'is_information_row' =>
false,
881 $reshook = $hookmanager->executeHooks(
882 'printFieldListValue',
888 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
890 print $hookmanager->resPrint;
897 $suffix =
"_".$j.
"_".$i;
901 if (
isModEnabled(
'productbatch') && !empty($objp->tobatch)) {
907 'is_information_row' =>
true,
912 $reshook = $hookmanager->executeHooks(
913 'printFieldListValue',
919 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
921 print $hookmanager->resPrint;
925 print
'<!-- line for batch '.$numline.
' (not dispatched line yet for this order line) -->';
926 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'">';
928 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
929 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
930 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
932 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
934 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
936 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
942 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.
GETPOST(
'lot_number'.$suffix).
'">';
945 print
'<td class="nowraponall">';
947 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
951 print
'<td class="nowraponall">';
953 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
956 print
'<td colspan="3"> </td>';
966 'is_information_row' =>
true,
971 $reshook = $hookmanager->executeHooks(
972 'printFieldListValue',
978 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
980 print $hookmanager->resPrint;
984 print
'<!-- line no batch '.$numline.
' (not dispatched line yet for this order line) -->';
985 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
986 print
'<td colspan="'.$colspan.
'">';
987 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
988 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
989 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
991 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
993 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" data-type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
995 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
1001 print
'<td class="right">';
1002 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
1003 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.
'">';
1006 if (
isModEnabled(
'productbatch') && $objp->tobatch > 0) {
1008 print img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" onClick="addDispatchLine('.$i.
', \''.$type.
'\')
"');
1009 if ($objp->tobatch == 2) {
1010 // Product managed with unique serial numbers: allow to enter several serial numbers at once (one line per serial)
1011 print img_picto($langs->trans('EnterMultipleSerialNumbers'), 'barcode', 'class="splitbutton marginleftonly
" onClick="addDispatchLinesFromSerialList(
'.$i.', \
''.$type.
'\')
"');
1015 print img_picto($langs->trans('AddStockLocationLine'), 'split', 'class="splitbutton
" onClick="addDispatchLine(
'.$i.', \
''.$type.
'\')
"');
1020 if (getDolGlobalString('SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
1021 if (!isModEnabled("multicurrency
") && empty($conf->dynamicprices->enabled)) {
1023 print '<td class="right
">';
1024 print '<input id="pu
'.$suffix.'" name="pu
'.$suffix.'" type="text
" size="8
" value="'.price((GETPOST('pu
'.$suffix) != '' ? price2num(GETPOST('pu
'.$suffix)) : $up_ht_disc)).'">';
1028 print '<td class="right
">';
1029 print '<input id="dto
'.$suffix.'" name="dto
'.$suffix.'" type="text
" size="8
" value="'.(GETPOST('dto
'.$suffix) != '' ? GETPOST('dto
'.$suffix) : '').'">';
1033 print '<td class="center
">';
1034 print '<input class="flat checkformerge
" type="checkbox
" name="saveprice
'.$suffix.'" value="'.(GETPOST('saveprice
'.$suffix) != '' ? GETPOST('saveprice
'.$suffix) : '').'">';
1040 print '<td class="right
">';
1041 if (count($listwarehouses) > 1) {
1042 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);
1043 } elseif (count($listwarehouses) == 1) {
1044 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);
1046 $langs->load("errors
");
1047 print $langs->trans("ErrorNoWarehouseDefined
");
1051 // Enable hooks to append additional columns
1052 $parameters = array(
1053 'is_information_row' => false, // this is a dispatch form row
1055 'suffix' => $suffix,
1058 $reshook = $hookmanager->executeHooks(
1059 'printFieldListValue',
1065 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1067 print $hookmanager->resPrint;
1076 dol_print_error($db);
1083 print '<div class="center
">';
1084 $parameters = array();
1085 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1087 if (empty($reshook)) {
1088 /*$checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically
", $langs->transnoentitiesnoconv('StatusOrderReceivedAll'));
1090 if (empty($conf->reception->enabled)) {
1091 print $langs->trans("Comment").' : ';
1092 print '<input type="text
" class="minwidth400
" maxlength="128
" name="comment
" value="';
1093 print GETPOSTISSET("comment") ? GETPOST("comment") : $langs->trans("DispatchSupplierOrder", $object->ref);
1094 // print ' /
'.$object->ref_supplier; // Not yet available
1095 print '" class="flat
"><br>';
1097 print '<input type="checkbox
" checked="checked
" name="closeopenorder
"> '.$checkboxlabel;
1100 $dispatchBt = empty($conf->reception->enabled) ? $langs->trans("Receive
") : $langs->trans("CreateReception
");
1105 print '<input type="submit
" id="submitform
" class="button" name="dispatch
" value="'.$langs->trans("Save").'"';
1107 if (!$permissiontoreceive) {
1110 if (count($listwarehouses) <= 0) {
1122 // Message if nothing to dispatch
1125 if (!getDolGlobalString('SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
1126 print '<div class="opacitymedium
">'.$langs->trans("NoPredefinedProductToDispatch
").'</div>'; // No predefined line at all
1128 print '<div class="opacitymedium
">'.$langs->trans("NoMorePredefinedProductToDispatch
").'</div>'; // No predefined line that remain to be dispatched.
1135 print dol_get_fiche_end();
1137 // Handling of the default warehouse
1138 print '<script type="text/javascript
">
1139 $(document).ready(function () {
1140 $("select[
name=fk_default_warehouse]
").change(function() {
1141 var fk_default_warehouse = $("option:selected
", this).val();
1142 $("select[
name^=entrepot_]
").val(fk_default_warehouse).change();
1145 $("#autoreset
").click(function() {
1146 $(".autoresettr
").each(function(){
1147 id = $(this).attr("name");
1148 idtab = id.split("_
");
1149 if ($(this).data("remove") == "clear
"){
1150 console.log("We clear the
object to expected value
")
1151 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val("");
1153 qtyexpected = $("#qty_
"+idtab[1]+"_
"+idtab[2]).data("expected
")
1154 console.log(qtyexpected);
1155 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val(qtyexpected);
1156 qtydispatched = $("#qty_dispatched_0_
"+idtab[2]).data("dispatched
")
1157 $("#qty_dispatched_0_
"+idtab[2]).val(qtydispatched);
1160 console.log("We
remove the
object")
1162 $("tr[
name^=\
'"+idtab[0]+"_\'][name$=\'_"+idtab[2]+"\']:last .splitbutton").show();
1168 $("#resetalltoexpected").click(function(){
1169 $(".qtydispatchinput").each(function(){
1170 console.log("We reset to expected "+$(this).attr("id")+" qty to dispatch");
1171 $(this).val($(this).data("expected"));
1176 $(".resetline").click(function(e){
1178 id = $(this).attr("id");
1179 id = id.split("reset_");
1180 console.log("Reset trigger for id = qty_"+id[1]);
1181 $("#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, $processnotimeasnoon=0)
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...
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.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
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).
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
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.
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.
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, $nodie=0, $mode='')
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.