35require
'../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.
'/core/modules/supplier_order/modules_commandefournisseur.php';
37require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/entrepot.class.php';
38require_once DOL_DOCUMENT_ROOT.
'/core/lib/fourn.lib.php';
39require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.class.php';
40require_once DOL_DOCUMENT_ROOT.
'/fourn/class/fournisseur.commande.dispatch.class.php';
41require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
42require_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/core/lib/reception.lib.php';
44require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
55$langs->loadLangs(array(
"bills",
"orders",
"sendings",
"companies",
"products",
"stocks",
"receptions"));
58 $langs->load(
'productbatch');
65$action =
GETPOST(
'action',
'aZ09');
66$fk_default_warehouse =
GETPOSTINT(
'fk_default_warehouse');
67$cancel =
GETPOST(
'cancel',
'alpha');
68$confirm =
GETPOST(
'confirm',
'alpha');
74 $socid = $user->socid;
77$hookmanager->initHooks(array(
'ordersupplierdispatch'));
81if (GETPOSTISSET(
"projectid")) {
87if ($id > 0 || !empty($ref)) {
88 $result =
$object->fetch($id, $ref);
92 $result =
$object->fetch_thirdparty();
103 $origin_id =
$object->origin_object->id;
105 $objectsrc->fetch($origin_id);
109if (empty($conf->reception->enabled)) {
110 $permissiontoreceive = $user->hasRight(
'fournisseur',
'commande',
'receptionner');
111 $permissiontocontrol = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'fournisseur',
'commande',
'receptionner')) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'fournisseur',
'commande_advance',
'check')));
113 $permissiontoreceive = $user->hasRight(
'reception',
'creer');
114 $permissiontocontrol = ((!
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'creer')) || (
getDolGlobalString(
'MAIN_USE_ADVANCED_PERMS') && $user->hasRight(
'reception',
'reception_advance',
'validate')));
124$usercancreate = $user->hasRight(
'reception',
'creer');
125$permissiontoadd = $usercancreate;
132$parameters = array();
133$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
139if ($action ==
'updatelines' && $permissiontoreceive) {
146 foreach ($_POST as $key => $value) {
149 if (preg_match(
'/^product_.*([0-9]+)_([0-9]+)$/i', $key, $reg)) {
152 if (preg_match(
'/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
153 $modebatch =
"barcode";
154 } elseif (preg_match(
'/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
155 $modebatch =
"batch";
159 if ($modebatch ==
"barcode") {
160 $prod =
"product_".$reg[1].
'_'.$reg[2];
162 $prod =
'product_batch_'.$reg[1].
'_'.$reg[2];
164 $qty =
"qty_".$reg[1].
'_'.$reg[2];
165 $ent =
"entrepot_".$reg[1].
'_'.$reg[2];
166 $pu =
"pu_".$reg[1].
'_'.$reg[2];
167 $fk_commandefourndet =
"fk_commandefourndet_".$reg[1].
'_'.$reg[2];
168 $idline =
GETPOSTINT(
"idline_".$reg[1].
'_'.$reg[2]);
172 if ($modebatch ==
"batch") {
173 $lot =
GETPOST(
'lot_number_'.$reg[1].
'_'.$reg[2]);
178 $saveprice =
'__invalidsavepricekey__';
180 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
181 $dto =
GETPOSTINT(
"dto_".$reg[1].
'_'.$reg[2]);
185 $saveprice =
"saveprice_".$reg[1].
'_'.$reg[2];
190 if (($modebatch ==
"batch" &&
GETPOST($qty) > 0) || ($modebatch ==
"barcode" &&
GETPOST($qty) != 0)) {
192 dol_syslog(
'No dispatch for line '.$key.
' as no warehouse was chosen.');
193 $text = $langs->transnoentities(
'Warehouse').
', '.$langs->transnoentities(
'Line').
' '.($numline);
194 setEventMessages($langs->trans(
'ErrorFieldRequired', $text),
null,
'errors');
200 $result = $supplierorderdispatch->fetch($idline);
201 if ($result > 0 && (
int) $supplierorderdispatch->fk_reception !== (
int)
$object->id) {
203 $supplierorderdispatch->error = $langs->trans(
'ErrorRecordNotFound');
207 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
210 $qtystart = $supplierorderdispatch->qty;
212 $supplierorderdispatch->fk_entrepot =
GETPOSTINT($ent);
213 if ($modebatch ==
"batch") {
214 $supplierorderdispatch->eatby = $dDLUO;
215 $supplierorderdispatch->sellby = $dDLC;
218 $result = $supplierorderdispatch->update($user);
220 setEventMessages($supplierorderdispatch->error, $supplierorderdispatch->errors,
'errors');
264 $result = $objectsrc->dispatchProduct($user,
GETPOSTINT($prod),
GETPOSTFLOAT($qty),
GETPOSTINT($ent),
GETPOSTFLOAT($pu),
GETPOST(
'comment'), $dDLUO, $dDLC, $lot,
GETPOSTINT($fk_commandefourndet), 0,
$object->id);
271 if (!$error &&
getDolGlobalString(
'SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
272 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
279 if (GETPOSTISSET($saveprice)) {
281 $sql =
"UPDATE ".MAIN_DB_PREFIX.
"product_fournisseur_price";
282 $sql .=
" SET unitprice='".price2num(
GETPOST($pu),
'MU').
"'";
283 $sql .=
", price=".price2num(
GETPOST($pu),
'MU').
"*quantity";
284 $sql .=
", remise_percent = ".((float) $dto);
285 $sql .=
" WHERE fk_soc=".((int)
$object->socid);
286 $sql .=
" AND fk_product=".(GETPOSTINT($prod));
288 $resql = $db->query($sql);
303 header(
"Location: ".DOL_URL_ROOT.
'/reception/dispatch.php?id='.
$object->id);
315$form =
new Form($db);
317$warehouse_static =
new Entrepot($db);
320$title =
$object->ref.
" - ".$langs->trans(
'ReceptionDistribution');
321$help_url =
'EN:Module_Suppliers_Orders|FR:CommandeFournisseur|ES:Módulo_Pedidos_a_proveedores';
322$morejs = array(
'/fourn/js/lib_dispatch.js.php');
325llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs,
'',
'',
'mod-reception page-card_dispatch');
327if ($id > 0 || !empty($ref)) {
332 $origin_id =
$object->origin_id;
338 $author =
new User($db);
339 $author->fetch(
$object->user_author_id);
343 $title = $langs->trans(
"SupplierOrder");
344 print
dol_get_fiche_head($head,
'dispatch', $langs->trans(
"Reception"), -1,
'dollyrevert');
350 if ($action ==
'ask_deleteline') {
351 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
355 $parameters = array(
'lineid' => $lineid);
357 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
358 if (empty($reshook)) {
359 $formconfirm .= $hookmanager->resPrint;
360 } elseif ($reshook > 0) {
361 $formconfirm = $hookmanager->resPrint;
368 $linkback =
'<a href="'.DOL_URL_ROOT.
'/reception/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
369 $morehtmlref =
'<div class="refidno">';
372 $morehtmlref .= $form->editfieldkey(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'', 0, 1);
373 $morehtmlref .= $form->editfieldval(
"RefSupplier",
'ref_supplier',
$object->ref_supplier, $object, $user->hasRight(
'reception',
'creer'),
'string',
'',
null,
null,
'', 1);
376 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
379 $langs->load(
"projects");
380 $morehtmlref .=
'<br>';
382 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
383 if ($action !=
'classify' && $permissiontoadd) {
384 $morehtmlref .=
'<a class="editfielda" href="'.dolBuildUrl($_SERVER[
'PHP_SELF'], [
'action' =>
'classify',
'id' =>
$object->id],
true).
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
386 $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');
388 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
390 $proj->fetch($objectsrc->fk_project);
391 $morehtmlref .= $proj->getNomUrl(1);
393 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
398 $morehtmlref .=
'</div>';
400 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
403 print
'<div class="fichecenter">';
404 print
'<div class="underbanner clearboth"></div>';
406 print
'<table class="border tableforfield" width="100%">';
411 print $langs->trans(
"RefOrder").
'</td>';
412 print
'<td colspan="3">';
413 print $objectsrc->getNomUrl(1,
'commande');
419 print $langs->trans(
"RefProposal").
'</td>';
420 print
'<td colspan="3">';
421 print $objectsrc->getNomUrl(1,
'reception');
425 if (($typeobject ==
'supplier_order' || $typeobject ==
'order_supplier') &&
$object->origin_object->id &&
isModEnabled(
"propal")) {
427 print $langs->trans(
"SupplierOrder").
'</td>';
428 print
'<td colspan="3">';
429 print $objectsrc->getNomUrl(1,
'reception');
435 print
'<tr><td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
436 print
'<td colspan="3">'.dol_print_date(
$object->date_creation,
"dayhour",
"tzuserrel").
"</td>\n";
440 print
'<tr><td height="10">';
441 print
'<table class="nobordernopadding" width="100%"><tr><td>';
442 print $langs->trans(
'DateDeliveryPlanned');
444 print
'</tr></table>';
445 print
'</td><td colspan="2">';
451 print
'<br><br><center>';
452 print
'<a href="#" id="resetalltoexpected" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'autofill',
'class="pictofixedwidth"').$langs->trans(
"RestoreWithCurrentQtySaved").
'</a></td>';
454 print
'<a href="#" id="autoreset" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'eraser',
'class="pictofixedwidth"').$langs->trans(
"ClearQtys").
'</a></td>';
462 if (
$object->statut == Reception::STATUS_DRAFT || (
$object->statut == Reception::STATUS_VALIDATED && !
getDolGlobalString(
'STOCK_CALCULATE_ON_RECEPTION'))) {
463 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
465 $formproduct->loadWarehouses();
467 $listwarehouses = $entrepot->list_array(1);
469 print
'<form method="post" action="'.dolBuildUrl($_SERVER[
"PHP_SELF"]).
'">';
471 print
'<input type="hidden" name="token" value="'.newToken().
'">';
472 print
'<input type="hidden" name="action" value="updatelines">';
473 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
475 print
'<div class="div-table-responsive-no-min">';
476 print
'<table class="noborder centpercent">';
479 $products_dispatched = array();
480 $sql =
"SELECT l.rowid, cfd.fk_product, sum(cfd.qty) as qty";
481 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
482 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"receptiondet_batch as l on l.rowid = cfd.fk_elementdet";
483 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
484 $sql .=
" GROUP BY l.rowid, cfd.fk_product";
486 $resql = $db->query($sql);
488 $num = $db->num_rows($resql);
493 $objd = $db->fetch_object($resql);
494 $products_dispatched[$objd->rowid] =
price2num($objd->qty,
'MS');
503 $sql =
"SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, l.ref AS sref, l.qty as qty,";
504 $sql .=
" p.ref, p.label, p.tobatch, p.fk_default_warehouse";
506 $parameters = array();
507 $reshook = $hookmanager->executeHooks(
508 'printFieldListSelect',
516 $sql .= $hookmanager->resPrint;
517 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commande_fournisseurdet as l";
518 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON l.fk_product=p.rowid";
519 $sql .=
" WHERE l.fk_commande = ".((int) $objectsrc->id);
521 $sql .=
" AND l.product_type = 0";
524 $parameters = array();
525 $reshook = $hookmanager->executeHooks(
526 'printFieldListWhere',
534 $sql .= $hookmanager->resPrint;
537 $sql .=
" ORDER BY l.rang, p.ref, p.label";
539 $resql = $db->query($sql);
541 $num = $db->num_rows($resql);
545 print
'<tr class="liste_titre">';
547 print
'<td>'.$langs->trans(
"Description").
'</td>';
549 print
'<td class="dispatch_batch_number_title">'.$langs->trans(
"batch_number").
'</td>';
551 print
'<td class="dispatch_dlc_title">'.$langs->trans(
"SellByDate").
'</td>';
554 print
'<td class="dispatch_dluo_title">'.$langs->trans(
"EatByDate").
'</td>';
561 print
'<td class="right">'.$langs->trans(
"SupplierRef").
'</td>';
562 print
'<td class="right">'.$langs->trans(
"QtyOrdered").
'</td>';
563 if (
$object->status == Reception::STATUS_DRAFT) {
564 print
'<td class="right">'.$langs->trans(
"QtyToReceive");
566 print
'<td class="right">'.$langs->trans(
"QtyDispatchedShort").
'</td>';
568 print
'<td class="right">'.$langs->trans(
"Details");
569 print
'<td width="32"></td>';
572 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
573 print
'<td class="right">'.$langs->trans(
"Price").
'</td>';
574 print
'<td class="right">'.$langs->trans(
"ReductionShort").
' (%)</td>';
575 print
'<td class="right">'.$langs->trans(
"UpdatePrice").
'</td>';
579 print
'<td align="right">'.$langs->trans(
"Warehouse");
582 if (count($listwarehouses) > 1) {
583 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);
584 } elseif (count($listwarehouses) == 1) {
585 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);
591 $parameters = array();
592 $reshook = $hookmanager->executeHooks(
593 'printFieldListTitle',
601 print $hookmanager->resPrint;
609 $conf->cache[
'product'] = array();
613 $objp = $db->fetch_object($resql);
616 if (!$objp->fk_product > 0) {
619 $alreadydispatched = isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] : 0;
620 $remaintodispatch =
price2num($objp->qty, 5);
621 if ($remaintodispatch < 0 && !
getDolGlobalString(
'SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN')) {
622 $remaintodispatch = 0;
625 if ($remaintodispatch || !
getDolGlobalString(
'SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
634 print
'<!-- Line to dispatch '.$suffix.
' -->'.
"\n";
636 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$objp->qty.
'">';
637 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" data-dispatched="'.((float) $alreadydispatched).
'" value="'.(float) $alreadydispatched.
'">';
638 print
'<tr class="oddeven">';
640 if (empty($conf->cache[
'product'][$objp->fk_product])) {
641 $tmpproduct =
new Product($db);
642 $tmpproduct->fetch($objp->fk_product);
643 $conf->cache[
'product'][$objp->fk_product] = $tmpproduct;
645 $tmpproduct = $conf->cache[
'product'][$objp->fk_product];
648 $linktoprod = $tmpproduct->getNomUrl(1);
649 $linktoprod .=
' - '.$objp->label.
"\n";
652 if ($objp->tobatch) {
654 print
'<td class="tdoverflowmax200">';
657 print
'<td class="dispatch_batch_number"></td>';
659 print
'<td class="dispatch_dlc"></td>';
662 print
'<td class="dispatch_dluo"></td>';
666 print
'<td class="tdoverflowmax200">';
669 print
'<td class="dispatch_batch_number">';
670 print
'<span class="opacitymedium small">'.$form->textwithpicto($langs->transnoentitiesnoconv(
"NA"), $langs->transnoentitiesnoconv(
"ProductDoesNotUseBatchSerial")).
'</small>';
673 print
'<td class="dispatch_dlc"></td>';
676 print
'<td class="dispatch_dluo"></td>';
680 print
'<td colspan="4">';
686 $up_ht_disc = $objp->subprice;
687 if (!empty($objp->remise_percent) && !
getDolGlobalString(
'STOCK_EXCLUDE_DISCOUNT_FOR_PMP')) {
688 $up_ht_disc =
price2num($up_ht_disc * (100 - $objp->remise_percent) / 100,
'MU');
692 print
'<td class="right">'.$objp->sref.
'</td>';
695 print
'<td class="right">'.$objp->qty.
'</td>';
698 print
'<td class="right">'.$alreadydispatched.
'</td>';
700 print
'<td class="right">';
706 $sql =
"SELECT cfd.rowid, cfd.qty, cfd.fk_entrepot, cfd.batch, cfd.eatby, cfd.sellby, cfd.fk_product";
707 $sql .=
" FROM ".MAIN_DB_PREFIX.
"receptiondet_batch as cfd";
708 $sql .=
" WHERE cfd.fk_reception = ".((int)
$object->id);
709 $sql .=
" AND cfd.fk_element = ".((int) $objectsrc->id);
710 $sql .=
" AND cfd.fk_elementdet = ".(int) $objp->rowid;
713 $resultsql = $db->query($sql);
716 $numd = $db->num_rows($resultsql);
719 $suffix =
"_".$j.
"_".$i;
720 $objd = $db->fetch_object($resultsql);
722 if (
isModEnabled(
'productbatch') && (!empty($objd->batch) || (is_null($objd->batch) && $tmpproduct->status_batch > 0))) {
728 'is_information_row' =>
true,
733 $reshook = $hookmanager->executeHooks(
734 'printFieldListValue',
742 print $hookmanager->resPrint;
746 print
'<!-- line for batch '.$numline.
' -->';
747 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
749 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
750 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
751 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
753 print
'<!-- This is a U.P. (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
755 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
757 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
763 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).
'">';
766 print
'<td class="nowraponall">';
768 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
772 print
'<td class="nowraponall">';
774 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
777 print
'<td colspan="3"> </td>';
787 'is_information_row' =>
true,
792 $reshook = $hookmanager->executeHooks(
793 'printFieldListValue',
801 print $hookmanager->resPrint;
805 print
'<!-- line no batch '.$numline.
' -->';
806 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
807 print
'<td colspan="'.$colspan.
'">';
808 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
809 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
810 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
812 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
814 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
816 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
822 print
'<td class="right nowraponall">';
823 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
824 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.
'">';
827 if (
isModEnabled(
'productbatch') && $objp->tobatch > 0) {
829 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
832 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
838 if (!
isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
840 print
'<td class="right">';
841 print
'<input id="pu'.$suffix.
'" name="pu'.$suffix.
'" type="text" size="8" value="'.
price((
GETPOST(
'pu'.$suffix) !=
'' ?
price2num(
GETPOST(
'pu'.$suffix)) : $up_ht_disc)).
'">';
845 print
'<td class="right">';
846 print
'<input id="dto'.$suffix.
'" name="dto'.$suffix.
'" type="text" size="8" value="'.(
GETPOST(
'dto'.$suffix) !=
'' ?
GETPOST(
'dto'.$suffix) :
'').
'">';
850 print
'<td class="center">';
851 print
'<input class="flat checkformerge" type="checkbox" name="saveprice'.$suffix.
'" value="'.(
GETPOST(
'saveprice'.$suffix) !=
'' ?
GETPOST(
'saveprice'.$suffix) :
'').
'">';
857 print
'<td class="right">';
858 if (count($listwarehouses) > 1) {
859 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 1, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
860 } elseif (count($listwarehouses) == 1) {
861 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 0, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
863 $langs->load(
"errors");
864 print $langs->trans(
"ErrorNoWarehouseDefined");
870 'is_information_row' =>
false,
875 $reshook = $hookmanager->executeHooks(
876 'printFieldListValue',
884 print $hookmanager->resPrint;
891 $suffix =
"_".$j.
"_".$i;
895 if (
isModEnabled(
'productbatch') && !empty($objp->tobatch)) {
901 'is_information_row' =>
true,
906 $reshook = $hookmanager->executeHooks(
907 'printFieldListValue',
915 print $hookmanager->resPrint;
919 print
'<!-- line for batch '.$numline.
' (not dispatched line yet for this order line) -->';
920 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'">';
922 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
923 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
924 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
926 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
928 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
930 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
936 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.
GETPOST(
'lot_number'.$suffix).
'">';
939 print
'<td class="nowraponall">';
941 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
945 print
'<td class="nowraponall">';
947 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
950 print
'<td colspan="3"> </td>';
960 'is_information_row' =>
true,
965 $reshook = $hookmanager->executeHooks(
966 'printFieldListValue',
974 print $hookmanager->resPrint;
978 print
'<!-- line no batch '.$numline.
' (not dispatched line yet for this order line) -->';
979 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
980 print
'<td colspan="'.$colspan.
'">';
981 print
'<input id="fk_commandefourndet'.$suffix.
'" name="fk_commandefourndet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
982 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
983 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
985 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
987 print $langs->trans(
"BuyingPrice").
': <input class="maxwidth75" name="pu'.$suffix.
'" data-type="text" value="'.
price2num($up_ht_disc,
'MU').
'">';
989 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
995 print
'<td class="right">';
996 print
'<a href="#" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
997 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.
'">';
1000 if (
isModEnabled(
'productbatch') && $objp->tobatch > 0) {
1002 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split',
'class="splitbutton" onClick="addDispatchLine('.$i.
', \''.$type.
'\')
"');
1005 print img_picto($langs->trans('AddStockLocationLine'), 'split', 'class="splitbutton
" onClick="addDispatchLine(
'.$i.', \
''.$type.
'\')
"');
1010 if (getDolGlobalString('SUPPLIER_ORDER_CAN_UPDATE_BUYINGPRICE_DURING_RECEIPT')) {
1011 if (!isModEnabled("multicurrency
") && empty($conf->dynamicprices->enabled)) {
1013 print '<td class="right
">';
1014 print '<input id="pu
'.$suffix.'" name="pu
'.$suffix.'" type="text
" size="8
" value="'.price((GETPOST('pu
'.$suffix) != '' ? price2num(GETPOST('pu
'.$suffix)) : $up_ht_disc)).'">';
1018 print '<td class="right
">';
1019 print '<input id="dto
'.$suffix.'" name="dto
'.$suffix.'" type="text
" size="8
" value="'.(GETPOST('dto
'.$suffix) != '' ? GETPOST('dto
'.$suffix) : '').'">';
1023 print '<td class="center
">';
1024 print '<input class="flat checkformerge
" type="checkbox
" name="saveprice
'.$suffix.'" value="'.(GETPOST('saveprice
'.$suffix) != '' ? GETPOST('saveprice
'.$suffix) : '').'">';
1030 print '<td class="right
">';
1031 if (count($listwarehouses) > 1) {
1032 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);
1033 } elseif (count($listwarehouses) == 1) {
1034 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);
1036 $langs->load("errors
");
1037 print $langs->trans("ErrorNoWarehouseDefined
");
1041 // Enable hooks to append additional columns
1042 $parameters = array(
1043 'is_information_row' => false, // this is a dispatch form row
1045 'suffix' => $suffix,
1048 $reshook = $hookmanager->executeHooks(
1049 'printFieldListValue',
1055 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1057 print $hookmanager->resPrint;
1066 dol_print_error($db);
1073 print '<div class="center
">';
1074 $parameters = array();
1075 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1077 if (empty($reshook)) {
1078 /*$checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically
", $langs->transnoentitiesnoconv('StatusOrderReceivedAll'));
1080 if (empty($conf->reception->enabled)) {
1081 print $langs->trans("Comment").' : ';
1082 print '<input type="text
" class="minwidth400
" maxlength="128
" name="comment
" value="';
1083 print GETPOSTISSET("comment") ? GETPOST("comment") : $langs->trans("DispatchSupplierOrder", $object->ref);
1084 // print ' /
'.$object->ref_supplier; // Not yet available
1085 print '" class="flat
"><br>';
1087 print '<input type="checkbox
" checked="checked
" name="closeopenorder
"> '.$checkboxlabel;
1090 $dispatchBt = empty($conf->reception->enabled) ? $langs->trans("Receive
") : $langs->trans("CreateReception
");
1095 print '<input type="submit
" id="submitform
" class="button" name="dispatch
" value="'.$langs->trans("Save").'"';
1097 if (!$permissiontoreceive) {
1100 if (count($listwarehouses) <= 0) {
1112 // Message if nothing to dispatch
1115 if (!getDolGlobalString('SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
1116 print '<div class="opacitymedium
">'.$langs->trans("NoPredefinedProductToDispatch
").'</div>'; // No predefined line at all
1118 print '<div class="opacitymedium
">'.$langs->trans("NoMorePredefinedProductToDispatch
").'</div>'; // No predefined line that remain to be dispatched.
1125 print dol_get_fiche_end();
1127 // traitement entrepot par défaut
1128 print '<script type="text/javascript
">
1129 $(document).ready(function () {
1130 $("select[
name=fk_default_warehouse]
").change(function() {
1131 var fk_default_warehouse = $("option:selected
", this).val();
1132 $("select[
name^=entrepot_]
").val(fk_default_warehouse).change();
1135 $("#autoreset
").click(function() {
1136 $(".autoresettr
").each(function(){
1137 id = $(this).attr("name");
1138 idtab = id.split("_
");
1139 if ($(this).data("remove") == "clear
"){
1140 console.log("We clear the
object to expected value
")
1141 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val("");
1143 qtyexpected = $("#qty_
"+idtab[1]+"_
"+idtab[2]).data("expected
")
1144 console.log(qtyexpected);
1145 $("#qty_
"+idtab[1]+"_
"+idtab[2]).val(qtyexpected);
1146 qtydispatched = $("#qty_dispatched_0_
"+idtab[2]).data("dispatched
")
1147 $("#qty_dispatched_0_
"+idtab[2]).val(qtydispatched);
1150 console.log("We
remove the
object")
1152 $("tr[
name^=\
'"+idtab[0]+"_\'][name$=\'_"+idtab[2]+"\']:last .splitbutton").show();
1158 $("#resetalltoexpected").click(function(){
1159 $(".qtydispatchinput").each(function(){
1160 console.log("We reset to expected "+$(this).attr("id")+" qty to dispatch");
1161 $(this).val($(this).data("expected"));
1166 $(".resetline").click(function(e){
1168 id = $(this).attr("id");
1169 id = id.split("reset_");
1170 console.log("Reset trigger for id = qty_"+id[1]);
1171 $("#qty_"+id[1]).val("");
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage table ReceptionLineBatch.
Class to manage predefined suppliers products.
Class to manage warehouses.
Class to manage products or services.
Class to manage projects.
Class to manage receptions.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
dol_now($mode='gmt')
Return date for now.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
multi select button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
treeview li table
No Email.
reception_prepare_head(Reception $object)
Prepare array with list of tabs.
$conf db name
Only used if Module[ID]Name translation string is not found.
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.