BF [ 1885414 ] ASI should be always mandatory if CostingLevel is Batch/Lot
This commit is contained in:
parent
71b71e4618
commit
cab309511f
|
@ -1096,23 +1096,13 @@ public class MInOut extends X_M_InOut implements DocAction
|
||||||
//
|
//
|
||||||
if (line.getM_AttributeSetInstance_ID() != 0)
|
if (line.getM_AttributeSetInstance_ID() != 0)
|
||||||
continue;
|
continue;
|
||||||
if (product != null)
|
if (product != null && product.isASIMandatory(isSOTrx()))
|
||||||
{
|
|
||||||
int M_AttributeSet_ID = product.getM_AttributeSet_ID();
|
|
||||||
if (M_AttributeSet_ID != 0)
|
|
||||||
{
|
|
||||||
MAttributeSet mas = MAttributeSet.get(getCtx(), M_AttributeSet_ID);
|
|
||||||
if (mas != null
|
|
||||||
&& ((isSOTrx() && mas.isMandatory())
|
|
||||||
|| (!isSOTrx() && mas.isMandatoryAlways())) )
|
|
||||||
{
|
{
|
||||||
m_processMsg = "@M_AttributeSet_ID@ @IsMandatory@ (@Line@ #" + lines[i].getLine() +
|
m_processMsg = "@M_AttributeSet_ID@ @IsMandatory@ (@Line@ #" + lines[i].getLine() +
|
||||||
", @M_Product_ID@=" + product.getValue() + ")";
|
", @M_Product_ID@=" + product.getValue() + ")";
|
||||||
return DocAction.STATUS_Invalid;
|
return DocAction.STATUS_Invalid;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
setVolume(Volume);
|
setVolume(Volume);
|
||||||
setWeight(Weight);
|
setWeight(Weight);
|
||||||
|
|
||||||
|
|
|
@ -300,16 +300,11 @@ public class MInventoryLine extends X_M_InventoryLine
|
||||||
if (getM_AttributeSetInstance_ID() == 0)
|
if (getM_AttributeSetInstance_ID() == 0)
|
||||||
{
|
{
|
||||||
MProduct product = MProduct.get(getCtx(), getM_Product_ID());
|
MProduct product = MProduct.get(getCtx(), getM_Product_ID());
|
||||||
if (product.getM_AttributeSet_ID() != 0)
|
if (product != null && product.isASIMandatory(isSOTrx()))
|
||||||
{
|
{
|
||||||
MAttributeSet mas = MAttributeSet.get(getCtx(), product.getM_AttributeSet_ID());
|
log.saveError("FillMandatory", Msg.getElement(getCtx(), COLUMNNAME_M_AttributeSetInstance_ID));
|
||||||
if (mas.isInstanceAttribute()
|
|
||||||
&& (mas.isMandatory() || mas.isMandatoryAlways()))
|
|
||||||
{
|
|
||||||
log.saveError("FillMandatory", Msg.getElement(getCtx(), "M_AttributeSetInstance_ID"));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} // No ASI
|
} // No ASI
|
||||||
} // new or manual
|
} // new or manual
|
||||||
|
|
||||||
|
@ -418,4 +413,38 @@ public class MInventoryLine extends X_M_InventoryLine
|
||||||
}
|
}
|
||||||
} // createMA
|
} // createMA
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Is Internal Use Inventory
|
||||||
|
* @return true if is internal use inventory
|
||||||
|
*/
|
||||||
|
public boolean isInternalUseInventory() {
|
||||||
|
/* TODO: need to add M_Inventory.IsInternalUseInventory flag
|
||||||
|
see FR [ 1879029 ] Added IsInternalUseInventory flag to M_Inventory table
|
||||||
|
MInventory parent = getParent();
|
||||||
|
return parent != null && parent.isInternalUseInventory();
|
||||||
|
*/
|
||||||
|
return getQtyInternalUse().signum() != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Movement Qty (absolute value)
|
||||||
|
* <li>negative value means outgoing trx
|
||||||
|
* <li>positive value means incoming trx
|
||||||
|
* @return movement qty
|
||||||
|
*/
|
||||||
|
public BigDecimal getMovementQty() {
|
||||||
|
if(isInternalUseInventory()) {
|
||||||
|
return getQtyInternalUse().negate();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return getQtyCount().subtract(getQtyBook());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true if is an outgoing transaction
|
||||||
|
*/
|
||||||
|
public boolean isSOTrx() {
|
||||||
|
return getMovementQty().signum() < 0;
|
||||||
|
}
|
||||||
} // MInventoryLine
|
} // MInventoryLine
|
||||||
|
|
|
@ -177,25 +177,25 @@ public class MMovementLine extends X_M_MovementLine
|
||||||
setMovementQty(getMovementQty());
|
setMovementQty(getMovementQty());
|
||||||
|
|
||||||
// Mandatory Instance
|
// Mandatory Instance
|
||||||
|
MProduct product = getProduct();
|
||||||
|
if (getM_AttributeSetInstance_ID() == 0) {
|
||||||
|
if (product != null && product.isASIMandatory(false)) {
|
||||||
|
log.saveError("FillMandatory", Msg.getElement(getCtx(), COLUMNNAME_M_AttributeSetInstance_ID));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (getM_AttributeSetInstanceTo_ID() == 0)
|
if (getM_AttributeSetInstanceTo_ID() == 0)
|
||||||
{
|
{
|
||||||
if (getM_AttributeSetInstance_ID() != 0) // set to from
|
if (getM_AttributeSetInstance_ID() != 0) // set to from
|
||||||
setM_AttributeSetInstanceTo_ID(getM_AttributeSetInstance_ID());
|
setM_AttributeSetInstanceTo_ID(getM_AttributeSetInstance_ID());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MProduct product = getProduct();
|
if (product != null && product.isASIMandatory(true))
|
||||||
if (product != null
|
|
||||||
&& product.getM_AttributeSet_ID() != 0)
|
|
||||||
{
|
{
|
||||||
MAttributeSet mas = MAttributeSet.get(getCtx(), product.getM_AttributeSet_ID());
|
log.saveError("FillMandatory", Msg.getElement(getCtx(), COLUMNNAME_M_AttributeSetInstanceTo_ID));
|
||||||
if (mas.isInstanceAttribute()
|
|
||||||
&& (mas.isMandatory() || mas.isMandatoryAlways()))
|
|
||||||
{
|
|
||||||
log.saveError("FillMandatory", Msg.getElement(getCtx(), "M_AttributeSetInstanceTo_ID"));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} // ASI
|
} // ASI
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.compiere.util.*;
|
||||||
*
|
*
|
||||||
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
|
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
|
||||||
* <li>FR [ 1885153 ] Refactor: getMMPolicy code
|
* <li>FR [ 1885153 ] Refactor: getMMPolicy code
|
||||||
|
* <li>BF [ 1885414 ] ASI should be always mandatory if CostingLevel is Batch/Lot
|
||||||
*/
|
*/
|
||||||
public class MProduct extends X_M_Product
|
public class MProduct extends X_M_Product
|
||||||
{
|
{
|
||||||
|
@ -748,4 +749,41 @@ public class MProduct extends X_M_Product
|
||||||
return MMPolicy;
|
return MMPolicy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if ASI is mandatory
|
||||||
|
* @param isSOTrx is outgoing trx?
|
||||||
|
* @return true if ASI is mandatory, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean isASIMandatory(boolean isSOTrx) {
|
||||||
|
//
|
||||||
|
// If CostingLevel is BatchLot ASI is always mandatory - check all client acct schemas
|
||||||
|
MAcctSchema[] mass = MAcctSchema.getClientAcctSchema(getCtx(), getAD_Client_ID(), get_TrxName());
|
||||||
|
for (MAcctSchema as : mass) {
|
||||||
|
MProductCategoryAcct pca = MProductCategoryAcct.get(getCtx(), getM_Product_Category_ID(), as.getC_AcctSchema_ID(), get_TrxName());
|
||||||
|
String cl = pca.getCostingLevel();
|
||||||
|
if (cl == null)
|
||||||
|
cl = as.getCostingLevel();
|
||||||
|
if (MAcctSchema.COSTINGLEVEL_BatchLot.equals(cl)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Check Attribute Set settings
|
||||||
|
int M_AttributeSet_ID = getM_AttributeSet_ID();
|
||||||
|
if (M_AttributeSet_ID != 0)
|
||||||
|
{
|
||||||
|
MAttributeSet mas = MAttributeSet.get(getCtx(), M_AttributeSet_ID);
|
||||||
|
if (mas == null || !mas.isInstanceAttribute())
|
||||||
|
return false;
|
||||||
|
// Outgoing transaction
|
||||||
|
else if (isSOTrx)
|
||||||
|
return mas.isMandatory();
|
||||||
|
// Incoming transaction
|
||||||
|
else // isSOTrx == false
|
||||||
|
return mas.isMandatoryAlways();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Default not mandatory
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} // MProduct
|
} // MProduct
|
||||||
|
|
Loading…
Reference in New Issue