2015-10-15 79 views
1

有可能在Adempiere,Inventory Stock變爲負值。使其成爲負面的方法之一是當我們把Quantity放在Internal Use Inventory以上Available股票在Warehouse預防可用庫存變爲負值

Product Info 
------------ 
Product || Qty 
Fertilizer || 15 

它示於產品信息的那個Fertilizer當前Qty15。然後,我做內部使用庫存文件

Internal Use Inventory 
---------------------- 
Product || Qty 
Fertilizer || 25 

當我完成它,Quantity將是-10Quantity是否大於Available Stock,我該如何防止Internal Use Inventory被完成?這樣我就可以避開負面的存貨

+0

這將是一個更好的做法,如果你可以分享,如果解決方案是不合格的,或者他們投票並標記爲正確將幫助未來的用戶相同的問題。 – JavaDragon

回答

1

這是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) 
0

爲了防止股票被否定,你可以用兩種方法

  1. 標註的代碼
  2. BeforeSave方法
  1. 爲了在通話中應用它您需要創建一個Callout類並獲取當前定位器的庫存數量,然後從輸入的數量中減去數量,如果結果小於0,則顯示錯誤。將其應用於數量字段,您將獲得所需的結果。

  2. 這是稍微好一點的方法,因爲這不需要在代碼中完全創建一個新類,並且會佔用更少的內存,在代碼中搜索MInventoryLine類,然後在其中搜索beforesave()。添加相同的代碼(獲取股票,然後從輸入的數量中減去它)。 (該代碼在beforesave)會是這樣

    if (your condition here) { log.saveError("Could Not Save - Error", "Qty less than 0"); return false;  } 
    

現在我假設你知道基本的代碼來創建一個標註,並設計了一個條件,如果您需要任何幫助,讓我知道。

+1

使用Callout的問題這只是在UI中執行 - 所以如果股票正在被一個進程減少(在後臺),那麼這個規則就不會被強制執行。當您想要強制實施新規則時,如果想要影響UI - 模型驗證器,請使用標註。 –