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);
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);
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);
305 header(
"Location: ".DOL_URL_ROOT.
'/reception/dispatch.php?id='.
$object->id);
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;
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',
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',
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',
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])) {
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',
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',
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.
'\')"');
834 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
842 print
'<td class="right">';
843 print
'<input id="pu'.$suffix.
'" name="pu'.$suffix.
'" type="text" size="8" value="'.
price((
GETPOST(
'pu'.$suffix) !=
'' ?
price2num(
GETPOST(
'pu'.$suffix)) : $up_ht_disc)).
'">';
847 print
'<td class="right">';
848 print
'<input id="dto'.$suffix.
'" name="dto'.$suffix.
'" type="text" size="8" value="'.(
GETPOST(
'dto'.$suffix) !=
'' ?
GETPOST(
'dto'.$suffix) :
'').
'">';
852 print
'<td class="center">';
853 print
'<input class="flat checkformerge" type="checkbox" name="saveprice'.$suffix.
'" value="'.(
GETPOST(
'saveprice'.$suffix) !=
'' ?
GETPOST(
'saveprice'.$suffix) :
'').
'">';
859 print
'<td class="right">';
860 if (count($listwarehouses) > 1) {
861 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 1, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
862 } elseif (count($listwarehouses) == 1) {
863 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 0, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
865 $langs->load(
"errors");
866 print $langs->trans(
"ErrorNoWarehouseDefined");
872 'is_information_row' =>
false,
877 $reshook = $hookmanager->executeHooks(
878 'printFieldListValue',
886 print $hookmanager->resPrint;
893 $suffix =
"_".$j.
"_".$i;
897 if (
isModEnabled(
'productbatch') && !empty($objp->tobatch)) {
903 'is_information_row' =>
true,
908 $reshook = $hookmanager->executeHooks(
909 'printFieldListValue',
917 print $hookmanager->resPrint;
921 print
'<!-- line for batch '.$numline.
' (not dispatched line yet for this order line) -->';
922 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'">';
924 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
925 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
926 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
928 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
930 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
932 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
938 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.
GETPOST(
'lot_number'.$suffix).
'">';
941 print
'<td class="nowraponall">';
943 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
947 print
'<td class="nowraponall">';
949 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
952 print
'<td colspan="3"> </td>';
962 'is_information_row' =>
true,
967 $reshook = $hookmanager->executeHooks(
968 'printFieldListValue',
976 print $hookmanager->resPrint;
980 print
'<!-- line no batch '.$numline.
' (not dispatched line yet for this order line) -->';
981 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
982 print
'<td colspan="'.$colspan.
'">';
983 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
984 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
985 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
987 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
989 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" data-type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
991 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
997 print
'<td class="right">';
998 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
999 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.
'">';
1002 if (
isModEnabled(
'productbatch') && $objp->tobatch > 0) {
1004 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" onClick="addDispatchLine('.$i.
', \''.$type.
'\')
"');
1007 print img_picto($langs->trans('AddStockLocationLine'), 'split', 'class="splitbutton
" onClick="addDispatchLine(
'.$i.', \
''.$type.
'\')
"');
1012 if (getDolGlobalString('SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
1013 if (!isModEnabled("multicurrency
") && empty($conf->dynamicprices->enabled)) {
1015 print '<td class="right
">';
1016 print '<input id="pu
'.$suffix.'" name="pu
'.$suffix.'" type="text
" size="8
" value="'.price((GETPOST('pu
'.$suffix) != '' ? price2num(GETPOST('pu
'.$suffix)) : $up_ht_disc)).'">';
1020 print '<td class="right
">';
1021 print '<input id="dto
'.$suffix.'" name="dto
'.$suffix.'" type="text
" size="8
" value="'.(GETPOST('dto
'.$suffix) != '' ? GETPOST('dto
'.$suffix) : '').'">';
1025 print '<td class="center
">';
1026 print '<input class="flat checkformerge
" type="checkbox
" name="saveprice
'.$suffix.'" value="'.(GETPOST('saveprice
'.$suffix) != '' ? GETPOST('saveprice
'.$suffix) : '').'">';
1032 print '<td class="right
">';
1033 if (count($listwarehouses) > 1) {
1034 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);
1035 } elseif (count($listwarehouses) == 1) {
1036 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);
1038 $langs->load("errors
");
1039 print $langs->trans("ErrorNoWarehouseDefined
");
1043 // Enable hooks to append additional columns
1044 $parameters = array(
1045 'is_information_row' => false, // this is a dispatch form row
1047 'suffix' => $suffix,
1050 $reshook = $hookmanager->executeHooks(
1051 'printFieldListValue',
1057 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1059 print $hookmanager->resPrint;
1068 dol_print_error($db);
1075 print '<div class="center
">';
1076 $parameters = array();
1077 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1079 if (empty($reshook)) {
1080 /*$checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically
", $langs->transnoentitiesnoconv('StatusOrderReceivedAll'));
1082 if (empty($conf->reception->enabled)) {
1083 print $langs->trans("Comment").' : ';
1084 print '<input type="text
" class="minwidth400
" maxlength="128
" name="comment
" value="';
1085 print GETPOSTISSET("comment") ? GETPOST("comment") : $langs->trans("DispatchSupplierOrder", $object->ref);
1086 // print ' /
'.$object->ref_supplier; // Not yet available
1087 print '" class="flat
"><br>';
1089 print '<input type="checkbox
" checked="checked
" name="closeopenorder
"> '.$checkboxlabel;
1092 $dispatchBt = empty($conf->reception->enabled) ? $langs->trans("Receive
") : $langs->trans("CreateReception
");
1097 print '<input type="submit
" id="submitform
" class="button" name="dispatch
" value="'.$langs->trans("Save").'"';
1099 if (!$permissiontoreceive) {
1102 if (count($listwarehouses) <= 0) {
1114 // Message if nothing to dispatch
1117 if (!getDolGlobalString('SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
1118 print '<div class="opacitymedium
">'.$langs->trans("NoPredefinedProductToDispatch
").'</div>'; // No predefined line at all
1120 print '<div class="opacitymedium
">'.$langs->trans("NoMorePredefinedProductToDispatch
").'</div>'; // No predefined line that remain to be dispatched.
1127 print dol_get_fiche_end();
1129 // Handling of the default warehouse
1130 print '<script type="text/javascript
">
1131 $(document).ready(function () {
1132 $("select[
name=fk_default_warehouse]
").change(function() {
1133 var fk_default_warehouse = $("option:selected
", this).val();
1134 $("select[
name^=entrepot_]
").val(fk_default_warehouse).change();
1137 $("#autoreset
").click(function() {
1138 $(".autoresettr
").each(function(){
1139 id = $(this).attr("name");
1140 idtab = id.split("_
");
1141 if ($(this).data("remove") == "clear
"){
1142 console.log("We clear the
object to expected value
")
1143 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val("");
1145 qtyexpected = $("#qty_
"+idtab[1]+"_
"+idtab[2]).data("expected
")
1146 console.log(qtyexpected);
1147 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val(qtyexpected);
1148 qtydispatched = $("#qty_dispatched_0_
"+idtab[2]).data("dispatched
")
1149 $("#qty_dispatched_0_
"+idtab[2]).val(qtydispatched);
1152 console.log("We
remove the
object")
1154 $("tr[
name^=\
'"+idtab[0]+"_\'][name$=\'_"+idtab[2]+"\']:last .splitbutton").show();
1160 $("#resetalltoexpected").click(function(){
1161 $(".qtydispatchinput").each(function(){
1162 console.log("We reset to expected "+$(this).attr("id")+" qty to dispatch");
1163 $(this).val($(this).data("expected"));
1168 $(".resetline").click(function(e){
1170 id = $(this).attr("id");
1171 id = id.split("reset_");
1172 console.log("Reset trigger for id = qty_"+id[1]);
1173 $("#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)
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.
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.
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.
print $langs trans("Show") . '< td style="' . $timeColor . '" align="center"> s</td > badge status0 badge status4 badge status3 Error badge status8< td align="center">< span class="badge ' . $badge . '"></span ></td >< td align="center">< a href="#" class="button button-small" onclick="openLogModal(this)" data-req="' . dol_escape_htmltag($reqSafe) . '" data-res="' . dol_escape_htmltag($resSafe) . '" data-err="' . dol_escape_htmltag($errSafe) . '">< span class="fa fa-search-plus"></span ></a ></td ></tr >< tr >< td colspan="' . $colspan . '" class="opacitymedium"></td ></tr ></table ></div ></form > logModal none logModal none s a JSON string
buildzip.php
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.