diff --git a/base/src/org/eevolution/model/LiberoValidator.java b/base/src/org/eevolution/model/LiberoValidator.java index 93aa0aa9ad..28693c23ce 100644 --- a/base/src/org/eevolution/model/LiberoValidator.java +++ b/base/src/org/eevolution/model/LiberoValidator.java @@ -182,10 +182,11 @@ public class LiberoValidator implements ModelValidator if(inout.isSOTrx()) { final String whereClause = "C_OrderLine_ID IS NOT NULL" - +" AND EXISTS (SELECT 1 FROM C_OrderLine ol , M_InOutLine iol" - +" WHERE ol.C_OrderLine_ID=iol.C_OrderLine_ID AND iol.M_InOut_ID=? )"; + +" AND EXISTS (SELECT 1 FROM M_InOutLine iol" + +" WHERE iol.M_InOut_ID=? AND PP_Order.C_OrderLine_ID = iol.C_OrderLine_ID) AND " + + MPPOrder.COLUMNNAME_DocStatus + " = ?"; Collection orders = new Query(po.getCtx(), MPPOrder.Table_Name, whereClause, po.get_TrxName()) - .setParameters(new Object[]{inout.getM_InOut_ID()}) + .setParameters(new Object[]{inout.getM_InOut_ID(), MPPOrder.DOCSTATUS_InProgress}) .list(); for(MPPOrder order : orders) { @@ -199,6 +200,7 @@ public class LiberoValidator implements ModelValidator order.setDocStatus(MPPOrder.DOCACTION_Close); order.setDocAction(MPPOrder.DOCACTION_None); order.saveEx(); + } } } diff --git a/base/src/org/eevolution/model/MPPCostCollector.java b/base/src/org/eevolution/model/MPPCostCollector.java index 6715271f1e..44cceeffb9 100644 --- a/base/src/org/eevolution/model/MPPCostCollector.java +++ b/base/src/org/eevolution/model/MPPCostCollector.java @@ -69,6 +69,88 @@ import org.eevolution.exceptions.ActivityProcessedException; public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction { private static final long serialVersionUID = 1L; + + /** + * Create & Complete Cost Collector + * @param pp_order + * @param M_Product_ID + * @param M_Locator_ID + * @param M_AttributeSetInstance_ID + * @param S_Resource_ID + * @param PP_Order_BOMLine_ID + * @param PP_Order_Node_ID + * @param C_DocType_ID + * @param CostCollectorType + * @param movementdate + * @param qty + * @param scrap + * @param reject + * @param durationSetup + * @param duration + * @param trxName + * @return completed cost collector + */ + public static MPPCostCollector createCollector (MPPOrder pp_order, + int M_Product_ID, + int M_Locator_ID, + int M_AttributeSetInstance_ID, + int S_Resource_ID, + int PP_Order_BOMLine_ID, + int PP_Order_Node_ID, + int C_DocType_ID, + String CostCollectorType, + Timestamp movementdate, + BigDecimal qty, + BigDecimal scrap, + BigDecimal reject, + int durationSetup, + int duration, + String trxName + ) + { + MPPCostCollector cc = new MPPCostCollector(pp_order.getCtx(), 0, trxName); + cc.setPP_Order_ID(pp_order.getPP_Order_ID()); + cc.setPP_Order_BOMLine_ID(PP_Order_BOMLine_ID); + cc.setPP_Order_Workflow_ID(pp_order.getMPPOrderWorkflow().getPP_Order_Workflow_ID()); + cc.setPP_Order_Node_ID(PP_Order_Node_ID); + cc.setAD_OrgTrx_ID(pp_order.getAD_OrgTrx_ID()); + cc.setC_Activity_ID(pp_order.getC_Activity_ID()); + cc.setC_Campaign_ID(pp_order.getC_Campaign_ID()); + cc.setC_DocType_ID(C_DocType_ID); + cc.setC_DocTypeTarget_ID(C_DocType_ID); + cc.setCostCollectorType(CostCollectorType); + cc.setC_Project_ID(pp_order.getC_Project_ID()); + cc.setDescription(pp_order.getDescription()); + cc.setDocAction(MPPCostCollector.ACTION_Complete); + cc.setDocStatus(MPPCostCollector.DOCSTATUS_Drafted); + cc.setIsActive(true); + cc.setM_Warehouse_ID(pp_order.getM_Warehouse_ID()); + cc.setM_Locator_ID(M_Locator_ID); + cc.setM_AttributeSetInstance_ID(M_AttributeSetInstance_ID); + cc.setS_Resource_ID(S_Resource_ID); + cc.setMovementDate(movementdate); + cc.setDateAcct(movementdate); + cc.setMovementQty(qty); + cc.setScrappedQty(scrap); + cc.setQtyReject(reject); + cc.setSetupTimeReal(new BigDecimal(durationSetup)); + cc.setDurationReal(new BigDecimal(duration)); + cc.setPosted(false); + cc.setProcessed(false); + cc.setProcessing(false); + cc.setUser1_ID(pp_order.getUser1_ID()); + cc.setUser2_ID(pp_order.getUser2_ID()); + cc.setM_Product_ID(M_Product_ID); + cc.saveEx(); + if (!cc.processIt(MPPCostCollector.DOCACTION_Complete)) + { + throw new AdempiereException(cc.getProcessMsg()); + } + cc.saveEx(); + return cc; + } + + /** * Standard Constructor @@ -230,20 +312,11 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction activity.setSetupTimeReal(activity.getSetupTimeReal()+getSetupTimeReal().intValue()); activity.saveEx(); - if (MPPOrderNode.isLastNode(getCtx(), getPP_Order_Node_ID(), get_TrxName())) + // report all activity previews to milestone activity + if(activity.isMilestone()) { - final String whereClause ="PP_Order_ID=? AND PP_Order_Node_ID<>?" - +" AND NOT EXISTS (SELECT 1 FROM PP_Cost_Collector cc " - +" WHERE cc.PP_Order_ID=PP_Order_Node.PP_Order_ID" - +" AND cc.PP_Order_Node_ID=PP_Order_Node.PP_Order_Node_ID)"; - List nodes = new Query(getCtx(), MPPOrderNode.Table_Name, whereClause, get_TrxName()) - .setParameters(new Object[]{getPP_Order_ID(),getPP_Order_Node_ID()}) - .setOnlyActiveRecords(true) - .list(); - for (MPPOrderNode node : nodes) - { - createNewNode(node); - } + MPPOrderWorkflow order_workflow = activity.getMPPOrderWorkflow(); + order_workflow.closeActivities(activity, getMovementDate(), true); } } @@ -447,9 +520,10 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction return DocStatus; } setProcessed(true); - setDocAction(DOCACTION_Close); - setDocStatus(DOCSTATUS_Completed); - activity.setDocStatus(DOCSTATUS_Completed); + setDocAction(MPPOrderNode.DOCACTION_Close); + setDocStatus(MPPOrderNode.DOCSTATUS_Completed); + activity.setDocStatus(MPPOrderNode.DOCSTATUS_Completed); + activity.setAction(MPPOrderNode.DOCACTION_None); activity.saveEx(); m_processMsg = Msg.translate(getCtx(), "PP_Order_ID") +":"+ getPP_Order().getDocumentNo() @@ -461,7 +535,8 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction { if(activity.getQtyDelivered().compareTo(activity.getQtyRequiered()) >= 0) { - activity.setDocStatus(DOCSTATUS_Completed); + activity.setDocStatus(MPPOrderNode.DOCSTATUS_Completed); + activity.setAction(MPPOrderNode.DOCACTION_None); activity.saveEx(); } } @@ -484,45 +559,6 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction public boolean closeIt() { log.info("closeIt - " + toString()); - - // Close Not delivered Qty - // fjviejo e-evolution operation activity - // last node translates to => I complete node - if(!MPPOrderNode.isLastNode(getCtx(), getPP_Order_Node_ID(), get_TrxName())) - { - MPPOrderNode onodeact = new MPPOrderNode(Env.getCtx(),getPP_Order_Node_ID(),get_TrxName()); - onodeact.setDocStatus(DOCSTATUS_Closed); - // onodeact.setAction(DOCACTION_None); - onodeact.saveEx(); - - final String whereClause = COLUMNNAME_PP_Order_ID+"=? AND "+COLUMNNAME_PP_Order_Node_ID+"=?"; - List list = new Query(getCtx(), Table_Name, whereClause, get_TrxName()) - .setOnlyActiveRecords(true) - .setParameters(new Object[]{getPP_Order_ID(), getPP_Order_Node_ID()}) - .list(); - for (MPPCostCollector cc : list) - { - cc.setDocStatus(DOCSTATUS_Closed); - cc.setDocAction(DOCACTION_None); - cc.saveEx(); - } - } - else - { - final String whereClause = MPPOrderNode.COLUMNNAME_PP_Order_ID+"=?" - +" AND ("+MPPOrderNode.COLUMNNAME_DocStatus+" IS NULL OR "+MPPOrderNode.COLUMNNAME_DocStatus+"<>?)"; - List list = new Query(getCtx(), MPPOrderNode.Table_Name, whereClause, get_TrxName()) - .setOnlyActiveRecords(true) - .setParameters(new Object[]{getPP_Order_ID(), MPPOrderNode.DOCSTATUS_Closed}) - .list(); - for (MPPOrderNode onode : list) - { - onode.setDocStatus(DOCSTATUS_Closed); - onode.saveEx(); - } - closeNew(getPP_Order_ID(), getPP_Order_Node_ID()); - } - // fjviejo e-evolution operation activity end setDocAction(DOCACTION_None); return true; } // closeIt @@ -611,43 +647,6 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction MDocType dt = MDocType.get(getCtx(), getC_DocType_ID()); return dt.getName() + " " + getDocumentNo(); } // getDocumentInfo - - private void createNewNode(MPPOrderNode node) - { - String whereClause = COLUMNNAME_PP_Order_ID+"=? AND "+COLUMNNAME_PP_Order_Node_ID+"=?"; - boolean exists = new Query(getCtx(), Table_Name, whereClause, get_TrxName()) - .setOnlyActiveRecords(true) - .setParameters(new Object[]{getPP_Order_ID(), node.getPP_Order_Node_ID()}) - .match(); - if (!exists) - { - MPPCostCollector costnew = new MPPCostCollector(getCtx(), 0, get_TrxName()); - costnew.setPP_Order_ID(getPP_Order_ID()); - costnew.setC_DocTypeTarget_ID(getC_DocTypeTarget_ID()); - costnew.setC_DocType_ID(getC_DocType_ID()); - costnew.setS_Resource_ID(getS_Resource_ID()); - costnew.setM_Warehouse_ID(getM_Warehouse_ID()); - costnew.setM_Locator_ID(getM_Locator_ID()); - costnew.setM_Product_ID(getM_Product_ID()); - costnew.setM_AttributeSetInstance_ID(getM_AttributeSetInstance_ID()); - costnew.setPP_Order_Workflow_ID(getPP_Order_Workflow_ID()); - costnew.setAD_User_ID(getAD_User_ID()); - costnew.setMovementDate(getMovementDate()); - costnew.setDateAcct(getDateAcct()); - costnew.setMovementQty(getMovementQty()); - //costnew.setDurationUnit(getDurationUnit()); - costnew.setCostCollectorType(getCostCollectorType()); - costnew.setPP_Order_Node_ID(node.getPP_Order_Node_ID()); - costnew.setDurationReal(new BigDecimal(node.getDuration())); - costnew.saveEx(); - // costnew.completeIt(); - } - else - { - log.warning("***** NODE already exists"); - } - //completenew(getPP_Order_ID(),node); - } @Override protected boolean beforeSave(boolean newRecord) diff --git a/base/src/org/eevolution/model/MPPOrder.java b/base/src/org/eevolution/model/MPPOrder.java index 690acd1b3f..76c6bd7db9 100644 --- a/base/src/org/eevolution/model/MPPOrder.java +++ b/base/src/org/eevolution/model/MPPOrder.java @@ -22,6 +22,7 @@ import java.math.RoundingMode; import java.sql.ResultSet; import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Properties; @@ -50,7 +51,6 @@ import org.compiere.process.DocumentEngine; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.KeyNamePair; -import org.compiere.util.Msg; import org.compiere.wf.MWFNode; import org.compiere.wf.MWFNodeNext; import org.compiere.wf.MWorkflow; @@ -659,12 +659,13 @@ public class MPPOrder extends X_PP_Order implements DocAction MPPOrder.createReceipt( this, today , - this.getQtyDelivered(), - this.getQtyOpen(), - this.getQtyScrap(), - this.getQtyReject(), - this.getM_Locator_ID(), - this.getM_AttributeSetInstance_ID(), false, get_TrxName()); + getQtyDelivered(), + getQtyOpen(), + getQtyScrap(), + getQtyReject(), + getM_Locator_ID(), + getM_AttributeSetInstance_ID(), false, get_TrxName()); + setQtyDelivered(getQtyOpen()); return DOCSTATUS_Closed; } @@ -713,19 +714,28 @@ public class MPPOrder extends X_PP_Order implements DocAction public boolean closeIt() { log.info(toString()); + // Before Close + m_processMsg = ModelValidationEngine.get().fireDocValidate(this,ModelValidator.TIMING_BEFORE_CLOSE); + if (m_processMsg != null) + return false; + if(MPPOrder.DOCSTATUS_Closed.equals(getDocStatus())) return true; - if(!MPPOrder.DOCSTATUS_Completed.equals(this.getDocStatus())) + if(!MPPOrder.DOCSTATUS_Completed.equals(getDocStatus())) { String DocStatus = completeIt(); setDocStatus(DocStatus); setDocAction(MPPOrder.ACTION_None); } - // Before Close - m_processMsg = ModelValidationEngine.get().fireDocValidate(this,ModelValidator.TIMING_BEFORE_CLOSE); - if (m_processMsg != null) - return false; + + BigDecimal qtyReported = getQtyDelivered().add(getQtyReject().add(getQtyScrap())); + if(qtyReported.signum() > 0) + { + //Close all the activity do not reported + MPPOrderWorkflow m_order_wf = getMPPOrderWorkflow(); + m_order_wf.closeActivities(m_order_wf.getLastNode(getAD_Client_ID()), getUpdated(),false); + } orderStock(); // Clear Ordered Quantities reserveStock(getLines()); // Clear Reservations @@ -1007,7 +1017,7 @@ public class MPPOrder extends X_PP_Order implements DocAction /** * Create Receipt Finish Good - * @param pp_order + * @param order * @param movementDate * @param qtyDelivered * @param qtyToDeliver @@ -1018,7 +1028,7 @@ public class MPPOrder extends X_PP_Order implements DocAction * @param IsCloseDocument * @param trxName */ - static public void createReceipt(MPPOrder pp_order, + static public void createReceipt(MPPOrder order, Timestamp movementDate, BigDecimal qtyDelivered, BigDecimal qtyToDeliver, @@ -1032,28 +1042,33 @@ public class MPPOrder extends X_PP_Order implements DocAction if (qtyToDeliver.signum() != 0 || qtyScrap.signum() != 0 || qtyReject.signum() != 0) { - createCollector(pp_order, pp_order.getM_Product_ID(), - M_Locator_ID, - M_AttributeSetInstance_ID, - movementDate, - qtyToDeliver, qtyScrap, qtyReject, - MDocType.getDocType(MDocType.DOCBASETYPE_ManufacturingOrder), - 0, // PP_Order_BOMLine_ID - MPPCostCollector.COSTCOLLECTORTYPE_MaterialReceipt, + MPPCostCollector.createCollector( + order, //MPPOrder + order.getM_Product_ID(), //M_Product_ID + M_Locator_ID, //M_Locator_ID + M_AttributeSetInstance_ID, //M_AttributeSetInstance_ID + order.getS_Resource_ID(), //S_Resource_ID + 0, //PP_Order_BOMLine_ID + 0, //PP_Order_Node_ID + MDocType.getDocType(MDocType.DOCBASETYPE_ManufacturingOrder), //C_DocType_ID + MPPCostCollector.COSTCOLLECTORTYPE_MaterialReceipt, //Production "+" + movementDate, //MovementDate + qtyToDeliver, qtyScrap, qtyReject, //qty,scrap,reject + 0,0, trxName); } if (IsCloseDocument) { - pp_order.setDateFinish(movementDate); - pp_order.closeIt(); - pp_order.saveEx(); + order.setDateFinish(movementDate); + order.closeIt(); + order.saveEx(); } - pp_order.setDateDelivered(movementDate); - if (pp_order.getDateStart() == null) + order.setDateDelivered(movementDate); + if (order.getDateStart() == null) { - pp_order.setDateStart(movementDate); + order.setDateStart(movementDate); } BigDecimal DQ = qtyDelivered; @@ -1061,10 +1076,10 @@ public class MPPOrder extends X_PP_Order implements DocAction BigDecimal OQ = qtyToDeliver; if (DQ.add(SQ).compareTo(OQ) >= 0) { - pp_order.setDateFinish(movementDate); + order.setDateFinish(movementDate); } - pp_order.saveEx(trxName); + order.saveEx(trxName); } @@ -1077,7 +1092,7 @@ public class MPPOrder extends X_PP_Order implements DocAction * @param qtyReject * @param storages */ - public static void createIssue(MPPOrder pp_order, int PP_OrderBOMLine_ID, + public static void createIssue(MPPOrder order, int PP_OrderBOMLine_ID, Timestamp movementdate, BigDecimal qty, BigDecimal qtyScrap, BigDecimal qtyReject, MStorage[] storages, @@ -1096,7 +1111,7 @@ public class MPPOrder extends X_PP_Order implements DocAction BigDecimal qtyIssue = toIssue.min(storage.getQtyOnHand()); //log.fine("ToIssue: " + issue); - MPPOrderBOMLine PP_orderbomLine = new MPPOrderBOMLine(pp_order.getCtx(), PP_OrderBOMLine_ID, trxName); + MPPOrderBOMLine PP_orderbomLine = new MPPOrderBOMLine(order.getCtx(), PP_OrderBOMLine_ID, trxName); //create record for negative and positive transaction if (qtyIssue.signum() != 0 || qtyScrap.signum() != 0 || qtyReject.signum() != 0) { @@ -1108,16 +1123,20 @@ public class MPPOrder extends X_PP_Order implements DocAction CostCollectorType = MPPCostCollector.COSTCOLLECTORTYPE_MethodChangeVariance; } // - createCollector (pp_order, - PP_orderbomLine.getM_Product_ID(), - storage.getM_Locator_ID(), - storage.getM_AttributeSetInstance_ID(), - movementdate, - qtyIssue, qtyScrap, qtyReject, - MDocType.getDocType(MDocType.DOCBASETYPE_ManufacturingOrder), - PP_OrderBOMLine_ID, - CostCollectorType, // Production "-" - trxName + MPPCostCollector.createCollector ( + order, //MPPOrder + PP_orderbomLine.getM_Product_ID(), //M_Product_ID + storage.getM_Locator_ID(), //M_Locator_ID + storage.getM_AttributeSetInstance_ID(), //M_AttributeSetInstance_ID + order.getS_Resource_ID(), //S_Resource_ID + PP_OrderBOMLine_ID, //PP_Order_BOMLine_ID + 0, //PP_Order_Node_ID + MDocType.getDocType(MDocType.DOCBASETYPE_ManufacturingOrder), //C_DocType_ID, + CostCollectorType, //Production "-" + movementdate, //MovementDate + qtyIssue, qtyScrap, qtyReject, //qty,scrap,reject + 0,0, //durationSetup,duration + trxName //trxName ); } @@ -1133,75 +1152,7 @@ public class MPPOrder extends X_PP_Order implements DocAction throw new AdempiereException("Should not happen toIssue="+toIssue); } } - - /** - * Create & Complete Cost Collector - * @param pp_order - * @param M_Product_ID - * @param M_Locator_ID - * @param M_AttributeSetInstance_ID - * @param movementdate - * @param qty - * @param scrap - * @param reject - * @param C_DocType_ID - * @param PP_Order_BOMLine_ID - * @param CostCollectorType - * @param trxName - * @return completed cost collector - */ - private static MPPCostCollector createCollector (MPPOrder pp_order, - int M_Product_ID, - int M_Locator_ID, - int M_AttributeSetInstance_ID, - Timestamp movementdate, - BigDecimal qty, - BigDecimal scrap, - BigDecimal reject, - int C_DocType_ID, - int PP_Order_BOMLine_ID, - String CostCollectorType, - String trxName - ) - { - MPPCostCollector cc = new MPPCostCollector(pp_order.getCtx(), 0, trxName); - cc.setPP_Order_ID(pp_order.getPP_Order_ID()); - cc.setPP_Order_BOMLine_ID(PP_Order_BOMLine_ID); - cc.setAD_OrgTrx_ID(pp_order.getAD_OrgTrx_ID()); - cc.setC_Activity_ID(pp_order.getC_Activity_ID()); - cc.setC_Campaign_ID(pp_order.getC_Campaign_ID()); - cc.setC_DocType_ID(C_DocType_ID); - cc.setC_DocTypeTarget_ID(C_DocType_ID); - cc.setCostCollectorType(CostCollectorType); - cc.setC_Project_ID(pp_order.getC_Project_ID()); - cc.setDescription(pp_order.getDescription()); - cc.setDocAction(MPPCostCollector.ACTION_Complete); - cc.setDocStatus(MPPCostCollector.DOCSTATUS_Drafted); - cc.setIsActive(true); - cc.setM_Warehouse_ID(pp_order.getM_Warehouse_ID()); - cc.setM_Locator_ID(M_Locator_ID); - cc.setM_AttributeSetInstance_ID(M_AttributeSetInstance_ID); - cc.setS_Resource_ID(pp_order.getS_Resource_ID()); - cc.setMovementDate(movementdate); - cc.setDateAcct(movementdate); - cc.setMovementQty(qty); - cc.setScrappedQty(scrap); - cc.setQtyReject(reject); - cc.setPosted(false); - cc.setProcessed(false); - cc.setProcessing(false); - cc.setUser1_ID(pp_order.getUser1_ID()); - cc.setUser2_ID(pp_order.getUser2_ID()); - cc.setM_Product_ID(M_Product_ID); - cc.saveEx(); - if (!cc.processIt(MPPCostCollector.DOCACTION_Complete)) - { - throw new AdempiereException(cc.getProcessMsg()); - } - cc.saveEx(); - return cc; - } - + public static boolean isAvailableQty(MPPOrder order, I_PP_Order_BOMLine line) { MProduct product = MProduct.get(order.getCtx(), line.getM_Product_ID()); @@ -1333,7 +1284,7 @@ public class MPPOrder extends X_PP_Order implements DocAction /** * @return Default Locator for current Warehouse */ - private int getM_Locator_ID() + public int getM_Locator_ID() { MWarehouse wh = MWarehouse.get(getCtx(), getM_Warehouse_ID()); return wh.getDefaultLocator().getM_Locator_ID(); diff --git a/base/src/org/eevolution/model/MPPOrderNode.java b/base/src/org/eevolution/model/MPPOrderNode.java index 2b32caec39..5559d59e47 100644 --- a/base/src/org/eevolution/model/MPPOrderNode.java +++ b/base/src/org/eevolution/model/MPPOrderNode.java @@ -74,7 +74,8 @@ public class MPPOrderNode extends X_PP_Order_Node /** Cache */ private static CCache s_cache = new CCache (Table_Name, 50); - + /** MPPOrderWorkflow */ + MPPOrderWorkflow m_order_wf = null; /************************************************************************** * Standard Constructor - save to cache @@ -203,6 +204,8 @@ public class MPPOrderNode extends X_PP_Order_Node private List m_next = new ArrayList(); /** Duration Base MS */ private long m_durationBaseMS = -1; + /** Workflow Order */ + private MPPOrder m_workflow = null; /** * Load Next @@ -271,7 +274,7 @@ public class MPPOrderNode extends X_PP_Order_Node if (duration == 0) return 0; if (m_durationBaseMS == -1) - m_durationBaseMS = getPPOrderWorkflow().getDurationBaseSec() * 1000; + m_durationBaseMS = getMPPOrderWorkflow().getDurationBaseSec() * 1000; return duration * m_durationBaseMS; } // getDurationMS @@ -285,7 +288,7 @@ public class MPPOrderNode extends X_PP_Order_Node if (limit == 0) return 0; if (m_durationBaseMS == -1) - m_durationBaseMS = getPPOrderWorkflow().getDurationBaseSec() * 1000; + m_durationBaseMS = getMPPOrderWorkflow().getDurationBaseSec() * 1000; return limit * m_durationBaseMS; } // getLimitMS @@ -295,18 +298,9 @@ public class MPPOrderNode extends X_PP_Order_Node */ public int getDurationCalendarField() { - return getPPOrderWorkflow().getDurationCalendarField(); + return getMPPOrderWorkflow().getDurationCalendarField(); } // getDurationCalendarField - /** - * Get Workflow (NoTrx) - * @return workflow - */ - public MPPOrderWorkflow getPPOrderWorkflow() - { - return MPPOrderWorkflow.get(getCtx(), getPP_Order_Workflow_ID()); - } // getWorkflow - /** * String Representation * @return info @@ -335,7 +329,7 @@ public class MPPOrderNode extends X_PP_Order_Node { MResource resource = (MResource) getS_Resource(); //get the rate for this cost type element (Rsource, Burden) - MPPOrderWorkflow workflow = getPPOrderWorkflow(); + MPPOrderWorkflow workflow = getMPPOrderWorkflow(); double rate = resource.getResouceRate(C_AcctSchema_ID, M_CostType_ID,CostElementType, AD_Org_ID); BigDecimal cost = Env.ZERO; if (rate == 0) @@ -359,4 +353,15 @@ public class MPPOrderNode extends X_PP_Order_Node } return cost; } + + /** + * Get Parent + * @return MPPOrderWorkflow + */ + public MPPOrderWorkflow getMPPOrderWorkflow() + { + if (m_order_wf == null) + m_order_wf = new MPPOrderWorkflow(getCtx(), getPP_Order_Workflow_ID(), get_TrxName()); + return m_order_wf; + } // getParent } diff --git a/base/src/org/eevolution/model/MPPOrderWorkflow.java b/base/src/org/eevolution/model/MPPOrderWorkflow.java index b53583fd36..04dc81363c 100644 --- a/base/src/org/eevolution/model/MPPOrderWorkflow.java +++ b/base/src/org/eevolution/model/MPPOrderWorkflow.java @@ -17,6 +17,7 @@ package org.eevolution.model; import java.sql.ResultSet; +import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -24,6 +25,8 @@ import java.util.Properties; import java.util.logging.Level; import org.compiere.model.MClient; +import org.compiere.model.MDocType; +import org.compiere.model.MOrder; import org.compiere.model.Query; import org.compiere.util.CCache; import org.compiere.util.Env; @@ -149,6 +152,8 @@ public class MPPOrderWorkflow extends X_PP_Order_Workflow /** WF Nodes */ private List m_nodes = null; + /** Manufacturing Order */ + private MPPOrder m_order = null; /** * Load All Nodes @@ -411,7 +416,7 @@ public class MPPOrderWorkflow extends X_PP_Order_Workflow * @param AD_Client_ID for client * @return next PP_Order_Node_ID or 0 */ - public int getLast (int AD_Client_ID) + public int getNodeLastID (int AD_Client_ID) { MPPOrderNode[] nodes = getNodesInOrder(AD_Client_ID); if (nodes.length > 0) @@ -420,6 +425,21 @@ public class MPPOrderWorkflow extends X_PP_Order_Workflow } return 0; } // getLast + + /** + * Get very Last Node + * @param AD_Client_ID for client + * @return next PP_Order_Node_ID or 0 + */ + public MPPOrderNode getLastNode (int AD_Client_ID) + { + MPPOrderNode[] nodes = getNodesInOrder(AD_Client_ID); + if (nodes.length > 0) + { + return nodes[nodes.length-1]; + } + return null; + } // getLast /** * Is this the first Node @@ -516,4 +536,58 @@ public class MPPOrderWorkflow extends X_PP_Order_Workflow return Calendar.YEAR; return Calendar.MINUTE; } // getDurationCalendarField + + + /** + * Complete Activities + * @param activity + * @param movementdate + */ + public void closeActivities(MPPOrderNode activity, Timestamp movementdate, boolean milestone) + { + + MPPOrderWorkflow order_workflow = activity.getMPPOrderWorkflow(); + MPPOrder order = order_workflow.getMPPOrder(); + int nodeId = activity.get_ID(); + while(nodeId != 0) + { + MPPOrderNode node = MPPOrderNode.get(getCtx(), nodeId); + //break the cycle + if(node.isMilestone() && milestone) + return; + if(!MPPOrderNode.DOCSTATUS_Closed.equals(node.getDocStatus())) + { + + MPPCostCollector.createCollector ( + order, //MPPOrder + order.getM_Product_ID(), //M_Product_ID + order.getM_Locator_ID(), //M_Locator_ID + order.getM_AttributeSetInstance_ID(), //M_AttributeSetInstance_ID + order.getS_Resource_ID(), //S_Resource_ID + 0, //PP_Order_BOMLine_ID + node.get_ID(), //PP_Order_Node_ID + MDocType.getDocType(MDocType.DOCBASETYPE_ManufacturingOrder), //C_DocType_ID, + MPPCostCollector.COSTCOLLECTORTYPE_ActivityControl, //Activity Control + movementdate, //MovementDate + order.getQtyOrdered(), Env.ZERO, Env.ZERO, //qty,scrap,reject + node.getSetupTimeReal(),node.getDurationReal(), //durationSetup,duration + get_TrxName() //trxName + ); + } + nodeId = order_workflow.getPrevious(node.get_ID(), order_workflow.getAD_Client_ID()); + } + } + + /** + * Get Parent + * @return MPPOrder + */ + public MPPOrder getMPPOrder() + { + if (m_order == null) + m_order = new MPPOrder(getCtx(), getPP_Order_ID(), get_TrxName()); + return m_order; + } // getParent + + } // MPPOrderWorkflow_ID diff --git a/base/src/org/eevolution/process/CRP.java b/base/src/org/eevolution/process/CRP.java index e13bc363e7..57048c290c 100644 --- a/base/src/org/eevolution/process/CRP.java +++ b/base/src/org/eevolution/process/CRP.java @@ -156,7 +156,7 @@ public class CRP extends SvrProcess { else if (p_ScheduleType.equals(BACKWARD_SCHEDULING)) { Timestamp date = order.getDateFinishSchedule(); - int nodeId = owf.getLast(getAD_Client_ID()); + int nodeId = owf.getNodeLastID(getAD_Client_ID()); MPPOrderNode node = null; while(nodeId != 0) diff --git a/client/src/org/eevolution/form/crp/CRPDatasetFactory.java b/client/src/org/eevolution/form/crp/CRPDatasetFactory.java index f43321a567..137bea409f 100644 --- a/client/src/org/eevolution/form/crp/CRPDatasetFactory.java +++ b/client/src/org/eevolution/form/crp/CRPDatasetFactory.java @@ -240,7 +240,7 @@ public abstract class CRPDatasetFactory extends CRPReasoner implements CRPModel else if(node.getUserObject() instanceof MPPOrderNode) { MPPOrderNode on = (MPPOrderNode)node.getUserObject(); - MPPOrderWorkflow owf = on.getPPOrderWorkflow(); + MPPOrderWorkflow owf = on.getMPPOrderWorkflow(); MResourceType rt = MResourceType.get(Env.getCtx(), r.getS_ResourceType_ID()); // no function