Autoswitch on inventory tab on validation of inventory

Fix disabled button when some data are available.
This commit is contained in:
Laurent Destailleur 2021-11-18 12:58:31 +01:00
parent 9b9b63c794
commit e652b93878
6 changed files with 57 additions and 22 deletions

View File

@ -140,6 +140,7 @@ if ($action == 'add' && !empty($permissiontoadd)) {
header("Location: ".$urltogo); header("Location: ".$urltogo);
exit; exit;
} else { } else {
$error++;
// Creation KO // Creation KO
if (!empty($object->errors)) { if (!empty($object->errors)) {
setEventMessages(null, $object->errors, 'errors'); setEventMessages(null, $object->errors, 'errors');
@ -255,6 +256,7 @@ if ($action == 'update' && !empty($permissiontoadd)) {
if ($result > 0) { if ($result > 0) {
$action = 'view'; $action = 'view';
} else { } else {
$error++;
// Creation KO // Creation KO
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
$action = 'edit'; $action = 'edit';
@ -284,6 +286,7 @@ if ($action == "update_extras" && !empty($permissiontoadd)) {
setEventMessages($langs->trans('RecordSaved'), null, 'mesgs'); setEventMessages($langs->trans('RecordSaved'), null, 'mesgs');
$action = 'view'; $action = 'view';
} else { } else {
$error++;
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
$action = 'edit_extras'; $action = 'edit_extras';
} }
@ -301,9 +304,11 @@ if ($action == 'confirm_delete' && !empty($permissiontodelete)) {
if ($result > 0) { if ($result > 0) {
// Delete OK // Delete OK
setEventMessages("RecordDeleted", null, 'mesgs'); setEventMessages("RecordDeleted", null, 'mesgs');
header("Location: ".$backurlforlist); header("Location: ".$backurlforlist);
exit; exit;
} else { } else {
$error++;
if (!empty($object->errors)) { if (!empty($object->errors)) {
setEventMessages(null, $object->errors, 'errors'); setEventMessages(null, $object->errors, 'errors');
} else { } else {
@ -347,6 +352,7 @@ if ($action == 'confirm_deleteline' && $confirm == 'yes' && !empty($permissionto
header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id);
exit; exit;
} else { } else {
$error++;
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
} }
$action = ''; $action = '';
@ -383,6 +389,7 @@ if ($action == 'confirm_validate' && $confirm == 'yes' && $permissiontoadd) {
} }
} }
} else { } else {
$error++;
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
} }
$action = ''; $action = '';
@ -414,6 +421,7 @@ if ($action == 'confirm_close' && $confirm == 'yes' && $permissiontoadd) {
} }
} }
} else { } else {
$error++;
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
} }
$action = ''; $action = '';
@ -425,6 +433,7 @@ if ($action == 'confirm_setdraft' && $confirm == 'yes' && $permissiontoadd) {
if ($result >= 0) { if ($result >= 0) {
// Nothing else done // Nothing else done
} else { } else {
$error++;
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
} }
$action = ''; $action = '';
@ -456,6 +465,7 @@ if ($action == 'confirm_reopen' && $confirm == 'yes' && $permissiontoadd) {
} }
} }
} else { } else {
$error++;
setEventMessages($object->error, $object->errors, 'errors'); setEventMessages($object->error, $object->errors, 'errors');
} }
$action = ''; $action = '';
@ -481,6 +491,7 @@ if ($action == 'confirm_clone' && $confirm == 'yes' && !empty($permissiontoadd))
header("Location: ".$_SERVER['PHP_SELF'].'?id='.$newid); // Open record of new object header("Location: ".$_SERVER['PHP_SELF'].'?id='.$newid); // Open record of new object
exit; exit;
} else { } else {
$error++;
setEventMessages($objectutil->error, $objectutil->errors, 'errors'); setEventMessages($objectutil->error, $objectutil->errors, 'errors');
$action = ''; $action = '';
} }

View File

@ -8730,7 +8730,11 @@ abstract class CommonObject
$res = $this->db->query($sql); $res = $this->db->query($sql);
if ($res === false) { if ($res === false) {
$error++; $error++;
$this->errors[] = $this->db->lasterror(); if ($this->db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
$this->errors[] = "ErrorRefAlreadyExists";
} else {
$this->errors[] = $this->db->lasterror();
}
} }
} }

View File

@ -264,3 +264,5 @@ 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.
InventoryStartedShort=Started

View File

@ -109,6 +109,7 @@ if ($reshook < 0) {
} }
if (empty($reshook)) { if (empty($reshook)) {
$savaction = $action;
$error = 0; $error = 0;
$backurlforlist = DOL_URL_ROOT.'/product/inventory/list.php'; $backurlforlist = DOL_URL_ROOT.'/product/inventory/list.php';
@ -152,6 +153,12 @@ if (empty($reshook)) {
$autocopy = 'MAIN_MAIL_AUTOCOPY_INVENTORY_TO'; $autocopy = 'MAIN_MAIL_AUTOCOPY_INVENTORY_TO';
$trackid = 'stockinv'.$object->id; $trackid = 'stockinv'.$object->id;
include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php'; include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
if (!$error && $savaction == 'confirm_validate' && $action == '' && $object->id > 0) {
// Switch to the tab inventory
header("Location: ".DOL_URL_ROOT.'/product/inventory/inventory.php?id='.$object->id);
exit;
}
} }

View File

@ -59,10 +59,10 @@ class Inventory extends CommonObject
*/ */
public $picto = 'inventory'; public $picto = 'inventory';
const STATUS_DRAFT = 0; const STATUS_DRAFT = 0; // Draft
const STATUS_VALIDATED = 1; const STATUS_VALIDATED = 1; // Inventory is in process
const STATUS_RECORDED = 2; const STATUS_RECORDED = 2; // Inventory is finisged. Stock movement has been recorded.
const STATUS_CANCELED = 9; const STATUS_CANCELED = 9; // Canceled
/** /**
* 'type' field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]', 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter]]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'text:none', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password') * 'type' field format ('integer', 'integer:ObjectClass:PathToClass[:AddCreateButtonOrNot[:Filter]]', 'sellist:TableName:LabelFieldName[:KeyFieldName[:KeyFieldParent[:Filter]]]', 'varchar(x)', 'double(24,8)', 'real', 'price', 'text', 'text:none', 'html', 'date', 'datetime', 'timestamp', 'duration', 'mail', 'phone', 'url', 'password')
@ -368,7 +368,7 @@ class Inventory extends CommonObject
} }
/** /**
* Set to Recorded * Set to inventory to status "Closed". It means all stock movements were recorded.
* *
* @param User $user User that creates * @param User $user User that creates
* @param bool $notrigger false=launch triggers after, true=disable triggers * @param bool $notrigger false=launch triggers after, true=disable triggers
@ -616,11 +616,11 @@ class Inventory extends CommonObject
$labelStatus = array(); $labelStatus = array();
$labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); $labelStatus[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
$labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated').' ('.$langs->transnoentitiesnoconv('Started').')'; $labelStatus[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Validated').' ('.$langs->transnoentitiesnoconv('InventoryStartedShort').')';
$labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled'); $labelStatus[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
$labelStatus[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed'); $labelStatus[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');
$labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft'); $labelStatusShort[self::STATUS_DRAFT] = $langs->transnoentitiesnoconv('Draft');
$labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('Started'); $labelStatusShort[self::STATUS_VALIDATED] = $langs->transnoentitiesnoconv('InventoryStartedShort');
$labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled'); $labelStatusShort[self::STATUS_CANCELED] = $langs->transnoentitiesnoconv('Canceled');
$labelStatusShort[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed'); $labelStatusShort[self::STATUS_RECORDED] = $langs->transnoentitiesnoconv('Closed');

View File

@ -310,20 +310,22 @@ $help_url = '';
llxHeader('', $langs->trans('Inventory'), $help_url); llxHeader('', $langs->trans('Inventory'), $help_url);
// Disable button Generate movement if data were not saved // Disable button Generate movement if data were modified and not saved
print '<script type="text/javascript" language="javascript"> print '<script type="text/javascript" language="javascript">
function disablebuttonmakemovementandclose() { function disablebuttonmakemovementandclose() {
console.log("Disable button idbuttonmakemovementandclose until we save"); console.log("Disable button idbuttonmakemovementandclose until we save");
jQuery("#idbuttonmakemovementandclose").attr(\'disabled\',\'disabled\'); jQuery("#idbuttonmakemovementandclose").attr(\'disabled\',\'disabled\');
jQuery("#idbuttonmakemovementandclose").attr(\'title\',\''.dol_escape_js($langs->trans("SaveQtyFirst")).'\');
jQuery("#idbuttonmakemovementandclose").attr(\'class\',\'butActionRefused\'); jQuery("#idbuttonmakemovementandclose").attr(\'class\',\'butActionRefused\');
}; };
jQuery(document).ready(function() { jQuery(document).ready(function() {
jQuery(".realqty").keyup(function() { jQuery(".realqty").keyup(function() {
console.log("keyup on realqty");
disablebuttonmakemovementandclose(); disablebuttonmakemovementandclose();
}); });
jQuery(".realqty").change(function() { jQuery(".realqty").change(function() {
console.log("change on realqty");
disablebuttonmakemovementandclose(); disablebuttonmakemovementandclose();
}); });
}); });
@ -480,7 +482,7 @@ if ($object->id > 0) {
// Save // Save
if ($object->status == $object::STATUS_VALIDATED) { if ($object->status == $object::STATUS_VALIDATED) {
if ($permissiontoadd) { if ($permissiontoadd) {
print '<a class="butAction" id="idbuttonmakemovementandclose" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=record&token='.newToken().'" title="'.dol_escape_htmltag("SaveQtyFirst").'">'.$langs->trans("MakeMovementsAndClose").'</a>'."\n"; print '<a class="butAction" id="idbuttonmakemovementandclose" href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&action=record&token='.newToken().'" title="'.dol_escape_htmltag($langs->trans("MakeMovementsAndClose")).'">'.$langs->trans("MakeMovementsAndClose").'</a>'."\n";
} else { } else {
print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans('MakeMovementsAndClose').'</a>'."\n"; print '<a class="butActionRefused classfortooltip" href="#" title="'.dol_escape_htmltag($langs->trans("NotEnoughPermissions")).'">'.$langs->trans('MakeMovementsAndClose').'</a>'."\n";
} }
@ -522,10 +524,9 @@ if ($object->id > 0) {
var objecttofill = $("#"+object.id+"_input")[0]; var objecttofill = $("#"+object.id+"_input")[0];
objecttofill.value = object.innerText; objecttofill.value = object.innerText;
}) })
console.log("Values filled"); console.log("Values filled (after click on fillwithexpected)");
console.log("Disable button idbuttonmakemovementandclose until we save"); disablebuttonmakemovementandclose();
jQuery("#idbuttonmakemovementandclose").attr(\'disabled\',\'disabled\'); return false;
jQuery("#idbuttonmakemovementandclose").attr(\'class\',\'butActionRefused\');
});'; });';
print '});'; print '});';
print '</script>'; print '</script>';
@ -639,12 +640,14 @@ if ($object->id > 0) {
//Call method to undo changes in real qty //Call method to undo changes in real qty
print '<script>'; print '<script>';
print 'jQuery(document).ready(function() { print 'jQuery(document).ready(function() {
$(".undochangesqty").on("click",function undochangesqty(){ $(".undochangesqty").on("click",function undochangesqty() {
console.log("Clear value of inventory line");
id = this.id; id = this.id;
id = id.split("_")[1]; id = id.split("_")[1];
tmpvalue = $("#id_"+id+"_input_tmp").val() tmpvalue = $("#id_"+id+"_input_tmp").val()
$("#id_"+id+"_input")[0].value = tmpvalue; $("#id_"+id+"_input")[0].value = tmpvalue;
document.forms["formrecord"].submit(); disablebuttonmakemovementandclose();
return false; /* disable submit */
}); });
});'; });';
print '</script>'; print '</script>';
@ -667,7 +670,7 @@ if ($object->id > 0) {
print '</td>'; print '</td>';
} }
print '<td class="right">'.$langs->trans("ExpectedQty").'</td>'; print '<td class="right">'.$langs->trans("ExpectedQty").'</td>';
print '<td class="center">'; print '<td class="right">';
print $form->textwithpicto($langs->trans("RealQty"), $langs->trans("InventoryRealQtyHelp")); print $form->textwithpicto($langs->trans("RealQty"), $langs->trans("InventoryRealQtyHelp"));
print '</td>'; print '</td>';
if ($object->status == $object::STATUS_VALIDATED) { if ($object->status == $object::STATUS_VALIDATED) {
@ -692,7 +695,7 @@ if ($object->id > 0) {
print '</td>'; print '</td>';
} }
print '<td class="right"></td>'; print '<td class="right"></td>';
print '<td class="center">'; print '<td class="right">';
print '<input type="text" name="qtytoadd" class="maxwidth75" value="">'; print '<input type="text" name="qtytoadd" class="maxwidth75" value="">';
print '</td>'; print '</td>';
// Actions // Actions
@ -764,17 +767,22 @@ if ($object->id > 0) {
print '</td>'; print '</td>';
// Real quantity // Real quantity
print '<td class="center">'; print '<td class="right">';
if ($object->status == $object::STATUS_VALIDATED) { if ($object->status == $object::STATUS_VALIDATED) {
$qty_view = GETPOST("id_".$obj->rowid) && price2num(GETPOST("id_".$obj->rowid), 'MS') >= 0 ? GETPOST("id_".$obj->rowid) : $obj->qty_view; $qty_view = GETPOST("id_".$obj->rowid) && price2num(GETPOST("id_".$obj->rowid), 'MS') >= 0 ? GETPOST("id_".$obj->rowid) : $obj->qty_view;
if (!$hasinput && $qty_view !== null && $obj->qty_stock != $qty_view) {
//if (!$hasinput && $qty_view !== null && $obj->qty_stock != $qty_view) {
if ($qty_view != '') {
$hasinput = true; $hasinput = true;
} }
print '<a id="undochangesqty_'.$obj->rowid.'" href="#" class="undochangesqty reposition marginrightonly" title="'.dol_escape_htmltag($langs->trans("Clear")).'">';
print img_picto('', 'eraser', 'class="opacitymedium"');
print '</a>';
print '<input type="text" class="maxwidth75 right realqty" name="id_'.$obj->rowid.'" id="id_'.$obj->rowid.'_input" value="'.$qty_view.'">'; print '<input type="text" class="maxwidth75 right realqty" name="id_'.$obj->rowid.'" id="id_'.$obj->rowid.'_input" value="'.$qty_view.'">';
print '</td>'; print '</td>';
print '<td class="right">'; print '<td class="right">';
print '<a id="undochangesqty_'.$obj->rowid.'" href="#" class="undochangesqty"><span class="fas fa-undo pictoundo" ></span></a> &nbsp';
print '<a class="reposition" href="'.DOL_URL_ROOT.'/product/inventory/inventory.php?id='.$object->id.'&lineid='.$obj->rowid.'&action=deleteline&token='.newToken().'">'.img_delete().'</a>'; print '<a class="reposition" href="'.DOL_URL_ROOT.'/product/inventory/inventory.php?id='.$object->id.'&lineid='.$obj->rowid.'&action=deleteline&token='.newToken().'">'.img_delete().'</a>';
print '</td>'; print '</td>';
$qty_tmp = price2num(GETPOST("id_".$obj->rowid."_input_tmp", 'MS')) >= 0 ? GETPOST("id_".$obj->rowid."_input_tmp") : $qty_view; $qty_tmp = price2num(GETPOST("id_".$obj->rowid."_input_tmp", 'MS')) >= 0 ? GETPOST("id_".$obj->rowid."_input_tmp") : $qty_view;
@ -801,10 +809,13 @@ if ($object->id > 0) {
print '</div>'; print '</div>';
// Call method to disable the button if no qty entered yet for inventory // Call method to disable the button if no qty entered yet for inventory
if ($object->status != $object::STATUS_VALIDATED || !$hasinput) { if ($object->status != $object::STATUS_VALIDATED || !$hasinput) {
print '<script type="text/javascript" language="javascript"> print '<script type="text/javascript" language="javascript">
jQuery(document).ready(function() { jQuery(document).ready(function() {
console.log("Call disablebuttonmakemovementandclose because status = '.((int) $object->status).' or $hasinput = '.((int) $hasinput).'");
disablebuttonmakemovementandclose(); disablebuttonmakemovementandclose();
}); });
</script>'; </script>';