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/sendings.lib.php';
44if (isModEnabled(
'project')) {
45 require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
49$langs->loadLangs(array(
"sendings",
"companies",
"bills",
'deliveries',
'orders',
'stocks',
'other',
'propal',
'receptions'));
51if (isModEnabled(
'productbatch')) {
52 $langs->load(
'productbatch');
59$action =
GETPOST(
'action',
'aZ09');
60$fk_default_warehouse =
GETPOSTINT(
'fk_default_warehouse');
61$cancel =
GETPOST(
'cancel',
'alpha');
62$confirm =
GETPOST(
'confirm',
'alpha');
68 $socid = $user->socid;
71$hookmanager->initHooks(array(
'expeditiondispatch'));
75if (GETPOSTISSET(
"projectid")) {
83if ($id > 0 || !empty($ref)) {
84 $result =
$object->fetch($id, $ref);
88 $result =
$object->fetch_thirdparty();
103if (!isModEnabled(
'stock')) {
107$usercancreate = $user->hasRight(
'expedition',
'creer');
108$permissiontoadd = $usercancreate;
115$parameters = array();
116$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
122if ($action ==
'updatelines' && $usercancreate) {
131 foreach ($_POST as $key => $value) {
134 if (preg_match(
'/^product_.*([0-9]+)_([0-9]+)$/i', $key, $reg)) {
136 if (preg_match(
'/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
137 $modebatch =
"barcode";
138 } elseif (preg_match(
'/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
139 $modebatch =
"batch";
143 if ($modebatch ==
"barcode") {
144 $prod =
"product_".$reg[1].
'_'.$reg[2];
146 $prod =
'product_batch_'.$reg[1].
'_'.$reg[2];
148 $qty =
"qty_".$reg[1].
'_'.$reg[2];
149 $ent =
"entrepot_".$reg[1].
'_'.$reg[2];
150 $fk_commandedet =
"fk_commandedet_".$reg[1].
'_'.$reg[2];
151 $idline =
GETPOST(
"idline_".$reg[1].
'_'.$reg[2]);
158 if ($modebatch ==
"batch") {
159 $lot =
GETPOST(
'lot_number_'.$reg[1].
'_'.$reg[2]);
168 if (($modebatch ==
"batch" && $newqty >= 0) || ($modebatch ==
"barcode" && $newqty != 0)) {
170 if (!($warehouse_id > 0)) {
171 dol_syslog(
'No dispatch for line '.$key.
' as no warehouse was chosen.');
172 $text = $langs->transnoentities(
'Warehouse').
', '.$langs->transnoentities(
'Line').
' '.($numline);
173 setEventMessages($langs->trans(
'ErrorFieldRequired', $text),
null,
'errors');
176 if (!$error && $modebatch ==
"batch") {
177 $sql =
"SELECT pb.rowid ";
178 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_batch as pb";
179 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"product_stock as ps";
180 $sql .=
" ON ps.rowid = pb.fk_product_stock";
181 $sql .=
" WHERE pb.batch = '".$db->escape($lot).
"'";
182 $sql .=
" AND ps.fk_product = ".((int) $prod_id) ;
183 $sql .=
" AND ps.fk_entrepot = ".((int) $warehouse_id) ;
185 $resql = $db->query($sql);
187 $num = $db->num_rows($resql);
189 dol_syslog(
'No dispatch for line '.$key.
' as too many combination warehouse, product, batch code was found ('.$num.
').');
190 setEventMessages($langs->trans(
'ErrorTooManyCombinationBatchcode', $numline, $num),
null,
'errors');
192 } elseif ($num < 1) {
194 $tmpwarehouse->fetch($warehouse_id);
196 $tmpprod->fetch($prod_id);
197 dol_syslog(
'No dispatch for line '.$key.
' as no combination warehouse, product, batch code was found.');
198 setEventMessages($langs->trans(
'ErrorNoCombinationBatchcode', $numline, $tmpwarehouse->ref, $tmpprod->ref, $lot),
null,
'errors');
210 $result = $expeditiondispatch->fetch($idline);
212 setEventMessages($expeditiondispatch->error, $expeditiondispatch->errors,
'errors');
215 $qtystart = $expeditiondispatch->qty;
216 $expeditiondispatch->qty = $newqty;
217 $expeditiondispatch->entrepot_id =
GETPOSTINT($ent);
220 $result = $expeditiondispatch->update($user);
222 $result = $expeditiondispatch->delete($user);
225 setEventMessages($expeditiondispatch->error, $expeditiondispatch->errors,
'errors');
229 if (!$error && $modebatch ==
"batch") {
231 $suffixkeyfordate = preg_replace(
'/^product_batch/',
'', $key);
232 $sellby =
dol_mktime(0, 0, 0,
GETPOST(
'dlc'.$suffixkeyfordate.
'month'),
GETPOST(
'dlc'.$suffixkeyfordate.
'day'),
GETPOST(
'dlc'.$suffixkeyfordate.
'year'),
'');
233 $eatby =
dol_mktime(0, 0, 0,
GETPOST(
'dluo'.$suffixkeyfordate.
'month'),
GETPOST(
'dluo'.$suffixkeyfordate.
'day'),
GETPOST(
'dluo'.$suffixkeyfordate.
'year'));
235 $sqlsearchdet =
"SELECT rowid FROM ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element;
236 $sqlsearchdet .=
" WHERE fk_expeditiondet = ".((int) $idline);
237 $sqlsearchdet .=
" AND batch = '".$db->escape($lot).
"'";
238 $resqlsearchdet = $db->query($sqlsearchdet);
240 if ($resqlsearchdet) {
241 $objsearchdet = $db->fetch_object($resqlsearchdet);
247 $sql =
"UPDATE ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element.
" SET";
248 $sql .=
" eatby = ".($eatby ?
"'".$db->idate($eatby).
"'" :
"null");
249 $sql .=
" , sellby = ".($sellby ?
"'".$db->idate($sellby).
"'" :
"null");
250 $sql .=
" , qty = ".((float) $newqty);
251 $sql .=
" , fk_warehouse = ".((int) $warehouse_id);
252 $sql .=
" WHERE rowid = ".((int) $objsearchdet->rowid);
254 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element.
" (";
255 $sql .=
"fk_expeditiondet, eatby, sellby, batch, qty, fk_origin_stock, fk_warehouse)";
256 $sql .=
" VALUES (".((int) $idline).
", ".($eatby ?
"'".$db->idate($eatby).
"'" :
"null").
", ".($sellby ?
"'".$db->idate($sellby).
"'" :
"null").
", ";
257 $sql .=
" '".$db->escape($lot).
"', ".((float) $newqty).
", 0, ".((int) $warehouse_id).
")";
260 $sql =
" DELETE FROM ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element;
261 $sql .=
" WHERE fk_expeditiondet = ".((int) $idline);
262 $sql .=
" AND batch = '".$db->escape($lot).
"'";
265 $resql = $db->query($sql);
273 $expeditiondispatch->fk_expedition =
$object->id;
274 $expeditiondispatch->entrepot_id =
GETPOSTINT($ent);
275 $expeditiondispatch->fk_elementdet =
GETPOSTINT($fk_commandedet);
276 $expeditiondispatch->qty = $newqty;
279 $idline = $expeditiondispatch->insert($user);
281 setEventMessages($expeditiondispatch->error, $expeditiondispatch->errors,
'errors');
285 if ($modebatch ==
"batch" && !$error) {
286 $expeditionlinebatch->sellby = $dDLUO;
287 $expeditionlinebatch->eatby = $dDLC;
288 $expeditionlinebatch->batch = $lot;
289 $expeditionlinebatch->qty = $newqty;
290 $expeditionlinebatch->fk_origin_stock = 0;
291 $expeditionlinebatch->fk_warehouse =
GETPOSTINT($ent);
293 $result = $expeditionlinebatch->create($idline);
295 setEventMessages($expeditionlinebatch->error, $expeditionlinebatch->errors,
'errors');
352 header(
"Location: ".DOL_URL_ROOT.
'/expedition/dispatch.php?id='.
$object->id);
355} elseif ($action ==
'setdate_livraison' && $usercancreate) {
359 $result =
$object->setDeliveryDate($user, $datedelivery);
372$form =
new Form($db);
374$warehouse_static =
new Entrepot($db);
376$title =
$object->ref.
" - ".$langs->trans(
'ShipmentDistribution');
377$help_url =
'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Expediciones|DE:Modul_Lieferungen';
378$morejs = array(
'/expedition/js/lib_dispatch.js.php');
380llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs,
'',
'',
'mod-expedition page-card_dispatch');
386 $num_prod = count($lines);
398 $author =
new User($db);
399 $author->fetch(
$object->user_author_id);
409 if ($action ==
'ask_deleteline') {
410 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
414 $parameters = array(
'lineid' => $lineid);
416 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
417 if (empty($reshook)) {
418 $formconfirm .= $hookmanager->resPrint;
419 } elseif ($reshook > 0) {
420 $formconfirm = $hookmanager->resPrint;
426 if ($typeobject ==
'commande' &&
$object->origin_object->id && isModEnabled(
'order')) {
428 $objectsrc->fetch(
$object->origin_object->id);
430 if ($typeobject ==
'propal' &&
$object->origin_object->id && isModEnabled(
"propal")) {
431 $objectsrc =
new Propal($db);
432 $objectsrc->fetch(
$object->origin_object->id);
436 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expedition/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
437 $morehtmlref =
'<div class="refidno">';
440 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
441 $morehtmlref .= $form->editfieldval(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string'.(isset($conf->global->THIRDPARTY_REF_INPUT_SIZE) ?
':' .
getDolGlobalString(
'THIRDPARTY_REF_INPUT_SIZE') :
''),
'', null, null,
'', 1);
444 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
446 if (isModEnabled(
'project')) {
447 $langs->load(
"projects");
448 $morehtmlref .=
'<br>';
450 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
451 if ($action !=
'classify' && $permissiontoadd) {
452 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
454 $morehtmlref .= $form->form_project($_SERVER[
'PHP_SELF'].
'?id='.
$object->id, (!
getDolGlobalString(
'PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') ?
$object->socid : -1),
$object->fk_project, ($action ==
'classify' ?
'projectid' :
'none'), 0, 0, 0, 1,
'',
'maxwidth300');
456 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
458 $proj->fetch($objectsrc->fk_project);
459 $morehtmlref .= $proj->getNomUrl(1);
461 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
466 $morehtmlref .=
'</div>';
468 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
471 print
'<div class="fichecenter">';
472 print
'<div class="underbanner clearboth"></div>';
474 print
'<table class="border tableforfield centpercent">';
477 if ($typeobject ==
'commande' &&
$object->origin_object->id && isModEnabled(
'order')) {
479 print $langs->trans(
"RefOrder").
'</td>';
480 print
'<td colspan="3">';
481 print $objectsrc->getNomUrl(1,
'commande');
485 if ($typeobject ==
'propal' &&
$object->origin_object->id && isModEnabled(
"propal")) {
487 print $langs->trans(
"RefProposal").
'</td>';
488 print
'<td colspan="3">';
489 print $objectsrc->getNomUrl(1,
'expedition');
495 print
'<tr><td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
496 print
'<td colspan="3">'.dol_print_date(
$object->date_creation,
"dayhour",
"tzuserrel").
"</td>\n";
500 print
'<tr><td height="10">';
501 print
'<table class="nobordernopadding" width="100%"><tr><td>';
502 print $langs->trans(
'DateDeliveryPlanned');
504 if ($action !=
'editdate_livraison') {
505 print
'<td class="right"><a class="editfielda" href="'.$_SERVER[
"PHP_SELF"].
'?action=editdate_livraison&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->trans(
'SetDeliveryDate'), 1).
'</a></td>';
507 print
'</tr></table>';
508 print
'</td><td colspan="2">';
509 if ($action ==
'editdate_livraison') {
510 print
'<form name="setdate_livraison" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
511 print
'<input type="hidden" name="token" value="'.newToken().
'">';
512 print
'<input type="hidden" name="action" value="setdate_livraison">';
513 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
514 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
520 print
'</tr></table>';
522 print
'<br><center>';
523 if (isModEnabled(
'barcode') || isModEnabled(
'productbatch')) {
524 print
'<a href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=updatebyscaning&token='.
currentToken().
'" class="marginrightonly paddingright marginleftonly paddingleft">'.
img_picto(
'',
'barcode',
'class="paddingrightonly"').$langs->trans(
"UpdateByScaning").
'</a>';
526 print
'<a href="#" id="resetalltoexpected" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'autofill',
'class="pictofixedwidth"').$langs->trans(
"RestoreWithCurrentQtySaved").
'</a></td>';
528 print
'<a href="#" id="autoreset" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'eraser',
'class="pictofixedwidth"').$langs->trans(
"ClearQtys").
'</a></td>';
535 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
537 $formproduct->loadWarehouses();
539 $listwarehouses = $entrepot->list_array(1);
542 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'">';
544 print
'<input type="hidden" name="token" value="'.newToken().
'">';
545 print
'<input type="hidden" name="action" value="updatelines">';
546 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
548 print
'<div class="div-table-responsive-no-min">';
549 print
'<table class="noborder centpercent">';
552 $products_dispatched = array();
553 $sql =
"SELECT ed.fk_elementdet as rowid, sum(ed.qty) as qty";
554 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expeditiondet as ed";
555 $sql .=
" WHERE ed.fk_expedition = ".((int)
$object->id);
556 $sql .=
" GROUP BY ed.fk_elementdet";
558 $resql = $db->query($sql);
560 $num = $db->num_rows($resql);
565 $objd = $db->fetch_object($resql);
566 $products_dispatched[$objd->rowid] =
price2num($objd->qty,
'MS');
574 $sql =
"SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, '' AS sref, l.qty as qty,";
575 $sql .=
" p.ref, p.label, p.tobatch, p.fk_default_warehouse, p.barcode";
577 $parameters = array();
578 $reshook = $hookmanager->executeHooks(
579 'printFieldListSelect',
587 $sql .= $hookmanager->resPrint;
589 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commandedet as l";
590 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON l.fk_product=p.rowid";
591 $sql .=
" WHERE l.fk_commande = ".((int) $objectsrc->id);
593 $sql .=
" AND l.product_type = 0";
596 $parameters = array();
597 $reshook = $hookmanager->executeHooks(
598 'printFieldListWhere',
606 $sql .= $hookmanager->resPrint;
609 $sql .=
" ORDER BY l.rang, p.ref, p.label";
611 $resql = $db->query($sql);
613 $num = $db->num_rows($resql);
618 print
'<tr class="liste_titre">';
620 print
'<td>'.$langs->trans(
"Description").
'</td>';
621 if (isModEnabled(
'productbatch')) {
622 print
'<td class="dispatch_batch_number_title">'.$langs->trans(
"batch_number").
'</td>';
624 print
'<td class="dispatch_dlc_title">'.$langs->trans(
"SellByDate").
'</td>';
627 print
'<td class="dispatch_dluo_title">'.$langs->trans(
"EatByDate").
'</td>';
634 print
'<td class="right">'.$langs->trans(
"QtyOrdered").
'</td>';
636 print
'<td class="right">'.$langs->trans(
"QtyToShip");
638 print
'<td class="right">'.$langs->trans(
"QtyDispatchedShort").
'</td>';
640 print
'<td class="right">'.$langs->trans(
"Details");
641 print
'<td width="32"></td>';
644 if (!isModEnabled(
"multicurrency") && empty($conf->dynamicprices->enabled)) {
645 print
'<td class="right">'.$langs->trans(
"Price").
'</td>';
646 print
'<td class="right">'.$langs->trans(
"ReductionShort").
' (%)</td>';
647 print
'<td class="right">'.$langs->trans(
"UpdatePrice").
'</td>';
651 print
'<td align="right">'.$langs->trans(
"Warehouse");
654 if (count($listwarehouses) > 1) {
655 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);
656 } elseif (count($listwarehouses) == 1) {
657 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);
663 $parameters = array();
664 $reshook = $hookmanager->executeHooks(
665 'printFieldListTitle',
673 print $hookmanager->resPrint;
682 $conf->cache[
'product'] = array();
686 $objp = $db->fetch_object($resql);
689 if (!$objp->fk_product > 0) {
692 $alreadydispatched = isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] : 0;
693 $remaintodispatch =
price2num($objp->qty, 5);
694 if ($remaintodispatch < 0 && !
getDolGlobalString(
'SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN')) {
695 $remaintodispatch = 0;
698 if ($remaintodispatch || !
getDolGlobalString(
'SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
707 print
'<!-- Line to dispatch '.$suffix.
' -->'.
"\n";
709 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$objp->qty.
'">';
710 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" data-dispatched="'.((float) $alreadydispatched).
'" value="'.(float) $alreadydispatched.
'">';
711 print
'<tr class="oddeven">';
713 if (empty($conf->cache[
'product'][$objp->fk_product])) {
714 $tmpproduct =
new Product($db);
715 $tmpproduct->fetch($objp->fk_product);
716 $conf->cache[
'product'][$objp->fk_product] = $tmpproduct;
718 $tmpproduct = $conf->cache[
'product'][$objp->fk_product];
721 $linktoprod = $tmpproduct->getNomUrl(1);
722 $linktoprod .=
' - '.$objp->label.
"\n";
724 if (isModEnabled(
'productbatch')) {
725 if ($objp->tobatch) {
727 print
'<td id="product_'.$i.
'" data-idproduct="'.$objp->fk_product.
'" data-barcode="'.$objp->barcode.
'">';
730 print
'<td class="dispatch_batch_number"></td>';
732 print
'<td class="dispatch_dlc"></td>';
735 print
'<td class="dispatch_dluo"></td>';
739 print
'<td id="product_'.$i.
'" data-idproduct="'.$objp->fk_product.
'" data-barcode="'.$objp->barcode.
'">';
742 print
'<td class="dispatch_batch_number">';
743 print
'<span class="opacitymedium small">'.$langs->trans(
"ProductDoesNotUseBatchSerial").
'</span>';
746 print
'<td class="dispatch_dlc"></td>';
749 print
'<td class="dispatch_dluo"></td>';
753 print
'<td colspan="4">';
759 $up_ht_disc = $objp->subprice;
760 if (!empty($objp->remise_percent) && !
getDolGlobalString(
'STOCK_EXCLUDE_DISCOUNT_FOR_PMP')) {
761 $up_ht_disc =
price2num($up_ht_disc * (100 - $objp->remise_percent) / 100,
'MU');
765 print
'<td class="right">'.$objp->qty.
'</td>';
768 print
'<td class="right">'.$alreadydispatched.
'</td>';
770 print
'<td class="right">';
776 $sql =
"SELECT ed.rowid, ed.qty, ed.fk_entrepot,";
777 $sql .=
" eb.batch, eb.eatby, eb.sellby, cd.fk_product";
778 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expeditiondet as ed";
779 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"expeditiondet_batch as eb on ed.rowid = eb.fk_expeditiondet";
780 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"commandedet as cd on ed.fk_elementdet = cd.rowid";
781 $sql .=
" WHERE ed.fk_elementdet =".(int) $objp->rowid;
782 $sql .=
" AND ed.fk_expedition =".(int)
$object->id;
783 $sql .=
" ORDER BY ed.rowid, ed.fk_elementdet";
785 $resultsql = $db->query($sql);
788 $numd = $db->num_rows($resultsql);
791 $suffix =
"_".$j.
"_".$i;
792 $objd = $db->fetch_object($resultsql);
794 if (isModEnabled(
'productbatch') && (!empty($objd->batch) || (is_null($objd->batch) && $tmpproduct->status_batch > 0))) {
800 'is_information_row' =>
true,
805 $reshook = $hookmanager->executeHooks(
806 'printFieldListValue',
814 print $hookmanager->resPrint;
818 print
'<!-- line for batch '.$numline.
' -->';
819 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
821 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
822 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
823 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
825 print
'<!-- This is a U.P. (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
826 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
831 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.(GETPOSTISSET(
'lot_number'.$suffix) ?
GETPOST(
'lot_number'.$suffix) : $objd->batch).
'">';
835 print
'<td class="nowraponall">';
837 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
841 print
'<td class="nowraponall">';
843 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
846 print
'<td colspan="2"> </td>';
856 'is_information_row' =>
true,
861 $reshook = $hookmanager->executeHooks(
862 'printFieldListValue',
870 print $hookmanager->resPrint;
874 print
'<!-- line no batch '.$numline.
' -->';
875 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
876 print
'<td colspan="'.$colspan.
'">';
877 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
878 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
879 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
880 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
881 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
885 print
'<td class="right nowraponall">';
886 print
'<a href="" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
887 $suggestedvalue = (GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : $objd->qty);
889 print
'<input id="qty'.$suffix.
'" onchange="onChangeDispatchLineQty($(this))" name="qty'.$suffix.
'" data-type="'.$type.
'" data-index="'.$i.
'" class="width50 right qtydispatchinput" value="'.$suggestedvalue.
'" data-expected="'.$objd->qty.
'">';
892 if (isModEnabled(
'productbatch') && $objp->tobatch > 0) {
894 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
897 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
903 print
'<td class="right">';
904 if (count($listwarehouses) > 1) {
905 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 1, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
906 } elseif (count($listwarehouses) == 1) {
907 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 0, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
909 $langs->load(
"errors");
910 print $langs->trans(
"ErrorNoWarehouseDefined");
916 'is_information_row' =>
false,
921 $reshook = $hookmanager->executeHooks(
922 'printFieldListValue',
930 print $hookmanager->resPrint;
937 $suffix =
"_".$j.
"_".$i;
941 if (isModEnabled(
'productbatch') && !empty($objp->tobatch)) {
947 'is_information_row' =>
true,
952 $reshook = $hookmanager->executeHooks(
953 'printFieldListValue',
961 print $hookmanager->resPrint;
965 print
'<!-- line for batch '.$numline.
' (not dispatched line yet for this order line) -->';
966 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
968 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
969 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
970 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
972 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
973 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
977 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.
GETPOST(
'lot_number'.$suffix).
'">';
980 print
'<td class="nowraponall">';
982 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
986 print
'<td class="nowraponall">';
988 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
991 print
'<td colspan="2"> </td>';
1001 'is_information_row' =>
true,
1003 'suffix' => $suffix,
1006 $reshook = $hookmanager->executeHooks(
1007 'printFieldListValue',
1015 print $hookmanager->resPrint;
1019 print
'<!-- line no batch '.$numline.
' (not dispatched line yet for this order line) -->';
1020 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
1021 print
'<td colspan="'.$colspan.
'">';
1022 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
1023 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
1024 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
1026 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
1027 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
1031 print
'<td class="right">';
1032 print
'<a href="" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
1033 $amounttosuggest = (GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : (!
getDolGlobalString(
'SUPPLIER_ORDER_DISPATCH_FORCE_QTY_INPUT_TO_ZERO') ? $remaintodispatch : 0));
1034 if (count($products_dispatched)) {
1037 $amounttosuggest = (GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : (isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] :
''));
1039 print
'<input id="qty'.$suffix.
'" onchange="onChangeDispatchLineQty($(this))" name="qty'.$suffix.
'" data-index="'.$i.
'" data-type="text" class="width50 right qtydispatchinput" value="'.$amounttosuggest.
'" data-expected="'.$amounttosuggest.
'">';
1042 if (isModEnabled(
'productbatch') && $objp->tobatch > 0) {
1044 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" onClick="addDispatchLine('.$i.
', \''.$type.
'\')
"');
1047 print img_picto($langs->trans('AddStockLocationLine'), 'split.png', 'class="splitbutton
" onClick="addDispatchLine(
'.$i.', \
''.$type.
'\')
"');
1053 print '<td class="right
">';
1054 if (count($listwarehouses) > 1) {
1055 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);
1056 } elseif (count($listwarehouses) == 1) {
1057 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);
1059 $langs->load("errors
");
1060 print $langs->trans("ErrorNoWarehouseDefined
");
1064 // Enable hooks to append additional columns
1065 $parameters = array(
1066 'is_information_row' => false, // this is a dispatch form row
1068 'suffix' => $suffix,
1071 $reshook = $hookmanager->executeHooks(
1072 'printFieldListValue',
1078 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1080 print $hookmanager->resPrint;
1089 dol_print_error($db);
1096 //$checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically
", $langs->transnoentitiesnoconv('StatusOrderReceivedAll'));
1098 print '<div class="center
">';
1099 $parameters = array();
1100 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1102 if (empty($reshook)) {
1103 /*if (empty($conf->reception->enabled)) {
1104 print $langs->trans("Comment").' : ';
1105 print '<input type="text
" class="minwidth400
" maxlength="128
" name="comment
" value="';
1106 print GETPOSTISSET("comment") ? GETPOST("comment") : $langs->trans("DispatchSupplierOrder", $object->ref);
1107 // print ' /
'.$object->ref_supplier; // Not yet available
1108 print '" class="flat
"><br>';
1110 print '<input type="checkbox
" checked="checked
" name="closeopenorder
"> '.$checkboxlabel;
1113 $dispatchBt = empty($conf->reception->enabled) ? $langs->trans("Receive
") : $langs->trans("CreateReception
");
1118 print '<input type="submit
" id="submitform
" class="button" name="dispatch
" value="'.$langs->trans("Save").'"';
1120 if (!$usercancreate) {
1123 if (count($listwarehouses) <= 0) {
1135 // Message if nothing to dispatch
1138 if (!getDolGlobalString('SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
1139 print '<div class="opacitymedium
">'.$langs->trans("NoPredefinedProductToDispatch
").'</div>'; // No predefined line at all
1141 print '<div class="opacitymedium
">'.$langs->trans("NoMorePredefinedProductToDispatch
").'</div>'; // No predefined line that remain to be dispatched.
1148 print dol_get_fiche_end();
1150 // Popup for mass barcode scanning
1151 if ($action == 'updatebyscaning') {
1152 if ($permissiontoadd) {
1153 // Output the javascript to manage the scanner tool.
1157 var duplicatedbatchcode = [];
1163 function barcodescannerjs(){
1164 console.log("We
catch inputs in scanner box
");
1165 jQuery("#scantoolmessage
").text();
1167 var selectaddorreplace = $("select[
name=selectaddorreplace]
").val();
1168 var barcodemode = $("input[
name=barcodemode]:checked
").val();
1169 var barcodeproductqty = $("input[
name=barcodeproductqty]
").val();
1170 var warehousetouse = $("select[
name=warehousenew]
").val();
1171 var textarea = $("textarea[
name=barcodelist]
").val();
1172 var textarray = textarea.split(/[\s,;]+/);
1173 var tabproduct = [];
1174 duplicatedbatchcode = [];
1180 textarray = textarray.filter(function(value){
1183 if(textarray.some((element) => element != "")){
1184 $(".qtydispatchinput
").each(function(){
1185 id = $(this).attr(\'id\');
1186 idarray = id.split(\'_\');
1187 idproduct = idarray[2];
1188 id = idarray[1] + \'_\' + idarray[2];
1189 console.log("Analyze the line
"+id+" in inventory, barcodemode=
"+barcodemode);
1190 warehouse = $("#entrepot_
"+id).val();
1191 console.log(warehouse);
1192 productbarcode = $("#product_
"+idproduct).attr(\'data-barcode\');
1193 console.log(productbarcode);
1194 productbatchcode = $("#lot_number_
"+id).val();
1195 if(productbatchcode == undefined){
1196 productbatchcode = "";
1198 console.log(productbatchcode);
1200 if (barcodemode != "barcodeforproduct
") {
1201 tabproduct.forEach(product=>{
1202 console.log("product.Batch=
"+product.Batch+" productbatchcode=
"+productbatchcode);
1203 if(product.Batch != "" && product.Batch == productbatchcode){
1204 console.log("duplicate batch code found
for batch code
"+productbatchcode);
1205 duplicatedbatchcode.push(productbatchcode);
1209 productinput = $("#qty_
"+id).val();
1210 if(productinput == ""){
1213 tabproduct.push({\'Id\':id,\'Warehouse\':warehouse,\'Barcode\':productbarcode,\'Batch\':productbatchcode,\'Qty\':productinput,\'fetched\':false});
1215 console.log("Loop on each record entered in the textarea
");
1217 textarray.forEach(function(element,index){
1218 console.log("Process record element=
"+element+" id=
"+id);
1219 var verify_batch = false;
1220 var verify_barcode = false;
1221 switch(barcodemode){
1222 case "barcodeforautodetect
":
1223 verify_barcode = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"barcode
",true);
1224 verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"lotserial
",true);
1226 case "barcodeforproduct
":
1227 verify_barcode = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"barcode
");
1229 case "barcodeforlotserial
":
1230 verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"lotserial
");
1233 alert(\''.dol_escape_js($langs->trans("ErrorWrongBarcodemode
")).' "\
'+barcodemode+\'"\');
1234 throw \''.dol_escape_js($langs->trans(
'ErrorWrongBarcodemode')).
' "\'+barcodemode+\'"\';
1237 if (verify_batch == false && verify_barcode == false) { /* If the 2 flags are false, not found error */
1238 errortab2.push(element);
1239 } else if (verify_batch == true && verify_barcode == true) { /* If the 2 flags are true, error: we don t know which one to take */
1240 errortab3.push(element);
1241 } else if (verify_batch == true) {
1242 console.log("element="+element);
1243 console.log(duplicatedbatchcode);
1244 if (duplicatedbatchcode.includes(element)) {
1245 errortab1.push(element);
1250 if (Object.keys(errortab1).length < 1 && Object.keys(errortab2).length < 1 && Object.keys(errortab3).length < 1) {
1251 tabproduct.forEach(product => {
1253 if(product.hasOwnProperty("reelqty")){
1254 idprod = $("td[data-idproduct=\'"+product.fk_product+"\']").attr("id");
1255 idproduct = idprod.split("_")[1];
1256 console.log("We create a new line for product_"+idproduct);
1257 if(product.Barcode != null){
1258 modedispatch = "dispatch";
1260 modedispatch = "batch";
1262 addDispatchLine(idproduct,modedispatch);
1263 console.log($("tr[name^=\'"+modedispatch+"_\'][name$=\'_"+idproduct+"\']"));
1264 nbrTrs = $("tr[name^=\'"+modedispatch+"_\'][name$=\'_"+idproduct+"\']").length;
1266 $("#qty_"+(nbrTrs-1)+"_"+idproduct).val(product.Qty);
1267 $("#entrepot_"+(nbrTrs-1)+"_"+idproduct).val(product.Warehouse);
1269 if(modedispatch == "batch"){
1270 $("#lot_number_"+(nbrTrs-1)+"_"+idproduct).val(product.Batch);
1274 console.log("We change #qty_"+product.Id +" to match input in scanner box");
1275 $("#qty_"+product.Id).val(product.Qty);
1279 jQuery("#scantoolmessage").text("'.
dol_escape_js($langs->transnoentities(
"QtyWasAddedToTheScannedBarcode")).
'\n");
1280 /* document.forms["formrecord"].submit(); */
1282 let stringerror = "";
1283 if (Object.keys(errortab1).length > 0) {
1284 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorSameBatchNumber')).
': ";
1285 errortab1.forEach(element => {
1286 stringerror += (element + ", ")
1288 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1290 if (Object.keys(errortab2).length > 0) {
1291 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorCantFindCodeInInventory')).
': ";
1292 errortab2.forEach(element => {
1293 stringerror += (element + ", ")
1295 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1297 if (Object.keys(errortab3).length > 0) {
1298 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorCodeScannedIsBothProductAndSerial')).
': ";
1299 errortab3.forEach(element => {
1300 stringerror += (element + ", ")
1302 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1304 if (Object.keys(errortab4).length > 0) {
1305 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorBarcodeNotFoundForProductWarehouse')).
': ";
1306 errortab4.forEach(element => {
1307 stringerror += (element + ", ")
1309 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1312 jQuery("#scantoolmessage").html(\''.
dol_escape_js($langs->transnoentities(
"ErrorOnElementsInventory")).
'\' + stringerror);
1320 function barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,mode,autodetect=
false){
1321 BarcodeIsInProduct=0;
1324 tabproduct.forEach(product => {
1325 $.ajax({ url: \
''.DOL_URL_ROOT.
'/expedition/ajax/searchfrombarcode.php\',
1326 data: { "token":"'.
newToken().
'", "action":"existbarcode","fk_entrepot": warehousetouse, "barcode":element, "mode":mode},
1329 success: function(response) {
1330 if (response.status == "success"){
1331 console.log(response.message);
1333 newproductrow = response.object;
1336 if (mode!="lotserial" && autodetect==false && !errortab4.includes(element)){
1337 errortab4.push(element);
1338 console.error(response.message);
1342 error : function(output) {
1343 console.error("Error on barcodeserialforproduct function");
1346 console.log("Product "+(index+=1)+": "+element);
1347 if(mode == "barcode"){
1348 testonproduct = product.Barcode
1349 }else if (mode == "lotserial"){
1350 testonproduct = product.Batch
1352 testonwarehouse = product.Warehouse;
1353 if(testonproduct == element && testonwarehouse == warehousetouse){
1354 if(selectaddorreplace == "add"){
1355 productqty = parseInt(product.Qty,10);
1356 product.Qty = productqty + parseInt(barcodeproductqty,10);
1357 }else if(selectaddorreplace == "replace"){
1358 if(product.fetched == false){
1359 product.Qty = barcodeproductqty
1360 product.fetched=true
1362 productqty = parseInt(product.Qty,10);
1363 product.Qty = productqty + parseInt(barcodeproductqty,10);
1366 BarcodeIsInProduct+=1;
1369 if(BarcodeIsInProduct==0 && newproductrow!=0){
1370 tabproduct.push({\'Id\':tabproduct.length-1,\'Warehouse\':newproductrow.fk_warehouse,\'Barcode\':mode=="barcode"?element:null,\'Batch\':mode=="lotserial"?element:null,\'Qty\':barcodeproductqty,\'fetched\':true,\'reelqty\':newproductrow.reelqty,\'fk_product\':newproductrow.fk_product,\'mode\':mode});
1373 if(BarcodeIsInProduct > 0){
1381 include DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
1383 print $formother->getHTMLScannerForm(
"barcodescannerjs",
'all', 1);
1387 print
'<script type="text/javascript">
1388 $(document).ready(function () {
1389 $("select[name=fk_default_warehouse]").change(function() {
1390 console.log("warehouse is modified");
1391 var fk_default_warehouse = $("option:selected", this).val();
1392 $("select[name^=entrepot_]").val(fk_default_warehouse).change();
1395 $("#autoreset").click(function() {
1396 console.log("we click on autoreset");
1397 $(".autoresettr").each(function(){
1398 id = $(this).attr("name");
1399 idtab = id.split("_");
1400 console.log("we process line "+id+" "+idtab);
1401 if ($(this).data("remove") == "clear") { /* data-remove=clear means that line qty must be cleared but line must not be removed */
1402 console.log("We clear the object to expected value")
1403 $("#qty_"+idtab[1]+"_"+idtab[2]).val("");
1405 qtyexpected = $("#qty_"+idtab[1]+"_"+idtab[2]).data("expected")
1406 console.log(qtyexpected);
1407 $("#qty_"+idtab[1]+"_"+idtab[2]).val(qtyexpected);
1408 qtydispatched = $("#qty_dispatched_0_"+idtab[2]).data("dispatched")
1409 $("#qty_dispatched_0_"+idtab[2]).val(qtydispatched);
1411 } else { /* data-remove=remove means that line must be removed */
1412 console.log("We remove the object")
1414 $("tr[name^=\'"+idtab[0]+"_\'][name$=\'_"+idtab[2]+"\']:last .splitbutton").show();
1420 $("#resetalltoexpected").click(function(){
1421 $(".qtydispatchinput").each(function(){
1422 console.log("We reset to expected "+$(this).attr("id")+" qty to dispatch");
1423 $(this).val($(this).data("expected"));
1428 $(".resetline").on("click", function(event) {
1429 event.preventDefault();
1430 id = $(this).attr("id");
1431 id = id.split("reset_");
1432 console.log("Reset trigger for id = qty_"+id[1]);
1433 $("#qty_"+id[1]).val("");
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Class to manage customers orders.
Class to manage warehouses.
const STATUS_DRAFT
Draft status.
Class to manage lines of shipment.
CRUD class for batch number management within shipment.
Class to manage products or services.
Class to manage projects.
Class to manage proposals.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage Dolibarr users.
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_now($mode='auto')
Return date for now.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
treeview li table
No Email.
ui state ui widget content ui state ui widget header ui state a ui button
0 = Do not include form tag and submit button -1 = Do not include form tag but include submit button
$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.
shipping_prepare_head($object)
Prepare array with list of tabs.