diff --git a/base/src/org/compiere/model/CalloutMovement.java b/base/src/org/compiere/model/CalloutMovement.java index ab47f8f895..b13703fdb2 100644 --- a/base/src/org/compiere/model/CalloutMovement.java +++ b/base/src/org/compiere/model/CalloutMovement.java @@ -26,6 +26,9 @@ import org.compiere.util.*; * * @author Jorg Janke * @version $Id: CalloutMovement.java,v 1.2 2006/07/30 00:51:03 jjanke Exp $ + * + * @author Teo Sarca, SC ARHIPAC SERVICE SRL + *
  • BF [ 1879568 ] CalloutMouvement QtyAvailable issues */ public class CalloutMovement extends CalloutEngine { @@ -52,23 +55,7 @@ public class CalloutMovement extends CalloutEngine else mTab.setValue("M_AttributeSetInstance_ID", null); - // Begin Armen 2006/10/01 - MProduct product = MProduct.get(ctx, M_Product_ID.intValue()); - if (product.isStocked()) { - BigDecimal MovementQty = (BigDecimal) mTab.getValue("MovementQty"); - int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); - int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); - BigDecimal available = MStorage.getQtyAvailable(M_Warehouse_ID, - M_Product_ID.intValue(), M_AttributeSetInstance_ID, null); - if (available == null) - available = Env.ZERO; - if (available.signum() == 0) - mTab.fireDataStatusEEvent("NoQtyAvailable", "0", false); - else if (available.compareTo(MovementQty) < 0) - mTab.fireDataStatusEEvent("InsufficientQtyAvailable", available.toString(), false); - } - // End Armen - + checkQtyAvailable(ctx, mTab, WindowNo, M_Product_ID, null); return ""; } // product @@ -90,29 +77,61 @@ public class CalloutMovement extends CalloutEngine setCalloutActive(true); int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); - // log.log(Level.WARNING,"qty - init - M_Product_ID=" + M_Product_ID); + checkQtyAvailable(ctx, mTab, WindowNo, M_Product_ID, (BigDecimal)value); + // + setCalloutActive(false); + return ""; + } // qty + + /** + * Movement Line - Locator modified + * + * @param ctx Context + * @param WindowNo current Window No + * @param GridTab Model Tab + * @param GridField Model Field + * @param value The new value + * @return Error message or "" + */ + public String locator(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value) { + if (value == null) + return ""; + int M_Product_ID = Env.getContextAsInt(ctx, WindowNo, "M_Product_ID"); + checkQtyAvailable(ctx, mTab, WindowNo, M_Product_ID, null); + return ""; + } + /** + * Check available qty + * + * @param ctx context + * @param mTab Model Tab + * @param WindowNo current Window No + * @param M_Product_ID product ID + * @param MovementQty movement qty (if null will be get from context "MovementQty") + */ + private void checkQtyAvailable(Properties ctx, GridTab mTab, int WindowNo, int M_Product_ID, BigDecimal MovementQty) { + // Begin Armen 2006/10/01 if (M_Product_ID != 0) { MProduct product = MProduct.get(ctx, M_Product_ID); if (product.isStocked()) { - BigDecimal MovementQty = (BigDecimal) value; - int M_Warehouse_ID = Env.getContextAsInt(ctx, WindowNo, "M_Warehouse_ID"); - int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, - WindowNo, "M_AttributeSetInstance_ID"); - BigDecimal available = MStorage.getQtyAvailable(M_Warehouse_ID, - M_Product_ID, M_AttributeSetInstance_ID, null); + if (MovementQty == null) + MovementQty = (BigDecimal) mTab.getValue("MovementQty"); + int M_Locator_ID = Env.getContextAsInt(ctx, WindowNo, "M_Locator_ID"); + // If no locator, don't check anything and assume is ok + if (M_Locator_ID <= 0) + return; + int M_Warehouse_ID = MLocator.get(ctx, M_Locator_ID).getM_Warehouse_ID(); + int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID"); + BigDecimal available = MStorage.getQtyAvailable(M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, null); if (available == null) available = Env.ZERO; if (available.signum() == 0) mTab.fireDataStatusEEvent("NoQtyAvailable", "0", false); else if (available.compareTo(MovementQty) < 0) - mTab.fireDataStatusEEvent("InsufficientQtyAvailable", - available.toString(), false); + mTab.fireDataStatusEEvent("InsufficientQtyAvailable", available.toString(), false); } } - // - setCalloutActive(false); - return ""; - } // qty - + // End Armen + } } // CalloutMove \ No newline at end of file diff --git a/migration/331b-trunk/079_BF_1879568.sql b/migration/331b-trunk/079_BF_1879568.sql new file mode 100644 index 0000000000..593bf0dcfc --- /dev/null +++ b/migration/331b-trunk/079_BF_1879568.sql @@ -0,0 +1,8 @@ +-- BF [ 1879568 ] CalloutMouvement QtyAvailable issues +-- http://sourceforge.net/tracker/?func=detail&atid=879332&aid=1879568&group_id=176962 +-- +-- WARNING: if you already modified the Callout column, this update will do nothing, solve the issue manually +update AD_Column set Callout='org.compiere.model.CalloutMovement.locator' +where AD_Column_ID=3591 and Callout is null; +-- +commit; diff --git a/migration/331b-trunk/postgresql/079_BF_1879568.sql b/migration/331b-trunk/postgresql/079_BF_1879568.sql new file mode 100644 index 0000000000..593bf0dcfc --- /dev/null +++ b/migration/331b-trunk/postgresql/079_BF_1879568.sql @@ -0,0 +1,8 @@ +-- BF [ 1879568 ] CalloutMouvement QtyAvailable issues +-- http://sourceforge.net/tracker/?func=detail&atid=879332&aid=1879568&group_id=176962 +-- +-- WARNING: if you already modified the Callout column, this update will do nothing, solve the issue manually +update AD_Column set Callout='org.compiere.model.CalloutMovement.locator' +where AD_Column_ID=3591 and Callout is null; +-- +commit;