modify code related with M_Storage
This commit is contained in:
parent
0731626ca0
commit
31ee8bc837
|
@ -147,12 +147,12 @@ public class CalloutInventory extends CalloutEngine
|
|||
private BigDecimal setQtyBook (int M_AttributeSetInstance_ID, int M_Product_ID, int M_Locator_ID) throws Exception {
|
||||
// Set QtyBook from first storage location
|
||||
BigDecimal bd = null;
|
||||
String sql = "SELECT QtyOnHand FROM M_Storage "
|
||||
String sql = "SELECT QtyOnHand FROM M_StorageOnHand "
|
||||
+ "WHERE M_Product_ID=?" // 1
|
||||
+ " AND M_Locator_ID=?" // 2
|
||||
+ " AND M_AttributeSetInstance_ID=?";
|
||||
if (M_AttributeSetInstance_ID == 0)
|
||||
sql = "SELECT SUM(QtyOnHand) FROM M_Storage "
|
||||
sql = "SELECT SUM(QtyOnHand) FROM M_StorageOnHand "
|
||||
+ "WHERE M_Product_ID=?" // 1
|
||||
+ " AND M_Locator_ID=?"; // 2
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ package org.compiere.model;
|
|||
import java.math.BigDecimal;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
|
||||
/**
|
||||
|
@ -117,11 +118,15 @@ public class CalloutMovement extends CalloutEngine
|
|||
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;
|
||||
//@win - IDEMPIERE-385
|
||||
int M_Warehouse_ID = DB.getSQLValue(null, "SELECT M_Warehouse_ID FROM M_Locator WHERE M_Locator_ID=?");
|
||||
//
|
||||
int M_AttributeSetInstance_ID = Env.getContextAsInt(ctx, WindowNo, "M_AttributeSetInstance_ID");
|
||||
BigDecimal available = MStorageReservation.getQtyAvailable(0, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID, null);
|
||||
BigDecimal available = MStorageReservation.getQtyAvailable(M_Warehouse_ID, M_Product_ID, M_AttributeSetInstance_ID, null);
|
||||
if (available == null)
|
||||
available = Env.ZERO;
|
||||
if (available.signum() == 0)
|
||||
|
|
|
@ -135,13 +135,13 @@ public class InventoryCountCreate extends SvrProcess
|
|||
// Create Null Storage records
|
||||
if (p_QtyRange != null && p_QtyRange.equals("="))
|
||||
{
|
||||
StringBuilder sql = new StringBuilder("INSERT INTO M_Storage ");
|
||||
StringBuilder sql = new StringBuilder("INSERT INTO M_StorageOnHand ");
|
||||
sql.append("(AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,");
|
||||
sql.append(" M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID,");
|
||||
sql.append(" QtyOnHand, QtyReserved, QtyOrdered, DateLastInventory) ");
|
||||
sql.append(" QtyOnHand, DateLastInventory) ");
|
||||
sql.append("SELECT l.AD_CLIENT_ID, l.AD_ORG_ID, 'Y', SysDate, 0,SysDate, 0,");
|
||||
sql.append(" l.M_Locator_ID, p.M_Product_ID, 0,");
|
||||
sql.append(" 0,0,0,null ");
|
||||
sql.append(" 0,null ");
|
||||
sql.append("FROM M_Locator l");
|
||||
sql.append(" INNER JOIN M_Product p ON (l.AD_Client_ID=p.AD_Client_ID) ");
|
||||
sql.append("WHERE l.M_Warehouse_ID=");
|
||||
|
@ -151,7 +151,7 @@ public class InventoryCountCreate extends SvrProcess
|
|||
sql.append(" AND l.M_Locator_ID=").append(p_M_Locator_ID);
|
||||
sql.append(" AND l.IsDefault='Y'")
|
||||
.append(" AND p.IsActive='Y' AND p.IsStocked='Y' and p.ProductType='I'")
|
||||
.append(" AND NOT EXISTS (SELECT * FROM M_Storage s")
|
||||
.append(" AND NOT EXISTS (SELECT * FROM M_StorageOnHand s")
|
||||
.append(" INNER JOIN M_Locator sl ON (s.M_Locator_ID=sl.M_Locator_ID) ")
|
||||
.append("WHERE sl.M_Warehouse_ID=l.M_Warehouse_ID")
|
||||
.append(" AND s.M_Product_ID=p.M_Product_ID)");
|
||||
|
@ -162,7 +162,7 @@ public class InventoryCountCreate extends SvrProcess
|
|||
StringBuilder sql = new StringBuilder("SELECT s.M_Product_ID, s.M_Locator_ID, s.M_AttributeSetInstance_ID,");
|
||||
sql.append(" s.QtyOnHand, p.M_AttributeSet_ID ");
|
||||
sql.append("FROM M_Product p");
|
||||
sql.append(" INNER JOIN M_Storage s ON (s.M_Product_ID=p.M_Product_ID)");
|
||||
sql.append(" INNER JOIN M_StorageOnHand s ON (s.M_Product_ID=p.M_Product_ID)");
|
||||
sql.append(" INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID) ");
|
||||
sql.append("WHERE l.M_Warehouse_ID=?");
|
||||
sql.append(" AND p.IsActive='Y' AND p.IsStocked='Y' and p.ProductType='I'");
|
||||
|
|
|
@ -92,14 +92,14 @@ public class InventoryCountUpdate extends SvrProcess
|
|||
// ASI
|
||||
sql = new StringBuilder("UPDATE M_InventoryLine l ")
|
||||
.append("SET (QtyBook,QtyCount) = ")
|
||||
.append("(SELECT QtyOnHand,QtyOnHand FROM M_Storage s ")
|
||||
.append("(SELECT QtyOnHand,QtyOnHand FROM M_StorageOnHand s ")
|
||||
.append("WHERE s.M_Product_ID=l.M_Product_ID AND s.M_Locator_ID=l.M_Locator_ID")
|
||||
.append(" AND s.M_AttributeSetInstance_ID=l.M_AttributeSetInstance_ID),")
|
||||
.append(" Updated=SysDate,")
|
||||
.append(" UpdatedBy=").append(getAD_User_ID())
|
||||
//
|
||||
.append(" WHERE M_Inventory_ID=").append(p_M_Inventory_ID)
|
||||
.append(" AND EXISTS (SELECT * FROM M_Storage s ")
|
||||
.append(" AND EXISTS (SELECT * FROM M_StorageOnHand s ")
|
||||
.append("WHERE s.M_Product_ID=l.M_Product_ID AND s.M_Locator_ID=l.M_Locator_ID")
|
||||
.append(" AND s.M_AttributeSetInstance_ID=l.M_AttributeSetInstance_ID)");
|
||||
int no = DB.executeUpdate(sql.toString(), get_TrxName());
|
||||
|
|
|
@ -175,7 +175,7 @@ public class InventoryValue extends SvrProcess
|
|||
|
||||
// Get current QtyOnHand with ASI
|
||||
sql = new StringBuilder ("UPDATE T_InventoryValue iv SET QtyOnHand = ")
|
||||
.append("(SELECT SUM(QtyOnHand) FROM M_Storage s")
|
||||
.append("(SELECT SUM(QtyOnHand) FROM M_StorageOnHand s")
|
||||
.append(" INNER JOIN M_Locator l ON (l.M_Locator_ID=s.M_Locator_ID) ")
|
||||
.append("WHERE iv.M_Product_ID=s.M_Product_ID")
|
||||
.append(" AND iv.M_Warehouse_ID=l.M_Warehouse_ID")
|
||||
|
@ -186,7 +186,7 @@ public class InventoryValue extends SvrProcess
|
|||
log.fine("QtHand with ASI=" + no);
|
||||
// Get current QtyOnHand without ASI
|
||||
sql = new StringBuilder ("UPDATE T_InventoryValue iv SET QtyOnHand = ")
|
||||
.append("(SELECT SUM(QtyOnHand) FROM M_Storage s")
|
||||
.append("(SELECT SUM(QtyOnHand) FROM M_StorageOnHand s")
|
||||
.append(" INNER JOIN M_Locator l ON (l.M_Locator_ID=s.M_Locator_ID) ")
|
||||
.append("WHERE iv.M_Product_ID=s.M_Product_ID")
|
||||
.append(" AND iv.M_Warehouse_ID=l.M_Warehouse_ID) ")
|
||||
|
|
|
@ -143,7 +143,6 @@ public class M_Production_Run extends SvrProcess {
|
|||
{
|
||||
BigDecimal QtyAvailable = MStorageReservation.getQtyAvailable(
|
||||
locator.getM_Warehouse_ID(),
|
||||
locator.getM_Locator_ID(),
|
||||
pline.getM_Product_ID(),
|
||||
pline.getM_AttributeSetInstance_ID(),
|
||||
get_TrxName());
|
||||
|
|
|
@ -140,7 +140,7 @@ public class OrgOwnership extends SvrProcess
|
|||
|
||||
// Set Storage
|
||||
sql = new StringBuilder();
|
||||
sql.append("UPDATE M_Storage s ")
|
||||
sql.append("UPDATE M_StorageOnHand s ")
|
||||
.append("SET AD_Org_ID=").append(p_AD_Org_ID)
|
||||
.append(" WHERE EXISTS ")
|
||||
.append("(SELECT * FROM M_Locator l WHERE l.M_Locator_ID=s.M_Locator_ID")
|
||||
|
|
|
@ -249,12 +249,12 @@ public class ReplenishReport extends SvrProcess
|
|||
log.fine("Insert (BP) #" + no);
|
||||
}
|
||||
sql = new StringBuilder("UPDATE T_Replenish t SET ");
|
||||
sql.append("QtyOnHand = (SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append("QtyOnHand = (SELECT COALESCE(SUM(QtyOnHand),0) FROM M_StorageOnHand s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
|
||||
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
|
||||
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
|
||||
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
|
||||
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
|
||||
if (p_C_DocType_ID != 0)
|
||||
sql.append(", C_DocType_ID=").append(p_C_DocType_ID);
|
||||
sql.append(" WHERE AD_PInstance_ID=").append(getAD_PInstance_ID());
|
||||
|
|
|
@ -271,10 +271,10 @@ public class ReplenishReportProduction extends SvrProcess
|
|||
sql = new StringBuilder("UPDATE T_Replenish t SET ");
|
||||
sql.append("QtyOnHand = (SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
|
||||
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
|
||||
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
|
||||
sql.append("QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID),");
|
||||
sql.append("QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_StorageReservation s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID");
|
||||
sql.append(" AND l.M_Warehouse_ID=t.M_Warehouse_ID)");
|
||||
if (p_C_DocType_ID != 0)
|
||||
sql.append(", C_DocType_ID=").append(p_C_DocType_ID);
|
||||
sql.append(" WHERE AD_PInstance_ID=").append(getAD_PInstance_ID());
|
||||
|
|
|
@ -68,7 +68,7 @@ public class StorageCleanup extends SvrProcess
|
|||
{
|
||||
log.info("");
|
||||
// Clean up empty Storage
|
||||
String sql = "DELETE FROM M_Storage "
|
||||
String sql = "DELETE FROM M_StorageOnHand "
|
||||
+ "WHERE QtyOnHand = 0 AND QtyReserved = 0 AND QtyOrdered = 0"
|
||||
+ " AND Created < SysDate-3";
|
||||
int no = DB.executeUpdate(sql, get_TrxName());
|
||||
|
@ -76,7 +76,7 @@ public class StorageCleanup extends SvrProcess
|
|||
|
||||
//
|
||||
sql = "SELECT * "
|
||||
+ "FROM M_Storage s "
|
||||
+ "FROM M_StorageOnHand s "
|
||||
+ "WHERE AD_Client_ID = ?"
|
||||
+ " AND QtyOnHand < 0"
|
||||
// Instance Attribute
|
||||
|
@ -89,7 +89,7 @@ public class StorageCleanup extends SvrProcess
|
|||
// + " AND s.M_Product_ID=sl.M_Product_ID"
|
||||
// + " AND s.M_Locator_ID=sl.M_Locator_ID)"
|
||||
// Stock in same Warehouse
|
||||
+ " AND EXISTS (SELECT * FROM M_Storage sw"
|
||||
+ " AND EXISTS (SELECT * FROM M_StorageOnHand sw"
|
||||
+ " INNER JOIN M_Locator swl ON (sw.M_Locator_ID=swl.M_Locator_ID), M_Locator sl "
|
||||
+ "WHERE sw.QtyOnHand > 0"
|
||||
+ " AND s.M_Product_ID=sw.M_Product_ID"
|
||||
|
@ -250,7 +250,7 @@ public class StorageCleanup extends SvrProcess
|
|||
{
|
||||
ArrayList<MStorageOnHand> list = new ArrayList<MStorageOnHand>();
|
||||
String sql = "SELECT * "
|
||||
+ "FROM M_Storage s "
|
||||
+ "FROM M_StorageOnHand s "
|
||||
+ "WHERE QtyOnHand > 0"
|
||||
+ " AND M_Product_ID=?"
|
||||
// Empty ASI
|
||||
|
|
|
@ -188,9 +188,9 @@ public class AccessSqlParserTest extends TestCase
|
|||
*/
|
||||
public void testProductInstanceAttributeQuery()
|
||||
{
|
||||
String sql = "SELECT p.M_Product_ID, p.Discontinued, p.Value, p.Name, BOM_Qty_Available(p.M_Product_ID,?) AS QtyAvailable, bomQtyList(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceList, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceStd, BOM_Qty_OnHand(p.M_Product_ID,?) AS QtyOnHand, BOM_Qty_Reserved(p.M_Product_ID,?) AS QtyReserved, BOM_Qty_Ordered(p.M_Product_ID,?) AS QtyOrdered, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID)-bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS Margin, bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceLimit, pa.IsInstanceAttribute FROM M_Product p INNER JOIN M_ProductPrice pr ON (p.M_Product_ID=pr.M_Product_ID) LEFT OUTER JOIN M_AttributeSet pa ON (p.M_AttributeSet_ID=pa.M_AttributeSet_ID) WHERE p.IsSummary='N' AND p.IsActive='Y' AND pr.IsActive='Y' AND pr.M_PriceList_Version_ID=? AND EXISTS (SELECT * FROM M_Storage s INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) WHERE s.M_Product_ID=p.M_Product_ID AND asi.SerNo LIKE '33' AND asi.Lot LIKE '33' AND asi.M_Lot_ID=101 AND TRUNC(asi.GuaranteeDate)<TO_DATE('2003-10-16','YYYY-MM-DD') AND asi.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=103 AND Value LIKE '33') AND (M_Attribute_ID=102 AND M_AttributeValue_ID=106))) AND p.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=101 AND M_AttributeValue_ID=105) AND (M_Attribute_ID=100 AND M_AttributeValue_ID=102)) AND p.AD_Client_ID IN(0,11) AND p.AD_Org_ID IN(0,11,12) ORDER BY QtyAvailable DESC, Margin DESC";
|
||||
String sql = "SELECT p.M_Product_ID, p.Discontinued, p.Value, p.Name, BOM_Qty_Available(p.M_Product_ID,?) AS QtyAvailable, bomQtyList(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceList, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceStd, BOM_Qty_OnHand(p.M_Product_ID,?) AS QtyOnHand, BOM_Qty_Reserved(p.M_Product_ID,?) AS QtyReserved, BOM_Qty_Ordered(p.M_Product_ID,?) AS QtyOrdered, bomQtyStd(p.M_Product_ID, pr.M_PriceList_Version_ID)-bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS Margin, bomQtyLimit(p.M_Product_ID, pr.M_PriceList_Version_ID) AS PriceLimit, pa.IsInstanceAttribute FROM M_Product p INNER JOIN M_ProductPrice pr ON (p.M_Product_ID=pr.M_Product_ID) LEFT OUTER JOIN M_AttributeSet pa ON (p.M_AttributeSet_ID=pa.M_AttributeSet_ID) WHERE p.IsSummary='N' AND p.IsActive='Y' AND pr.IsActive='Y' AND pr.M_PriceList_Version_ID=? AND EXISTS (SELECT * FROM M_StorageOnHand s INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) WHERE s.M_Product_ID=p.M_Product_ID AND asi.SerNo LIKE '33' AND asi.Lot LIKE '33' AND asi.M_Lot_ID=101 AND TRUNC(asi.GuaranteeDate)<TO_DATE('2003-10-16','YYYY-MM-DD') AND asi.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=103 AND Value LIKE '33') AND (M_Attribute_ID=102 AND M_AttributeValue_ID=106))) AND p.M_AttributeSetInstance_ID IN (SELECT M_AttributeSetInstance_ID FROM M_AttributeInstance WHERE (M_Attribute_ID=101 AND M_AttributeValue_ID=105) AND (M_Attribute_ID=100 AND M_AttributeValue_ID=102)) AND p.AD_Client_ID IN(0,11) AND p.AD_Org_ID IN(0,11,12) ORDER BY QtyAvailable DESC, Margin DESC";
|
||||
AccessSqlParser fixture = new AccessSqlParser(sql);
|
||||
assertEquals("AccessSqlParser[M_AttributeInstance|M_Storage=s,M_AttributeSetInstance=asi|M_AttributeInstance|M_Product=p,M_ProductPrice=pr,M_AttributeSet=pa|3]", fixture.toString());
|
||||
assertEquals("AccessSqlParser[M_AttributeInstance|M_StorageOnHand=s,M_AttributeSetInstance=asi|M_AttributeInstance|M_Product=p,M_ProductPrice=pr,M_AttributeSet=pa|3]", fixture.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1002,7 +1002,7 @@ public class MCostDetail extends X_M_CostDetail
|
|||
* Solution:
|
||||
* Make sure the current qty is reflecting the actual qty in storage
|
||||
*/
|
||||
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage")
|
||||
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_StorageOnHand")
|
||||
.append(" WHERE AD_Client_ID=").append(cost.getAD_Client_ID())
|
||||
.append(" AND M_Product_ID=").append(cost.getM_Product_ID());
|
||||
//Costing Level
|
||||
|
@ -1159,7 +1159,7 @@ public class MCostDetail extends X_M_CostDetail
|
|||
MCostElement[] lce = MCostElement.getNonCostingMethods(this);
|
||||
if (lce.length > 0)
|
||||
{
|
||||
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage")
|
||||
StringBuilder sql = new StringBuilder("SELECT COALESCE(SUM(QtyOnHand),0) FROM M_StorageOnHand")
|
||||
.append(" WHERE AD_Client_ID=").append(cost.getAD_Client_ID())
|
||||
.append(" AND M_Product_ID=").append(cost.getM_Product_ID());
|
||||
//Costing Level
|
||||
|
|
|
@ -332,7 +332,7 @@ public final class MLocatorLookup extends Lookup implements Serializable
|
|||
sql.append(" AND (IsDefault='Y' ") // Default Locator
|
||||
.append("OR EXISTS (SELECT * FROM M_Product p ") // Product Locator
|
||||
.append("WHERE p.M_Locator_ID=M_Locator.M_Locator_ID AND p.M_Product_ID=?)")
|
||||
.append("OR EXISTS (SELECT * FROM M_Storage s ") // Storage Locator
|
||||
.append("OR EXISTS (SELECT * FROM M_StorageOnHand s ") // Storage Locator
|
||||
.append("WHERE s.M_Locator_ID=M_Locator.M_Locator_ID AND s.M_Product_ID=?))");
|
||||
sql.append(" ORDER BY ");
|
||||
if (local_only_warehouse_id == 0)
|
||||
|
|
|
@ -580,8 +580,7 @@ public class MProduct extends X_M_Product
|
|||
for (int i = 0; i < onHandStorages.length; i++)
|
||||
{
|
||||
OnHand = OnHand.add(onHandStorages[i].getQtyOnHand());
|
||||
//Ordered = Ordered.add(storages[i].getQtyOrdered());
|
||||
//Reserved = Reserved.add(storages[i].getQtyReserved());
|
||||
|
||||
}
|
||||
for (int i = 0; i < reservationStorages.length; i++)
|
||||
{
|
||||
|
@ -720,26 +719,23 @@ public class MProduct extends X_M_Product
|
|||
// Check Storage
|
||||
if (isStocked() || PRODUCTTYPE_Item.equals(getProductType()))
|
||||
{
|
||||
// large modified related to storages by zuhri
|
||||
MStorageOnHand[] onHandStorages = MStorageOnHand.getOfProduct(getCtx(), get_ID(), get_TrxName());
|
||||
MStorageReservation[] reservationStorages = MStorageReservation.getOfProduct(getCtx(), get_ID(), get_TrxName());
|
||||
MStorageReservation[] reserves = MStorageReservation.getOfProduct(getCtx(), get_ID(), get_TrxName());
|
||||
|
||||
BigDecimal OnHand = Env.ZERO;
|
||||
BigDecimal Ordered = Env.ZERO;
|
||||
BigDecimal Reserved = Env.ZERO;
|
||||
for (int i = 0; i < onHandStorages.length; i++)
|
||||
{
|
||||
OnHand = OnHand.add(onHandStorages[i].getQtyOnHand());
|
||||
//Ordered = Ordered.add(storages[i].getQtyOrdered());
|
||||
//Reserved = Reserved.add(storages[i].getQtyReserved());
|
||||
}
|
||||
for (int i = 0; i < reservationStorages.length; i++)
|
||||
{
|
||||
if(reservationStorages[i].isSOTrx())
|
||||
Reserved = Reserved.add(reservationStorages[i].getQty());
|
||||
else
|
||||
Ordered = Ordered.add(reservationStorages[i].getQty());
|
||||
|
||||
for (int i = 0; i < reserves.length; i++)
|
||||
{
|
||||
Ordered = OnHand.add(reserves[i].getQtyOrdered());
|
||||
Reserved = OnHand.add(reserves[i].getQtyReserved());
|
||||
}
|
||||
// end large modified related to storages by zuhri
|
||||
|
||||
String errMsg = "";
|
||||
if (OnHand.signum() != 0)
|
||||
errMsg = "@QtyOnHand@ = " + OnHand;
|
||||
|
|
|
@ -105,6 +105,13 @@ public class MStorageReservation extends X_M_StorageReservation {
|
|||
return qty;
|
||||
}
|
||||
|
||||
|
||||
public static BigDecimal getQtyOrdered (int M_Warehouse_ID,
|
||||
int M_Product_ID, int M_AttributeSetInstance_ID, String trxName)
|
||||
{
|
||||
BigDecimal retValue = null;
|
||||
return retValue;
|
||||
}
|
||||
/**
|
||||
* Get Available Qty.
|
||||
* The call is accurate only if there is a storage record
|
||||
|
@ -123,5 +130,15 @@ public class MStorageReservation extends X_M_StorageReservation {
|
|||
BigDecimal retValue = qtyOnHand.subtract(qtyReserved);
|
||||
return retValue;
|
||||
}
|
||||
|
||||
public BigDecimal getQtyOrdered() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
public BigDecimal getQtyReserved() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -213,7 +213,7 @@ public class MWarehouse extends X_M_Warehouse
|
|||
with negative onhand. */
|
||||
if (is_ValueChanged("IsDisallowNegativeInv") && isDisallowNegativeInv())
|
||||
{
|
||||
String sql = "SELECT M_Product_ID FROM M_Storage s "+
|
||||
String sql = "SELECT M_Product_ID FROM M_StorageOnHand s "+
|
||||
"WHERE s.M_Locator_ID IN (SELECT M_Locator_ID FROM M_Locator l " +
|
||||
"WHERE M_Warehouse_ID=? )" +
|
||||
" GROUP BY M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID " +
|
||||
|
|
|
@ -49,14 +49,14 @@ public class MStorageTest extends AdempiereTestCase
|
|||
s1.setQtyOnHand(targetQty);
|
||||
s1.saveEx();
|
||||
//
|
||||
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), loc.get_ID(), product_id, 0, getTrxName()).setScale(12, BigDecimal.ROUND_HALF_UP);
|
||||
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), product_id, 0, getTrxName()).setScale(12, BigDecimal.ROUND_HALF_UP);
|
||||
assertEquals("Error on locator "+locatorValue, targetQty, qty);
|
||||
//
|
||||
return loc;
|
||||
}
|
||||
private void assertWarehouseQty(MWarehouse wh, BigDecimal targetQty)
|
||||
{
|
||||
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), 0, product_id, 0, getTrxName());
|
||||
BigDecimal qty = MStorageReservation.getQtyAvailable(wh.get_ID(), product_id, 0, getTrxName());
|
||||
qty = qty.setScale(12, BigDecimal.ROUND_HALF_UP);
|
||||
targetQty = targetQty.setScale(12, BigDecimal.ROUND_HALF_UP);
|
||||
assertEquals(targetQty, qty);
|
||||
|
|
|
@ -185,9 +185,7 @@ public class InventoryTest extends AdempiereTestCase
|
|||
ArrayList<Object> params = new ArrayList<Object>();
|
||||
String sql = "SELECT"
|
||||
+" COALESCE(SUM(QtyOnHand),0)"
|
||||
+",COALESCE(SUM(QtyReserved),0)"
|
||||
+",COALESCE(SUM(QtyOrdered),0)"
|
||||
+" FROM M_Storage"
|
||||
+" FROM M_StorageOnHand"
|
||||
+" WHERE M_Locator_ID=? AND M_Product_ID=?";
|
||||
params.add(locator.get_ID());
|
||||
params.add(product.get_ID());
|
||||
|
@ -199,8 +197,6 @@ public class InventoryTest extends AdempiereTestCase
|
|||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
BigDecimal qtyOnHand = Env.ZERO;
|
||||
BigDecimal qtyOrdered = Env.ZERO;
|
||||
BigDecimal qtyReserved = Env.ZERO;
|
||||
try
|
||||
{
|
||||
pstmt = DB.prepareStatement(sql, trxName);
|
||||
|
@ -209,8 +205,6 @@ public class InventoryTest extends AdempiereTestCase
|
|||
if (rs.next())
|
||||
{
|
||||
qtyOnHand = rs.getBigDecimal(1);
|
||||
qtyReserved = rs.getBigDecimal(2);
|
||||
qtyOrdered = rs.getBigDecimal(3);
|
||||
}
|
||||
}
|
||||
catch (SQLException e)
|
||||
|
@ -225,8 +219,7 @@ public class InventoryTest extends AdempiereTestCase
|
|||
//
|
||||
//
|
||||
assertEquals("QtyOnHand not match "+doc, doc.Qty, qtyOnHand);
|
||||
assertEquals("QtyReserved not match "+doc, doc.QtyReserved, qtyReserved);
|
||||
assertEquals("QtyOrdered not match "+doc, doc.QtyOrdered, qtyOrdered);
|
||||
|
||||
}
|
||||
|
||||
private void dumpStatus(MMDocument doc, String trxName)
|
||||
|
|
|
@ -519,7 +519,7 @@ public class VAttributeGrid extends CPanel
|
|||
formatted = "";
|
||||
if (m_M_Warehouse_ID != 0)
|
||||
{
|
||||
BigDecimal qty = MStorageReservation.getQtyAvailable(m_M_Warehouse_ID, 0, M_Product_ID, 0, null);
|
||||
BigDecimal qty = MStorageReservation.getQtyAvailable(m_M_Warehouse_ID, M_Product_ID, 0, null);
|
||||
if (qty == null)
|
||||
formatted = "-";
|
||||
else
|
||||
|
|
|
@ -512,7 +512,7 @@ public class InfoPAttribute extends CDialog
|
|||
// finish Instance Attributes
|
||||
if (sb.length() > 0)
|
||||
{
|
||||
sb.insert(0, " AND EXISTS (SELECT * FROM M_Storage s"
|
||||
sb.insert(0, " AND EXISTS (SELECT * FROM M_StorageOnHand s"
|
||||
+ " INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) "
|
||||
+ "WHERE s.M_Product_ID=p.M_Product_ID");
|
||||
sb.append(")");
|
||||
|
|
|
@ -1246,7 +1246,7 @@ public class InfoProduct extends Info implements ActionListener, ChangeListener
|
|||
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
|
||||
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
|
||||
sql += " w.Name, l.Value "
|
||||
+ "FROM M_Storage s"
|
||||
+ "FROM M_StorageOnHand s"
|
||||
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
|
||||
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
|
||||
+ "WHERE M_Product_ID=?";
|
||||
|
|
|
@ -566,7 +566,7 @@ public class InvoiceHistory extends CDialog
|
|||
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
|
||||
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
|
||||
sql += " w.Name, l.Value "
|
||||
+ "FROM M_Storage s"
|
||||
+ "FROM M_StorageOnHand s"
|
||||
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
|
||||
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
|
||||
+ "WHERE M_Product_ID=?";
|
||||
|
|
|
@ -178,7 +178,7 @@ public class PAttributeInstance extends CDialog
|
|||
new ColumnInfo(Msg.translate(Env.getCtx(), "ShelfLifeRemainingPct"), "CASE WHEN p.GuaranteeDays > 0 THEN TRUNC(((daysbetween(asi.GuaranteeDate, SYSDATE))/p.GuaranteeDays)*100) ELSE 0 END", Integer.class),
|
||||
};
|
||||
/** From Clause */
|
||||
private static String s_sqlFrom = "M_Storage s"
|
||||
private static String s_sqlFrom = "M_StorageOnHand s"
|
||||
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
|
||||
+ " INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)"
|
||||
+ " LEFT OUTER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)";
|
||||
|
|
|
@ -456,7 +456,7 @@ public class VLocator extends JComponent
|
|||
sql.append(" AND (IsDefault='Y' ") // Default Locator
|
||||
.append("OR EXISTS (SELECT * FROM M_Product p ") // Product Locator
|
||||
.append("WHERE p.M_Locator_ID=M_Locator.M_Locator_ID AND p.M_Product_ID=?)")
|
||||
.append("OR EXISTS (SELECT * FROM M_Storage s ") // Storage Locator
|
||||
.append("OR EXISTS (SELECT * FROM M_StorageOnHand s ") // Storage Locator
|
||||
.append("WHERE s.M_Locator_ID=M_Locator.M_Locator_ID AND s.M_Product_ID=?))");
|
||||
String finalSql = MRole.getDefault(Env.getCtx(), false).addAccessSQL(
|
||||
sql.toString(), "M_Locator", MRole.SQL_NOTQUALIFIED, MRole.SQL_RO);
|
||||
|
|
|
@ -349,7 +349,7 @@ public class WLocatorEditor extends WEditor implements EventListener<Event>, Pro
|
|||
sql.append(" AND (IsDefault='Y' ") // Default Locator
|
||||
.append("OR EXISTS (SELECT * FROM M_Product p ") // Product Locator
|
||||
.append("WHERE p.M_Locator_ID=M_Locator.M_Locator_ID AND p.M_Product_ID=?)")
|
||||
.append("OR EXISTS (SELECT * FROM M_Storage s ") // Storage Locator
|
||||
.append("OR EXISTS (SELECT * FROM M_StorageOnHand s ") // Storage Locator
|
||||
.append("WHERE s.M_Locator_ID=M_Locator.M_Locator_ID AND s.M_Product_ID=?))");
|
||||
|
||||
String finalSql = MRole.getDefault(Env.getCtx(), false).addAccessSQL(
|
||||
|
|
|
@ -166,7 +166,7 @@ public class InfoPAttributeInstancePanel extends Window implements EventListener
|
|||
new ColumnInfo(Msg.translate(Env.getCtx(), "ShelfLifeRemainingPct"), "CASE WHEN p.GuaranteeDays > 0 THEN TRUNC(((daysbetween(asi.GuaranteeDate, SYSDATE))/p.GuaranteeDays)*100) ELSE 0 END", Integer.class),
|
||||
};
|
||||
/** From Clause */
|
||||
private static String s_sqlFrom = "M_Storage s"
|
||||
private static String s_sqlFrom = "M_StorageOnHand s"
|
||||
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
|
||||
+ " INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)"
|
||||
+ " LEFT OUTER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)";
|
||||
|
|
|
@ -614,7 +614,7 @@ public class InfoPAttributePanel extends Window implements EventListener
|
|||
// finish Instance Attributes
|
||||
if (sb.length() > 0)
|
||||
{
|
||||
sb.insert(0, " AND EXISTS (SELECT * FROM M_Storage s"
|
||||
sb.insert(0, " AND EXISTS (SELECT * FROM M_StorageOnHand s"
|
||||
+ " INNER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID) "
|
||||
+ "WHERE s.M_Product_ID=p.M_Product_ID");
|
||||
sb.append(")");
|
||||
|
|
|
@ -1453,7 +1453,7 @@ public class InfoProductPanel extends InfoPanel implements EventListener
|
|||
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
|
||||
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
|
||||
sql += " w.Name, l.Value "
|
||||
+ "FROM M_Storage s"
|
||||
+ "FROM M_StorageOnHand s"
|
||||
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
|
||||
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
|
||||
+ "WHERE M_Product_ID=?";
|
||||
|
|
|
@ -599,7 +599,7 @@ public class InvoiceHistory extends Window implements EventListener
|
|||
sql = "SELECT SUM(s.QtyOnHand), SUM(s.QtyReserved), SUM(s.QtyOrdered),"
|
||||
+ " productAttribute(s.M_AttributeSetInstance_ID), 0,";
|
||||
sql += " w.Name, l.Value "
|
||||
+ "FROM M_Storage s"
|
||||
+ "FROM M_StorageOnHand s"
|
||||
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
|
||||
+ " INNER JOIN M_Warehouse w ON (l.M_Warehouse_ID=w.M_Warehouse_ID) "
|
||||
+ "WHERE M_Product_ID=?";
|
||||
|
|
|
@ -173,7 +173,7 @@ public class WPAttributeInstance extends Window implements EventListener
|
|||
new ColumnInfo(Msg.translate(Env.getCtx(), "ShelfLifeRemainingPct"), "CASE WHEN p.GuaranteeDays > 0 THEN TRUNC(((daysbetween(asi.GuaranteeDate, SYSDATE))/p.GuaranteeDays)*100) ELSE 0 END", Integer.class),
|
||||
};
|
||||
/** From Clause */
|
||||
private static String s_sqlFrom = "M_Storage s"
|
||||
private static String s_sqlFrom = "M_StorageOnHand s"
|
||||
+ " INNER JOIN M_Locator l ON (s.M_Locator_ID=l.M_Locator_ID)"
|
||||
+ " INNER JOIN M_Product p ON (s.M_Product_ID=p.M_Product_ID)"
|
||||
+ " LEFT OUTER JOIN M_AttributeSetInstance asi ON (s.M_AttributeSetInstance_ID=asi.M_AttributeSetInstance_ID)";
|
||||
|
|
Loading…
Reference in New Issue