More complete error management.
This commit is contained in:
parent
a662a980db
commit
771805cd83
@ -73,14 +73,15 @@ class FormOther
|
|||||||
$out .= '<div class="div-for-modal-topright" style="padding: 15px">';
|
$out .= '<div class="div-for-modal-topright" style="padding: 15px">';
|
||||||
$out .= '<center><strong>Barcode scanner tool...</strong></center><br>';
|
$out .= '<center><strong>Barcode scanner tool...</strong></center><br>';
|
||||||
|
|
||||||
$out .= '<input type="radio" name="barcodemode" value="barcodeforautodetect" checked="checked"> Autodetect if we scan a product barcode or a lot/serial barcode<br>';
|
$out .= '<input type="radio" name="barcodemode" value="barcodeforautodetect" id="barcodeforautodetect" checked="checked"> <label for="barcodeforautodetect">Autodetect if we scan a product barcode or a lot/serial barcode</label><br>';
|
||||||
$out .= '<input type="radio" name="barcodemode" value="barcodeforproduct"> Scan a product barcode<br>';
|
$out .= '<input type="radio" name="barcodemode" value="barcodeforproduct" id="barcodeforproduct"> <label for="barcodeforproduct">Scan a product barcode</label><br>';
|
||||||
$out .= '<input type="radio" name="barcodemode" value="barcodeforlotserial"> Scan a product lot or serial number<br>';
|
$out .= '<input type="radio" name="barcodemode" value="barcodeforlotserial" id="barcodeforlotserial"> <label for="barcodeforlotserial">Scan a product lot or serial number</label><br>';
|
||||||
|
|
||||||
$stringaddbarcode = $langs->trans("QtyToAddAfterBarcodeScan", "tmphtml");
|
$stringaddbarcode = $langs->trans("QtyToAddAfterBarcodeScan", "tmphtml");
|
||||||
$htmltoreplaceby = '<select name="selectaddorreplace"><option selected value="add">'.$langs->trans("Add").'</option><option value="replace">'.$langs->trans("ToReplace").'</option></select>';
|
$htmltoreplaceby = '<select name="selectaddorreplace"><option selected value="add">'.$langs->trans("Add").'</option><option value="replace">'.$langs->trans("ToReplace").'</option></select>';
|
||||||
$stringaddbarcode = str_replace("tmphtml", $htmltoreplaceby, $stringaddbarcode);
|
$stringaddbarcode = str_replace("tmphtml", $htmltoreplaceby, $stringaddbarcode);
|
||||||
$out .= $stringaddbarcode.' <input type="text" name="barcodeproductqty" class="width50 right" value="1"><br>';
|
$out .= $stringaddbarcode.' <input type="text" name="barcodeproductqty" class="width50 right" value="1"><br>';
|
||||||
|
$out .= '<br>';
|
||||||
$out .= '<textarea type="text" name="barcodelist" class="centpercent" autofocus rows="'.ROWS_3.'"></textarea>';
|
$out .= '<textarea type="text" name="barcodelist" class="centpercent" autofocus rows="'.ROWS_3.'"></textarea>';
|
||||||
|
|
||||||
/*print '<br>'.$langs->trans("or").'<br>';
|
/*print '<br>'.$langs->trans("or").'<br>';
|
||||||
@ -92,13 +93,20 @@ class FormOther
|
|||||||
$out .= '<br>';
|
$out .= '<br>';
|
||||||
$out .= '<center>';
|
$out .= '<center>';
|
||||||
$out .= '<input type="submit" class="button marginleftonly marginrightonly" id ="exec'.dol_escape_js($jstoexecuteonadd).'" name="addscan" value="'.$langs->trans("Add").'">';
|
$out .= '<input type="submit" class="button marginleftonly marginrightonly" id ="exec'.dol_escape_js($jstoexecuteonadd).'" name="addscan" value="'.$langs->trans("Add").'">';
|
||||||
$out .= '<input type="submit" class="button marginleftonly marginrightonly" name="cancel" value="'.$langs->trans("Cancel").'">';
|
$out .= '<input type="submit" class="button marginleftonly marginrightonly" name="cancel" value="'.$langs->trans("CloseWindow").'">';
|
||||||
|
$out .= '</center>';
|
||||||
$out .= '<br>';
|
$out .= '<br>';
|
||||||
|
$out .= '<div type="text" id="scantoolmessage" class="scantoolmessage ok nopadding"></div>';
|
||||||
|
|
||||||
$out .= '<script>';
|
$out .= '<script>';
|
||||||
|
$out .= 'jQuery("#barcodeforautodetect, #barcodeforproduct, #barcodeforlotserial").click(function(){';
|
||||||
|
$out .= 'console.log("select choice");';
|
||||||
|
$out .= 'jQuery("#scantoolmessage").text("");';
|
||||||
|
$out .= '});'."\n";
|
||||||
$out .= '$("#exec'.dol_escape_js($jstoexecuteonadd).'").click(function(){
|
$out .= '$("#exec'.dol_escape_js($jstoexecuteonadd).'").click(function(){
|
||||||
console.log("We call js to execute '.dol_escape_js($jstoexecuteonadd).'");
|
console.log("We call js to execute '.dol_escape_js($jstoexecuteonadd).'");
|
||||||
'.dol_escape_js($jstoexecuteonadd).'();
|
'.dol_escape_js($jstoexecuteonadd).'();
|
||||||
|
return false; /* We want to stay on the scan tool */
|
||||||
})';
|
})';
|
||||||
$out .= '</script>';
|
$out .= '</script>';
|
||||||
|
|
||||||
|
|||||||
@ -259,11 +259,13 @@ ShowAllBatchByDefault=By default, show batch details on product "stock" tab
|
|||||||
CollapseBatchDetailHelp=You can set batch detail default display in stocks module configuration
|
CollapseBatchDetailHelp=You can set batch detail default display in stocks module configuration
|
||||||
ErrorWrongBarcodemode=Unknown Barcode mode
|
ErrorWrongBarcodemode=Unknown Barcode mode
|
||||||
ProductDoesNotExist=Product does not exist
|
ProductDoesNotExist=Product does not exist
|
||||||
ErrorSameBatchNumber=Same batch number found in inventory list
|
ErrorSameBatchNumber=Several record for the batch number were found in the inventory sheet. No way to know which one to increase.
|
||||||
ProductBatchDoesNotExist=Product with batch/serial does not exist
|
ProductBatchDoesNotExist=Product with batch/serial does not exist
|
||||||
ProductBarcodeDoesNotExist=Product with barcode does not exist
|
ProductBarcodeDoesNotExist=Product with barcode does not exist
|
||||||
WarehouseId=Warehouse ID
|
WarehouseId=Warehouse ID
|
||||||
WarehouseRef=Warehouse Ref
|
WarehouseRef=Warehouse Ref
|
||||||
SaveQtyFirst=Save the real inventoried quantities first, before asking creation of the stock movement.
|
SaveQtyFirst=Save the real inventoried quantities first, before asking creation of the stock movement.
|
||||||
InventoryStartedShort=Started
|
InventoryStartedShort=Started
|
||||||
ErrorOnElementsInventory=Scan was aborted due to following barcode or batch number on error
|
ErrorOnElementsInventory=Operation canceled for the following reason:
|
||||||
|
ErrorCantFindCodeInInventory=Can't find the following code in inventory
|
||||||
|
QtyWasAddedToTheScannedBarcode=Success !! The quantity was added to all the requested barcode. You can close the Scanner tool.
|
||||||
@ -343,10 +343,15 @@ if (empty($reshook)) {
|
|||||||
$result = $tmp->create($user);
|
$result = $tmp->create($user);
|
||||||
if ($result < 0) {
|
if ($result < 0) {
|
||||||
if ($db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
|
if ($db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
|
||||||
setEventMessages($langs->trans("DuplicateRecord"), null, 'errors');
|
$langs->load("errors");
|
||||||
|
setEventMessages($langs->trans("ErrorRecordAlreadyExists"), null, 'errors');
|
||||||
} else {
|
} else {
|
||||||
dol_print_error($db, $tmp->error, $tmp->errors);
|
dol_print_error($db, $tmp->error, $tmp->errors);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// Clear var
|
||||||
|
$_POST['batch'] = '';
|
||||||
|
$_POST['qtytoadd'] = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -606,18 +611,28 @@ if ($object->id > 0) {
|
|||||||
print '<script>';
|
print '<script>';
|
||||||
|
|
||||||
print '
|
print '
|
||||||
var errortab = [];
|
var errortab1 = [];
|
||||||
|
var errortab2 = [];
|
||||||
|
var errortab3 = [];
|
||||||
|
|
||||||
function barcodescannerjs(){
|
function barcodescannerjs(){
|
||||||
console.log("We catch inputs in sacnner box");
|
console.log("We catch inputs in scanner box");
|
||||||
|
jQuery("#scantoolmessage").text();
|
||||||
|
|
||||||
var selectaddorreplace = $("select[name=selectaddorreplace]").val();
|
var selectaddorreplace = $("select[name=selectaddorreplace]").val();
|
||||||
var barcodemode = $("input[name=barcodemode]:checked").val();
|
var barcodemode = $("input[name=barcodemode]:checked").val();
|
||||||
var barcodeproductqty = $("input[name=barcodeproductqty]").val();
|
var barcodeproductqty = $("input[name=barcodeproductqty]").val();
|
||||||
var textarea = $("textarea[name=barcodelist]").val();
|
var textarea = $("textarea[name=barcodelist]").val();
|
||||||
var textarray = textarea.split("\n");
|
var textarray = textarea.split(/[\s,]+/);
|
||||||
var tabproduct = [];
|
var tabproduct = [];
|
||||||
|
errortab1 = [];
|
||||||
|
errortab2 = [];
|
||||||
|
errortab3 = [];
|
||||||
|
|
||||||
if(textarray[0] != ""){
|
if(textarray[0] != ""){
|
||||||
$(".expectedqty").each(function(){
|
$(".expectedqty").each(function(){
|
||||||
id = this.id;
|
id = this.id;
|
||||||
|
console.log("Analyze line "+id+" in inventory");
|
||||||
warehouse = $("#"+id+"_warehouse").children().first().text();
|
warehouse = $("#"+id+"_warehouse").children().first().text();
|
||||||
productbarcode = $("#"+id+"_product").children().first().attr("title");
|
productbarcode = $("#"+id+"_product").children().first().attr("title");
|
||||||
productbarcode = productbarcode.split("<br>");
|
productbarcode = productbarcode.split("<br>");
|
||||||
@ -628,8 +643,7 @@ if ($object->id > 0) {
|
|||||||
if (barcodemode != "barcodeforproduct") {
|
if (barcodemode != "barcodeforproduct") {
|
||||||
tabproduct.forEach(product=>{
|
tabproduct.forEach(product=>{
|
||||||
if(product.Batch != "" && product.Batch == productbatchcode){
|
if(product.Batch != "" && product.Batch == productbatchcode){
|
||||||
alert("'.$langs->transnoentities('ErrorSameBatchNumber').': "+productbatchcode);
|
errortab1.push(productbatchcode);
|
||||||
throw"'.$langs->transnoentities('ErrorSameBatchNumber').': "+productbatchcode;
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -638,7 +652,8 @@ if ($object->id > 0) {
|
|||||||
productinput = 0
|
productinput = 0
|
||||||
}
|
}
|
||||||
tabproduct.push({\'Id\':id,\'Warehouse\':warehouse,\'Barcode\':productbarcode,\'Batch\':productbatchcode,\'Qty\':productinput,\'fetched\':false});
|
tabproduct.push({\'Id\':id,\'Warehouse\':warehouse,\'Barcode\':productbarcode,\'Batch\':productbatchcode,\'Qty\':productinput,\'fetched\':false});
|
||||||
})
|
});
|
||||||
|
|
||||||
textarray.forEach(function(element,index){
|
textarray.forEach(function(element,index){
|
||||||
var verify_batch = false;
|
var verify_batch = false;
|
||||||
var verify_barcode = false;
|
var verify_barcode = false;
|
||||||
@ -648,26 +663,31 @@ if ($object->id > 0) {
|
|||||||
verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"lotserial",true);
|
verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"lotserial",true);
|
||||||
break;
|
break;
|
||||||
case "barcodeforproduct":
|
case "barcodeforproduct":
|
||||||
barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"barcode");
|
verify_barcode = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"barcode");
|
||||||
break;
|
break;
|
||||||
case "barcodeforlotserial":
|
case "barcodeforlotserial":
|
||||||
barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"lotserial");
|
verify_batch = barcodeserialforproduct(tabproduct,index,element,barcodeproductqty,selectaddorreplace,"lotserial");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
alert("'.$langs->trans("ErrorWrongBarcodemode").' \""+barcodemode+"\"");
|
alert("'.$langs->trans("ErrorWrongBarcodemode").' \""+barcodemode+"\"");
|
||||||
throw "'.$langs->trans('ErrorWrongBarcodemode').' \""+barcodemode+"\"";
|
throw "'.$langs->trans('ErrorWrongBarcodemode').' \""+barcodemode+"\"";
|
||||||
}
|
}
|
||||||
if(verify_batch == true && verify_barcode == true){
|
|
||||||
errortab.push(element);
|
if (verify_batch == false && verify_barcode == false) { /* If the 2 flags are false, error */
|
||||||
|
errortab2.push(element);
|
||||||
|
}
|
||||||
|
if (verify_batch == true && verify_barcode == true) { /* If the 2 flags are true, error: we don t know which one to take */
|
||||||
|
errortab3.push(element);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if (Object.keys(errortab).length < 1){
|
|
||||||
|
if (Object.keys(errortab1).length < 1 && Object.keys(errortab2).length < 1 && Object.keys(errortab3).length < 1) {
|
||||||
tabproduct.forEach(product => {
|
tabproduct.forEach(product => {
|
||||||
if(product.Qty!=0){
|
if(product.Qty!=0){
|
||||||
console.log("We change #"+product.Id+"_input to match input in scanner box");
|
console.log("We change #"+product.Id+"_input to match input in scanner box");
|
||||||
if(product.hasOwnProperty("reelqty")){
|
if(product.hasOwnProperty("reelqty")){
|
||||||
$.ajax({ url: \''.DOL_URL_ROOT.'/product/inventory/ajax/searchfrombarcode.php\',
|
$.ajax({ url: \''.DOL_URL_ROOT.'/product/inventory/ajax/searchfrombarcode.php\',
|
||||||
data: { "action":"addnewlineproduct","fk_entrepot":product.Warehouse,"batch":product.Batch,"fk_inventory":'.dol_escape_js($object->id).',"fk_product":product.fk_product,"reelqty":product.reelqty},
|
data: { "token":"'.newToken().'", "action":"addnewlineproduct", "fk_entrepot":product.Warehouse, "batch":product.Batch, "fk_inventory":'.dol_escape_js($object->id).', "fk_product":product.fk_product, "reelqty":product.reelqty},
|
||||||
type: \'POST\',
|
type: \'POST\',
|
||||||
async: false,
|
async: false,
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
@ -690,15 +710,35 @@ if ($object->id > 0) {
|
|||||||
$("#"+product.Id+"_input").val(product.Qty);
|
$("#"+product.Id+"_input").val(product.Qty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
document.forms["formrecord"].submit();
|
jQuery("#scantoolmessage").text("'.$langs->trans("QtyWasAddedToTheScannedBarcode").'\n");
|
||||||
|
/* document.forms["formrecord"].submit(); */
|
||||||
} else {
|
} else {
|
||||||
let stringerror = "";
|
let stringerror = "";
|
||||||
errortab.forEach(element => {
|
if (Object.keys(errortab1).length > 0) {
|
||||||
|
stringerror += "<br>'.$langs->transnoentities('ErrorSameBatchNumber').': ";
|
||||||
|
errortab1.forEach(element => {
|
||||||
stringerror += (element + ", ")
|
stringerror += (element + ", ")
|
||||||
});
|
});
|
||||||
stringerror = stringerror.slice(0, -1);
|
stringerror = stringerror.slice(0, -2); /* Remove last ", " */
|
||||||
alert("'.$langs->trans("ErrorOnElementsInventory").' :\n" + stringerror);
|
}
|
||||||
|
if (Object.keys(errortab2).length > 0) {
|
||||||
|
stringerror += "<br>'.$langs->transnoentities('ErrorCantFindCodeInInventory').': ";
|
||||||
|
errortab2.forEach(element => {
|
||||||
|
stringerror += (element + ", ")
|
||||||
|
});
|
||||||
|
stringerror = stringerror.slice(0, -2); /* Remove last ", " */
|
||||||
|
}
|
||||||
|
if (Object.keys(errortab3).length > 0) {
|
||||||
|
stringerror += "<br>'.$langs->transnoentities('ErrorCodeScannedIsBothProductAndSerial').': ";
|
||||||
|
errortab3.forEach(element => {
|
||||||
|
stringerror += (element + ", ")
|
||||||
|
});
|
||||||
|
stringerror = stringerror.slice(0, -2); /* Remove last ", " */
|
||||||
|
}
|
||||||
|
|
||||||
|
jQuery("#scantoolmessage").text("'.$langs->trans("ErrorOnElementsInventory").'\n" + stringerror);
|
||||||
|
//alert("'.$langs->trans("ErrorOnElementsInventory").' :\n" + stringerror);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,7 +750,7 @@ if ($object->id > 0) {
|
|||||||
result=false;
|
result=false;
|
||||||
tabproduct.forEach(product => {
|
tabproduct.forEach(product => {
|
||||||
$.ajax({ url: \''.DOL_URL_ROOT.'/product/inventory/ajax/searchfrombarcode.php\',
|
$.ajax({ url: \''.DOL_URL_ROOT.'/product/inventory/ajax/searchfrombarcode.php\',
|
||||||
data: { "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},
|
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},
|
||||||
type: \'POST\',
|
type: \'POST\',
|
||||||
async: false,
|
async: false,
|
||||||
success: function(response) {
|
success: function(response) {
|
||||||
|
|||||||
@ -1032,6 +1032,11 @@ div.divsearchfield {
|
|||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================================== */
|
||||||
|
/* Styles for scan tool */
|
||||||
|
/* ============================================================================== */
|
||||||
|
|
||||||
div.div-for-modal {
|
div.div-for-modal {
|
||||||
/* display: none; */
|
/* display: none; */
|
||||||
position:absolute;
|
position:absolute;
|
||||||
@ -1045,19 +1050,26 @@ div.div-for-modal {
|
|||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#scantoolmessage {
|
||||||
|
height: 3em;
|
||||||
|
border: none;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
div.div-for-modal-topright {
|
div.div-for-modal-topright {
|
||||||
/* display: none; */
|
/* display: none; */
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
width:50%; /* adjust as per your needs */
|
width:50%; /* adjust as per your needs */
|
||||||
height:250px; /* adjust as per your needs */
|
height:320px; /* adjust as per your needs */
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border: 1px solid #bbb;
|
border: 1px solid #bbb;
|
||||||
box-shadow: 2px 2px 20px #ddd;
|
box-shadow: 2px 2px 20px #ddd;
|
||||||
z-index: 1100;
|
z-index: 1100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
// Add a nowrap on smartphone, so long list of field used for filter are overflowed with clip
|
// Add a nowrap on smartphone, so long list of field used for filter are overflowed with clip
|
||||||
if ($conf->browser->layout == 'phone') {
|
if ($conf->browser->layout == 'phone') {
|
||||||
|
|||||||
@ -1158,6 +1158,10 @@ if ($conf->browser->layout == 'phone') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ============================================================================== */
|
||||||
|
/* Styles for scan tool */
|
||||||
|
/* ============================================================================== */
|
||||||
|
|
||||||
div.div-for-modal {
|
div.div-for-modal {
|
||||||
/* display: none; */
|
/* display: none; */
|
||||||
position:absolute;
|
position:absolute;
|
||||||
@ -1171,13 +1175,19 @@ div.div-for-modal {
|
|||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#scantoolmessage {
|
||||||
|
height: 3em;
|
||||||
|
border: none;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
div.div-for-modal-topright {
|
div.div-for-modal-topright {
|
||||||
/* display: none; */
|
/* display: none; */
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
right: 0;
|
right: 0;
|
||||||
width:50%; /* adjust as per your needs */
|
width:50%; /* adjust as per your needs */
|
||||||
height:250px; /* adjust as per your needs */
|
height:300px; /* adjust as per your needs */
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border: 1px solid #bbb;
|
border: 1px solid #bbb;
|
||||||
box-shadow: 2px 2px 20px #ddd;
|
box-shadow: 2px 2px 20px #ddd;
|
||||||
@ -1185,6 +1195,7 @@ div.div-for-modal-topright {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
div.confirmmessage {
|
div.confirmmessage {
|
||||||
padding-top: 6px;
|
padding-top: 6px;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user