27require
'../../main.inc.php';
28include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formcompany.class.php';
29include_once DOL_DOCUMENT_ROOT.
'/product/class/html.formproduct.class.php';
30include_once DOL_DOCUMENT_ROOT.
'/product/class/product.class.php';
31include_once DOL_DOCUMENT_ROOT.
'/product/inventory/class/inventory.class.php';
32include_once DOL_DOCUMENT_ROOT.
'/product/inventory/lib/inventory.lib.php';
33include_once DOL_DOCUMENT_ROOT.
'/product/stock/class/mouvementstock.class.php';
34include_once DOL_DOCUMENT_ROOT.
'/product/stock/class/productlot.class.php';
45$langs->loadLangs(array(
"stocks",
"other",
"productbatch"));
50$action =
GETPOST(
'action',
'aZ09');
51$confirm =
GETPOST(
'confirm',
'alpha');
53$contextpage =
GETPOST(
'contextpage',
'aZ') ?
GETPOST(
'contextpage',
'aZ') :
'inventorycard';
54$backtopage =
GETPOST(
'backtopage',
'alpha');
55$listoffset =
GETPOST(
'listoffset',
'alpha');
56$sortfield =
GETPOST(
'sortfield',
'aZ09comma');
57$sortorder =
GETPOST(
'sortorder',
'aZ09comma');
60if (empty($page) || $page == -1) {
63$offset = $limit * $page;
70$batch =
GETPOST(
'batch',
'alphanohtml');
71$totalExpectedValuation = 0;
72$totalRealValuation = 0;
73$hookmanager->initHooks(array(
'inventorycard'));
77 $result =
restrictedArea($user,
'stock', $id,
'inventory&stock',
'inventory_advance');
83$diroutputmassaction =
$conf->stock->dir_output.
'/temp/massgeneration/'.$user->id;
94$extrafields->fetch_name_optionals_label(
$object->table_element);
96$search_array_options = $extrafields->getOptionalsFromPost(
$object->table_element,
'',
'search_');
99$search_all =
GETPOST(
"search_all",
'alpha');
101foreach (
$object->fields as $key => $val) {
102 if (
GETPOST(
'search_'.$key,
'alpha')) {
103 $search[$key] =
GETPOST(
'search_'.$key,
'alpha');
107if (empty($action) && empty($id) && empty($ref)) {
112include DOL_DOCUMENT_ROOT.
'/core/actions_fetchobject.inc.php';
120$paramwithsearch =
'&sortfield=' . urlencode($sortfield);
121$paramwithsearch .=
'&sortorder=' . urlencode($sortorder);
122if ($limit > 0 && $limit !=
$conf->liste_limit) {
123 $paramwithsearch .=
'&limit='.((int) $limit);
127$sortfield .=
',' . ($sortfield ==
'e.ref' ?
'p.ref' :
'e.ref') .
',id.batch,id.rowid';
128$sortorder .=
',' . $sortorder.
",ASC,ASC";
131 $permissiontoadd = $user->hasRight(
'stock',
'creer');
132 $permissiontodelete = $user->hasRight(
'stock',
'supprimer');
133 $permissiontoupdatestock = $user->hasRight(
'stock',
'mouvement',
'creer');
135 $permissiontoadd = $user->hasRight(
'stock',
'inventory_advance',
'write');
136 $permissiontodelete = $user->hasRight(
'stock',
'inventory_advance',
'write');
137 $permissiontoupdatestock = $user->hasRight(
'stock',
'inventory_advance',
'write');
153$parameters = array();
154$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
159if (empty($reshook)) {
162 if ($action ==
'cancel_record' && $permissiontoupdatestock) {
167 if ($action ==
'update' && $permissiontoupdatestock &&
$object->status == $object::STATUS_VALIDATED) {
171 $cacheOfProducts = array();
175 $sql =
'SELECT id.rowid, id.datec as date_creation, id.tms as date_modification, id.fk_inventory, id.fk_warehouse,';
176 $sql .=
' id.fk_product, id.batch, id.qty_stock, id.qty_view, id.qty_regulated, id.pmp_real';
177 $sql .=
' FROM '.MAIN_DB_PREFIX.
'inventorydet as id';
178 $sql .=
' WHERE id.fk_inventory = '.((int)
$object->id);
179 $sql .=
' ORDER BY id.rowid';
181 $resql = $db->query($sql);
183 $num = $db->num_rows($resql);
189 $line = $db->fetch_object($resql);
191 $qty_stock = $line->qty_stock;
192 $qty_view = $line->qty_view;
196 if (isset($cacheOfProducts[$line->fk_product])) {
197 $product_static = $cacheOfProducts[$line->fk_product];
199 $product_static =
new Product($db);
200 $result = $product_static->fetch($line->fk_product,
'',
'',
'', 1, 1, 1);
203 $option .=
',novirtual';
204 $product_static->load_stock($option);
206 $cacheOfProducts[$product_static->id] = $product_static;
210 $realqtynow = $product_static->stock_warehouse[$line->fk_warehouse]->real;
211 if (isModEnabled(
'productbatch') && $product_static->hasbatch()) {
212 $realqtynow = $product_static->stock_warehouse[$line->fk_warehouse]->detail_batch[$line->batch]->qty;
215 if (!is_null($qty_view)) {
216 $stock_movement_qty =
price2num($qty_view - $realqtynow,
'MS');
219 if ($stock_movement_qty != 0) {
220 if ($stock_movement_qty < 0) {
228 $inventorycode =
'INV-'.$object->ref;
231 $price = $line->pmp_real;
234 $idstockmove = $stockmovment->_create($user, $line->fk_product, $line->fk_warehouse, (
float) $stock_movement_qty, $movement_type, $price, $langs->trans(
'LabelOfInventoryMovemement',
$object->ref), $inventorycode, $datemovement,
'',
'', $line->batch);
235 if ($idstockmove < 0) {
242 $sqlupdate =
"UPDATE ".MAIN_DB_PREFIX.
"inventorydet";
243 $sqlupdate .=
" SET fk_movement = ".((int) $idstockmove);
244 if ($qty_stock != $realqtynow) {
245 $sqlupdate .=
", qty_stock = ".((float) $realqtynow);
247 $sqlupdate .=
" WHERE rowid = ".((int) $line->rowid);
248 $resqlupdate = $db->query($sqlupdate);
249 if (! $resqlupdate) {
257 $sqlpmp =
'UPDATE '.MAIN_DB_PREFIX.
'product SET pmp = '.((float) $line->pmp_real).
' WHERE rowid = '.((int) $line->fk_product);
258 $resqlpmp = $db->query($sqlpmp);
265 $sqlpmp =
'UPDATE '.MAIN_DB_PREFIX.
'product_perentity SET pmp = '.((float) $line->pmp_real).
' WHERE fk_product = '.((int) $line->fk_product).
' AND entity='.
$conf->entity;
266 $resqlpmp = $db->query($sqlpmp);
295 if ($action ==
'updateinventorylines' && $permissiontoupdatestock) {
296 $sql =
'SELECT id.rowid, id.datec as date_creation, id.tms as date_modification, id.fk_inventory, id.fk_warehouse,';
297 $sql .=
' id.fk_product, id.batch, id.qty_stock, id.qty_view, id.qty_regulated';
298 $sql .=
' FROM '.MAIN_DB_PREFIX.
'inventorydet as id';
299 $sql .=
' LEFT JOIN ' . $db->prefix() .
'product as p ON id.fk_product = p.rowid';
300 $sql .=
' LEFT JOIN ' . $db->prefix() .
'entrepot as e ON id.fk_warehouse = e.rowid';
301 $sql .=
' WHERE id.fk_inventory = '.((int)
$object->id);
302 $sql .= $db->order($sortfield, $sortorder);
303 $sql .= $db->plimit($limit, $offset);
307 $resql = $db->query($sql);
309 $num = $db->num_rows($resql);
315 $line = $db->fetch_object($resql);
316 $lineid = $line->rowid;
321 if (
GETPOST(
"id_".$lineid,
'alpha') !=
'') {
323 $result = $inventoryline->fetch($lineid);
324 if ($qtytoupdate < 0) {
326 setEventMessages($langs->trans(
"FieldCannotBeNegative", $langs->transnoentitiesnoconv(
"RealQty")),
null,
'errors');
329 $inventoryline->qty_stock = (float)
price2num(
GETPOST(
'stock_qty_'.$lineid,
'alpha'),
'MS');
330 $inventoryline->qty_view = $qtytoupdate;
331 $inventoryline->pmp_real =
price2num(
GETPOST(
'realpmp_'.$lineid,
'alpha'),
'MS');
332 $inventoryline->pmp_expected =
price2num(
GETPOST(
'expectedpmp_'.$lineid,
'alpha'),
'MS');
333 $resultupdate = $inventoryline->update($user);
335 } elseif (GETPOSTISSET(
'id_' . $lineid)) {
337 $result = $inventoryline->fetch($lineid);
339 $inventoryline->qty_view =
null;
340 $inventoryline->pmp_real =
price2num(
GETPOST(
'realpmp_'.$lineid,
'alpha'),
'MS');
341 $inventoryline->pmp_expected =
price2num(
GETPOST(
'expectedpmp_'.$lineid,
'alpha'),
'MS');
342 $resultupdate = $inventoryline->update($user);
346 if ($result < 0 || $resultupdate < 0) {
356 $sqlupdate =
"UPDATE ".MAIN_DB_PREFIX.
"inventory";
357 $sqlupdate .=
" SET fk_user_modif = ".((int) $user->id);
358 $sqlupdate .=
" WHERE rowid = ".((int)
$object->id);
359 $resqlupdate = $db->query($sqlupdate);
360 if (! $resqlupdate) {
373 $backurlforlist = DOL_URL_ROOT.
'/product/inventory/list.php';
374 $backtopage = DOL_URL_ROOT.
'/product/inventory/inventory.php?id='.
$object->id.
'&page='.$page.$paramwithsearch;
377 include DOL_DOCUMENT_ROOT.
'/core/actions_addupdatedelete.inc.php';
380 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
383 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
391 if (
GETPOST(
'addline',
'alpha')) {
393 if ($fk_warehouse <= 0) {
395 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Warehouse")),
null,
'errors');
397 if ($fk_product <= 0) {
399 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentitiesnoconv(
"Product")),
null,
'errors');
403 setEventMessages($langs->trans(
"FieldCannotBeNegative", $langs->transnoentitiesnoconv(
"RealQty")),
null,
'errors');
405 if (!$error && isModEnabled(
'productbatch')) {
406 $tmpproduct =
new Product($db);
407 $result = $tmpproduct->fetch($fk_product);
409 if (empty($error) && $tmpproduct->status_batch > 0 && empty($batch)) {
411 $langs->load(
"errors");
412 setEventMessages($langs->trans(
"ErrorProductNeedBatchNumber", $tmpproduct->ref),
null,
'errors');
414 if (empty($error) && $tmpproduct->status_batch == 2 && !empty($batch) && $qty > 1) {
416 $langs->load(
"errors");
417 setEventMessages($langs->trans(
"TooManyQtyForSerialNumber", $tmpproduct->ref, $batch),
null,
'errors');
419 if (empty($error) && empty($tmpproduct->status_batch) && !empty($batch)) {
421 $langs->load(
"errors");
422 setEventMessages($langs->trans(
"ErrorProductDoesNotNeedBatchNumber", $tmpproduct->ref),
null,
'errors');
427 $tmp->fk_inventory =
$object->id;
428 $tmp->fk_warehouse = $fk_warehouse;
429 $tmp->fk_product = $fk_product;
430 $tmp->batch = $batch;
432 $tmp->qty_view = $qty;
434 $result = $tmp->create($user);
436 if ($db->lasterrno() ==
'DB_ERROR_RECORD_ALREADY_EXISTS') {
437 $langs->load(
"errors");
438 setEventMessages($langs->trans(
"ErrorRecordAlreadyExists"),
null,
'errors');
444 $_POST[
'batch'] =
'';
445 $_POST[
'qtytoadd'] =
'';
457$form =
new Form($db);
462llxHeader(
'', $langs->trans(
'Inventory'), $help_url,
'', 0, 0,
'',
'',
'',
'mod-product page-inventory_inventory');
471if ($limit > 0 && $limit !=
$conf->liste_limit) {
472 $param .=
'&limit=' . ((int) $limit);
476$res =
$object->fetch_optionals();
484if ($action ==
'delete') {
485 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'DeleteInventory'), $langs->trans(
'ConfirmDeleteOrder'),
'confirm_delete',
'', 0, 1);
488if ($action ==
'deleteline') {
489 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&lineid='.$lineid.
'&page='.$page.$paramwithsearch, $langs->trans(
'DeleteLine'), $langs->trans(
'ConfirmDeleteLine'),
'confirm_deleteline',
'', 0, 1);
493if ($action ==
'clone') {
495 $formquestion = array();
496 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ToClone'), $langs->trans(
'ConfirmCloneMyObject',
$object->ref),
'confirm_clone', $formquestion,
'yes', 1);
500if ($action ==
'record') {
501 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&page='.$page.$paramwithsearch, $langs->trans(
'Close'), $langs->trans(
'ConfirmFinish'),
'update',
'', 0, 1);
506if ($action ==
'confirm_cancel') {
507 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'Cancel'), $langs->trans(
'ConfirmCancel'),
'cancel_record',
'', 0, 1);
511if ($action ==
'validate') {
512 $form =
new Form($db);
515 $formquestion = array(
516 array(
'type' =>
'checkbox',
'name' =>
'include_sub_warehouse',
'label' => $langs->trans(
"IncludeSubWarehouse"),
'value' => 1,
'size' =>
'10'),
518 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateInventory'), $langs->trans(
'IncludeSubWarehouseExplanation'),
'confirm_validate', $formquestion,
'', 1);
523$parameters = array(
'formConfirm' => $formconfirm,
'lineid' => $lineid);
524$reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
525if (empty($reshook)) {
526 $formconfirm .= $hookmanager->resPrint;
527} elseif ($reshook > 0) {
528 $formconfirm = $hookmanager->resPrint;
537$linkback =
'<a href="'.DOL_URL_ROOT.
'/product/inventory/list.php">'.$langs->trans(
"BackToList").
'</a>';
539$morehtmlref =
'<div class="refidno">';
579$morehtmlref .=
'</div>';
582dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
585print
'<div class="fichecenter">';
586print
'<div class="fichehalfleft">';
587print
'<div class="underbanner clearboth"></div>';
588print
'<table class="border centpercent tableforfield">'.
"\n";
591include DOL_DOCUMENT_ROOT.
'/core/tpl/commonfields_view.tpl.php';
594include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
602print
'<div class="clearboth"></div>';
606print
'<form id="formrecord" name="formrecord" method="POST" action="'.$_SERVER[
"PHP_SELF"].
'?page='.$page.
'&id='.
$object->id.
'">';
607print
'<input type="hidden" name="token" value="'.newToken().
'">';
608print
'<input type="hidden" name="action" value="updateinventorylines">';
609print
'<input type="hidden" name="id" value="'.$object->id.
'">';
610print
'<input type="hidden" name="sortfield" value="' . $sortfield .
'">';
611print
'<input type="hidden" name="sortorder" value="' . $sortorder .
'">';
613 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
618if ($action !=
'record') {
619 print
'<div class="tabsAction">'.
"\n";
620 $parameters = array();
621 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
626 if (empty($reshook)) {
627 if (
$object->status == Inventory::STATUS_DRAFT) {
628 if ($permissiontoupdatestock) {
630 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=validate&token='.
newToken().
'">'.$langs->trans(
"Validate").
' ('.$langs->trans(
"Start").
')</a>';
632 print
'<a class="butAction" href="'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&action=confirm_validate&confirm=yes&token='.
newToken().
'">'.$langs->trans(
"Validate").
' ('.$langs->trans(
"Start").
')</a>';
635 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'">'.$langs->trans(
'Validate').
' ('.$langs->trans(
"Start").
')</a>'.
"\n";
640 if (
$object->status == $object::STATUS_VALIDATED) {
641 if ($permissiontoupdatestock) {
642 print
'<a class="butAction classfortooltip" id="idbuttonmakemovementandclose" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=record&page='.$page.$paramwithsearch.
'&token='.
newToken().
'" title="'.
dol_escape_htmltag($langs->trans(
"MakeMovementsAndClose")).
'">'.$langs->trans(
"MakeMovementsAndClose").
'</a>'.
"\n";
644 print
'<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'">'.$langs->trans(
'MakeMovementsAndClose').
'</a>'.
"\n";
647 if ($permissiontoupdatestock) {
648 print
'<a class="butActionDelete" href="'.$_SERVER[
"PHP_SELF"].
'?id='.
$object->id.
'&action=confirm_cancel&page='.$page.$paramwithsearch.
'&token='.
newToken().
'">'.$langs->trans(
"Cancel").
'</a>'.
"\n";
654 if (
$object->status != Inventory::STATUS_DRAFT &&
$object->status != Inventory::STATUS_VALIDATED) {
661if (
$object->status == Inventory::STATUS_VALIDATED) {
663 if (!empty(
$conf->use_javascript_ajax)) {
664 if ($permissiontoupdatestock) {
666 if (isModEnabled(
'barcode') || isModEnabled(
'productbatch')) {
667 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>';
671 print
'<a id="fillwithexpected" class="marginrightonly paddingright marginleftonly paddingleft" href="#">'.img_picto(
'',
'autofill',
'class="paddingrightonly"').$langs->trans(
'AutofillWithExpected').
'</a>';
673 print
'$( document ).ready(function() {';
674 print
' $("#fillwithexpected").on("click",function fillWithExpected(){
675 $(".expectedqty").each(function(){
676 var object = $(this)[0];
677 var objecttofill = $("#"+object.id+"_input")[0];
678 objecttofill.value = object.innerText;
679 jQuery(".realqty").trigger("change");
681 console.log("Values filled (after click on fillwithexpected)");
682 /* disablebuttonmakemovementandclose(); */
689 print
'<a href="#" id="clearqty" class="marginrightonly paddingright marginleftonly paddingleft">'.img_picto(
'',
'eraser',
'class="paddingrightonly"').$langs->trans(
"ClearQtys").
'</a>';
691 print
'<a class="classfortooltip marginrightonly paddingright marginleftonly paddingleft" href="#" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'">'.$langs->trans(
"Save").
'</a>'.
"\n";
701if ($action ==
'updatebyscaning') {
702 if ($permissiontoupdatestock) {
707 var duplicatedbatchcode = [];
713 function barcodescannerjs(){
714 console.log("We catch inputs in scanner box");
715 jQuery("#scantoolmessage").text();
717 var selectaddorreplace = $("select[name=selectaddorreplace]").val();
718 var barcodemode = $("input[name=barcodemode]:checked").val();
719 var barcodeproductqty = $("input[name=barcodeproductqty]").val();
720 var textarea = $("textarea[name=barcodelist]").val();
721 var textarray = textarea.split(/[\s,;]+/);
723 duplicatedbatchcode = [];
729 textarray = textarray.filter(function(value){
732 if(textarray.some((element) => element != "")){
733 $(".expectedqty").each(function(){
735 console.log("Analyze the line "+id+" in inventory, barcodemode="+barcodemode);
736 warehouse = $("#"+id+"_warehouse").attr(\'data-ref\');
737 //console.log(warehouse);
738 productbarcode = $("#"+id+"_product").attr(\'data-barcode\');
739 //console.log(productbarcode);
740 productbatchcode = $("#"+id+"_batch").attr(\'data-batch\');
741 //console.log(productbatchcode);
743 if (barcodemode != "barcodeforproduct") {
744 tabproduct.forEach(product=>{
745 console.log("product.Batch="+product.Batch+" productbatchcode="+productbatchcode);
746 if(product.Batch != "" && product.Batch == productbatchcode){
747 console.log("duplicate batch code found for batch code "+productbatchcode);
748 duplicatedbatchcode.push(productbatchcode);
752 productinput = $("#"+id+"_input").val();
753 if(productinput == ""){
756 tabproduct.push({\'Id\':id,\'Warehouse\':warehouse,\'Barcode\':productbarcode,\'Batch\':productbatchcode,\'Qty\':productinput,\'fetched\':false});
759 console.log("Loop on each record entered in the textarea");
760 textarray.forEach(function(element,index){
761 console.log("Process record element="+element+" id="+id);
762 var verify_batch = false;
763 var verify_barcode = false;
765 case "barcodeforautodetect":
766 verify_barcode = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"barcode",true);
767 verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"lotserial",true);
769 case "barcodeforproduct":
770 verify_barcode = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"barcode");
772 case "barcodeforlotserial":
773 verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"lotserial");
776 alert(\''.dol_escape_js($langs->trans(
"ErrorWrongBarcodemode")).
' "\'+barcodemode+\'"\');
777 throw \''.
dol_escape_js($langs->trans(
'ErrorWrongBarcodemode')).
' "\'+barcodemode+\'"\';
780 if (verify_batch == false && verify_barcode == false) { /* If the 2 flags are false, not found error */
781 errortab2.push(element);
782 } else if (verify_batch == true && verify_barcode == true) { /* If the 2 flags are true, error: we don t know which one to take */
783 errortab3.push(element);
784 } else if (verify_batch == true) {
785 console.log("element="+element);
786 console.log(duplicatedbatchcode);
787 if (duplicatedbatchcode.includes(element)) {
788 errortab1.push(element);
793 if (Object.keys(errortab1).length < 1 && Object.keys(errortab2).length < 1 && Object.keys(errortab3).length < 1) {
794 tabproduct.forEach(product => {
796 console.log("We change #"+product.Id+"_input to match input in scanner box");
797 if(product.hasOwnProperty("reelqty")){
798 $.ajax({ url: \''.DOL_URL_ROOT.
'/product/inventory/ajax/searchfrombarcode.php\',
799 data: { "token":"'.
newToken().
'", "action":"addnewlineproduct", "fk_entrepot":product.Warehouse, "batch":product.Batch, "fk_inventory":'.
dol_escape_js((
string)
$object->id).
', "fk_product":product.fk_product, "reelqty":product.reelqty},
802 success: function(response) {
803 response = JSON.parse(response);
804 if(response.status == "success"){
805 console.log(response.message);
806 $("<input type=\'text\' value=\'"+product.Qty+"\' />")
807 .attr("id", "id_"+response.id_line+"_input")
808 .attr("name", "id_"+response.id_line)
809 .appendTo("#formrecord");
811 console.error(response.message);
814 error : function(output) {
815 console.error("Error on line creation function");
819 $("#"+product.Id+"_input").val(product.Qty);
823 jQuery("#scantoolmessage").text("'.
dol_escape_js($langs->transnoentities(
"QtyWasAddedToTheScannedBarcode")).
'\n");
824 /* document.forms["formrecord"].submit(); */
826 let stringerror = "";
827 if (Object.keys(errortab1).length > 0) {
828 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorSameBatchNumber')).
': ";
829 errortab1.forEach(element => {
830 stringerror += (element + ", ")
832 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
834 if (Object.keys(errortab2).length > 0) {
835 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorCantFindCodeInInventory')).
': ";
836 errortab2.forEach(element => {
837 stringerror += (element + ", ")
839 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
841 if (Object.keys(errortab3).length > 0) {
842 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorCodeScannedIsBothProductAndSerial')).
': ";
843 errortab3.forEach(element => {
844 stringerror += (element + ", ")
846 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
848 if (Object.keys(errortab4).length > 0) {
849 stringerror += "<br>'.
dol_escape_js($langs->transnoentities(
'ErrorBarcodeNotFoundForProductWarehouse')).
': ";
850 errortab4.forEach(element => {
851 stringerror += (element + ", ")
853 stringerror = stringerror.slice(0, -2); /* Remove last ", " */
856 jQuery("#scantoolmessage").html(\''.
dol_escape_js($langs->transnoentities(
"ErrorOnElementsInventory")).
'\' + stringerror);
864 function barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,mode,autodetect=
false){
865 BarcodeIsInProduct=0;
868 tabproduct.forEach(product => {
869 $.ajax({ url: \
''.DOL_URL_ROOT.
'/product/inventory/ajax/searchfrombarcode.php\',
870 data: { "token":"'.
newToken().
'", "action":"existbarcode", '.(!empty(
$object->fk_warehouse) ?
'"fk_entrepot":'.$object->fk_warehouse.
', ' :
'').(!empty(
$object->fk_product) ?
'"fk_product":'.$object->fk_product.
', ' :
'').
'"barcode":element, "product":product, "mode":mode},
873 success: function(response) {
874 response = JSON.parse(response);
875 if (response.status == "success"){
876 console.log(response.message);
878 newproductrow = response.object;
881 if (mode!="lotserial" && autodetect==false && !errortab4.includes(element)){
882 errortab4.push(element);
883 console.error(response.message);
887 error : function(output) {
888 console.error("Error on barcodeserialforproduct function");
891 console.log("Product "+(index+=1)+": "+element);
892 if(mode == "barcode"){
893 testonproduct = product.Barcode
894 }else if (mode == "lotserial"){
895 testonproduct = product.Batch
897 if(testonproduct == element){
898 if(selectaddorreplace == "add"){
899 productqty = parseInt(product.Qty,10);
900 product.Qty = productqty + parseInt(barcodeproductqty,10);
901 }else if(selectaddorreplace == "replace"){
902 if(product.fetched == false){
903 product.Qty = barcodeproductqty
906 productqty = parseInt(product.Qty,10);
907 product.Qty = productqty + parseInt(barcodeproductqty,10);
910 BarcodeIsInProduct+=1;
913 if(BarcodeIsInProduct==0 && newproductrow!=0){
914 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});
917 if(BarcodeIsInProduct > 0){
925 include DOL_DOCUMENT_ROOT.
'/core/class/html.formother.class.php';
927 print $formother->getHTMLScannerForm(
"barcodescannerjs",
'all');
932print
'jQuery(document).ready(function() {
933 $("#clearqty").on("click", function() {
934 console.log("Clear all values");
935 /* disablebuttonmakemovementandclose(); */
936 jQuery(".realqty").val("");
937 jQuery(".realqty").trigger("change");
938 return false; /* disable submit */
940 $(".undochangesqty").on("click", function undochangesqty() {
941 console.log("Clear value of inventory line");
943 id = id.split("_")[1];
944 tmpvalue = $("#id_"+id+"_input_tmp").val()
945 $("#id_"+id+"_input")[0].value = tmpvalue;
946 /* disablebuttonmakemovementandclose(); */
947 return false; /* disable submit */
952print
'<div class="fichecenter">';
954print
'<div class="clearboth"></div>';
958print
'<div class="div-table-responsive-no-min">';
959print
'<table id="tablelines" class="noborder noshadow centpercent">';
961print
'<tr class="liste_titre">';
962print
getTitleFieldOfList($langs->trans(
"Warehouse"), 0, $_SERVER[
'PHP_SELF'],
'e.ref',
'',
'id=' .
$object->id .
'&page=' . $page . $param,
'', $sortfield, $sortorder,
'', 0,
'') .
"\n";
963print
getTitleFieldOfList($langs->trans(
"Product"), 0, $_SERVER[
'PHP_SELF'],
'p.ref',
'',
'id=' .
$object->id .
'&page=' . $page . $param,
'', $sortfield, $sortorder,
'', 0,
'') .
"\n";
964if (isModEnabled(
'productbatch')) {
966 print $langs->trans(
"Batch");
969if (
$object->status == $object::STATUS_DRAFT ||
$object->status == $object::STATUS_VALIDATED) {
971 print
'<td class="right">'.$form->textwithpicto($langs->trans(
"ExpectedQty"), $langs->trans(
"QtyCurrentlyKnownInStock")).
'</td>';
974 print
'<td class="right">'.$form->textwithpicto($langs->trans(
"ExpectedQty"), $langs->trans(
"QtyInStockWhenInventoryWasValidated")).
'</td>';
977 print
'<td class="right">'.$langs->trans(
'PMPExpected').
'</td>';
978 print
'<td class="right">'.$langs->trans(
'ExpectedValuation').
'</td>';
979 print
'<td class="right">'.$form->textwithpicto($langs->trans(
"RealQty"), $langs->trans(
"InventoryRealQtyHelp")).
'</td>';
980 print
'<td class="right">'.$langs->trans(
'PMPReal').
'</td>';
981 print
'<td class="right">'.$langs->trans(
'RealValuation').
'</td>';
983 print
'<td class="right">';
984 print $form->textwithpicto($langs->trans(
"RealQty"), $langs->trans(
"InventoryRealQtyHelp"));
987if (
$object->status == $object::STATUS_DRAFT ||
$object->status == $object::STATUS_VALIDATED) {
989 print
'<td class="center">';
993 print
'<td class="right">';
1000if (
$object->status == $object::STATUS_DRAFT ||
$object->status == $object::STATUS_VALIDATED) {
1003 print $formproduct->selectWarehouses((GETPOSTISSET(
'fk_warehouse') ?
GETPOSTINT(
'fk_warehouse') :
$object->fk_warehouse),
'fk_warehouse',
'warehouseopen', 1, 0, 0,
'', 0, 0, array(),
'maxwidth300');
1011 print $form->select_produits((GETPOSTISSET(
'fk_product') ?
GETPOSTINT(
'fk_product') :
$object->fk_product),
'fk_product', $filtertype, 0, 0, -1, 2,
'', 0, array(), 0,
'1', 0,
'maxwidth300');
1013 if (isModEnabled(
'productbatch')) {
1015 print
'<input type="text" name="batch" class="maxwidth100" value="'.(GETPOSTISSET(
'batch') ?
GETPOST(
'batch') :
'').
'">';
1018 print
'<td class="right"></td>';
1020 print
'<td class="right">';
1022 print
'<td class="right">';
1024 print
'<td class="right">';
1025 print
'<input type="text" name="qtytoadd" class="maxwidth75" value="">';
1027 print
'<td class="right">';
1029 print
'<td class="right">';
1032 print
'<td class="right">';
1033 print
'<input type="text" name="qtytoadd" class="maxwidth75" value="">';
1037 print
'<td class="center">';
1038 if ($permissiontoupdatestock) {
1039 print
'<input type="submit" class="button paddingright" name="addline" value="'.$langs->trans(
"Add").
'">';
1041 print
'<input type="submit" class="button paddingright" disabled="disabled" title="'.dol_escape_htmltag($langs->trans(
"NotEnoughPermissions")).
'" name="addline" value="'.$langs->trans(
"Add").
'">';
1048$sql =
'SELECT id.rowid, id.datec as date_creation, id.tms as date_modification, id.fk_inventory, id.fk_warehouse,';
1049$sql .=
' id.fk_product, id.batch, id.qty_stock, id.qty_view, id.qty_regulated, id.fk_movement, id.pmp_real, id.pmp_expected';
1050$sql .=
' FROM ' . $db->prefix() .
'inventorydet as id';
1051$sql .=
' LEFT JOIN ' . $db->prefix() .
'product as p ON id.fk_product = p.rowid';
1052$sql .=
' LEFT JOIN ' . $db->prefix() .
'entrepot as e ON id.fk_warehouse = e.rowid';
1053$sql .=
' WHERE id.fk_inventory = ' . ((int)
$object->id);
1054$sql .= $db->order($sortfield, $sortorder);
1055$sql .= $db->plimit($limit, $offset);
1057$cacheOfProducts = array();
1058$cacheOfWarehouses = array();
1061$resql = $db->query($sql);
1063 $num = $db->num_rows($resql);
1065 if (!empty($limit != 0) || $num > $limit || $page) {
1066 print_fleche_navigation($page, $_SERVER[
"PHP_SELF"],
'&id='.
$object->id.$paramwithsearch, ($num >= $limit ? 1 : 0),
'<li class="pagination"><span>' . $langs->trans(
"Page") .
' ' . ($page + 1) .
'</span></li>',
'', $limit);
1073 $obj = $db->fetch_object($resql);
1075 if (isset($cacheOfWarehouses[$obj->fk_warehouse])) {
1076 $warehouse_static = $cacheOfWarehouses[$obj->fk_warehouse];
1078 $warehouse_static =
new Entrepot($db);
1079 $warehouse_static->fetch($obj->fk_warehouse);
1081 $cacheOfWarehouses[$warehouse_static->id] = $warehouse_static;
1086 if (isset($cacheOfProducts[$obj->fk_product])) {
1087 $product_static = $cacheOfProducts[$obj->fk_product];
1089 $product_static =
new Product($db);
1090 $result = $product_static->fetch($obj->fk_product,
'',
'',
'', 1, 1, 1);
1093 $option .=
',novirtual';
1094 $product_static->load_stock($option);
1096 $cacheOfProducts[$product_static->id] = $product_static;
1099 print
'<tr class="oddeven">';
1100 print
'<td id="id_'.$obj->rowid.
'_warehouse" data-ref="'.
dol_escape_htmltag($warehouse_static->ref).
'">';
1101 print $warehouse_static->getNomUrl(1);
1104 print $product_static->getNomUrl(1).
' - '.$product_static->label;
1107 if (isModEnabled(
'productbatch')) {
1108 print
'<td id="id_'.$obj->rowid.
'_batch" data-batch="'.
dol_escape_htmltag($obj->batch).
'">';
1111 $res = $batch_static->fetch(0, $product_static->id, $obj->batch);
1113 print $batch_static->getNomUrl(1);
1122 print
'<td class="right expectedqty" id="id_'.$obj->rowid.
'" title="Stock viewed at last update: '.$obj->qty_stock.
'">';
1123 $valuetoshow = $obj->qty_stock;
1125 if (
$object->status == $object::STATUS_DRAFT ||
$object->status == $object::STATUS_VALIDATED) {
1126 if (isModEnabled(
'productbatch') && $product_static->hasbatch()) {
1127 $valuetoshow = $product_static->stock_warehouse[$obj->fk_warehouse]->detail_batch[$obj->batch]->qty ?? 0;
1129 $valuetoshow = !empty($product_static->stock_warehouse[$obj->fk_warehouse]->real) ? $product_static->stock_warehouse[$obj->fk_warehouse]->real : 0;
1133 print
'<input type="hidden" name="stock_qty_'.$obj->rowid.
'" value="'.$valuetoshow.
'">';
1137 if (
$object->status == $object::STATUS_DRAFT ||
$object->status == $object::STATUS_VALIDATED) {
1141 if ($qty_view !=
'') {
1147 if (!empty($obj->pmp_expected)) {
1148 $pmp_expected = $obj->pmp_expected;
1150 $pmp_expected = $product_static->pmp;
1152 $pmp_valuation = $pmp_expected * $valuetoshow;
1153 print
'<td class="right">';
1154 print is_null($pmp_expected) ?
'' :
price($pmp_expected);
1155 print
'<input type="hidden" name="expectedpmp_'.$obj->rowid.
'" value="'.$pmp_expected.
'"/>';
1157 print
'<td class="right">';
1158 print
price($pmp_valuation);
1161 print
'<td class="right">';
1162 print
'<a id="undochangesqty_'.$obj->rowid.
'" href="#" class="undochangesqty reposition marginrightonly" title="'.
dol_escape_htmltag($langs->trans(
"Clear")).
'">';
1163 print
img_picto(
'',
'eraser',
'class="opacitymedium"');
1165 print
'<input type="text" class="maxwidth50 right realqty" name="id_'.$obj->rowid.
'" id="id_'.$obj->rowid.
'_input" value="'.$qty_view.
'">';
1169 print
'<td class="right">';
1170 if (!empty($obj->pmp_real) || (
string) $obj->pmp_real ===
'0') {
1171 $pmp_real = $obj->pmp_real;
1173 $pmp_real = $product_static->pmp;
1175 $pmp_valuation_real = $pmp_real * $qty_view;
1176 print
'<input type="text" class="maxwidth75 right realpmp'.$obj->fk_product.
'" name="realpmp_'.$obj->rowid.
'" id="id_'.$obj->rowid.
'_input_pmp" value="'.(is_null($pmp_real) ?
'' :
price2num($pmp_real)).
'">';
1178 print
'<td class="right">';
1179 print
'<input type="text" class="maxwidth75 right realvaluation'.$obj->fk_product.
'" name="realvaluation_'.$obj->rowid.
'" id="id_'.$obj->rowid.
'_input_real_valuation" value="'.$pmp_valuation_real.
'">';
1182 $totalExpectedValuation += $pmp_valuation;
1183 $totalRealValuation += $pmp_valuation_real;
1185 print
'<td class="right">';
1186 print
'<a id="undochangesqty_'.$obj->rowid.
'" href="#" class="undochangesqty reposition marginrightonly" title="'.
dol_escape_htmltag($langs->trans(
"Clear")).
'">';
1187 print
img_picto(
'',
'eraser',
'class="opacitymedium"');
1189 print
'<input type="text" class="maxwidth50 right realqty" name="id_'.$obj->rowid.
'" id="id_'.$obj->rowid.
'_input" value="'.$qty_view.
'">';
1194 print
'<td class="right">';
1195 if ($permissiontoupdatestock) {
1196 print
'<a class="reposition" href="'.DOL_URL_ROOT.
'/product/inventory/inventory.php?id='.
$object->id.
'&lineid='.$obj->rowid.
'&action=deleteline&page='.$page.$paramwithsearch.
'&token='.
newToken().
'">'.
img_delete().
'</a>';
1198 $qty_tmp =
price2num(
GETPOST(
"id_".$obj->rowid.
"_input_tmp"),
'MS') >= 0 ?
GETPOST(
"id_".$obj->rowid.
"_input_tmp") : $qty_view;
1199 print
'<input type="hidden" class="maxwidth50 right realqty" name="id_'.$obj->rowid.
'_input_tmp" id="id_'.$obj->rowid.
'_input_tmp" value="'.$qty_tmp.
'">';
1204 if (!empty($obj->pmp_expected)) {
1205 $pmp_expected = $obj->pmp_expected;
1207 $pmp_expected = $product_static->pmp;
1209 $pmp_valuation = $pmp_expected * $valuetoshow;
1210 print
'<td class="right">';
1211 print is_null($pmp_expected) ?
'' :
price($pmp_expected);
1213 print
'<td class="right">';
1214 print
price($pmp_valuation);
1217 print
'<td class="right nowraponall">';
1218 print $obj->qty_view;
1222 print
'<td class="right">';
1223 if (!empty($obj->pmp_real)) {
1224 $pmp_real = $obj->pmp_real;
1226 $pmp_real = $product_static->pmp;
1228 $pmp_valuation_real = $pmp_real * $obj->qty_view;
1229 print is_null($pmp_real) ?
'' :
price($pmp_real);
1231 print
'<td class="right">';
1232 print
price($pmp_valuation_real);
1234 print
'<td class="nowraponall right">';
1236 $totalExpectedValuation += $pmp_valuation;
1237 $totalRealValuation += $pmp_valuation_real;
1239 print
'<td class="right nowraponall">';
1240 print $obj->qty_view;
1244 if ($obj->fk_movement > 0) {
1246 $stockmovment->fetch($obj->fk_movement);
1247 print $stockmovment->getNomUrl(1,
'movements');
1259 print
'<tr class="liste_total">';
1260 print
'<td colspan="4">'.$langs->trans(
"Total").
'</td>';
1261 print
'<td class="right" colspan="2">'.price($totalExpectedValuation).
'</td>';
1262 print
'<td class="right" id="totalRealValuation" colspan="3">'.price($totalRealValuation).
'</td>';
1270if (
$object->status == $object::STATUS_VALIDATED) {
1271 print
'<center><input id="submitrecord" type="submit" class="button button-save" name="save" value="'.$langs->trans(
"Save").
'"></center>';
1291print
'<script type="text/javascript">
1292 $(document).ready(function() {
1294 $(".paginationnext:last").click(function(e){
1295 var form = $("#formrecord");
1296 var actionURL = "'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&page='.($page).$paramwithsearch.
'";
1299 data: form.serialize(),
1301 success: function(result){
1302 window.location.href = "'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&page='.($page + 1).$paramwithsearch.
'";
1308 $(".paginationprevious:last").click(function(e){
1309 var form = $("#formrecord");
1310 var actionURL = "'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&page='.($page).$paramwithsearch.
'";
1313 data: form.serialize(),
1315 success: function(result){
1316 window.location.href = "'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&page='.($page - 1).$paramwithsearch.
'";
1321 $("#idbuttonmakemovementandclose").click(function(e){
1322 var form = $("#formrecord");
1323 var actionURL = "'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&page='.($page).$paramwithsearch.
'";
1327 data: form.serialize(),
1329 success: function(result){
1330 window.location.href = "'.$_SERVER[
'PHP_SELF'].
'?id='.
$object->id.
'&page='.($page).$paramwithsearch.
'&action=record";
1340<script
type=
"text/javascript">
1341$(
'.realqty').on(
'change',
function () {
1342 let realqty = $(
this).closest(
'tr').find(
'.realqty').val();
1343 let inputPmp = $(
this).closest(
'tr').find(
'input[class*=realpmp]');
1344 let realpmp = $(inputPmp).val();
1345 if (!isNaN(realqty) && !isNaN(realpmp)) {
1346 let realval = realqty * realpmp;
1347 $(
this).closest(
'tr').find(
'input[name^=realvaluation]').val(realval.toFixed(2));
1349 updateTotalValuation();
1352$(
'input[class*=realpmp]').on(
'change',
function () {
1353 let inputQtyReal = $(
this).closest(
'tr').find(
'.realqty');
1354 let realqty = $(inputQtyReal).val();
1355 let inputPmp = $(
this).closest(
'tr').find(
'input[class*=realpmp]');
1356 console.log(inputPmp);
1357 let realPmpClassname = $(inputPmp).attr(
'class').match(/[\w-]*realpmp[\w-]*/g)[0];
1358 let realpmp = $(inputPmp).val();
1359 if (!isNaN(realpmp)) {
1360 $(
'.'+realPmpClassname).val(realpmp);
1362 if (!isNaN(realqty)) {
1363 let realval = realqty * realpmp;
1364 $(
this).closest(
'tr').find(
'input[name^=realvaluation]').val(realval.toFixed(2));
1366 $(
'.realqty').trigger(
'change');
1367 updateTotalValuation();
1371$(
'input[name^=realvaluation]').on(
'change',
function () {
1372 let inputQtyReal = $(
this).closest(
'tr').find(
'.realqty');
1373 let realqty = $(inputQtyReal).val();
1374 let inputPmp = $(
this).closest(
'tr').find(
'input[class*=realpmp]');
1375 let inputRealValuation = $(
this).closest(
'tr').find(
'input[name^=realvaluation]');
1376 let realPmpClassname = $(inputPmp).attr(
'class').match(/[\w-]*realpmp[\w-]*/g)[0];
1377 let realvaluation = $(inputRealValuation).val();
1378 if (!isNaN(realvaluation) && !isNaN(realqty) && realvaluation !==
'' && realqty !==
'' && realqty !== 0) {
1379 let realpmp = realvaluation / realqty
1380 $(
'.'+realPmpClassname).val(realpmp);
1381 $(
'.realqty').trigger(
'change');
1382 updateTotalValuation();
1386function updateTotalValuation() {
1388 $(
'input[name^=realvaluation]').each(
function( index ) {
1389 let val = $(
this).val();
1390 if(!isNaN(val)) total += parseFloat($(
this).val());
1392 let currencyFractionDigits =
new Intl.NumberFormat(
'fr-FR', {
1395 }).resolvedOptions().maximumFractionDigits;
1396 $(
'#totalRealValuation').html(total.toLocaleString(
'fr-FR', {
1397 maximumFractionDigits: currencyFractionDigits
$id
Support class for third parties, contacts, members, users or resources.
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $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 warehouses.
Class to manage stock movements.
Class to manage products or services.
Class with list of lots and properties.
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)
img_delete($titlealt='default', $other='class="pictodelete"', $morecss='')
Show delete logo.
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 '.
currentToken()
Return the value of token currently saved into session with name 'token'.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
print_fleche_navigation($page, $file, $options='', $nextpage=0, $betweenarrows='', $afterarrows='', $limit=-1, $totalnboflines=0, $selectlimitsuffix='', $beforearrows='', $hidenavigation=0)
Function to show navigation arrows into lists.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
inventoryPrepareHead(&$inventory, $title='Inventory', $get='')
Define head array for tabs of inventory tools setup pages.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
if(preg_match('/(crypted|dolcrypt):/i', $dolibarr_main_db_pass)||!empty($dolibarr_main_db_encrypted_pass)) $conf db type
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.