這是Adempiere特意設計的功能。在某些情況下,庫存允許變爲負值,因爲在這些情況下,最好允許過程完成但是負值則突出顯示必須解決的問題。在內部使用的情況下,用戶被警告,如果他們繼續進行,股票將變爲負數。
要改變這種標準的功能,您需要修改
org.compiere.model.MInventory.completeIt()
但如果你直接更改代碼,它會變得更加困難,以保持你的版本同步與基ADempiere的,甚至只是應用補丁。
推薦的方法是添加Model Validator。這是一種監視底層數據模型並在發生特定事件時能夠注入額外代碼/邏輯的機制。
你想要的事件是文檔事件TIMING_BEFORE_COMPLETE。 爲鏈接描述您可以創建一個新的模型驗證,在ADempiere的應用程序字典註冊登記,因爲你希望你的代碼觸發時庫存文件類型執行你想補充的方法是這樣的
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)
這將是一個更好的做法,如果你可以分享,如果解決方案是不合格的,或者他們投票並標記爲正確將幫助未來的用戶相同的問題。 – JavaDragon