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';
57$langs->loadLangs(array(
"sendings",
"companies",
"bills",
'deliveries',
'orders',
'stocks',
'other',
'propal',
'receptions'));
59if (isModEnabled(
'productbatch')) {
60 $langs->load(
'productbatch');
67$action =
GETPOST(
'action',
'aZ09');
68$fk_default_warehouse =
GETPOSTINT(
'fk_default_warehouse');
69$cancel =
GETPOST(
'cancel',
'alpha');
70$confirm =
GETPOST(
'confirm',
'alpha');
76 $socid = $user->socid;
79$hookmanager->initHooks(array(
'expeditiondispatch'));
83if (GETPOSTISSET(
"projectid")) {
91if ($id > 0 || !empty($ref)) {
92 $result =
$object->fetch($id, $ref);
96 $result =
$object->fetch_thirdparty();
111if (!isModEnabled(
'stock')) {
115$usercancreate = $user->hasRight(
'expedition',
'creer');
116$permissiontoadd = $usercancreate;
123$parameters = array();
124$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
130if ($action ==
'updatelines' && $usercancreate) {
139 foreach ($_POST as $key => $value) {
142 if (preg_match(
'/^product_.*([0-9]+)_([0-9]+)$/i', $key, $reg)) {
144 if (preg_match(
'/^product_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
145 $modebatch =
"barcode";
146 } elseif (preg_match(
'/^product_batch_([0-9]+)_([0-9]+)$/i', $key, $reg)) {
147 $modebatch =
"batch";
151 if ($modebatch ==
"barcode") {
152 $prod =
"product_".$reg[1].
'_'.$reg[2];
154 $prod =
'product_batch_'.$reg[1].
'_'.$reg[2];
156 $qty =
"qty_".$reg[1].
'_'.$reg[2];
157 $ent =
"entrepot_".$reg[1].
'_'.$reg[2];
158 $fk_commandedet =
"fk_commandedet_".$reg[1].
'_'.$reg[2];
159 $idline =
GETPOST(
"idline_".$reg[1].
'_'.$reg[2]);
166 if ($modebatch ==
"batch") {
167 $lot =
GETPOST(
'lot_number_'.$reg[1].
'_'.$reg[2]);
176 if (($modebatch ==
"batch" && $newqty >= 0) || ($modebatch ==
"barcode" && $newqty != 0)) {
178 if (!($warehouse_id > 0)) {
179 dol_syslog(
'No dispatch for line '.$key.
' as no warehouse was chosen.');
180 $text = $langs->transnoentities(
'Warehouse').
', '.$langs->transnoentities(
'Line').
' '.($numline);
181 setEventMessages($langs->trans(
'ErrorFieldRequired', $text),
null,
'errors');
184 if (!$error && $modebatch ==
"batch") {
185 $sql =
"SELECT pb.rowid ";
186 $sql .=
" FROM ".MAIN_DB_PREFIX.
"product_batch as pb";
187 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"product_stock as ps";
188 $sql .=
" ON ps.rowid = pb.fk_product_stock";
189 $sql .=
" WHERE pb.batch = '".$db->escape($lot).
"'";
190 $sql .=
" AND ps.fk_product = ".((int) $prod_id) ;
191 $sql .=
" AND ps.fk_entrepot = ".((int) $warehouse_id) ;
193 $resql = $db->query($sql);
195 $num = $db->num_rows($resql);
197 dol_syslog(
'No dispatch for line '.$key.
' as too many combination warehouse, product, batch code was found ('.$num.
').');
198 setEventMessages($langs->trans(
'ErrorTooManyCombinationBatchcode', $numline, $num),
null,
'errors');
200 } elseif ($num < 1) {
202 $tmpwarehouse->fetch($warehouse_id);
204 $tmpprod->fetch($prod_id);
205 dol_syslog(
'No dispatch for line '.$key.
' as no combination warehouse, product, batch code was found.');
206 setEventMessages($langs->trans(
'ErrorNoCombinationBatchcode', $numline, $tmpwarehouse->ref, $tmpprod->ref, $lot),
null,
'errors');
218 $result = $expeditiondispatch->fetch($idline);
220 setEventMessages($expeditiondispatch->error, $expeditiondispatch->errors,
'errors');
223 $qtystart = $expeditiondispatch->qty;
224 $expeditiondispatch->qty = $newqty;
225 $expeditiondispatch->entrepot_id =
GETPOSTINT($ent);
228 $result = $expeditiondispatch->update($user);
230 $result = $expeditiondispatch->delete($user);
233 setEventMessages($expeditiondispatch->error, $expeditiondispatch->errors,
'errors');
237 if (!$error && $modebatch ==
"batch") {
239 $suffixkeyfordate = preg_replace(
'/^product_batch/',
'', $key);
243 $sqlsearchdet =
"SELECT rowid FROM ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element;
244 $sqlsearchdet .=
" WHERE fk_expeditiondet = ".((int) $idline);
245 $sqlsearchdet .=
" AND batch = '".$db->escape($lot).
"'";
246 $resqlsearchdet = $db->query($sqlsearchdet);
248 if ($resqlsearchdet) {
249 $objsearchdet = $db->fetch_object($resqlsearchdet);
255 $sql =
"UPDATE ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element.
" SET";
256 $sql .=
" eatby = ".($eatby ?
"'".$db->idate($eatby).
"'" :
"null");
257 $sql .=
" , sellby = ".($sellby ?
"'".$db->idate($sellby).
"'" :
"null");
258 $sql .=
" , qty = ".((float) $newqty);
259 $sql .=
" , fk_warehouse = ".((int) $warehouse_id);
260 $sql .=
" WHERE rowid = ".((int) $objsearchdet->rowid);
262 $sql =
"INSERT INTO ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element.
" (";
263 $sql .=
"fk_expeditiondet, eatby, sellby, batch, qty, fk_origin_stock, fk_warehouse)";
264 $sql .=
" VALUES (".((int) $idline).
", ".($eatby ?
"'".$db->idate($eatby).
"'" :
"null").
", ".($sellby ?
"'".$db->idate($sellby).
"'" :
"null").
", ";
265 $sql .=
" '".$db->escape($lot).
"', ".((float) $newqty).
", 0, ".((int) $warehouse_id).
")";
268 $sql =
" DELETE FROM ".MAIN_DB_PREFIX.$expeditionlinebatch->table_element;
269 $sql .=
" WHERE fk_expeditiondet = ".((int) $idline);
270 $sql .=
" AND batch = '".$db->escape($lot).
"'";
273 $resql = $db->query($sql);
281 $expeditiondispatch->fk_expedition =
$object->id;
282 $expeditiondispatch->entrepot_id =
GETPOSTINT($ent);
283 $expeditiondispatch->fk_elementdet =
GETPOSTINT($fk_commandedet);
284 $expeditiondispatch->qty = $newqty;
287 $idline = $expeditiondispatch->insert($user);
289 setEventMessages($expeditiondispatch->error, $expeditiondispatch->errors,
'errors');
293 if ($modebatch ==
"batch" && !$error) {
294 $expeditionlinebatch->sellby = $dDLUO;
295 $expeditionlinebatch->eatby = $dDLC;
296 $expeditionlinebatch->batch = $lot;
297 $expeditionlinebatch->qty = $newqty;
298 $expeditionlinebatch->fk_origin_stock = 0;
299 $expeditionlinebatch->fk_warehouse =
GETPOSTINT($ent);
301 $result = $expeditionlinebatch->create($idline);
303 setEventMessages($expeditionlinebatch->error, $expeditionlinebatch->errors,
'errors');
360 header(
"Location: ".DOL_URL_ROOT.
'/expedition/dispatch.php?id='.
$object->id);
363} elseif ($action ==
'setdate_livraison' && $usercancreate) {
367 $result =
$object->setDeliveryDate($user, $datedelivery);
380$form =
new Form($db);
382$warehouse_static =
new Entrepot($db);
384$title =
$object->ref.
" - ".$langs->trans(
'ShipmentDistribution');
385$help_url =
'EN:Module_Shipments|FR:Module_Expéditions|ES:Módulo_Expediciones|DE:Modul_Lieferungen';
386$morejs = array(
'/expedition/js/lib_dispatch.js.php');
388llxHeader(
'', $title, $help_url,
'', 0, 0, $morejs,
'',
'',
'mod-expedition page-card_dispatch');
394 $num_prod = count($lines);
406 $author =
new User($db);
407 $author->fetch(
$object->user_author_id);
417 if ($action ==
'ask_deleteline') {
418 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
422 $parameters = array(
'lineid' => $lineid);
424 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
425 if (empty($reshook)) {
426 $formconfirm .= $hookmanager->resPrint;
427 } elseif ($reshook > 0) {
428 $formconfirm = $hookmanager->resPrint;
434 if ($typeobject ==
'commande' &&
$object->origin_object->id && isModEnabled(
'order')) {
436 $objectsrc->fetch(
$object->origin_object->id);
438 if ($typeobject ==
'propal' &&
$object->origin_object->id && isModEnabled(
"propal")) {
439 $objectsrc =
new Propal($db);
440 $objectsrc->fetch(
$object->origin_object->id);
444 $linkback =
'<a href="'.DOL_URL_ROOT.
'/expedition/list.php?restore_lastsearch_values=1'.(!empty($socid) ?
'&socid='.$socid :
'').
'">'.$langs->trans(
"BackToList").
'</a>';
445 $morehtmlref =
'<div class="refidno">';
448 $morehtmlref .= $form->editfieldkey(
"RefCustomer",
'ref_customer',
$object->ref_customer, $object, $user->hasRight(
'expedition',
'creer'),
'string',
'', 0, 1);
449 $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);
452 $morehtmlref .=
'<br>'.$object->thirdparty->getNomUrl(1);
454 if (isModEnabled(
'project')) {
455 $langs->load(
"projects");
456 $morehtmlref .=
'<br>';
458 $morehtmlref .=
img_picto($langs->trans(
"Project"),
'project',
'class="pictofixedwidth"');
459 if ($action !=
'classify' && $permissiontoadd) {
460 $morehtmlref .=
'<a class="editfielda" href="'.$_SERVER[
'PHP_SELF'].
'?action=classify&token='.
newToken().
'&id='.
$object->id.
'">'.
img_edit($langs->transnoentitiesnoconv(
'SetProject')).
'</a> ';
462 $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');
464 if (!empty($objectsrc) && !empty($objectsrc->fk_project)) {
466 $proj->fetch($objectsrc->fk_project);
467 $morehtmlref .= $proj->getNomUrl(1);
469 $morehtmlref .=
'<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).
'</span>';
474 $morehtmlref .=
'</div>';
476 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
479 print
'<div class="fichecenter">';
480 print
'<div class="underbanner clearboth"></div>';
482 print
'<table class="border tableforfield centpercent">';
485 if ($typeobject ==
'commande' &&
$object->origin_object->id && isModEnabled(
'order')) {
487 print $langs->trans(
"RefOrder").
'</td>';
488 print
'<td colspan="3">';
489 print $objectsrc->getNomUrl(1,
'commande');
493 if ($typeobject ==
'propal' &&
$object->origin_object->id && isModEnabled(
"propal")) {
495 print $langs->trans(
"RefProposal").
'</td>';
496 print
'<td colspan="3">';
497 print $objectsrc->getNomUrl(1,
'expedition');
503 print
'<tr><td class="titlefield">'.$langs->trans(
"DateCreation").
'</td>';
504 print
'<td colspan="3">'.dol_print_date(
$object->date_creation,
"dayhour",
"tzuserrel").
"</td>\n";
508 print
'<tr><td height="10">';
509 print
'<table class="nobordernopadding" width="100%"><tr><td>';
510 print $langs->trans(
'DateDeliveryPlanned');
512 if ($action !=
'editdate_livraison') {
513 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>';
515 print
'</tr></table>';
516 print
'</td><td colspan="2">';
517 if ($action ==
'editdate_livraison') {
518 print
'<form name="setdate_livraison" action="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'" method="post">';
519 print
'<input type="hidden" name="token" value="'.newToken().
'">';
520 print
'<input type="hidden" name="action" value="setdate_livraison">';
521 print $form->selectDate(
$object->date_delivery ?
$object->date_delivery : -1,
'liv_', 1, 1, 0,
"setdate_livraison", 1, 0);
522 print
'<input type="submit" class="button button-edit smallpaddingimp" value="'.$langs->trans(
'Modify').
'">';
528 print
'</tr></table>';
530 print
'<br><center>';
531 if (isModEnabled(
'barcode') || isModEnabled(
'productbatch')) {
532 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>';
534 print
'<a href="#" id="resetalltoexpected" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'autofill',
'class="pictofixedwidth"').$langs->trans(
"RestoreWithCurrentQtySaved").
'</a></td>';
536 print
'<a href="#" id="autoreset" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
"",
'eraser',
'class="pictofixedwidth"').$langs->trans(
"ClearQtys").
'</a></td>';
543 require_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
545 $formproduct->loadWarehouses();
547 $listwarehouses = $entrepot->list_array(1);
550 print
'<form method="post" action="'.$_SERVER[
"PHP_SELF"].
'">';
552 print
'<input type="hidden" name="token" value="'.newToken().
'">';
553 print
'<input type="hidden" name="action" value="updatelines">';
554 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
556 print
'<div class="div-table-responsive-no-min">';
557 print
'<table class="noborder centpercent">';
560 $products_dispatched = array();
561 $sql =
"SELECT ed.fk_elementdet as rowid, sum(ed.qty) as qty";
562 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expeditiondet as ed";
563 $sql .=
" WHERE ed.fk_expedition = ".((int)
$object->id);
564 $sql .=
" GROUP BY ed.fk_elementdet";
566 $resql = $db->query($sql);
568 $num = $db->num_rows($resql);
573 $objd = $db->fetch_object($resql);
574 $products_dispatched[$objd->rowid] =
price2num($objd->qty,
'MS');
582 $sql =
"SELECT l.rowid, l.fk_product, l.subprice, l.remise_percent, '' AS sref, l.qty as qty,";
583 $sql .=
" p.ref, p.label, p.tobatch, p.fk_default_warehouse, p.barcode";
585 $parameters = array();
586 $reshook = $hookmanager->executeHooks(
587 'printFieldListSelect',
595 $sql .= $hookmanager->resPrint;
597 $sql .=
" FROM ".MAIN_DB_PREFIX.
"commandedet as l";
598 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"product as p ON l.fk_product=p.rowid";
599 $sql .=
" WHERE l.fk_commande = ".((int) $objectsrc->id);
601 $sql .=
" AND l.product_type = 0";
604 $parameters = array();
605 $reshook = $hookmanager->executeHooks(
606 'printFieldListWhere',
614 $sql .= $hookmanager->resPrint;
617 $sql .=
" ORDER BY l.rang, p.ref, p.label";
619 $resql = $db->query($sql);
621 $num = $db->num_rows($resql);
626 print
'<tr class="liste_titre">';
628 print
'<td>'.$langs->trans(
"Description").
'</td>';
629 if (isModEnabled(
'productbatch')) {
630 print
'<td class="dispatch_batch_number_title">'.$langs->trans(
"batch_number").
'</td>';
632 print
'<td class="dispatch_dlc_title">'.$langs->trans(
"SellByDate").
'</td>';
635 print
'<td class="dispatch_dluo_title">'.$langs->trans(
"EatByDate").
'</td>';
642 print
'<td class="right">'.$langs->trans(
"QtyOrdered").
'</td>';
644 print
'<td class="right">'.$langs->trans(
"QtyToShip");
646 print
'<td class="right">'.$langs->trans(
"QtyDispatchedShort").
'</td>';
648 print
'<td class="right">'.$langs->trans(
"Details");
649 print
'<td width="32"></td>';
652 if (!isModEnabled(
"multicurrency") && empty(
$conf->dynamicprices->enabled)) {
653 print
'<td class="right">'.$langs->trans(
"Price").
'</td>';
654 print
'<td class="right">'.$langs->trans(
"ReductionShort").
' (%)</td>';
655 print
'<td class="right">'.$langs->trans(
"UpdatePrice").
'</td>';
659 print
'<td align="right">'.$langs->trans(
"Warehouse");
662 if (count($listwarehouses) > 1) {
663 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);
664 } elseif (count($listwarehouses) == 1) {
665 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);
671 $parameters = array();
672 $reshook = $hookmanager->executeHooks(
673 'printFieldListTitle',
681 print $hookmanager->resPrint;
690 $conf->cache[
'product'] = array();
694 $objp = $db->fetch_object($resql);
697 if (!$objp->fk_product > 0) {
700 $alreadydispatched = isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] : 0;
701 $remaintodispatch =
price2num($objp->qty, 5);
702 if ($remaintodispatch < 0 && !
getDolGlobalString(
'SUPPLIER_ORDER_ALLOW_NEGATIVE_QTY_FOR_SUPPLIER_ORDER_RETURN')) {
703 $remaintodispatch = 0;
706 if ($remaintodispatch || !
getDolGlobalString(
'SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
715 print
'<!-- Line to dispatch '.$suffix.
' -->'.
"\n";
717 print
'<input id="qty_ordered'.$suffix.
'" type="hidden" value="'.$objp->qty.
'">';
718 print
'<input id="qty_dispatched'.$suffix.
'" type="hidden" data-dispatched="'.((float) $alreadydispatched).
'" value="'.(float) $alreadydispatched.
'">';
719 print
'<tr class="oddeven">';
721 if (empty(
$conf->cache[
'product'][$objp->fk_product])) {
722 $tmpproduct =
new Product($db);
723 $tmpproduct->fetch($objp->fk_product);
724 $conf->cache[
'product'][$objp->fk_product] = $tmpproduct;
726 $tmpproduct =
$conf->cache[
'product'][$objp->fk_product];
729 $linktoprod = $tmpproduct->getNomUrl(1);
730 $linktoprod .=
' - '.$objp->label.
"\n";
732 if (isModEnabled(
'productbatch')) {
733 if ($objp->tobatch) {
735 print
'<td id="product_'.$i.
'" data-idproduct="'.$objp->fk_product.
'" data-barcode="'.$objp->barcode.
'">';
738 print
'<td class="dispatch_batch_number"></td>';
740 print
'<td class="dispatch_dlc"></td>';
743 print
'<td class="dispatch_dluo"></td>';
747 print
'<td id="product_'.$i.
'" data-idproduct="'.$objp->fk_product.
'" data-barcode="'.$objp->barcode.
'">';
750 print
'<td class="dispatch_batch_number">';
751 print
'<span class="opacitymedium small">'.$langs->trans(
"ProductDoesNotUseBatchSerial").
'</span>';
754 print
'<td class="dispatch_dlc"></td>';
757 print
'<td class="dispatch_dluo"></td>';
761 print
'<td colspan="4">';
767 $up_ht_disc = $objp->subprice;
768 if (!empty($objp->remise_percent) && !
getDolGlobalString(
'STOCK_EXCLUDE_DISCOUNT_FOR_PMP')) {
769 $up_ht_disc =
price2num($up_ht_disc * (100 - $objp->remise_percent) / 100,
'MU');
773 print
'<td class="right">'.$objp->qty.
'</td>';
776 print
'<td class="right">'.$alreadydispatched.
'</td>';
778 print
'<td class="right">';
784 $sql =
"SELECT ed.rowid, ed.qty, ed.fk_entrepot,";
785 $sql .=
" eb.batch, eb.eatby, eb.sellby, cd.fk_product";
786 $sql .=
" FROM ".MAIN_DB_PREFIX.
"expeditiondet as ed";
787 $sql .=
" LEFT JOIN ".MAIN_DB_PREFIX.
"expeditiondet_batch as eb on ed.rowid = eb.fk_expeditiondet";
788 $sql .=
" JOIN ".MAIN_DB_PREFIX.
"commandedet as cd on ed.fk_elementdet = cd.rowid";
789 $sql .=
" WHERE ed.fk_elementdet =".(int) $objp->rowid;
790 $sql .=
" AND ed.fk_expedition =".(int)
$object->id;
791 $sql .=
" ORDER BY ed.rowid, ed.fk_elementdet";
793 $resultsql = $db->query($sql);
796 $numd = $db->num_rows($resultsql);
799 $suffix =
"_".$j.
"_".$i;
800 $objd = $db->fetch_object($resultsql);
802 if (isModEnabled(
'productbatch') && (!empty($objd->batch) || (is_null($objd->batch) && $tmpproduct->status_batch > 0))) {
808 'is_information_row' =>
true,
813 $reshook = $hookmanager->executeHooks(
814 'printFieldListValue',
822 print $hookmanager->resPrint;
826 print
'<!-- line for batch '.$numline.
' -->';
827 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
829 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
830 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
831 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
833 print
'<!-- This is a U.P. (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
834 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
839 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).
'">';
843 print
'<td class="nowraponall">';
845 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
849 print
'<td class="nowraponall">';
851 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
854 print
'<td colspan="2"> </td>';
864 'is_information_row' =>
true,
869 $reshook = $hookmanager->executeHooks(
870 'printFieldListValue',
878 print $hookmanager->resPrint;
882 print
'<!-- line no batch '.$numline.
' -->';
883 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
884 print
'<td colspan="'.$colspan.
'">';
885 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
886 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="'.$objd->rowid.
'">';
887 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objd->fk_product.
'">';
888 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
889 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
893 print
'<td class="right nowraponall">';
894 print
'<a href="" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
895 $suggestedvalue = (GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : $objd->qty);
897 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.
'">';
900 if (isModEnabled(
'productbatch') && $objp->tobatch > 0) {
902 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
905 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" '.($numd != $j + 1 ?
'style="display:none"' :
'').
' onClick="addDispatchLine('.$i.
', \''.$type.
'\')"');
911 print
'<td class="right">';
912 if (count($listwarehouses) > 1) {
913 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 1, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
914 } elseif (count($listwarehouses) == 1) {
915 print $formproduct->selectWarehouses(
GETPOST(
"entrepot".$suffix) ?
GETPOST(
"entrepot".$suffix) : $objd->fk_entrepot,
"entrepot".$suffix,
'', 0, 0, $objp->fk_product,
'', 1, 0, array(),
'csswarehouse'.$suffix);
917 $langs->load(
"errors");
918 print $langs->trans(
"ErrorNoWarehouseDefined");
924 'is_information_row' =>
false,
929 $reshook = $hookmanager->executeHooks(
930 'printFieldListValue',
938 print $hookmanager->resPrint;
945 $suffix =
"_".$j.
"_".$i;
949 if (isModEnabled(
'productbatch') && !empty($objp->tobatch)) {
955 'is_information_row' =>
true,
960 $reshook = $hookmanager->executeHooks(
961 'printFieldListValue',
969 print $hookmanager->resPrint;
973 print
'<!-- line for batch '.$numline.
' (not dispatched line yet for this order line) -->';
974 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
976 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
977 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
978 print
'<input name="product_batch'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
980 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
981 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
985 print
'<input type="text" class="inputlotnumber quatrevingtquinzepercent" id="lot_number'.$suffix.
'" name="lot_number'.$suffix.
'" value="'.
GETPOST(
'lot_number'.$suffix).
'">';
988 print
'<td class="nowraponall">';
990 print $form->selectDate($dlcdatesuffix,
'dlc'.$suffix, 0, 0, 1,
'');
994 print
'<td class="nowraponall">';
996 print $form->selectDate($dluodatesuffix,
'dluo'.$suffix, 0, 0, 1,
'');
999 print
'<td colspan="2"> </td>';
1007 $parameters = array(
1009 'is_information_row' =>
true,
1011 'suffix' => $suffix,
1014 $reshook = $hookmanager->executeHooks(
1015 'printFieldListValue',
1023 print $hookmanager->resPrint;
1027 print
'<!-- line no batch '.$numline.
' (not dispatched line yet for this order line) -->';
1028 print
'<tr class="oddeven autoresettr" name="'.$type.$suffix.
'" data-remove="clear">';
1029 print
'<td colspan="'.$colspan.
'">';
1030 print
'<input id="fk_commandedet'.$suffix.
'" name="fk_commandedet'.$suffix.
'" type="hidden" value="'.$objp->rowid.
'">';
1031 print
'<input id="idline'.$suffix.
'" name="idline'.$suffix.
'" type="hidden" value="-1">';
1032 print
'<input name="product'.$suffix.
'" type="hidden" value="'.$objp->fk_product.
'">';
1034 print
'<!-- This is a up (may include discount or not depending on STOCK_EXCLUDE_DISCOUNT_FOR_PMP. will be used for PMP calculation) -->';
1035 print
'<input class="maxwidth75" name="pu'.$suffix.
'" type="hidden" value="'.
price2num($up_ht_disc,
'MU').
'">';
1039 print
'<td class="right">';
1040 print
'<a href="" id="reset'.$suffix.
'" class="resetline">'.
img_picto($langs->trans(
"Reset"),
'eraser',
'class="pictofixedwidth opacitymedium"').
'</a>';
1041 $amounttosuggest = (GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : (!
getDolGlobalString(
'SUPPLIER_ORDER_DISPATCH_FORCE_QTY_INPUT_TO_ZERO') ? $remaintodispatch : 0));
1042 if (count($products_dispatched)) {
1045 $amounttosuggest = (GETPOSTISSET(
'qty'.$suffix) ?
GETPOSTINT(
'qty'.$suffix) : (isset($products_dispatched[$objp->rowid]) ? $products_dispatched[$objp->rowid] :
''));
1047 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.
'">';
1050 if (isModEnabled(
'productbatch') && $objp->tobatch > 0) {
1052 print
img_picto($langs->trans(
'AddStockLocationLine'),
'split.png',
'class="splitbutton" onClick="addDispatchLine('.$i.
', \''.$type.
'\')
"');
1055 print img_picto($langs->trans('AddStockLocationLine'), 'split.png', 'class="splitbutton
" onClick="addDispatchLine(
'.$i.', \
''.$type.
'\')
"');
1061 print '<td class="right
">';
1062 if (count($listwarehouses) > 1) {
1063 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);
1064 } elseif (count($listwarehouses) == 1) {
1065 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);
1067 $langs->load("errors
");
1068 print $langs->trans("ErrorNoWarehouseDefined
");
1072 // Enable hooks to append additional columns
1073 $parameters = array(
1074 'is_information_row' => false, // this is a dispatch form row
1076 'suffix' => $suffix,
1079 $reshook = $hookmanager->executeHooks(
1080 'printFieldListValue',
1086 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
1088 print $hookmanager->resPrint;
1097 dol_print_error($db);
1104 //$checkboxlabel = $langs->trans("CloseReceivedSupplierOrdersAutomatically
", $langs->transnoentitiesnoconv('StatusOrderReceivedAll'));
1106 print '<div class="center
">';
1107 $parameters = array();
1108 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1110 if (empty($reshook)) {
1111 /*if (empty($conf->reception->enabled)) {
1112 print $langs->trans("Comment").' : ';
1113 print '<input type="text
" class="minwidth400
" maxlength="128
" name="comment
" value="';
1114 print GETPOSTISSET("comment") ? GETPOST("comment") : $langs->trans("DispatchSupplierOrder", $object->ref);
1115 // print ' /
'.$object->ref_supplier; // Not yet available
1116 print '" class="flat
"><br>';
1118 print '<input type="checkbox
" checked="checked
" name="closeopenorder
"> '.$checkboxlabel;
1121 $dispatchBt = empty($conf->reception->enabled) ? $langs->trans("Receive
") : $langs->trans("CreateReception
");
1126 print '<input type="submit
" id="submitform
" class="button" name="dispatch
" value="'.$langs->trans("Save").'"';
1128 if (!$usercancreate) {
1131 if (count($listwarehouses) <= 0) {
1143 // Message if nothing to dispatch
1146 if (!getDolGlobalString('SUPPLIER_ORDER_DISABLE_STOCK_DISPATCH_WHEN_TOTAL_REACHED')) {
1147 print '<div class="opacitymedium
">'.$langs->trans("NoPredefinedProductToDispatch
").'</div>'; // No predefined line at all
1149 print '<div class="opacitymedium
">'.$langs->trans("NoMorePredefinedProductToDispatch
").'</div>'; // No predefined line that remain to be dispatched.
1156 print dol_get_fiche_end();
1158 // Popup for mass barcode scanning
1159 if ($action == 'updatebyscaning') {
1160 if ($permissiontoadd) {
1161 // Output the javascript to manage the scanner tool.
1165 var duplicatedbatchcode = [];
1171 function barcodescannerjs(){
1172 console.log("We
catch inputs in scanner box
");
1173 jQuery("#scantoolmessage
").text();
1175 var selectaddorreplace = $("select[
name=selectaddorreplace]
").val();
1176 var barcodemode = $("input[
name=barcodemode]:checked
").val();
1177 var barcodeproductqty = $("input[
name=barcodeproductqty]
").val();
1178 var warehousetouse = $("select[
name=warehousenew]
").val();
1179 var textarea = $("textarea[
name=barcodelist]
").val();
1180 var textarray = textarea.split(/[\s,;]+/);
1181 var tabproduct = [];
1182 duplicatedbatchcode = [];
1188 textarray = textarray.filter(function(value){
1191 if(textarray.some((element) => element != "")){
1192 $(".qtydispatchinput
").each(function(){
1193 id = $(this).attr(\'id\');
1194 idarray = id.split(\'_\');
1195 idproduct = idarray[2];
1196 id = idarray[1] + \'_\' + idarray[2];
1197 console.log("Analyze the line
"+id+" in inventory, barcodemode=
"+barcodemode);
1198 warehouse = $("#entrepot_
"+id).val();
1199 console.log(warehouse);
1200 productbarcode = $("#product_
"+idproduct).attr(\'data-barcode\');
1201 console.log(productbarcode);
1202 productbatchcode = $("#lot_number_
"+id).val();
1203 if(productbatchcode == undefined){
1204 productbatchcode = "";
1206 console.log(productbatchcode);
1208 if (barcodemode != "barcodeforproduct
") {
1209 tabproduct.forEach(product=>{
1210 console.log("product.Batch=
"+product.Batch+" productbatchcode=
"+productbatchcode);
1211 if(product.Batch != "" && product.Batch == productbatchcode){
1212 console.log("duplicate batch code found
for batch code
"+productbatchcode);
1213 duplicatedbatchcode.push(productbatchcode);
1217 productinput = $("#qty_
"+id).val();
1218 if(productinput == ""){
1221 tabproduct.push({\'Id\':id,\'Warehouse\':warehouse,\'Barcode\':productbarcode,\'Batch\':productbatchcode,\'Qty\':productinput,\'fetched\':false});
1223 console.log("Loop on each record entered in the textarea
");
1225 textarray.forEach(function(element,index){
1226 console.log("Process record element=
"+element+" id=
"+id);
1227 var verify_batch = false;
1228 var verify_barcode = false;
1229 switch(barcodemode){
1230 case "barcodeforautodetect
":
1231 verify_barcode = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"barcode
",true);
1232 verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"lotserial
",true);
1234 case "barcodeforproduct
":
1235 verify_barcode = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"barcode
");
1237 case "barcodeforlotserial
":
1238 verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,"lotserial
");
1241 alert(\''.dol_escape_js($langs->trans("ErrorWrongBarcodemode
")).' "\
'+barcodemode+\'"\');
1242 throw \''.dol_escape_js($langs->trans(
'ErrorWrongBarcodemode')).
' "\'+barcodemode+\'"\';
1245 if (verify_batch == false && verify_barcode == false) { /* If the 2 flags are false, not found error */
1246 errortab2.push(element);
1247 } else if (verify_batch == true && verify_barcode == true) { /* If the 2 flags are true, error: we don t know which one to take */
1248 errortab3.push(element);
1249 } else if (verify_batch == true) {
1250 console.log("element="+element);
1251 console.log(duplicatedbatchcode);
1252 if (duplicatedbatchcode.includes(element)) {
1253 errortab1.push(element);
1258 if (Object.keys(errortab1).length < 1 && Object.keys(errortab2).length < 1 && Object.keys(errortab3).length < 1) {
1259 tabproduct.forEach(product => {
1261 if(product.hasOwnProperty("reelqty")){
1262 idprod = $("td[data-idproduct=\'"+product.fk_product+"\']").attr("id");
1263 idproduct = idprod.split("_")[1];
1264 console.log("We create a new line for product_"+idproduct);
1265 if(product.Barcode != null){
1266 modedispatch = "dispatch";
1268 modedispatch = "batch";
1270 addDispatchLine(idproduct,modedispatch);
1271 console.log($("tr[name^=\'"+modedispatch+"_\'][name$=\'_"+idproduct+"\']"));
1272 nbrTrs = $("tr[name^=\'"+modedispatch+"_\'][name$=\'_"+idproduct+"\']").length;
1274 $("#qty_"+(nbrTrs-1)+"_"+idproduct).val(product.Qty);
1275 $("#entrepot_"+(nbrTrs-1)+"_"+idproduct).val(product.Warehouse);
1277 if(modedispatch == "batch"){
1278 $("#lot_number_"+(nbrTrs-1)+"_"+idproduct).val(product.Batch);
1282 console.log("We change #qty_"+product.Id +" to match input in scanner box");
1283 $("#qty_"+product.Id).val(product.Qty);
1287 jQuery("#scantoolmessage").text("'.
dol_escape_js($langs->transnoentities(
"QtyWasAddedToTheScannedBarcode")).
'\n");
1288 /* document.forms["formrecord"].submit(); */
1290 let stringerror = "";
1291 if (Object.keys(errortab1).length > 0) {
1292 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorSameBatchNumber')).
': ";
1293 errortab1.forEach(element => {
1294 stringerror += (element + ", ")
1296 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1298 if (Object.keys(errortab2).length > 0) {
1299 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorCantFindCodeInInventory')).
': ";
1300 errortab2.forEach(element => {
1301 stringerror += (element + ", ")
1303 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1305 if (Object.keys(errortab3).length > 0) {
1306 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorCodeScannedIsBothProductAndSerial')).
': ";
1307 errortab3.forEach(element => {
1308 stringerror += (element + ", ")
1310 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1312 if (Object.keys(errortab4).length > 0) {
1313 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorBarcodeNotFoundForProductWarehouse')).
': ";
1314 errortab4.forEach(element => {
1315 stringerror += (element + ", ")
1317 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
1320 jQuery("#scantoolmessage").html(\''.
dol_escape_js($langs->transnoentities(
"ErrorOnElementsInventory")).
'\' + stringerror);
1328 function barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,warehousetouse,selectaddorreplace,mode,autodetect=
false){
1329 BarcodeIsInProduct=0;
1332 tabproduct.forEach(product => {
1333 $.ajax({ url: \
''.DOL_URL_ROOT.
'/expedition/ajax/searchfrombarcode.php\',
1334 data: { "token":"'.
newToken().
'", "action":"existbarcode","fk_entrepot": warehousetouse, "barcode":element, "mode":mode},
1337 success: function(response) {
1338 if (response.status == "success"){
1339 console.log(response.message);
1341 newproductrow = response.object;
1344 if (mode!="lotserial" && autodetect==false && !errortab4.includes(element)){
1345 errortab4.push(element);
1346 console.error(response.message);
1350 error : function(output) {
1351 console.error("Error on barcodeserialforproduct function");
1354 console.log("Product "+(index+=1)+": "+element);
1355 if(mode == "barcode"){
1356 testonproduct = product.Barcode
1357 }else if (mode == "lotserial"){
1358 testonproduct = product.Batch
1360 testonwarehouse = product.Warehouse;
1361 if(testonproduct == element && testonwarehouse == warehousetouse){
1362 if(selectaddorreplace == "add"){
1363 productqty = parseInt(product.Qty,10);
1364 product.Qty = productqty + parseInt(barcodeproductqty,10);
1365 }else if(selectaddorreplace == "replace"){
1366 if(product.fetched == false){
1367 product.Qty = barcodeproductqty
1368 product.fetched=true
1370 productqty = parseInt(product.Qty,10);
1371 product.Qty = productqty + parseInt(barcodeproductqty,10);
1374 BarcodeIsInProduct+=1;
1377 if(BarcodeIsInProduct==0 && newproductrow!=0){
1378 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});
1381 if(BarcodeIsInProduct > 0){
1389 include DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
1391 print $formother->getHTMLScannerForm(
"barcodescannerjs",
'all', 1);
1395 print
'<script type="text/javascript">
1396 $(document).ready(function () {
1397 $("select[name=fk_default_warehouse]").change(function() {
1398 console.log("warehouse is modified");
1399 var fk_default_warehouse = $("option:selected", this).val();
1400 $("select[name^=entrepot_]").val(fk_default_warehouse).change();
1403 $("#autoreset").click(function() {
1404 console.log("we click on autoreset");
1405 $(".autoresettr").each(function(){
1406 id = $(this).attr("name");
1407 idtab = id.split("_");
1408 console.log("we process line "+id+" "+idtab);
1409 if ($(this).data("remove") == "clear") { /* data-remove=clear means that line qty must be cleared but line must not be removed */
1410 console.log("We clear the object to expected value")
1411 $("#qty_"+idtab[1]+"_"+idtab[2]).val("");
1413 qtyexpected = $("#qty_"+idtab[1]+"_"+idtab[2]).data("expected")
1414 console.log(qtyexpected);
1415 $("#qty_"+idtab[1]+"_"+idtab[2]).val(qtyexpected);
1416 qtydispatched = $("#qty_dispatched_0_"+idtab[2]).data("dispatched")
1417 $("#qty_dispatched_0_"+idtab[2]).val(qtydispatched);
1419 } else { /* data-remove=remove means that line must be removed */
1420 console.log("We remove the object")
1422 $("tr[name^=\'"+idtab[0]+"_\'][name$=\'_"+idtab[2]+"\']:last .splitbutton").show();
1428 $("#resetalltoexpected").click(function(){
1429 $(".qtydispatchinput").each(function(){
1430 console.log("We reset to expected "+$(this).attr("id")+" qty to dispatch");
1431 $(this).val($(this).data("expected"));
1436 $(".resetline").on("click", function(event) {
1437 event.preventDefault();
1438 id = $(this).attr("id");
1439 id = id.split("reset_");
1440 console.log("Reset trigger for id = qty_"+id[1]);
1441 $("#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
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
$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.