这是 Adempiere 特意设计的功能。在某些情况下,允许库存变为负数,因为在这些情况下感觉最好让流程完成,但如果是负数,它突出了必须解决的问题。在内部使用的情况下,警告用户,如果他们继续,库存将变为负数。
要更改此标准功能,您需要修改
org.compiere.model.MInventory.completeIt()
但是,如果您直接更改代码,则使您的版本与基本 Adempiere 保持同步甚至只是应用补丁都会变得更加困难。
推荐的方法是添加一个Model Validator。这是一种监视底层数据模型并允许在特定事件发生时注入额外代码/逻辑的机制。
您想要的事件是文档事件 TIMING_BEFORE_COMPLETE。您将创建一个新的模型验证器,如链接中所述,将其注册到 Adempiere 的应用程序字典中,并且由于您希望代码在执行Inventory Document Type时触发,您将添加一个类似这样的方法
public String docValidate (PO po, int timing)
{
if (timing == TIMING_BEFORE_COMPLETE) {
if (po.get_TableName().equals(MInventory.Table_Name))
{
// your code to be executed
// it is executed just before any (internal or physical)
// Inventory is Completed
}
}
return null;
} // docValidate
一句警告;内部使用功能与实物盘点(即库存盘点)功能使用的相同!他们只是在 Adempiere 有不同的窗口。因此,请务必在应用任何更改后测试这两个功能。从核心org.compiere.model.MInventory
提示您如何区分两者。
//Get Quantity Internal Use
BigDecimal qtyDiff = line.getQtyInternalUse().negate();
//If Quantity Internal Use = Zero Then Physical Inventory Else Internal Use Inventory
if (qtyDiff.signum() == 0)