IDEMPIERE-5483 - Physical Inventory Doesn't Update Last Inventory Date on Specific Cases (#1575)

* IDEMPIERE-5483 - Physical Inventory Doesn't Update Last Inventory Date on Specific Cases

* IDEMPIERE-5483 - requested changes

* IDEMPIERE-5483 - fixes

* IDEMPIERE-5483 - fixed fallen test case
This commit is contained in:
Peter Takács 2022-11-29 03:39:21 +01:00 committed by GitHub
parent 8e886a26d6
commit 253125b60a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 103 additions and 32 deletions

View File

@ -526,6 +526,34 @@ public class MInventory extends X_M_Inventory implements DocAction
}
//If Quantity Count minus Quantity Book = Zero, then no change in Inventory
if(MDocType.DOCSUBTYPEINV_PhysicalInventory.equals(docSubTypeInv) && !isReversal()) {
// We want to update Date Last Inventory on this records as well.
if (line.getM_AttributeSetInstance_ID() == 0 ) {
MStorageOnHand[] storages = MStorageOnHand.getWarehouse(getCtx(), getM_Warehouse_ID(), line.getM_Product_ID(), 0,
null, MClient.MMPOLICY_FiFo.equals(product.getMMPolicy()), true, line.getM_Locator_ID(), get_TrxName(), false);
if(storages != null) {
for(MStorageOnHand storage: storages) {
storage.setDateLastInventory(getMovementDate());
if (!storage.save(get_TrxName())) {
m_processMsg = "Storage on hand not updated for DateLastInventory";
return DocAction.STATUS_Invalid;
}
}
}
} else {
MStorageOnHand[] storages = MStorageOnHand.getAll(getCtx(), line.getM_Product_ID(),
line.getM_Locator_ID(), line.getM_AttributeSetInstance_ID(), null, false, get_TrxName());
if(storages != null) {
for(MStorageOnHand storage: storages) {
storage.setDateLastInventory(getMovementDate());
if (!storage.save(get_TrxName())) {
m_processMsg = "Storage on hand not updated for DateLastInventory";
return DocAction.STATUS_Invalid;
}
}
}
}
}
if (qtyDiff.signum() == 0)
continue;
@ -571,26 +599,13 @@ public class MInventory extends X_M_Inventory implements DocAction
line.getM_Locator_ID(),
line.getM_Product_ID(),
ma.getM_AttributeSetInstance_ID(),
QtyMA.negate(),ma.getDateMaterialPolicy(), get_TrxName()))
QtyMA.negate(),ma.getDateMaterialPolicy(), getMovementDate(), get_TrxName()))
{
String lastError = CLogger.retrieveErrorString("");
m_processMsg = "Cannot correct Inventory (MA) - " + lastError;
return DocAction.STATUS_Invalid;
}
// Only Update Date Last Inventory if is a Physical Inventory
if (MDocType.DOCSUBTYPEINV_PhysicalInventory.equals(docSubTypeInv))
{
MStorageOnHand storage = MStorageOnHand.get(getCtx(), line.getM_Locator_ID(),
line.getM_Product_ID(), ma.getM_AttributeSetInstance_ID(),ma.getDateMaterialPolicy(),get_TrxName());
storage.setDateLastInventory(getMovementDate());
if (!storage.save(get_TrxName()))
{
m_processMsg = "Storage not updated(2)";
return DocAction.STATUS_Invalid;
}
}
String m_MovementType =null;
if(QtyMA.negate().compareTo(Env.ZERO) > 0 )
m_MovementType = MTransaction.MOVEMENTTYPE_InventoryIn;
@ -629,27 +644,13 @@ public class MInventory extends X_M_Inventory implements DocAction
line.getM_Locator_ID(),
line.getM_Product_ID(),
line.getM_AttributeSetInstance_ID(),
qtyDiff,dateMPolicy,get_TrxName()))
qtyDiff,dateMPolicy,getMovementDate(),get_TrxName()))
{
String lastError = CLogger.retrieveErrorString("");
m_processMsg = "Cannot correct Inventory OnHand (MA) - " + lastError;
return DocAction.STATUS_Invalid;
}
// Only Update Date Last Inventory if is a Physical Inventory
if (MDocType.DOCSUBTYPEINV_PhysicalInventory.equals(docSubTypeInv))
{
MStorageOnHand storage = MStorageOnHand.get(getCtx(), line.getM_Locator_ID(),
line.getM_Product_ID(), line.getM_AttributeSetInstance_ID(),dateMPolicy, get_TrxName());
storage.setDateLastInventory(getMovementDate());
if (!storage.save(get_TrxName()))
{
m_processMsg = "Storage not updated(2)";
return DocAction.STATUS_Invalid;
}
}
String m_MovementType = null;
if(qtyDiff.compareTo(Env.ZERO) > 0 )
m_MovementType = MTransaction.MOVEMENTTYPE_InventoryIn;

View File

@ -243,6 +243,54 @@ public class MStorageOnHand extends X_M_StorageOnHand
return retValue;
} // getAll
/**
* Get Storage Info
* @param ctx context
* @param M_Product_ID product
* @param M_Locator_ID locator
* @param M_AttributeSetInstance_ID instance
* @param dateMPolicy
* @param ignoreZeroQty
* @param trxName transaction
* @return existing or null
*/
public static MStorageOnHand[] getAll (Properties ctx,
int M_Product_ID, int M_Locator_ID, int M_AttributeSetInstance_ID, Timestamp dateMPolicy, boolean ignoreZeroQty, String trxName)
{
String sqlWhere = "M_Locator_ID=? AND M_Product_ID=? AND ";
if (M_AttributeSetInstance_ID == 0)
sqlWhere += "(M_AttributeSetInstance_ID=? OR M_AttributeSetInstance_ID IS NULL)";
else
sqlWhere += "M_AttributeSetInstance_ID=?";
if(ignoreZeroQty)
sqlWhere += " AND QtyOnHand<>0 ";
if (dateMPolicy != null)
sqlWhere += " AND DateMaterialPolicy=trunc(cast(? as date))";
Query query = new Query(ctx, MStorageOnHand.Table_Name, sqlWhere, trxName);
if (dateMPolicy != null)
query.setParameters(M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, dateMPolicy);
else
query.setParameters(M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID);
List<MStorageOnHand> list = query.list();
if (list == null || list.isEmpty()) {
if (s_log.isLoggable(Level.FINE)) s_log.fine("Not Found - M_Locator_ID=" + M_Locator_ID
+ ", M_Product_ID=" + M_Product_ID + ", M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID);
} else {
if (s_log.isLoggable(Level.FINE)) s_log.fine("Found " + list.size() + " - M_Locator_ID=" + M_Locator_ID
+ ", M_Product_ID=" + M_Product_ID + ", M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID);
}
MStorageOnHand[] retValue = new MStorageOnHand[list.size()];
list.toArray(retValue);
return retValue;
} // getAll
/**
* Get Storage Info for Product across warehouses
@ -739,7 +787,14 @@ public class MStorageOnHand extends X_M_StorageOnHand
int M_Product_ID, int M_AttributeSetInstance_ID,
BigDecimal diffQtyOnHand,Timestamp dateMPolicy, String trxName)
{
return add(ctx, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, diffQtyOnHand, dateMPolicy, trxName);
return add(ctx, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, diffQtyOnHand, dateMPolicy, null, trxName);
}
public static boolean add (Properties ctx, int M_Locator_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
BigDecimal diffQtyOnHand,Timestamp dateMPolicy, String trxName)
{
return add(ctx, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, diffQtyOnHand, dateMPolicy, null, trxName);
}
/**
@ -756,7 +811,7 @@ public class MStorageOnHand extends X_M_StorageOnHand
*/
public static boolean add (Properties ctx, int M_Locator_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
BigDecimal diffQtyOnHand,Timestamp dateMPolicy, String trxName)
BigDecimal diffQtyOnHand,Timestamp dateMPolicy, Timestamp dateLastInventory, String trxName)
{
if (diffQtyOnHand == null || diffQtyOnHand.signum() == 0)
return true;
@ -776,6 +831,8 @@ public class MStorageOnHand extends X_M_StorageOnHand
return false;
}
if(dateLastInventory != null)
storage.updateDateLastInventory(dateLastInventory);
storage.addQtyOnHand(diffQtyOnHand);
if (s_log.isLoggable(Level.FINE)) {
StringBuilder diffText = new StringBuilder("(OnHand=").append(diffQtyOnHand).append(") -> ").append(storage.toString());
@ -804,6 +861,19 @@ public class MStorageOnHand extends X_M_StorageOnHand
}
}
/**
* Update Date Last Inventory
* @param dateLastInv
*/
public void updateDateLastInventory(Timestamp dateLastInv) {
final String sql = "UPDATE M_StorageOnHand SET DateLastInventory=? " +
"WHERE M_Product_ID=? AND M_Locator_ID=? AND M_AttributeSetInstance_ID=? AND DateMaterialPolicy=?";
DB.executeUpdateEx(sql,
new Object[] {dateLastInv, getM_Product_ID(), getM_Locator_ID(), getM_AttributeSetInstance_ID(), getDateMaterialPolicy()},
get_TrxName());
load(get_TrxName());
}
/**************************************************************************
* Get Location with highest Locator Priority and a sufficient OnHand Qty
* @param M_Warehouse_ID warehouse