} // prepareTable /// <summary> /// Fill Table /// </summary> /// <param name="wh">warehouse</param> private void FillTable(MWarehouse wh) { String sql = "INSERT INTO T_Replenish " + "(AD_PInstance_ID, M_Warehouse_ID, M_Product_ID, AD_Client_ID, AD_Org_ID," + " ReplenishType, Level_Min, Level_Max, QtyOnHand,QtyReserved,QtyOrdered," + " C_BPartner_ID, Order_Min, Order_Pack, QtyToOrder, ReplenishmentCreate) " + "SELECT " + GetAD_PInstance_ID() + ", r.M_Warehouse_ID, r.M_Product_ID, r.AD_Client_ID, r.AD_Org_ID," + " r.ReplenishType, r.Level_Min, r.Level_Max, 0,0,0," + " po.C_BPartner_ID, po.Order_Min, po.Order_Pack, 0, "; if (_ReplenishmentCreate == null) { sql += "null"; } else { sql += "'" + _ReplenishmentCreate + "'"; } sql += " FROM M_Replenish r" + " INNER JOIN M_Product_PO po ON (r.M_Product_ID=po.M_Product_ID) " + "WHERE po.IsCurrentVendor='Y'" // Only Current Vendor + " AND r.ReplenishType<>'0'" + " AND po.IsActive='Y' AND r.IsActive='Y'" + " AND r.M_Warehouse_ID=" + _M_Warehouse_ID; if (_C_BPartner_ID != 0 && _C_BPartner_ID != -1) { sql += " AND po.C_BPartner_ID=" + _C_BPartner_ID; } int no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); log.Finest(sql); log.Fine("Insert (1) #" + no); if (_C_BPartner_ID == 0 || _C_BPartner_ID == -1) { sql = "INSERT INTO T_Replenish " + "(AD_PInstance_ID, M_Warehouse_ID, M_Product_ID, AD_Client_ID, AD_Org_ID," + " ReplenishType, Level_Min, Level_Max," + " C_BPartner_ID, Order_Min, Order_Pack, QtyToOrder, ReplenishmentCreate) " + "SELECT " + GetAD_PInstance_ID() + ", r.M_Warehouse_ID, r.M_Product_ID, r.AD_Client_ID, r.AD_Org_ID," + " r.ReplenishType, r.Level_Min, r.Level_Max," //jz + " null, 1, 1, 0, "; + DataBase.DB.NULL("I", Types.VARCHAR) + " , 1, 1, 0, "; if (_ReplenishmentCreate == null) { sql += "null"; } else { sql += "'" + _ReplenishmentCreate + "'"; } sql += " FROM M_Replenish r " + "WHERE r.ReplenishType<>'0' AND r.IsActive='Y'" + " AND r.M_Warehouse_ID=" + _M_Warehouse_ID + " AND NOT EXISTS (SELECT * FROM T_Replenish t " + "WHERE r.M_Product_ID=t.M_Product_ID" + " AND AD_PInstance_ID=" + GetAD_PInstance_ID() + ")"; no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); log.Fine("Insert (BP) #" + no); } sql = "UPDATE T_Replenish t SET " + "QtyOnHand = (SELECT COALESCE(SUM(QtyOnHand),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID" + " AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID)," + "QtyReserved = (SELECT COALESCE(SUM(QtyReserved),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID" + " AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID)," + "QtyOrdered = (SELECT COALESCE(SUM(QtyOrdered),0) FROM M_Storage s, M_Locator l WHERE t.M_Product_ID=s.M_Product_ID" + " AND l.M_Locator_ID=s.M_Locator_ID AND l.M_Warehouse_ID=t.M_Warehouse_ID)"; if (_C_DocType_ID != 0 && _C_DocType_ID != -1) { sql += ", C_DocType_ID=" + _C_DocType_ID; } sql += " WHERE AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Update #" + no); } // Delete inactive products and replenishments sql = "DELETE FROM T_Replenish r " + "WHERE (EXISTS (SELECT * FROM M_Product p " + "WHERE p.M_Product_ID=r.M_Product_ID AND p.IsActive='N')" + " OR EXISTS (SELECT * FROM M_Replenish rr " + " WHERE rr.M_Product_ID=r.M_Product_ID AND rr.M_Warehouse_ID=r.M_Warehouse_ID AND rr.IsActive='N'))" + " AND AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Delete Inactive=" + no); } // Ensure Data consistency sql = "UPDATE T_Replenish SET QtyOnHand = 0 WHERE QtyOnHand IS NULL"; no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); sql = "UPDATE T_Replenish SET QtyReserved = 0 WHERE QtyReserved IS NULL"; no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); sql = "UPDATE T_Replenish SET QtyOrdered = 0 WHERE QtyOrdered IS NULL"; no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); // Set Minimum / Maximum Maintain Level // X_M_Replenish.REPLENISHTYPE_ReorderBelowMinimumLevel sql = "UPDATE T_Replenish" + " SET QtyToOrder = Level_Min - QtyOnHand + QtyReserved - QtyOrdered " + "WHERE ReplenishType='1'" + " AND AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Update Type-1=" + no); } // // X_M_Replenish.REPLENISHTYPE_MaintainMaximumLevel sql = "UPDATE T_Replenish" + " SET QtyToOrder = Level_Max - QtyOnHand + QtyReserved - QtyOrdered " + "WHERE ReplenishType='2'" + " AND AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Update Type-2=" + no); } //dtd // Delete rows where nothing to order sql = "DELETE FROM T_Replenish " + "WHERE QtyToOrder < 1" + " AND AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Delete No QtyToOrder=" + no); } //dtd// Minimum Order Quantity //sql = "UPDATE T_Replenish" // + " SET QtyToOrder = Order_Min " // + "WHERE QtyToOrder < Order_Min" // + " AND AD_PInstance_ID=" + GetAD_PInstance_ID(); //no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); //if (no != 0) //{ // log.Fine("Set MinOrderQty=" + no); //} // Even dividable by Pack sql = "UPDATE T_Replenish" + " SET QtyToOrder = QtyToOrder - MOD(QtyToOrder, Order_Pack) + Order_Pack " + "WHERE MOD(QtyToOrder, Order_Pack) <> 0" + " AND AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Set OrderPackQty=" + no); } // Source from other warehouse if (wh.GetM_WarehouseSource_ID() != 0) { sql = "UPDATE T_Replenish" + " SET M_WarehouseSource_ID=" + wh.GetM_WarehouseSource_ID() + " WHERE AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Set Warehouse Source Warehouse=" + no); } } // Replenishment on Product level overwrites sql = "UPDATE T_Replenish " + "SET M_WarehouseSource_ID=(SELECT M_WarehouseSource_ID FROM M_Replenish r " + "WHERE r.M_Product_ID=T_Replenish.M_Product_ID" + " AND r.M_Warehouse_ID=" + _M_Warehouse_ID + ")" + "WHERE AD_PInstance_ID=" + GetAD_PInstance_ID() + " AND EXISTS (SELECT * FROM M_Replenish r " + "WHERE r.M_Product_ID=T_Replenish.M_Product_ID" + " AND r.M_Warehouse_ID=" + _M_Warehouse_ID + " AND r.M_WarehouseSource_ID > 0)"; no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Set Product Source Warehouse=" + no); } // Check Source Warehouse sql = "UPDATE T_Replenish" + " SET M_WarehouseSource_ID = NULL " + "WHERE M_Warehouse_ID=M_WarehouseSource_ID" + " AND AD_PInstance_ID=" + GetAD_PInstance_ID(); no = DataBase.DB.ExecuteQuery(sql, null, Get_TrxName()); if (no != 0) { log.Fine("Set same Source Warehouse=" + no); } // Custom Replenishment String className = wh.GetReplenishmentClass(); if (className == null || className.Length == 0) { return; } // Get Replenishment Class ReplenishInterface custom = null; try { //Class<?> clazz = Class.forName(className); Type clazz = Type.GetType(className); custom = (ReplenishInterface)Activator.CreateInstance(clazz);//.newInstance(); } catch (Exception e) { throw new Exception("No custom Replenishment class " + className + " - " + e.ToString()); } X_T_Replenish[] replenishs = GetReplenish("ReplenishType='9'"); for (int i = 0; i < replenishs.Length; i++) { X_T_Replenish replenish = replenishs[i]; if (replenish.GetReplenishType().Equals(X_T_Replenish.REPLENISHTYPE_Custom)) { Decimal?qto = null; try { qto = custom.GetQtyToOrder(wh, replenish); } catch (Exception e) { log.Log(Level.SEVERE, custom.ToString(), e); } if (qto == null) { qto = Env.ZERO; } replenish.SetQtyToOrder(qto); replenish.Save(); } } // fillTable }