2015-10-15 77 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 - 模型验证器,请使用标注。 –