Fix MRP bugs with multi organization

This commit is contained in:
vpj-cd 2008-09-25 21:43:19 +00:00
parent 496aa7e25f
commit 15e1126852
6 changed files with 61 additions and 54 deletions

View File

@ -109,7 +109,8 @@ public class MPPMRP extends X_PP_MRP
.first();
if (mrp == null)
{
mrp = new MPPMRP(ctx, 0, trxName);
mrp = new MPPMRP(ctx, 0, trxName);
mrp.setAD_Org_ID(fl.getAD_Org_ID());
mrp.setM_Forecast_ID(fl.getM_Forecast_ID());
mrp.setM_ForecastLine_ID(fl.getM_ForecastLine_ID());
mrp.setOrderType(MPPMRP.ORDERTYPE_Forecast);
@ -188,7 +189,8 @@ public class MPPMRP extends X_PP_MRP
.first();
if(mrp == null)
{
mrp = new MPPMRP(ctx, 0,trxName);
mrp = new MPPMRP(ctx, 0,trxName);
mrp.setAD_Org_ID(ol.getAD_Org_ID());
mrp.setC_Order_ID(ol.getC_Order_ID());
mrp.setC_OrderLine_ID(ol.getC_OrderLine_ID());
if (ol.getParent().isSOTrx())
@ -303,7 +305,8 @@ public class MPPMRP extends X_PP_MRP
.first();
if(mrp == null)
{
mrp = new MPPMRP(m_ctx, 0, trxName);
mrp = new MPPMRP(m_ctx, 0, trxName);
mrp.setAD_Org_ID(o.getAD_Org_ID());
mrp.setPP_Order_ID(o.getPP_Order_ID());
mrp.setTypeMRP(MPPMRP.TYPEMRP_Supply);
mrp.setOrderType(MPPMRP.ORDERTYPE_ManufacturingOrder);
@ -345,7 +348,8 @@ public class MPPMRP extends X_PP_MRP
MPPOrder o = obl.getParent();
if(mrp == null)
{
mrp = new MPPMRP(ctx, 0, trxName);
mrp = new MPPMRP(ctx, 0, trxName);
mrp.setAD_Org_ID(obl.getAD_Org_ID());
mrp.setPP_Order_BOMLine_ID(obl.getPP_Order_BOMLine_ID());
mrp.setPP_Order_ID(o.getPP_Order_ID());
mrp.setOrderType(MPPMRP.ORDERTYPE_ManufacturingOrder);
@ -496,6 +500,7 @@ public class MPPMRP extends X_PP_MRP
if (mrp == null)
{
mrp = new MPPMRP(ctx, 0, trxName);
mrp.setAD_Org_ID(r.getAD_Org_ID());
mrp.setM_Requisition_ID(rl.getM_Requisition_ID());
mrp.setM_RequisitionLine_ID(rl.getM_RequisitionLine_ID());
mrp.setOrderType(MPPMRP.ORDERTYPE_MaterialRequisition);

View File

@ -338,6 +338,7 @@ public class MPPOrder extends X_PP_Order implements DocAction
if (PP_Product_BOM.isValidFromTo(getDateStartSchedule()))
{
MPPOrderBOM PP_Order_BOM = new MPPOrderBOM(PP_Product_BOM, getPP_Order_ID(), get_TrxName());
PP_Order_BOM.setAD_Org_ID(getAD_Org_ID());
PP_Order_BOM.saveEx();
for (MPPProductBOMLine PP_Product_BOMline : PP_Product_BOM.getLines())
@ -348,6 +349,7 @@ public class MPPOrder extends X_PP_Order implements DocAction
getPP_Order_ID(), PP_Order_BOM.get_ID(),
getM_Warehouse_ID(),
get_TrxName());
PP_Order_BOMLine.setAD_Org_ID(getAD_Org_ID());
PP_Order_BOMLine.setQtyOrdered(getQtyOrdered());
PP_Order_BOMLine.saveEx();
} // end if valid From / To
@ -360,6 +362,7 @@ public class MPPOrder extends X_PP_Order implements DocAction
if (AD_Workflow.isValidFromTo(getDateStartSchedule()))
{
MPPOrderWorkflow PP_Order_Workflow = new MPPOrderWorkflow(AD_Workflow, get_ID(), get_TrxName());
PP_Order_Workflow.setAD_Org_ID(getAD_Org_ID());
PP_Order_Workflow.saveEx();
for (MWFNode AD_WF_Node : AD_Workflow.getNodes(false, getAD_Client_ID()))
{
@ -368,11 +371,14 @@ public class MPPOrder extends X_PP_Order implements DocAction
MPPOrderNode PP_Order_Node = new MPPOrderNode(AD_WF_Node, PP_Order_Workflow,
getQtyOrdered(),
get_TrxName());
PP_Order_Node.setAD_Org_ID(getAD_Org_ID());
PP_Order_Node.saveEx();
for (MWFNodeNext AD_WF_NodeNext : AD_WF_Node.getTransitions(getAD_Client_ID()))
{
new MPPOrderNodeNext(AD_WF_NodeNext, PP_Order_Node, get_TrxName()).saveEx();
MPPOrderNodeNext nodenext = new MPPOrderNodeNext(AD_WF_NodeNext, PP_Order_Node, get_TrxName());
nodenext.setAD_Org_ID(getAD_Org_ID());
nodenext.saveEx();
}// for NodeNext
}// for node

View File

@ -158,6 +158,7 @@ public class MPPOrderBOMLine extends X_PP_Order_BOMLine
getPP_Order_ID(), getPP_Order_BOM_ID(),
getM_Warehouse_ID(),
get_TrxName());
PP_Order_BOMLine.setAD_Org_ID(getAD_Org_ID());
PP_Order_BOMLine.setQtyOrdered(m_qtyToExplode);
PP_Order_BOMLine.saveEx();
}

View File

@ -139,8 +139,7 @@ public class DistributionRunOrders extends SvrProcess
m_run.save();
StringBuffer sql = new StringBuffer("SELECT M_Product_ID , SUM (QtyOrdered-QtyDelivered) AS TotalQty, l.M_Warehouse_ID FROM DD_OrderLine ol INNER JOIN M_Locator l ON (l.M_Locator_ID=ol.M_Locator_ID) INNER JOIN DD_Order o ON (o.DD_Order_ID=ol.DD_Order_ID) ");
//sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised BETWEEN ? AND ? AND l.M_Warehouse_ID=? GROUP BY M_Product_ID, l.M_Warehouse_ID");
sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised <= ? AND l.M_Warehouse_ID=? GROUP BY M_Product_ID, l.M_Warehouse_ID");
sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised <= ? AND l.M_Warehouse_ID=? GROUP BY M_Product_ID");
PreparedStatement pstmt = null;
ResultSet rs = null;
@ -193,13 +192,12 @@ public class DistributionRunOrders extends SvrProcess
//Create Distribution Run Line
public boolean generateDistributionDemand()
{
m_run = new MDistributionRun(this.getCtx(), 0 , this.get_TrxName());
m_run = new MDistributionRun(this.getCtx(), 0 , null);
m_run.setName("Generate from DRP " + p_DatePromised);
m_run.save();
StringBuffer sql = new StringBuffer("SELECT M_Product_ID , SUM (TargetQty) AS MinQty, SUM (QtyOrdered-QtyDelivered) AS TotalQty, l.M_Warehouse_ID FROM DD_OrderLine ol INNER JOIN M_Locator l ON (l.M_Locator_ID=ol.M_Locator_ID) INNER JOIN DD_Order o ON (o.DD_Order_ID=ol.DD_Order_ID) ");
//sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised BETWEEN ? AND ? AND l.M_Warehouse_ID=? GROUP BY M_Product_ID, l.M_Warehouse_ID");
sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised <= ? AND l.M_Warehouse_ID=? GROUP BY M_Product_ID, l.M_Warehouse_ID");
StringBuffer sql = new StringBuffer("SELECT M_Product_ID , SUM (TargetQty) AS MinQty, SUM (QtyOrdered-QtyDelivered) AS TotalQty FROM DD_OrderLine ol INNER JOIN M_Locator l ON (l.M_Locator_ID=ol.M_Locator_ID) INNER JOIN DD_Order o ON (o.DD_Order_ID=ol.DD_Order_ID) ");
sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised <= ? AND l.M_Warehouse_ID=? GROUP BY M_Product_ID");
PreparedStatement pstmt = null;
ResultSet rs = null;
try
@ -215,7 +213,7 @@ public class DistributionRunOrders extends SvrProcess
{
int M_Product_ID = rs.getInt("M_Product_ID");
BigDecimal QtyAvailable = MStorage.getQtyAvailable(p_M_Warehouse_ID,0 , M_Product_ID , 0, get_TrxName());
if(QtyAvailable.signum()< 0)
if(QtyAvailable.signum()<= 0)
continue;
BigDecimal QtyToDistribute = rs.getBigDecimal("TotalQty");
if(QtyAvailable.compareTo(QtyToDistribute) >= 0)
@ -226,6 +224,9 @@ public class DistributionRunOrders extends SvrProcess
QtyToDistribute = QtyAvailable.subtract(QtyReserved);
}
//if(QtyToDistribute.equals(Env.ZERO))
// continue;
MDistributionRunLine m_runLine = new MDistributionRunLine(getCtx(),0 ,get_TrxName());
m_runLine.setM_DistributionRun_ID(m_run.getM_DistributionRun_ID());
m_runLine.setAD_Org_ID(p_AD_Org_ID);
@ -263,26 +264,7 @@ public class DistributionRunOrders extends SvrProcess
private BigDecimal getTargetQty(int M_Product_ID)
{
StringBuffer sql = new StringBuffer("SELECT SUM (TargetQty) FROM DD_OrderLine ol INNER JOIN M_Locator l ON (l.M_Locator_ID=ol.M_Locator_ID) INNER JOIN DD_Order o ON (o.DD_Order_ID=ol.DD_Order_ID) ");
//sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised BETWEEN ? AND ? AND l.M_Warehouse_ID=? AND ol.M_Product_ID=? GROUP BY M_Product_ID, l.M_Warehouse_ID");
sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised <= ? AND l.M_Warehouse_ID=? AND ol.M_Product_ID=? GROUP BY M_Product_ID, l.M_Warehouse_ID");
BigDecimal qty = DB.getSQLValueBD(get_TrxName(), sql.toString(), new Object[]{p_DatePromised, p_M_Warehouse_ID, M_Product_ID});
// SQL may return no rows or null
if (qty == null)
return Env.ZERO;
return qty;
}
/**
* Set Qty TargetQty for a Warehouse
* @param M_Product_ID
* @return
*/
private BigDecimal setTargetQty(int M_Product_ID)
{
StringBuffer sql = new StringBuffer("SELECT SUM(Qty) FROM PP_MRP mrp "
+"WHERE TypeMRP='D' AND OrderType='SOO' AND DocStatus IN ('IN','CO') AND mrp.DatePromised <=? "
+"AND mrp.M_Warehouse_ID =? AND M_Product_ID=? GROUP BY M_Product_ID, l.M_Warehouse_ID");
sql.append(" WHERE o.DocStatus IN ('DR','IN') AND ol.DatePromised <= ? AND l.M_Warehouse_ID=? AND ol.M_Product_ID=? GROUP BY M_Product_ID");
BigDecimal qty = DB.getSQLValueBD(get_TrxName(), sql.toString(), new Object[]{p_DatePromised, p_M_Warehouse_ID, M_Product_ID});
// SQL may return no rows or null
if (qty == null)
@ -385,6 +367,7 @@ public class DistributionRunOrders extends SvrProcess
String msg = "No Parameter added"; // not translated
throw new Exception(msg,CLogger.retrieveException());
}
// Execute Process
MProcess worker = new MProcess(getCtx(),AD_Process_ID,get_TrxName());
worker.processIt(pi, Trx.get(get_TrxName(), true));

View File

@ -262,9 +262,16 @@ public class MRP extends SvrProcess
commit();
// Delete Requisition with Status Close from MRP Table
sql = "DELETE FROM PP_MRP WHERE OrderType = 'POR' AND DocStatus='CL' AND AD_Client_ID = " + AD_Client_ID + " AND AD_Org_ID=" + AD_Org_ID+ " AND M_Warehouse_ID="+M_Warehouse_ID + " AND S_Resource_ID="+S_Resource_ID;
sql = "DELETE FROM PP_MRP WHERE OrderType = 'POR' AND DocStatus IN ('CL','DR') AND AD_Client_ID = " + AD_Client_ID + " AND AD_Org_ID=" + AD_Org_ID+ " AND M_Warehouse_ID="+M_Warehouse_ID;
DB.executeUpdateEx(sql, get_TrxName());
commit();
//Delete Requisition with Draft Status
String whereClause = "DocStatus IN ('CL','DR') AND AD_Client_ID=? AND AD_Org_ID=? AND M_Warehouse_ID=?";
deletePO(MRequisition.Table_Name, whereClause, new Object[]{AD_Client_ID, AD_Org_ID, M_Warehouse_ID});
commit();
// Delete Action Notice
sql = "DELETE FROM AD_Note WHERE AD_Table_ID=? AND AD_Client_ID=? AND AD_Org_ID=?";
@ -274,19 +281,17 @@ public class MRP extends SvrProcess
if (p_IsRequiredDRP)
{
//Delete Distribution Order with Draft Status
String whereClause = "DocStatus='DR' AND AD_Client_ID=? AND AD_Org_ID=?"
whereClause = "DocStatus='DR' AND AD_Client_ID=? AND AD_Org_ID=?"
+" AND EXISTS (SELECT 1 FROM DD_OrderLine ol INNER JOIN M_Locator l ON (l.M_Locator_ID=ol.M_LocatorTo_ID) "
+" WHERE ol.DD_Order_ID=DD_Order.DD_Order_ID AND l.M_Warehouse_ID=?)";
deletePO(MDDOrder.Table_Name, whereClause, new Object[]{AD_Client_ID, AD_Org_ID, M_Warehouse_ID});
}
//Delete Manufacturing Order with Draft Status
String whereClause = "DocStatus='DR' AND AD_Client_ID=? AND AD_Org_ID=? AND M_Warehouse_ID=? AND S_Resource_ID=?";
whereClause = "DocStatus='DR' AND AD_Client_ID=? AND AD_Org_ID=? AND M_Warehouse_ID=? AND S_Resource_ID=?";
deletePO(MPPOrder.Table_Name, whereClause, new Object[]{AD_Client_ID, AD_Org_ID, M_Warehouse_ID, S_Resource_ID});
//Delete Requisition with Draft Status
whereClause = "DocStatus='DR' AND AD_Client_ID=? AND AD_Org_ID=? AND M_Warehouse_ID=?";
deletePO(MRequisition.Table_Name, whereClause, new Object[]{AD_Client_ID, AD_Org_ID, M_Warehouse_ID});
}
/**************************************************************************
@ -342,6 +347,9 @@ public class MRP extends SvrProcess
String OrderType = rs.getString(MPPMRP.COLUMNNAME_OrderType);
Timestamp DatePromised = rs.getTimestamp(MPPMRP.COLUMNNAME_DatePromised);
Timestamp DateStartSchedule = rs.getTimestamp(MPPMRP.COLUMNNAME_DateStartSchedule);
if(DateStartSchedule != null)
BeforeDateStartSchedule = DateStartSchedule;
// if demand is a forecast and this is minor today then is ignore this QtyGrossReq
if (MPPMRP.TYPEMRP_Demand.equals(TypeMRP)
@ -357,7 +365,7 @@ public class MRP extends SvrProcess
//if exist QtyGrossReq of last Demand verify plan
if (QtyGrossReqs.signum() != 0)
{
calculatePlan(BeforePP_MRP_ID, product, QtyGrossReqs ,BeforeDateStartSchedule);
calculatePlan(AD_Org_ID, BeforePP_MRP_ID, product, QtyGrossReqs ,BeforeDateStartSchedule);
QtyGrossReqs = Env.ZERO;
}
@ -384,14 +392,13 @@ public class MRP extends SvrProcess
// If No Product Planning found, go to next MRP record
if (m_product_planning == null)
continue;
BeforeDateStartSchedule = DateStartSchedule;
BeforePP_MRP_ID = rs.getInt("PP_MRP_ID");
BeforePP_MRP_ID = rs.getInt(MPPMRP.COLUMNNAME_PP_MRP_ID);
// Create Notice for Demand due
if(DatePromised.compareTo(Today) < 0)
{
createMRPNote("MRP-040", rs.getInt("PP_MRP_ID"), product);
createMRPNote("MRP-040", rs.getInt(MPPMRP.COLUMNNAME_PP_MRP_ID), product);
}
if (MPPProductPlanning.ORDER_POLICY_PeriodOrderQuantity.equals(m_product_planning.getOrder_Policy()))
@ -405,7 +412,8 @@ public class MRP extends SvrProcess
}
else
{ // if not then create new range for next period
calculatePlan(rs.getInt("PP_MRP_ID"),product, QtyGrossReqs ,POQDateStartSchedule);
BeforeDateStartSchedule = POQDateStartSchedule;
calculatePlan(AD_Org_ID,rs.getInt(MPPMRP.COLUMNNAME_PP_MRP_ID),product, QtyGrossReqs ,BeforeDateStartSchedule);
QtyGrossReqs = rs.getBigDecimal(MPPMRP.COLUMNNAME_Qty);
DatePromisedFrom = DatePromised;
DatePromisedTo = TimeUtil.addDays(DatePromised, m_product_planning.getOrder_Period().intValue());
@ -417,7 +425,8 @@ public class MRP extends SvrProcess
else if (MPPProductPlanning.ORDER_POLICY_LoteForLote.equals(m_product_planning.getOrder_Policy()))
{
QtyGrossReqs = rs.getBigDecimal(MPPMRP.COLUMNNAME_Qty);
calculatePlan(rs.getInt("PP_MRP_ID"),product, QtyGrossReqs , rs.getTimestamp("DateStartSchedule"));
BeforeDateStartSchedule = rs.getTimestamp(MPPMRP.COLUMNNAME_DateStartSchedule);
calculatePlan(AD_Org_ID,rs.getInt(MPPMRP.COLUMNNAME_PP_MRP_ID),product,QtyGrossReqs,BeforeDateStartSchedule);
continue;
}
} // end while
@ -425,7 +434,7 @@ public class MRP extends SvrProcess
//if exist QtyGrossReq of last Demand after finish while verify plan
if (QtyGrossReqs.signum() != 0)
{
calculatePlan(BeforePP_MRP_ID , product, QtyGrossReqs ,BeforeDateStartSchedule);
calculatePlan(AD_Org_ID,BeforePP_MRP_ID , product, QtyGrossReqs ,BeforeDateStartSchedule);
}
DB.close(rs, pstmt);
@ -558,7 +567,7 @@ public class MRP extends SvrProcess
* @param Qty Qty
* @param DemandDateStartSchedule Demand Date Start Schedule
*/
private void calculatePlan(int PP_MPR_ID , MProduct product , BigDecimal Qty, Timestamp DemandDateStartSchedule)
private void calculatePlan(int AD_Org_ID , int PP_MPR_ID , MProduct product , BigDecimal Qty, Timestamp DemandDateStartSchedule)
{
if (m_product_planning.isCreatePlan() == false)
return;
@ -644,17 +653,17 @@ public class MRP extends SvrProcess
// Distribution Order
if(p_IsRequiredDRP && m_product_planning.getDD_NetworkDistribution_ID() > 0)
{
createDDOrder(PP_MPR_ID, product, DemandDateStartSchedule);
createDDOrder(AD_Org_ID,PP_MPR_ID, product, DemandDateStartSchedule);
}
// Requisition
else if (product.isPurchased()) // then create M_Requisition
{
createRequisition(PP_MPR_ID, product, DemandDateStartSchedule);
createRequisition(AD_Org_ID,PP_MPR_ID, product, DemandDateStartSchedule);
}
// Manufacturing Order
else if (product.isBOM())
{
createPPOrder(PP_MPR_ID, product, DemandDateStartSchedule);
createPPOrder(AD_Org_ID, PP_MPR_ID, product, DemandDateStartSchedule);
}
} // end for oqf
}
@ -664,7 +673,7 @@ public class MRP extends SvrProcess
}
}
private void createDDOrder(int PP_MRP_ID, MProduct product, Timestamp DemandDateStartSchedule)
private void createDDOrder(int AD_Org_ID, int PP_MRP_ID, MProduct product, Timestamp DemandDateStartSchedule)
{
MDDNetworkDistribution network = MDDNetworkDistribution.get(getCtx(),m_product_planning.getDD_NetworkDistribution_ID());
@ -786,7 +795,7 @@ public class MRP extends SvrProcess
commit();
}
private void createRequisition(int PP_MRP_ID, MProduct product, Timestamp DemandDateStartSchedule)
private void createRequisition(int AD_Org_ID , int PP_MRP_ID, MProduct product, Timestamp DemandDateStartSchedule)
{
log.info("Create Requisition");
@ -795,6 +804,7 @@ public class MRP extends SvrProcess
+ m_product_planning.getTransfertTime().intValue();
MRequisition req = new MRequisition(getCtx(),0, get_TrxName());
req.setAD_Org_ID(AD_Org_ID);
req.setAD_User_ID(m_product_planning.getPlanner_ID());
req.setDateRequired(TimeUtil.addDays(DemandDateStartSchedule, 0 - duration));
req.setDescription("Generate from MRP"); // TODO: add translation
@ -807,6 +817,7 @@ public class MRP extends SvrProcess
MRequisitionLine reqline = new MRequisitionLine(req);
reqline.setLine(10);
reqline.setAD_Org_ID(AD_Org_ID);
reqline.setM_Product_ID(m_product_planning.getM_Product_ID());
reqline.setPrice();
reqline.setPriceActual(Env.ZERO);
@ -831,7 +842,7 @@ public class MRP extends SvrProcess
commit();
}
private void createPPOrder(int PP_MRP_ID, MProduct product, Timestamp DemandDateStartSchedule)
private void createPPOrder(int AD_Org_ID, int PP_MRP_ID, MProduct product, Timestamp DemandDateStartSchedule)
{
log.info("PP_Product_BOM_ID" + m_product_planning.getPP_Product_BOM_ID() + "AD_Workflow_ID" + m_product_planning.getAD_Workflow_ID());
if (m_product_planning.getPP_Product_BOM_ID() == 0 || m_product_planning.getAD_Workflow_ID() == 0)
@ -841,6 +852,7 @@ public class MRP extends SvrProcess
log.info("Manufacturing Order Create");
MPPOrder order = new MPPOrder(getCtx(), 0, get_TrxName());
order.setAD_Org_ID(AD_Org_ID);
order.setLine(10);
order.setC_DocTypeTarget_ID(DocTypeMO);
order.setC_DocType_ID(DocTypeMO);

View File

@ -177,7 +177,7 @@ public class MRPUpdate extends SvrProcess
executeUpdate("DELETE FROM PP_MRP WHERE "+whereClause, params);
//Delete Material Requisitions Document
whereClause = "DocStatus='DR' AND AD_Client_ID=? AND AD_Org_ID=? AND M_Warehouse_ID=?";
whereClause = "DocStatus IN ('DR','CL') AND AD_Client_ID=? AND AD_Org_ID=? AND M_Warehouse_ID=?";
deletePO(MRequisition.Table_Name, whereClause, params);
// Delete Distribution Orders:
deletePO(MDDOrder.Table_Name, whereClause, params);