From 6476744416c5b480070b414006e08887a9a6129f Mon Sep 17 00:00:00 2001 From: teo_sarca Date: Thu, 8 Jan 2009 12:19:57 +0000 Subject: [PATCH] Libero QA assurance: * move MForecastLine class to org.compiere.model * use getSQLValue*Ex instead of getSQLValue * code refactoring & cleanup * correct trxName usage * improved exception handling --- .../exceptions/DocTypeNotFoundException.java | 62 +++ .../src/org/compiere/model/MForecastLine.java | 87 ++++ base/src/org/compiere/wf/MWFNode.java | 4 +- .../ActivityProcessedException.java | 31 ++ .../org/eevolution/model/CalloutOrder.java | 4 +- .../org/eevolution/model/LiberoValidator.java | 257 ++++------- .../src/org/eevolution/model/MHREmployee.java | 11 +- .../eevolution/model/MPPCostCollector.java | 398 ++++++++++-------- base/src/org/eevolution/model/MPPMRP.java | 383 ++++++++++------- base/src/org/eevolution/model/MPPOrder.java | 225 +++++----- .../org/eevolution/model/MPPOrderBOMLine.java | 230 +++++++--- .../eevolution/model/MPPOrderBOMLineMA.java | 10 +- .../org/eevolution/model/MPPOrderNode.java | 298 ++----------- .../eevolution/model/MPPOrderNodeAsset.java | 70 +-- .../eevolution/model/MPPOrderNodeNext.java | 48 +-- .../eevolution/model/MPPOrderNodeProduct.java | 76 +--- .../eevolution/model/MPPOrderWorkflow.java | 39 +- .../org/eevolution/model/MPPProductBOM.java | 209 +++------ .../eevolution/model/MPPProductBOMLine.java | 49 +-- .../eevolution/model/MPPProductPlanning.java | 72 +++- .../org/eevolution/model/MPPWFNodeAsset.java | 77 ++-- .../eevolution/model/MPPWFNodeProduct.java | 85 ++-- .../model/X_RV_PP_Order_Storage.java | 109 ----- .../model/reasoner/CRPReasoner.java | 18 +- base/src/org/eevolution/process/CRP.java | 57 +-- base/src/org/eevolution/process/MRP.java | 6 +- .../process/RollupBillOfMaterial.java | 20 +- 27 files changed, 1383 insertions(+), 1552 deletions(-) create mode 100644 base/src/org/adempiere/exceptions/DocTypeNotFoundException.java create mode 100644 base/src/org/compiere/model/MForecastLine.java create mode 100644 base/src/org/eevolution/exceptions/ActivityProcessedException.java delete mode 100644 base/src/org/eevolution/model/X_RV_PP_Order_Storage.java diff --git a/base/src/org/adempiere/exceptions/DocTypeNotFoundException.java b/base/src/org/adempiere/exceptions/DocTypeNotFoundException.java new file mode 100644 index 0000000000..c366ca1e50 --- /dev/null +++ b/base/src/org/adempiere/exceptions/DocTypeNotFoundException.java @@ -0,0 +1,62 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 2008 SC ARHIPAC SERVICE SRL. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.adempiere.exceptions; + +import org.compiere.model.MDocType; +import org.compiere.model.MRefList; +import org.compiere.util.Env; +import org.compiere.util.Util; + +/** + * Throwed when desired document type was not found + * @author Teo Sarca, www.arhipac.ro + */ +public class DocTypeNotFoundException extends AdempiereException +{ + private static final long serialVersionUID = 1L; + + /** Doc Base Type */ + private String m_docBaseType = null; + + /** + * @param docBaseType Document Base Type (see MDocType.DOCBASETYPE_*) + * @param additionalInfo optional if there is some additional info + */ + public DocTypeNotFoundException(String docBaseType, String additionalInfo) + { + super(additionalInfo); + m_docBaseType = docBaseType; + } + + public String getDocBaseType() + { + return m_docBaseType; + } + + @Override + public String getMessage() + { + String additionalInfo = super.getMessage(); + String docBaseTypeName = MRefList.getListName(Env.getCtx(), MDocType.DOCBASETYPE_AD_Reference_ID, getDocBaseType()); + StringBuffer sb = new StringBuffer("@NotFound@ @C_DocType_ID@"); + sb.append(" - @DocBaseType@ : " + docBaseTypeName); + if (!Util.isEmpty(additionalInfo, true)) + { + sb.append(" (").append(additionalInfo).append(")"); + } + return sb.toString(); + } + + +} diff --git a/base/src/org/compiere/model/MForecastLine.java b/base/src/org/compiere/model/MForecastLine.java new file mode 100644 index 0000000000..2b0e1178b2 --- /dev/null +++ b/base/src/org/compiere/model/MForecastLine.java @@ -0,0 +1,87 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + * For the text or an alternative of this public license, you may reach us * + * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * + * Contributor(s): Victor Perez www.e-evolution.com * + *****************************************************************************/ +package org.compiere.model; + +import java.sql.ResultSet; +import java.util.Properties; + +import org.eevolution.model.MPPMRP; + +/** + * Forecast Line Model + * + * @author Victor Perez www.e-evolution.com + * @version $Id: MForecastLine.java,v 1.11 2005/05/17 05:29:52 vpj-cd Exp $ + */ +public class MForecastLine extends X_M_ForecastLine +{ + private static final long serialVersionUID = 1L; + + + /** + * Standard Constructor + * @param ctx context + * @param M_ForecastLine_ID id + */ + public MForecastLine (Properties ctx, int M_ForecastLine_ID, String trxName) + { + super (ctx, M_ForecastLine_ID, trxName); + } // MForecastLine + + /** + * Load Constructor + * @param ctx context + * @param rs result set + */ + public MForecastLine (Properties ctx, ResultSet rs, String trxName) + { + super(ctx, rs, trxName); + } // MRequisitionLine + + /** + * After Save. + * Update Total on Header + * @param newRecord if new record + * @param success save was success + */ + protected boolean afterSave (boolean newRecord, boolean success) + { + if (!success) + return success; + //begin e-evolution vpj-cd 10/30/2004 + MPPMRP.M_ForecastLine(this,false); + //end e-evolution vpj-cd 10/30/2004 + + return true; + } // afterSave + + + /** + * After Delete + * @param success + * @return true/false + */ + protected boolean afterDelete (boolean success) + { + if (!success) + return success; + //begin e-evolution vpj-cd 10/30/2004 + MPPMRP.M_ForecastLine(this,true); + //end e-evolution vpj-cd 10/30/2004 + return true; + } // afterDelete + +} // MForecastLine diff --git a/base/src/org/compiere/wf/MWFNode.java b/base/src/org/compiere/wf/MWFNode.java index 51c9d87b5f..9eb955422d 100644 --- a/base/src/org/compiere/wf/MWFNode.java +++ b/base/src/org/compiere/wf/MWFNode.java @@ -669,7 +669,7 @@ public class MWFNode extends X_AD_WF_Node public BigDecimal getCostForCostElementType(String CostElementType, int C_AcctSchema_ID,int M_CostType_ID,int AD_Org_ID,int setuptime, int duration) { MResource resource = (MResource) getS_Resource(); - //get the rate and convert in second for this cost type element (Rsource, Burden) + //get the rate and convert in second for this cost type element (Resource, Burden) MWorkflow workflow = getWorkflow(); double rate = resource.getResouceRate(C_AcctSchema_ID, M_CostType_ID,CostElementType, AD_Org_ID); BigDecimal cost = Env.ZERO; @@ -678,7 +678,7 @@ public class MWFNode extends X_AD_WF_Node return Env.ZERO; } - int C_UOM_ID = DB.getSQLValue(get_TrxName(),"SELECT C_UOM_ID FROM M_Product WHERE S_Resource_ID = ? " , getS_Resource_ID()); + int C_UOM_ID = DB.getSQLValueEx(get_TrxName(),"SELECT C_UOM_ID FROM M_Product WHERE S_Resource_ID = ? " , getS_Resource_ID()); MUOM uom = MUOM.get(getCtx(), C_UOM_ID); if (uom.isHour()) { diff --git a/base/src/org/eevolution/exceptions/ActivityProcessedException.java b/base/src/org/eevolution/exceptions/ActivityProcessedException.java new file mode 100644 index 0000000000..640e7c6d1f --- /dev/null +++ b/base/src/org/eevolution/exceptions/ActivityProcessedException.java @@ -0,0 +1,31 @@ +/****************************************************************************** + * Product: Adempiere ERP & CRM Smart Business Solution * + * Copyright (C) 2008 SC ARHIPAC SERVICE SRL. All Rights Reserved. * + * This program is free software; you can redistribute it and/or modify it * + * under the terms version 2 of the GNU General Public License as published * + * by the Free Software Foundation. This program is distributed in the hope * + * that it will be useful, but WITHOUT ANY WARRANTY; without even the implied * + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * + * See the GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License along * + * with this program; if not, write to the Free Software Foundation, Inc., * + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * + *****************************************************************************/ +package org.eevolution.exceptions; + +import org.adempiere.exceptions.AdempiereException; +import org.eevolution.model.MPPOrderNode; + +/** + * Throwed when we are trying to process/complete an Order Activity that is already processed/completed + * @author Teo Sarca, www.arhipac.ro + */ +public class ActivityProcessedException extends AdempiereException +{ + private static final long serialVersionUID = 1L; + + public ActivityProcessedException(MPPOrderNode activity) + { + super("Order Activity Already Processed - "+activity); // TODO: translate + } +} diff --git a/base/src/org/eevolution/model/CalloutOrder.java b/base/src/org/eevolution/model/CalloutOrder.java index 50c5fff351..0745178529 100644 --- a/base/src/org/eevolution/model/CalloutOrder.java +++ b/base/src/org/eevolution/model/CalloutOrder.java @@ -138,10 +138,10 @@ public class CalloutOrder extends CalloutEngine if (QtyBatchSize.equals(Env.ZERO)) Qty = Env.ONE; else - Qty = p_QtyEntered.divide(QtyBatchSize , 0, BigDecimal.ROUND_UP); + Qty = p_QtyEntered.divide(QtyBatchSize, 0, RoundingMode.UP); mTab.setValue(MPPOrder.COLUMNNAME_QtyBatchs, Qty); - mTab.setValue(MPPOrder.COLUMNNAME_QtyBatchSize, p_QtyEntered.divide(Qty , BigDecimal.ROUND_HALF_UP)); + mTab.setValue(MPPOrder.COLUMNNAME_QtyBatchSize, QtyBatchSize); return ""; } diff --git a/base/src/org/eevolution/model/LiberoValidator.java b/base/src/org/eevolution/model/LiberoValidator.java index 97c37a067d..db8897eb91 100644 --- a/base/src/org/eevolution/model/LiberoValidator.java +++ b/base/src/org/eevolution/model/LiberoValidator.java @@ -12,12 +12,14 @@ * For the text or an alternative of this public license, you may reach us * * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * * Contributor(s): Victor Perez www.e-evolution.com * + * Teo Sarca, www.arhipac.ro * *****************************************************************************/ package org.eevolution.model; import java.util.Collection; import org.compiere.model.MClient; +import org.compiere.model.MForecastLine; import org.compiere.model.MInOut; import org.compiere.model.MInOutLine; import org.compiere.model.MOrder; @@ -27,30 +29,21 @@ import org.compiere.model.ModelValidationEngine; import org.compiere.model.ModelValidator; import org.compiere.model.PO; import org.compiere.model.Query; +import org.compiere.process.DocAction; import org.compiere.util.CLogger; import org.compiere.util.Msg; /** - * LiberoValidator + * Libero Validator * - * @author Victor Perez - * @author Trifon Trifonov + * @author Victor Perez + * @author Trifon Trifonov *
  • [ 2270421 ] Can not complete Shipment (Customer)
  • - * - * @version $Id: LiberoValidator.java,v 1 vpj-cd Exp $ + * @author Teo Sarca, www.arhipac.ro */ public class LiberoValidator implements ModelValidator { - /** - * Constructor. - * The class is instantiated when logging in and client is selected/known - */ - public LiberoValidator () - { - super (); - } // LiberoValidator - /** Logger */ private CLogger log = CLogger.getCLogger(getClass()); /** Client */ @@ -60,10 +53,13 @@ public class LiberoValidator implements ModelValidator public void initialize (ModelValidationEngine engine, MClient client) { //client = null for global validator - if (client != null) { + if (client != null) + { m_AD_Client_ID = client.getAD_Client_ID(); log.info(client.toString()); - } else { + } + else + { log.info("Initializing global validator: "+this.toString()); } // Tables to be monitored @@ -80,217 +76,130 @@ public class LiberoValidator implements ModelValidator public String modelChange (PO po, int type) throws Exception { log.info(po.get_TableName() + " Type: "+type); - - if (po.get_TableName().equals(MOrder.Table_Name)) + boolean isChange = (TYPE_AFTER_NEW == type || (TYPE_AFTER_CHANGE == type && MPPMRP.isChanged(po))); + boolean isDelete = (TYPE_BEFORE_DELETE == type); + boolean isCompleted = false; + boolean isVoided = false; + DocAction doc = null; + if (po instanceof DocAction) + { + doc = (DocAction)po; + } + else if (po instanceof MOrderLine) + { + doc = ((MOrderLine)po).getParent(); + } + if (doc != null) + { + String docStatus = doc.getDocStatus(); + isCompleted = DocAction.STATUS_InProgress.equals(docStatus) + || DocAction.STATUS_Completed.equals(docStatus); + isVoided = DocAction.STATUS_Voided.equals(docStatus); + } + // + // + if (isDelete || isVoided) + { + MPPMRP.deleteMRP(po); + } + else if (po instanceof MOrder) { MOrder order = (MOrder)po; - //Create a planning supply when isPurchase Order - if (type == TYPE_AFTER_NEW && !order.isSOTrx()) + // Create/Update a planning supply when isPurchase Order + // or when you change DatePromised or DocStatus and is Purchase Order + if (isChange && !order.isSOTrx()) { MPPMRP.C_Order(order, false); } - //Update MRP when you change DatePromised or DocStatus and is Purchase Order - else if (type == TYPE_AFTER_CHANGE && !order.isSOTrx()) + // Update MRP when you change the status order to complete or in process for a sales order + // or you change DatePromised + else if (type == TYPE_AFTER_CHANGE && order.isSOTrx()) { - if ( order.is_ValueChanged(MOrder.COLUMNNAME_DatePromised) - || order.is_ValueChanged(MOrder.COLUMNNAME_DocStatus)) - MPPMRP.C_Order(order, false); - } - - //Update MRP when you change the status order to complete or in process for a sales order or you change DatePromised - if (type == TYPE_AFTER_CHANGE && order.isSOTrx()) - { - if ( order.is_ValueChanged(MOrder.COLUMNNAME_DatePromised) - || order.is_ValueChanged(MOrder.COLUMNNAME_DocStatus) - || order.getDocStatus().equals(MOrder.DOCSTATUS_InProgress) - || order.getDocStatus().equals(MOrder.DOCSTATUS_Completed)) + if (isCompleted || MPPMRP.isChanged(order)) { MPPMRP.C_Order(order, false); } } } - // - if (po.get_TableName().equals(MOrderLine.Table_Name)) + else if (po instanceof MOrderLine && isChange) { MOrderLine ol = (MOrderLine)po; MOrder order = ol.getParent(); - //Create a planning supply when isPurchase Order - if (type == TYPE_AFTER_NEW && !order.isSOTrx()) + // Create/Update a planning supply when isPurchase Order or you change relevant fields + if (!order.isSOTrx()) + { + MPPMRP.C_OrderLine(ol, false); + } + // Update MRP when Sales Order have document status in process or complete and + // you change relevant fields + else if(order.isSOTrx() && isCompleted) { MPPMRP.C_OrderLine(ol, false); - //Update MRP when when isPurchase Order and you change DatePromised , Product , Qty Ordered, Qty Delivered - } else if (type == TYPE_AFTER_CHANGE && !order.isSOTrx()) { - if ( ol.is_ValueChanged(MOrderLine.COLUMNNAME_DatePromised) - || ol.is_ValueChanged(MOrderLine.COLUMNNAME_M_Product_ID) - || ol.is_ValueChanged(MOrderLine.COLUMNNAME_QtyOrdered) - || ol.is_ValueChanged(MOrderLine.COLUMNNAME_QtyDelivered) - ) - MPPMRP.C_OrderLine(ol, false); - //Update MRP when Sales Order have document status in process or complete - //You change DatePromised , Product , Qty Ordered, Qty Delivered - } else if(type == TYPE_AFTER_CHANGE && order.isSOTrx()) { - if ( order.getDocStatus().equals(MOrder.DOCSTATUS_InProgress) - || order.getDocStatus().equals(MOrder.DOCSTATUS_Completed)) - { - if ( ol.is_ValueChanged(MOrderLine.COLUMNNAME_DatePromised) - || ol.is_ValueChanged(MOrderLine.COLUMNNAME_M_Product_ID) - || ol.is_ValueChanged(MOrderLine.COLUMNNAME_QtyOrdered) - || ol.is_ValueChanged(MOrderLine.COLUMNNAME_QtyDelivered) - ) - MPPMRP.C_OrderLine(ol, false); - } } } - - if (po.get_TableName().equals(MOrderLine.Table_Name) && type == TYPE_BEFORE_DELETE) - { - MOrderLine ol = (MOrderLine)po; - MPPMRP.C_OrderLine(ol, true); - } - - - if (po.get_TableName().equals(MRequisitionLine.Table_Name) ) + // + else if (po instanceof MRequisitionLine && isChange) { MRequisitionLine rl = (MRequisitionLine)po; - if (type == TYPE_AFTER_NEW) - { - MPPMRP.M_RequisitionLine(rl, false); - } - if (type == TYPE_AFTER_CHANGE) - { - if ( rl.is_ValueChanged(MRequisitionLine.COLUMNNAME_M_Product_ID) - || rl.is_ValueChanged(MRequisitionLine.COLUMNNAME_Qty)) - MPPMRP.M_RequisitionLine(rl, false); - } + MPPMRP.M_RequisitionLine(rl, false); } - - if (po.get_TableName().equals(MRequisitionLine.Table_Name) && type == TYPE_BEFORE_DELETE ) - { - MRequisitionLine ol = (MRequisitionLine)po; - MPPMRP.M_RequisitionLine(ol, true); - } - - if (po.get_TableName().equals(MForecastLine.Table_Name)) + // + else if (po instanceof MForecastLine && isChange) { MForecastLine fl = (MForecastLine)po; - if(type == TYPE_AFTER_NEW) - MPPMRP.M_ForecastLine(fl, false); - if (type == TYPE_AFTER_CHANGE) - { - if ( fl.is_ValueChanged(MForecastLine.COLUMNNAME_M_Product_ID) - || fl.is_ValueChanged(MForecastLine.COLUMNNAME_Qty) - || fl.is_ValueChanged(MForecastLine.COLUMNNAME_DatePromised) - ) - MPPMRP.M_ForecastLine(fl, false); - } + MPPMRP.M_ForecastLine(fl, false); } - - if (po.get_TableName().equals(MForecastLine.Table_Name) && type == TYPE_BEFORE_DELETE) - { - MForecastLine ol = (MForecastLine)po; - MPPMRP.M_ForecastLine(ol, true); - } - - if (po.get_TableName().equals(MDDOrderLine.Table_Name)) + // + else if (po instanceof MDDOrderLine && isChange) { MDDOrderLine ol = (MDDOrderLine)po; - if (type == TYPE_AFTER_NEW) - { - MPPMRP.DD_Order_Line(ol , false); - } - if (type == TYPE_AFTER_CHANGE) { - if ( ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_M_Product_ID) - || ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_DatePromised) - || ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_QtyOrdered) - || ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_QtyDelivered) - || ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_ConfirmedQty) - || ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_M_Locator_ID) - || ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_M_LocatorTo_ID) - || ol.is_ValueChanged(MDDOrderLine.COLUMNNAME_ConfirmedQty)) - MPPMRP.DD_Order_Line(ol, false); - } + MPPMRP.DD_Order_Line(ol , false); } - - if (po.get_TableName().equals(MDDOrderLine.Table_Name) && type == TYPE_BEFORE_DELETE) - { - - MDDOrderLine ol = (MDDOrderLine)po; - MPPMRP.DD_Order_Line(ol, true); - } - - if (po.get_TableName().equals(MPPOrder.Table_Name)) + // + else if (po instanceof MPPOrder && isChange) { MPPOrder order = (MPPOrder)po; - if (type == TYPE_AFTER_NEW) { - MPPMRP.PP_Order(order, false); - } - if (type == TYPE_AFTER_CHANGE) { - if ( order.is_ValueChanged(MPPOrder.COLUMNNAME_M_Product_ID) - || order.is_ValueChanged(MPPOrder.COLUMNNAME_DatePromised) - || order.is_ValueChanged(MPPOrder.COLUMNNAME_QtyOrdered) - || order.is_ValueChanged(MPPOrder.COLUMNNAME_QtyDelivered) - || order.is_ValueChanged(MPPOrder.COLUMNNAME_PP_Product_BOM_ID) - || order.is_ValueChanged(MPPOrder.COLUMNNAME_AD_Workflow_ID)) - MPPMRP.PP_Order(order, false); - } + MPPMRP.PP_Order(order, false); } - - if (po.get_TableName().equals(MPPOrder.Table_Name) && type == TYPE_BEFORE_DELETE) + // + else if (po instanceof MPPOrderBOMLine && isChange) { - MPPOrder order = (MPPOrder)po; - MPPMRP.PP_Order(order, true); + MPPOrderBOMLine obl = (MPPOrderBOMLine)po; + MPPMRP.PP_Order_BOMLine(obl, false); } - - if (po.get_TableName().equals(MPPOrderBOMLine.Table_Name)) - { - MPPOrderBOMLine ol = (MPPOrderBOMLine)po; - if (type == TYPE_AFTER_NEW) { - MPPMRP.PP_Order_BOMLine(ol, false); - } - if (type == TYPE_AFTER_CHANGE) { - if ( ol.is_ValueChanged(MPPOrderBOMLine.COLUMNNAME_M_Product_ID) - || ol.is_ValueChanged(MPPOrderBOMLine.COLUMNNAME_M_Warehouse_ID) - || ol.is_ValueChanged(MPPOrderBOMLine.COLUMNNAME_QtyEntered) - || ol.is_ValueChanged(MPPOrderBOMLine.COLUMNNAME_QtyDelivered)) - MPPMRP.PP_Order_BOMLine(ol, false); - } - } - if (po.get_TableName().equals(MPPOrderBOMLine.Table_Name) && type == TYPE_BEFORE_DELETE) - { - MPPOrderBOMLine ol = (MPPOrderBOMLine)po; - MPPMRP.PP_Order_BOMLine(ol, true); - } - + // return null; } // modelChange public String docValidate (PO po, int timing) { log.info(po.get_TableName() + " Timing: "+timing); - if (po.get_TableName().equals(MInOut.Table_Name) && timing == TIMING_AFTER_COMPLETE) + if (po instanceof MInOut && timing == TIMING_AFTER_COMPLETE) { MInOut inout = (MInOut)po; for (MInOutLine line : inout.getLines()) { String whereClause = "C_OrderLine_ID=? AND PP_Cost_Collector_ID IS NOT NULL"; Collection olines = new Query(po.getCtx(), MOrderLine.Table_Name, whereClause, po.get_TrxName()) - .setParameters(new Object[]{line.getC_OrderLine_ID()}).list(); - - for (MOrderLine oline: olines) + .setParameters(new Object[]{line.getC_OrderLine_ID()}) + .list(); + for (MOrderLine oline : olines) { if(oline.getQtyOrdered().compareTo(oline.getQtyDelivered()) >= 0) { MPPCostCollector cc = new MPPCostCollector(po.getCtx(), oline.getPP_Cost_Collector_ID(), po.get_TrxName()); - cc.completeIt(); - cc.setDocStatus(MPPCostCollector.DOCSTATUS_Completed); + String docStatus = cc.completeIt(); + cc.setDocStatus(docStatus); cc.setDocAction(MPPCostCollector.DOCACTION_Close); cc.saveEx(); - return Msg.translate(po.getCtx(), "PP_Order_ID")+":"+cc.getPPOrder().getDocumentNo()+Msg.translate(po.getCtx(),"PP_Order_Node_ID")+":"+cc.getPPOrderNode().getValue(); - } + return Msg.translate(po.getCtx(), "PP_Order_ID") + +":"+cc.getPP_Order().getDocumentNo() + +Msg.translate(po.getCtx(),"PP_Order_Node_ID") + +":"+cc.getPP_Order_Node().getValue(); + } } - } } return null; diff --git a/base/src/org/eevolution/model/MHREmployee.java b/base/src/org/eevolution/model/MHREmployee.java index 0a37ed4648..0e6e2d2d0a 100644 --- a/base/src/org/eevolution/model/MHREmployee.java +++ b/base/src/org/eevolution/model/MHREmployee.java @@ -72,13 +72,14 @@ public class MHREmployee extends X_HR_Employee //-- whereClause.append(" AND e.IsActive=? "); params.add(true); - - if(p.getHR_Payroll_ID() != 0 && p.getHR_Period_ID() != 0) // this payroll not content periods, NOT IS a Regular Payroll > ogi-cd 28Nov2007 + // This payroll not content periods, NOT IS a Regular Payroll > ogi-cd 28Nov2007 + if(p.getHR_Payroll_ID() != 0 && p.getHR_Period_ID() != 0) { whereClause.append(" AND (e.HR_Payroll_ID IS NULL OR e.HR_Payroll_ID=?) " ); params.add(p.getHR_Payroll_ID()); } + // HR Period if(p.getHR_Period_ID() != 0) { whereClause.append(" AND e.StartDate <=? "); @@ -90,7 +91,8 @@ public class MHREmployee extends X_HR_Employee //-- params.add(p.getDateAcct()); } - if (p.getHR_Department_ID() != 0) // Selected Department + // Selected Department + if (p.getHR_Department_ID() != 0) { whereClause.append(" AND e.HR_Department_ID =? "); params.add(p.getHR_Department_ID()); @@ -98,7 +100,8 @@ public class MHREmployee extends X_HR_Employee //-- whereClause.append(" ) "); // end select from HR_Employee - if (p.getC_BPartner_ID() != 0 ) // Selected Employee + // Selected Employee + if (p.getC_BPartner_ID() != 0) { whereClause.append(" AND C_BPartner_ID =? "); params.add(p.getC_BPartner_ID()); diff --git a/base/src/org/eevolution/model/MPPCostCollector.java b/base/src/org/eevolution/model/MPPCostCollector.java index c0305a33df..03e91f438b 100644 --- a/base/src/org/eevolution/model/MPPCostCollector.java +++ b/base/src/org/eevolution/model/MPPCostCollector.java @@ -18,24 +18,25 @@ package org.eevolution.model; import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.Timestamp; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Properties; -import java.util.logging.Level; import org.adempiere.exceptions.AdempiereException; -import org.compiere.Adempiere; -import org.compiere.acct.Doc; -import org.compiere.model.MAcctSchema; +import org.adempiere.exceptions.DocTypeNotFoundException; +import org.adempiere.exceptions.FillMandatoryException; +import org.adempiere.exceptions.NoVendorForProductException; +import org.compiere.model.I_C_UOM; +import org.compiere.model.I_M_Product; import org.compiere.model.MAttributeSetInstance; import org.compiere.model.MBPartner; import org.compiere.model.MClient; import org.compiere.model.MDocType; +import org.compiere.model.MLocator; import org.compiere.model.MOrder; import org.compiere.model.MOrderLine; import org.compiere.model.MPeriod; @@ -43,19 +44,19 @@ import org.compiere.model.MProduct; import org.compiere.model.MProductPO; import org.compiere.model.MStorage; import org.compiere.model.MTransaction; +import org.compiere.model.MUOM; +import org.compiere.model.MWarehouse; import org.compiere.model.ModelValidationEngine; import org.compiere.model.ModelValidator; import org.compiere.model.Query; import org.compiere.print.ReportEngine; import org.compiere.process.DocAction; import org.compiere.process.DocumentEngine; -import org.compiere.util.CCache; -import org.compiere.util.CLogMgt; import org.compiere.util.DB; import org.compiere.util.Env; -import org.compiere.util.Ini; import org.compiere.util.Msg; import org.compiere.util.TimeUtil; +import org.eevolution.exceptions.ActivityProcessedException; /** * PP Cost Collector Model @@ -79,10 +80,13 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction super (ctx, PP_Cost_Collector_ID,trxName); if (PP_Cost_Collector_ID == 0) { - setDocAction (DOCACTION_Complete); // CO + setC_DocType_ID(0); setDocStatus (DOCSTATUS_Drafted); // DR + setDocAction (DOCACTION_Complete); // CO setMovementDate (new Timestamp(System.currentTimeMillis())); // @#Date@ + setIsActive(true); setPosted (false); + setProcessing (false); setProcessed (false); } } // MPPCostCollector @@ -110,6 +114,20 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction else setDescription(desc + " | " + description); } // addDescription + + + public void setC_DocTypeTarget_ID(String docBaseType) + { + MDocType[] doc = MDocType.getOfDocBaseType(getCtx(), docBaseType); + if(doc == null) + { + throw new DocTypeNotFoundException(docBaseType, ""); + } + else + { + setC_DocTypeTarget_ID(doc[0].get_ID()); + } + } // @Override public void setProcessed (boolean processed) @@ -178,23 +196,23 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction // Operation Activity if(isCostCollectorType(COSTCOLLECTORTYPE_ActivityControl)) { - MPPOrderNode activity = getPPOrderNode(); - if(activity.getDocStatus().equals(MPPOrderNode.DOCACTION_Complete)) + MPPOrderNode activity = getPP_Order_Node(); + if(MPPOrderNode.DOCACTION_Complete.equals(activity.getDocStatus())) { - m_processMsg = "Activity was completed before"; - return DocAction.STATUS_Invalid; + throw new ActivityProcessedException(activity); } if (activity.isSubcontracting()) { - if(activity.getDocStatus().equals(MPPOrderNode.DOCSTATUS_InProgress) && getDocStatus().equals(MPPCostCollector.DOCSTATUS_InProgress)) + if(activity.getDocStatus().equals(MPPOrderNode.DOCSTATUS_InProgress) + && getDocStatus().equals(MPPCostCollector.DOCSTATUS_InProgress)) { return MPPOrderNode.DOCSTATUS_InProgress; } - else if(activity.getDocStatus().equals(MPPOrderNode.DOCSTATUS_InProgress) && getDocStatus().equals(MPPCostCollector.DOCSTATUS_Drafted)) + else if(activity.getDocStatus().equals(MPPOrderNode.DOCSTATUS_InProgress) + && getDocStatus().equals(MPPCostCollector.DOCSTATUS_Drafted)) { - m_processMsg = "Activity was processed before"; - return DocAction.STATUS_Invalid; + throw new ActivityProcessedException(activity); } createPOrder(activity); } @@ -209,11 +227,11 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction if (MPPOrderNode.isLastNode(getCtx(), getPP_Order_Node_ID(), get_TrxName())) { - String whereClause ="AND PP_Order_ID=? AND PP_Order_Node_ID<>?" + 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, this.get_TrxName()) + +" 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(); @@ -226,10 +244,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction m_justPrepared = true; - if (!DOCACTION_Complete.equals(getDocAction())) - { - setDocAction(DOCACTION_Complete); - } + setDocAction(DOCACTION_Complete); m_processMsg = ModelValidationEngine.get().fireDocValidate(this, ModelValidator.TIMING_AFTER_PREPARE); if (m_processMsg != null) @@ -296,7 +311,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction // Only for Production Issue records if (isIssue()) { - checkMaterialPolicy(getPPOrderBOMLine(), getMovementQty()); + checkMaterialPolicy(getPP_Order_BOMLine()); } log.fine("Material Transaction"); @@ -324,8 +339,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction ma.getM_AttributeSetInstance_ID(), reservationAttributeSetInstance_ID, QtyMA, QtyIssue, QtyReceipt, get_TrxName())) { - m_processMsg = "Cannot correct Inventory (MA)"; - return DocAction.STATUS_Invalid; + throw new AdempiereException(); //Cannot correct Inventory (MA) } // Create Transaction @@ -348,8 +362,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction getM_AttributeSetInstance_ID(), reservationAttributeSetInstance_ID, Qty, QtyIssue, QtyReceipt, get_TrxName())) { - m_processMsg = "Cannot correct Inventory"; - return DocAction.STATUS_Invalid; + throw new AdempiereException(); // Cannot correct Inventory; } // FallBack: Create Transaction @@ -367,56 +380,61 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction if (isIssue()) { // Update PP Order Line - MPPOrderBOMLine obomline = getPPOrderBOMLine(); - if (obomline != null) - { - obomline.setQtyDelivered(obomline.getQtyDelivered().add(getMovementQty())); - obomline.setQtyScrap(obomline.getQtyScrap().add(getScrappedQty())); - obomline.setQtyReject(obomline.getQtyReject().add(getQtyReject())); - obomline.setDateDelivered(getMovementDate()); // overwrite=last - obomline.setM_AttributeSetInstance_ID(getM_AttributeSetInstance_ID()); - log.fine("OrderLine - Reserved=" + obomline.getQtyReserved() + ", Delivered=" + obomline.getQtyDelivered()); - obomline.setQtyReserved(obomline.getQtyReserved().subtract(getMovementQty())); - obomline.saveEx(); - log.fine("OrderLine -> Reserved="+obomline.getQtyReserved()+", Delivered="+obomline.getQtyDelivered()); - } + MPPOrderBOMLine obomline = getPP_Order_BOMLine(); + obomline.setQtyDelivered(obomline.getQtyDelivered().add(getMovementQty())); + obomline.setQtyScrap(obomline.getQtyScrap().add(getScrappedQty())); + obomline.setQtyReject(obomline.getQtyReject().add(getQtyReject())); + obomline.setDateDelivered(getMovementDate()); // overwrite=last + obomline.setM_AttributeSetInstance_ID(getM_AttributeSetInstance_ID()); + log.fine("OrderLine - Reserved=" + obomline.getQtyReserved() + ", Delivered=" + obomline.getQtyDelivered()); + obomline.setQtyReserved(obomline.getQtyReserved().subtract(getMovementQty())); + obomline.saveEx(); + log.fine("OrderLine -> Reserved="+obomline.getQtyReserved()+", Delivered="+obomline.getQtyDelivered()); } - else if (isReceipt()) + if (isReceipt()) { - // Update PP Order - MPPOrder order = getPPOrder(); + // Update PP Order Qtys + MPPOrder order = getPP_Order(); order.setQtyDelivered(order.getQtyDelivered().add(getMovementQty())); order.setQtyScrap(order.getQtyScrap().add(getScrappedQty())); order.setQtyReject(order.getQtyReject().add(getQtyReject())); - order.setDateDelivered(getMovementDate()); // overwrite=last - log.fine("OrderLine - Reserved=" + order.getQtyReserved() + ", Delivered=" + order.getQtyDelivered()); order.setQtyReserved(order.getQtyReserved().subtract(getMovementQty())); + // + // Update PP Order Dates + order.setDateDelivered(getMovementDate()); // overwrite=last + if (order.getDateStart() == null) + { + order.setDateStart(getMovementDate()); + } + if (order.getQtyOpen().signum() <= 0) + { + order.setDateFinish(getMovementDate()); + } order.saveEx(); - log.fine("Order -> Delivered=" + order.getQtyDelivered()); } } else if(isCostCollectorType(COSTCOLLECTORTYPE_ActivityControl)) { - MPPOrderNode activity = getPPOrderNode(); + MPPOrderNode activity = getPP_Order_Node(); if(activity.getDocStatus().equals(MPPOrderNode.DOCSTATUS_Completed)) { - m_processMsg = "Activity was completed before"; - return DocAction.STATUS_Invalid; + throw new ActivityProcessedException(activity); } - if(isSubcontracting()) { - String whereClause = "PP_Cost_Collector_ID =?"; + String whereClause = MOrderLine.COLUMNNAME_PP_Cost_Collector_ID+"=?"; Collection olines = new Query(getCtx(), MOrderLine.Table_Name, whereClause, get_TrxName()) - .setParameters(new Object[]{this.getPP_Cost_Collector_ID()}).list(); + .setParameters(new Object[]{get_ID()}) + .list(); String DocStatus = MPPOrderNode.DOCSTATUS_Completed; StringBuffer msg = new StringBuffer("The quantity do not is complete for next Purchase Order :"); - for (MOrderLine oline: olines) + for (MOrderLine oline : olines) { - if(oline.getQtyDelivered().compareTo(oline.getQtyOrdered()) < 0) + if(oline.getQtyDelivered().compareTo(oline.getQtyOrdered()) < 0) + { DocStatus = MPPOrderNode.DOCSTATUS_InProgress; - + } msg.append(oline.getParent().getDocumentNo()).append(","); } @@ -443,9 +461,8 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction activity.saveEx(); } } - - } - // for all lines + } // end Activity Control + // setProcessed(true); setDocAction(DOCACTION_Close); setDocStatus(DOCSTATUS_Completed); @@ -488,7 +505,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction } else { - String whereClause = MPPOrderNode.COLUMNNAME_PP_Order_ID+"=?" + 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) @@ -631,10 +648,27 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction @Override protected boolean beforeSave(boolean newRecord) { - /*if (newRecord) + // Set default locator, if not set and we have the warehouse: + if (getM_Locator_ID() <= 0 && getM_Warehouse_ID() > 0) { - setDocStatus(DOCSTATUS_InProgress); - }*/ + MWarehouse wh = MWarehouse.get(getCtx(), getM_Warehouse_ID()); + MLocator loc = wh.getDefaultLocator(); + if (loc != null) + { + setM_Locator_ID(loc.get_ID()); + } + } + // + if (isCostCollectorType(COSTCOLLECTORTYPE_ActivityControl) && getPP_Order_Node_ID() <= 0) + { + throw new FillMandatoryException(COLUMNNAME_PP_Order_Node_ID); + } + // + if (isIssue() && getPP_Order_BOMLine_ID() <= 0) + { + throw new FillMandatoryException(COLUMNNAME_PP_Order_BOMLine_ID); + } + // return true; } @@ -656,7 +690,8 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction } } - protected void completeNew(int PP_Order_ID) + @Deprecated + private void completeNew(int PP_Order_ID) { if(isCostCollectorType(COSTCOLLECTORTYPE_ActivityControl)) { @@ -676,10 +711,10 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction } /** - * Check Material Policy. - * Sets line ASI + * Check Material Policy. + * Sets line ASI */ - private void checkMaterialPolicy(MPPOrderBOMLine line , BigDecimal qty) + private void checkMaterialPolicy(MPPOrderBOMLine line) { MPPOrderBOMLineMA.deleteOrderBOMLineMA(line.get_ID(), get_TrxName()); @@ -689,6 +724,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction return; } + BigDecimal qty = getMovementQty(); BigDecimal qtyASI = Env.ZERO ; // Check Line @@ -748,8 +784,9 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction } } // outgoing Trx } // checkMaterialPolicy - - public MPPOrderNode getPPOrderNode() + + @Override + public MPPOrderNode getPP_Order_Node() { int node_id = getPP_Order_Node_ID(); if (node_id <= 0) @@ -764,10 +801,9 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction m_orderNode.set_TrxName(get_TrxName()); return m_orderNode; } - - - public MPPOrderBOMLine getPPOrderBOMLine() + @Override + public MPPOrderBOMLine getPP_Order_BOMLine() { int id = getPP_Order_BOMLine_ID(); if (id <= 0) @@ -782,9 +818,9 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction m_bomLine.set_TrxName(get_TrxName()); return m_bomLine; } - - public MPPOrder getPPOrder() + @Override + public MPPOrder getPP_Order() { int id = getPP_Order_ID(); if (id <= 0) @@ -800,105 +836,115 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction return m_pporder; } - /** * Create Purchase Order (in case of Subcontracting) + * @param activity */ private void createPOrder(MPPOrderNode activity) { - // create purchase order on complete - String whereClause = "PP_Order_ID=? AND PP_Order_Node_ID=? AND IsSubcontracting=?"; - Collection subctracts = new Query(getCtx(),MPPOrderNodeProduct.Table_Name,whereClause, get_TrxName()) - .setParameters(new Object[]{getPP_Order_ID(), activity.getPP_Order_Node_ID(),"Y"}) - .setOnlyActiveRecords(true) - .list(); - - int C_BPartner_ID = -1 ; - CCache orders = new CCache(MOrder.Table_Name, 5); - - - for (MPPOrderNodeProduct subctract: subctracts ) + HashMap orders = new HashMap(); + // + String whereClause = MPPOrderNodeProduct.COLUMNNAME_PP_Order_Node_ID+"=?" + +" AND "+MPPOrderNodeProduct.COLUMNNAME_IsSubcontracting+"=?"; + Collection subcontracts = new Query(getCtx(), MPPOrderNodeProduct.Table_Name, whereClause, get_TrxName()) + .setParameters(new Object[]{activity.get_ID(), true}) + .setOnlyActiveRecords(true) + .list(); + for (MPPOrderNodeProduct subcontract : subcontracts) { - MProduct product = MProduct.get(getCtx(), subctract.getM_Product_ID()); - MProductPO m_product_po = null; - if(product.isPurchased() && product.getProductType().equals(MProduct.PRODUCTTYPE_Service)) - { - C_BPartner_ID = activity.getC_BPartner_ID(); - - MProductPO[] ppos = MProductPO.getOfProduct(getCtx(), product.getM_Product_ID(), get_TrxName()); - for (MProductPO ppo : ppos) - { - if(C_BPartner_ID == ppo.getC_BPartner_ID()) - { - C_BPartner_ID = ppo.getC_BPartner_ID(); - m_product_po = ppo; - break; - } - if (ppo.isCurrentVendor() && ppo.getC_BPartner_ID() != 0) - { - C_BPartner_ID = ppo.getC_BPartner_ID(); - m_product_po = ppo; - break; - } - } - - if(C_BPartner_ID == -1) - throw new AdempiereException(Msg.getMsg(getCtx(), "no.vendor.was.found.for")+" " - +Msg.getMsg(getCtx(),"M_Product_ID") + ":" + product.getName()); - - Timestamp today = new Timestamp(System.currentTimeMillis()); - Timestamp datePromised = TimeUtil.addDays(today, m_product_po.getDeliveryTime_Promised()); - - MOrder order = orders.get(C_BPartner_ID); - if(order == null) - { - order = new MOrder(getCtx(), 0, get_TrxName()); - MBPartner vendor = new MBPartner (getCtx(), C_BPartner_ID, get_TrxName()); - order.setBPartner(vendor); - order.setIsSOTrx(false); - order.setC_DocTypeTarget_ID(); - order.setDatePromised(datePromised); - order.setDescription(getPPOrder().getDocumentNo()); - order.setDocStatus(MOrder.DOCSTATUS_Drafted); - order.setDocAction(MOrder.DOCACTION_Complete); - order.setAD_User_ID(getAD_User_ID()); - //order.setSalesRep_ID(getAD_User_ID()); - order.saveEx(); - setDescription(getDescription() == null ? order.getDocumentNo() : - getDescription().concat(Msg.translate(getCtx(), "C_Order_ID")+":"+order.getDocumentNo())); - orders.put(C_BPartner_ID, order); - } - - BigDecimal QtyOrdered = Env.ZERO; - // Check Order Min - if(subctract.getQty().signum() > 0 && m_product_po.getOrder_Min().signum() > 0) - { - QtyOrdered = QtyOrdered.max(m_product_po.getOrder_Min()); - } - - // Check Order Pack - if (m_product_po.getOrder_Pack().signum() > 0 && QtyOrdered.signum() > 0) - { - QtyOrdered = m_product_po.getOrder_Pack().multiply(QtyOrdered.divide(m_product_po.getOrder_Pack(), 0 , BigDecimal.ROUND_UP)); - } - - MOrderLine oline = new MOrderLine(order); - oline.setM_Product_ID(product.getM_Product_ID()); - oline.setDescription(activity.getDescription()); - oline.setQty(QtyOrdered); - //line.setPrice(m_product_po.getPricePO()); - //oline.setPriceList(m_product_po.getPriceList()); - oline.setPP_Cost_Collector_ID(get_ID()); - oline.setDatePromised(datePromised); - oline.saveEx(); - setProcessed(true); + // + // If Product is not Purchased or is not Service, then it is not a subcontracting candidate [SKIP] + MProduct product = MProduct.get(getCtx(), subcontract.getM_Product_ID()); + if(product.isPurchased() && MProduct.PRODUCTTYPE_Service.equals(product.getProductType())) + { + continue; } - } - - - - + // + // Find Vendor and Product PO data + int C_BPartner_ID = activity.getC_BPartner_ID(); + MProductPO product_po = null; + for (MProductPO ppo : MProductPO.getOfProduct(getCtx(), product.get_ID(), null)) + { + if(C_BPartner_ID == ppo.getC_BPartner_ID()) + { + C_BPartner_ID = ppo.getC_BPartner_ID(); + product_po = ppo; + break; + } + if (ppo.isCurrentVendor() && ppo.getC_BPartner_ID() != 0) + { + C_BPartner_ID = ppo.getC_BPartner_ID(); + product_po = ppo; + break; + } + } + if(C_BPartner_ID <= 0 || product_po == null) + { + throw new NoVendorForProductException(product.getName()); + } + // + // Calculate Lead Time + Timestamp today = new Timestamp(System.currentTimeMillis()); + Timestamp datePromised = TimeUtil.addDays(today, product_po.getDeliveryTime_Promised()); + // + // Get/Create Purchase Order Header + MOrder order = orders.get(C_BPartner_ID); + if(order == null) + { + order = new MOrder(getCtx(), 0, get_TrxName()); + MBPartner vendor = MBPartner.get(getCtx(), C_BPartner_ID); + order.setBPartner(vendor); + order.setIsSOTrx(false); + order.setC_DocTypeTarget_ID(); + order.setDatePromised(datePromised); + order.setDescription(getPP_Order().getDocumentNo()); + order.setDocStatus(MOrder.DOCSTATUS_Drafted); + order.setDocAction(MOrder.DOCACTION_Complete); + order.setAD_User_ID(getAD_User_ID()); + //order.setSalesRep_ID(getAD_User_ID()); + order.saveEx(); + addDescription(Msg.translate(getCtx(), "C_Order_ID")+": "+order.getDocumentNo()); + orders.put(C_BPartner_ID, order); + } + // + // Create Order Line: + BigDecimal QtyOrdered = subcontract.getQty(); + // Check Order Min + if(product_po.getOrder_Min().signum() > 0) + { + QtyOrdered = QtyOrdered.max(product_po.getOrder_Min()); + } + // Check Order Pack + if (product_po.getOrder_Pack().signum() > 0 && QtyOrdered.signum() > 0) + { + QtyOrdered = product_po.getOrder_Pack().multiply(QtyOrdered.divide(product_po.getOrder_Pack(), 0 , BigDecimal.ROUND_UP)); + } + MOrderLine oline = new MOrderLine(order); + oline.setM_Product_ID(product.getM_Product_ID()); + oline.setDescription(activity.getDescription()); + oline.setQty(QtyOrdered); + //line.setPrice(m_product_po.getPricePO()); + //oline.setPriceList(m_product_po.getPriceList()); + oline.setPP_Cost_Collector_ID(get_ID()); + oline.setDatePromised(datePromised); + oline.saveEx(); + // + // TODO: Mark this as processed? + setProcessed(true); + } // each subcontracting line + } + + @Override + public I_M_Product getM_Product() + { + return MProduct.get(getCtx(), getM_Product_ID()); + } + + @Override + public I_C_UOM getC_UOM() + { + return MUOM.get(getCtx(), getC_UOM_ID()); } public boolean isIssue() @@ -942,7 +988,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction * @param args ignored * @throws IOException * @throws FileNotFoundException - */ + * public static void main (String[] args) throws FileNotFoundException, IOException { @@ -983,12 +1029,11 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction m_Ctx.setProperty("#AD_User_ID", new Integer(AD_User_ID_Value).toString()); m_Ctx.setProperty("#AD_Client_ID", new Integer(AD_Client_ID_Value).toString()); - /*if (fileName_Value.length() < 1) { - throw new AdempiereException("Please specify path to Adempiere.properties file!"); - } - - System.setProperty("PropertyFile", fileName_Value); - */ +// if (fileName_Value.length() < 1) { +// throw new AdempiereException("Please specify path to Adempiere.properties file!"); +// } +// +// System.setProperty("PropertyFile", fileName_Value); //CLogMgt.setLevel(LogLevel_Value); @@ -1009,5 +1054,6 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction } } - } + } + /**/ } // MPPCostCollector diff --git a/base/src/org/eevolution/model/MPPMRP.java b/base/src/org/eevolution/model/MPPMRP.java index 4b08980f4c..c96f1d984e 100644 --- a/base/src/org/eevolution/model/MPPMRP.java +++ b/base/src/org/eevolution/model/MPPMRP.java @@ -18,10 +18,13 @@ package org.eevolution.model; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Properties; import org.compiere.model.MDocType; +import org.compiere.model.MForecastLine; import org.compiere.model.MLocator; import org.compiere.model.MOrder; import org.compiere.model.MOrderLine; @@ -30,11 +33,11 @@ import org.compiere.model.MRequisition; import org.compiere.model.MRequisitionLine; import org.compiere.model.MResource; import org.compiere.model.MResourceType; -import org.compiere.model.MTable; +import org.compiere.model.PO; import org.compiere.model.Query; -import org.compiere.model.X_C_DocType; import org.compiere.model.X_M_Forecast; import org.compiere.process.DocAction; +import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; import org.compiere.util.TimeUtil; @@ -52,7 +55,131 @@ import org.compiere.wf.MWorkflow; public class MPPMRP extends X_PP_MRP { private static final long serialVersionUID = 1L; + + private static CLogger s_log = CLogger.getCLogger(MPPMRP.class); + + private static HashMap s_sourceColumnNames = new HashMap(); + static + { + s_sourceColumnNames.put(MOrder.Table_Name, new String[]{ + MOrder.COLUMNNAME_DatePromised, + MOrder.COLUMNNAME_DocStatus, + }); + s_sourceColumnNames.put(MOrderLine.Table_Name, new String[]{ + "AD_Org_ID", + MOrderLine.COLUMNNAME_DateOrdered, + MOrderLine.COLUMNNAME_DatePromised, + MOrderLine.COLUMNNAME_C_BPartner_ID, + MOrderLine.COLUMNNAME_M_Warehouse_ID, + MOrderLine.COLUMNNAME_M_Product_ID, + MOrderLine.COLUMNNAME_QtyOrdered, + MOrderLine.COLUMNNAME_QtyDelivered, + }); + s_sourceColumnNames.put(MRequisition.Table_Name, new String[]{ + MRequisition.COLUMNNAME_DateRequired, + MRequisition.COLUMNNAME_M_Warehouse_ID, + }); + s_sourceColumnNames.put(MRequisitionLine.Table_Name, new String[]{ + "AD_Org_ID", + MRequisitionLine.COLUMNNAME_M_Product_ID, + MRequisitionLine.COLUMNNAME_Qty, + MRequisitionLine.COLUMNNAME_C_OrderLine_ID, // QtyOrdered depends on that + }); + s_sourceColumnNames.put(X_M_Forecast.Table_Name, new String[]{ + }); + s_sourceColumnNames.put(MForecastLine.Table_Name, new String[]{ + "AD_Org_ID", + MForecastLine.COLUMNNAME_DatePromised, + MForecastLine.COLUMNNAME_M_Warehouse_ID, + MForecastLine.COLUMNNAME_M_Product_ID, + MForecastLine.COLUMNNAME_Qty, + }); + s_sourceColumnNames.put(MDDOrderLine.Table_Name, new String[]{ + "AD_Org_ID", + MDDOrderLine.COLUMNNAME_M_Product_ID, + MDDOrderLine.COLUMNNAME_DatePromised, + MDDOrderLine.COLUMNNAME_QtyOrdered, + MDDOrderLine.COLUMNNAME_QtyDelivered, + MDDOrderLine.COLUMNNAME_ConfirmedQty, + MDDOrderLine.COLUMNNAME_M_Locator_ID, + MDDOrderLine.COLUMNNAME_M_LocatorTo_ID, + MDDOrderLine.COLUMNNAME_ConfirmedQty, + }); + s_sourceColumnNames.put(MPPOrder.Table_Name, new String[]{ + "AD_Org_ID", + MPPOrder.COLUMNNAME_M_Product_ID, + MPPOrder.COLUMNNAME_DatePromised, + MPPOrder.COLUMNNAME_QtyOrdered, + MPPOrder.COLUMNNAME_QtyDelivered, + MPPOrder.COLUMNNAME_PP_Product_BOM_ID, + MPPOrder.COLUMNNAME_AD_Workflow_ID, + }); + s_sourceColumnNames.put(MPPOrderBOMLine.Table_Name, new String[]{ + MPPOrderBOMLine.COLUMNNAME_M_Product_ID, + MPPOrderBOMLine.COLUMNNAME_M_Warehouse_ID, + MPPOrderBOMLine.COLUMNNAME_QtyEntered, + MPPOrderBOMLine.COLUMNNAME_QtyDelivered, + }); + } + /** + * Check if a persistent object is changed, from MRP point of view + * @param po MRP relevant PO (e.g. MOrder, MOrderLine, MPPOrder etc) + * @return true if object changed + */ + public static boolean isChanged(PO po) + { + String[] columnNames = s_sourceColumnNames.get(po.get_TableName()); + if (columnNames == null || columnNames.length == 0) + { + return false; + } + for (String columnName : columnNames) + { + if (po.is_ValueChanged(columnName)) + { + return true; + } + } + return false; + } + + public static void deleteMRP(PO po) + { + String tableName = po.get_TableName(); + int no = DB.executeUpdateEx("DELETE FROM "+Table_Name+" WHERE "+tableName+"_ID=? AND AD_Client_ID=?", + new Object[]{po.get_ID(), po.getAD_Client_ID()}, + po.get_TrxName()); + s_log.finest("Deleted "+tableName+" #"+no); + } + + private static Query getQuery(PO po, String typeMRP, String orderType) + { + ArrayList params = new ArrayList(); + StringBuffer whereClause = new StringBuffer(); + // + whereClause.append("AD_Client_ID=?"); + params.add(po.getAD_Client_ID()); + // + whereClause.append(" AND ").append(po.get_TableName()).append("_ID=?"); + params.add(po.get_ID()); + // + if (typeMRP != null) + { + whereClause.append(" AND ").append(COLUMNNAME_TypeMRP).append("=?"); + params.add(typeMRP); + } + // + if (orderType != null) + { + whereClause.append(" AND ").append(COLUMNNAME_OrderType).append("=?"); + params.add(orderType); + } + // + return new Query(po.getCtx(), Table_Name, whereClause.toString(), po.get_TrxName()) + .setParameters(params); + } + /************************************************************************** * Default Constructor * @param ctx context @@ -122,15 +249,12 @@ public class MPPMRP extends X_PP_MRP if (delete) { - final String sql = "DELETE FROM PP_MRP WHERE M_ForecastLine_ID=? AND AD_Client_ID=?"; - DB.executeUpdateEx(sql, new Object[]{fl.get_ID(), fl.getAD_Client_ID()}, trxName); + deleteMRP(fl); return; } X_M_Forecast f = new X_M_Forecast(ctx, fl.getM_Forecast_ID(), trxName); - MPPMRP mrp = new Query(ctx, MPPMRP.Table_Name, "M_ForecastLine_ID=?", trxName) - .setParameters(new Object[]{fl.get_ID()}) - .first(); + MPPMRP mrp = getQuery(fl, null, null).firstOnly(); if (mrp == null) { mrp = new MPPMRP(ctx, 0, trxName); @@ -162,21 +286,14 @@ public class MPPMRP extends X_PP_MRP */ public static void C_Order(MOrder o, boolean delete) { - String trxName = o.get_TrxName(); - - final String whereClause = COLUMNNAME_C_Order_ID+"=? AND AD_Client_ID=?"; - Object[] params = new Object[]{o.get_ID(), o.getAD_Client_ID()}; - if (delete) { - final String sql = "DELETE FROM PP_MRP WHERE "+whereClause; - DB.executeUpdateEx(sql, params, trxName); + deleteMRP(o); return; } - MDocType dt = MDocType.get(o.getCtx(), o.getC_DocType_ID()); + MDocType dt = MDocType.get(o.getCtx(), o.getC_DocTypeTarget_ID()); String DocSubTypeSO = dt.getDocSubTypeSO(); - if(MDocType.DOCSUBTYPESO_StandardOrder.equals(DocSubTypeSO) || !o.isSOTrx()) { if((o.getDocStatus().equals(MOrder.DOCSTATUS_InProgress) @@ -193,9 +310,7 @@ public class MPPMRP extends X_PP_MRP || o.is_ValueChanged(MOrder.COLUMNNAME_C_BPartner_ID) ) { - List list = new Query(o.getCtx(), MPPMRP.Table_Name, whereClause, trxName) - .setParameters(params) - .list(); + List list = getQuery(o, null, null).list(); for (MPPMRP mrp : list) { mrp.setC_Order(o); @@ -213,29 +328,22 @@ public class MPPMRP extends X_PP_MRP */ public static void C_OrderLine(MOrderLine ol, boolean delete) { - Properties ctx = ol.getCtx(); - String trxName = ol.get_TrxName(); - final String whereClause = "AD_Client_ID = ? AND C_OrderLine_ID = ?"; - Object[] params = new Object[]{ol.getAD_Client_ID(),ol.getC_OrderLine_ID()}; if (delete) { - DB.executeUpdateEx("DELETE FROM PP_MRP WHERE "+whereClause, params, trxName); - MPPOrder order = new Query(ctx, MPPOrder.Table_Name, whereClause, trxName) - .setParameters(params) - .first(); + deleteMRP(ol); + // Delete generated manufacturing order + MPPOrder order = MPPOrder.forC_OrderLine_ID(ol.getCtx(), ol.get_ID(), ol.get_TrxName()); if (order != null && !order.isProcessed()) { - order.deleteEx(true, trxName); + order.deleteEx(true); } return; } - MPPMRP mrp = new Query(ctx, MPPMRP.Table_Name, whereClause, trxName) - .setParameters(params) - .first(); + MPPMRP mrp = getQuery(ol, null, null).firstOnly(); if(mrp == null) { - mrp = new MPPMRP(ctx, 0, trxName); + mrp = new MPPMRP(ol.getCtx(), 0, ol.get_TrxName()); mrp.setC_OrderLine_ID(ol.getC_OrderLine_ID()); } mrp.setAD_Org_ID(ol.getAD_Org_ID()); @@ -256,84 +364,64 @@ public class MPPMRP extends X_PP_MRP String DocSubTypeSO = dt.getDocSubTypeSO(); if(MDocType.DOCSUBTYPESO_StandardOrder.equals(DocSubTypeSO)) { - MPPOrder order = new Query(ctx, MPPOrder.Table_Name, whereClause, trxName) - .setParameters(params) - .first(); + MPPOrder order = MPPOrder.forC_OrderLine_ID(ol.getCtx(), ol.get_ID(), ol.get_TrxName()); if (order == null) { - String where = MPPProductBOM.COLUMNNAME_BOMType+"=?" + final String whereClause = MPPProductBOM.COLUMNNAME_BOMType+"=?" +" AND "+MPPProductBOM.COLUMNNAME_M_Product_ID+"=?"; - MPPProductBOM bom = new Query(ctx, MPPProductBOM.Table_Name, where, trxName) + MPPProductBOM bom = new Query(ol.getCtx(), MPPProductBOM.Table_Name, whereClause, null) .setParameters(new Object[]{MPPProductBOM.BOMTYPE_Make_To_Order, ol.getM_Product_ID()}) - .first(); + .firstOnly(); MPPProductPlanning pp = null; //Validate the BOM based in planning data if(bom == null) { - pp = MPPProductPlanning.find( ctx, ol.getAD_Org_ID() , 0, 0, ol.getM_Product_ID(), trxName); + pp = MPPProductPlanning.find(ol.getCtx(), ol.getAD_Org_ID(), 0, 0, ol.getM_Product_ID(), null); if(pp != null) { - if(pp.getPP_Product_BOM_ID() != 0) - { - bom = (MPPProductBOM) pp.getPP_Product_BOM(); - if(!bom.getBOMType().equals(MPPProductBOM.BOMTYPE_Make_To_Order)) - bom = null; + bom = (MPPProductBOM) pp.getPP_Product_BOM(); + if(bom != null && !MPPProductBOM.BOMTYPE_Make_To_Order.equals(bom.getBOMType())) + { + bom = null; } } } - if (bom != null) { - MProduct product = MProduct.get(ctx,ol.getM_Product_ID()); - String WhereClause = "ManufacturingResourceType = 'PT' AND IsManufacturingResource = 'Y' AND AD_Client_ID = ? AND M_Warehouse_ID = ?"; - MResource m_resource = (MResource)MTable.get(ctx,MResource.Table_ID).getPO(WhereClause, new Object[]{ ol.getAD_Client_ID(),ol.getM_Warehouse_ID()}, trxName); - - MWorkflow m_workflow = MWorkflow.get(ctx, MWorkflow.getWorkflowSearchKey(ctx, product)); - - //Validate the workflow based in planning data - if(m_workflow == null) - { - if(pp != null && pp.getAD_Workflow_ID() != 0) - { - m_workflow = (MWorkflow) pp.getAD_Workflow(); - } - } - - if (m_resource != null && m_workflow != null) - { - MDocType[] doc = MDocType.getOfDocBaseType(ctx, X_C_DocType.DOCBASETYPE_ManufacturingOrder); - int C_DocType_ID = doc[0].getC_DocType_ID(); - - order = new MPPOrder(ctx, 0 , trxName); - order.setC_OrderLine_ID(ol.getC_OrderLine_ID()); - order.setS_Resource_ID(m_resource.get_ID()); - order.setM_Warehouse_ID(ol.getM_Warehouse_ID()); - order.setM_Product_ID(ol.getM_Product_ID()); - order.setM_AttributeSetInstance_ID(ol.getM_AttributeSetInstance_ID()); - order.setPP_Product_BOM_ID(bom.get_ID()); - order.setAD_Workflow_ID(m_workflow.get_ID()); - order.setPlanner_ID(ol.getParent().getSalesRep_ID()); - order.setLine(10); - order.setQtyDelivered(Env.ZERO); - order.setQtyReject(Env.ZERO); - order.setQtyScrap(Env.ZERO); - order.setDateOrdered(ol.getDateOrdered()); - order.setDatePromised(ol.getDatePromised()); - order.setDateStartSchedule(TimeUtil.addDays(ol.getDatePromised(), (MPPMRP.getDays(ctx,m_resource.getS_Resource_ID(),m_workflow.getAD_Workflow_ID(), ol.getQtyOrdered(),ol.get_TrxName())).negate().intValue())); - order.setDateFinishSchedule(ol.getDatePromised()); - order.setC_UOM_ID(ol.getC_UOM_ID()); - order.setQty(ol.getQtyEntered()); - order.setPosted(false); - order.setProcessed(false); - order.setC_DocTypeTarget_ID(C_DocType_ID); - order.setC_DocType_ID(C_DocType_ID); - order.setPriorityRule(MPPOrder.PRIORITYRULE_High); - order.saveEx(); - order.prepareIt(); - //order.setDocAction(MPPOrder.DOCSTATUS_Completed); - order.saveEx(); - + final MProduct product = MProduct.get(ol.getCtx(), ol.getM_Product_ID()); + final int plant_id = MPPProductPlanning.getPlantForWarehouse(ol.getM_Warehouse_ID()); + MWorkflow workflow = MWorkflow.get(ol.getCtx(), MWorkflow.getWorkflowSearchKey(ol.getCtx(), product)); + //Validate the workflow based in planning data + if(workflow == null && pp != null) + { + workflow = pp.getAD_Workflow(); + } + // + if (plant_id > 0 && workflow != null) + { + int duration = MPPMRP.getDays(ol.getCtx(), plant_id, workflow.get_ID(), ol.getQtyOrdered(), ol.get_TrxName()).intValue(); + // + order = new MPPOrder(ol.getCtx(), 0 , ol.get_TrxName()); + order.setC_OrderLine_ID(ol.getC_OrderLine_ID()); + order.setS_Resource_ID(plant_id); + order.setM_Warehouse_ID(ol.getM_Warehouse_ID()); + order.setM_Product_ID(ol.getM_Product_ID()); + order.setM_AttributeSetInstance_ID(ol.getM_AttributeSetInstance_ID()); + order.setPP_Product_BOM_ID(bom.get_ID()); + order.setAD_Workflow_ID(workflow.get_ID()); + order.setPlanner_ID(ol.getParent().getSalesRep_ID()); + order.setLine(10); + order.setDateOrdered(ol.getDateOrdered()); + order.setDatePromised(ol.getDatePromised()); + order.setDateStartSchedule(TimeUtil.addDays(ol.getDatePromised(), 0 - duration)); + order.setDateFinishSchedule(ol.getDatePromised()); + order.setC_UOM_ID(ol.getC_UOM_ID()); + order.setQty(ol.getQtyOrdered()); + order.setPriorityRule(MPPOrder.PRIORITYRULE_High); + order.saveEx(); + order.prepareIt(); + order.saveEx(); } } } @@ -370,18 +458,12 @@ public class MPPMRP extends X_PP_MRP if (delete) { - String sql = "DELETE FROM PP_MRP WHERE PP_Order_ID=? AND AD_Client_ID=?"; - Object[] params = new Object[]{o.getPP_Order_ID(), o.getAD_Client_ID()}; - DB.executeUpdateEx(sql, params, trxName); + deleteMRP(o); return; } - // // Supply - final String whereClause = "TypeMRP=? AND OrderType=? AND AD_Client_ID=? AND PP_Order_ID=?"; - MPPMRP mrpSupply = new Query(ctx, MPPMRP.Table_Name, whereClause, trxName) - .setParameters(new Object[]{MPPMRP.TYPEMRP_Supply, MPPMRP.ORDERTYPE_ManufacturingOrder, o.getAD_Client_ID(), o.getPP_Order_ID()}) - .first(); + MPPMRP mrpSupply = getQuery(o, TYPEMRP_Supply, ORDERTYPE_ManufacturingOrder).firstOnly(); if(mrpSupply == null) { mrpSupply = new MPPMRP(ctx, 0, trxName); @@ -393,13 +475,10 @@ public class MPPMRP extends X_PP_MRP mrpSupply.setM_Product_ID(o.getM_Product_ID()); mrpSupply.setM_Warehouse_ID(o.getM_Warehouse_ID()); mrpSupply.saveEx(); - // // Demand - List demand = new Query(ctx, MPPMRP.Table_Name, whereClause, trxName) - .setParameters(new Object[]{MPPMRP.TYPEMRP_Demand, MPPMRP.ORDERTYPE_ManufacturingOrder, o.getAD_Client_ID(), o.getPP_Order_ID()}) - .list(); - for (MPPMRP mrpDemand : demand) + List mrpDemandList = getQuery(o, TYPEMRP_Demand, ORDERTYPE_ManufacturingOrder).list(); + for (MPPMRP mrpDemand : mrpDemandList) { mrpDemand.setPP_Order(o); mrpDemand.saveEx(); @@ -411,31 +490,39 @@ public class MPPMRP extends X_PP_MRP * @param MPPOrderBOMLine Order BOM Line * @param delete indicate if this record is delete */ - public static void PP_Order_BOMLine(MPPOrderBOMLine obl,boolean delete) + public static void PP_Order_BOMLine(MPPOrderBOMLine obl, boolean delete) { String trxName = obl.get_TrxName(); Properties ctx = obl.getCtx(); if (delete) { - final String sql = "DELETE FROM PP_MRP WHERE PP_Order_BOMLine_ID=? AND AD_Client_ID=?"; - DB.executeUpdateEx(sql, new Object[]{obl.get_ID(), obl.getAD_Client_ID()}, trxName); + deleteMRP(obl); return; } - - final String whereClause = "TypeMRP=? AND OrderType=? AND PP_Order_BOMLine_ID=? AND AD_Client_ID=?"; - MPPMRP mrp = new Query(ctx, MPPMRP.Table_Name, whereClause, trxName) - .setParameters(new Object[]{TYPEMRP_Demand, ORDERTYPE_ManufacturingOrder, obl.get_ID(), obl.getAD_Client_ID()}) - .first(); - MPPOrder o = obl.getParent(); + // + String typeMRP = MPPMRP.TYPEMRP_Demand; + BigDecimal qty = obl.getQtyRequiered().subtract(obl.getQtyDelivered()); + // + // By-Product support: + if (obl.isComponentType(MPPOrderBOMLine.COMPONENTTYPE_ByProduct)) + { + // TODO: need to evaluate + deleteMRP(obl); + return; +// typeMRP = MPPMRP.TYPEMRP_Supply; +// qty = qty.negate(); + } + // + MPPMRP mrp = getQuery(obl, typeMRP, ORDERTYPE_ManufacturingOrder).firstOnly(); if(mrp == null) { 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.setTypeMRP(MPPMRP.TYPEMRP_Demand); } - mrp.setPP_Order(o); - mrp.setQty(obl.getQtyRequiered().subtract(obl.getQtyDelivered())); + mrp.setAD_Org_ID(obl.getAD_Org_ID()); + mrp.setTypeMRP(typeMRP); + mrp.setPP_Order(obl.getParent()); + mrp.setQty(qty); mrp.setM_Product_ID(obl.getM_Product_ID()); mrp.setM_Warehouse_ID(obl.getM_Warehouse_ID()); mrp.saveEx(); @@ -448,12 +535,9 @@ public class MPPMRP extends X_PP_MRP */ public static void DD_Order(MDDOrder o, boolean delete) { - String sql = null; - String trxName = o.get_TrxName(); if (delete) { - sql = "DELETE FROM PP_MRP WHERE DD_Order_ID = "+ o.getDD_Order_ID() +" AND AD_Client_ID = " + o.getAD_Client_ID(); - DB.executeUpdateEx(sql, trxName); + deleteMRP(o); return; } } @@ -465,20 +549,18 @@ public class MPPMRP extends X_PP_MRP */ public static void DD_Order_Line(MDDOrderLine ol, boolean delete) { - String sql = null; String trxName = ol.getParent().get_TrxName(); Properties m_ctx = ol.getCtx(); if (delete) { - sql = "DELETE FROM PP_MRP WHERE DD_OrderLine_ID = "+ ol.getDD_OrderLine_ID() +" AND AD_Client_ID = " + ol.getAD_Client_ID(); - DB.executeUpdateEx(sql ,trxName); + deleteMRP(ol); return; } - String whereClause = "TypeMRP = ? AND OrderType=? AND AD_Client_ID=? AND DD_OrderLine_ID = ?"; - MPPMRP mrp = (MPPMRP)MTable.get(m_ctx, MPPMRP.Table_ID).getPO(whereClause, new Object[]{MPPMRP.TYPEMRP_Demand,"DOO",ol.getAD_Client_ID(),ol.getDD_OrderLine_ID()}, trxName); + // + MPPMRP mrp = getQuery(ol, TYPEMRP_Demand, ORDERTYPE_DistributionOrder).firstOnly(); MLocator source = MLocator.get( m_ctx , ol.getM_Locator_ID()); MLocator target = MLocator.get( m_ctx , ol.getM_LocatorTo_ID()); - if(mrp!=null) + if(mrp != null) { mrp.setAD_Org_ID(source.getAD_Org_ID()); mrp.setName("MRP"); @@ -510,8 +592,7 @@ public class MPPMRP extends X_PP_MRP mrp.saveEx(); } - whereClause ="TypeMRP=? AND OrderType=? AND AD_Client_ID=? AND DD_OrderLine_ID = ? "; - mrp = (MPPMRP)MTable.get(m_ctx, MPPMRP.Table_ID).getPO(whereClause, new Object[]{MPPMRP.TYPEMRP_Supply,"DOO",ol.getAD_Client_ID(),ol.getDD_OrderLine_ID()}, trxName); + mrp = getQuery(ol, TYPEMRP_Supply, ORDERTYPE_DistributionOrder).firstOnly(); if(mrp!=null) { mrp.setAD_Org_ID(target.getAD_Org_ID()); @@ -554,37 +635,30 @@ public class MPPMRP extends X_PP_MRP */ public static void M_RequisitionLine( MRequisitionLine rl , boolean delete) { - String trxName = rl.get_TrxName(); - Properties ctx = rl.getCtx(); - final String whereClause = "M_RequisitionLine_ID=? AND AD_Client_ID=?"; - Object[] params = new Object[]{rl.getM_RequisitionLine_ID(), rl.getAD_Client_ID()}; - if (delete) { - DB.executeUpdateEx("DELETE FROM PP_MRP WHERE "+whereClause, params, trxName); + deleteMRP(rl); return; } - MPPMRP mrp = new Query(ctx, MPPMRP.Table_Name, whereClause, trxName) - .setParameters(params) - .first(); + MPPMRP mrp = getQuery(rl, null, null).firstOnly(); MRequisition r = rl.getParent(); if (mrp == null) { - mrp = new MPPMRP(ctx, 0, trxName); - mrp.setAD_Org_ID(r.getAD_Org_ID()); + mrp = new MPPMRP(rl.getCtx(), 0, rl.get_TrxName()); mrp.setM_Requisition_ID(rl.getM_Requisition_ID()); mrp.setM_RequisitionLine_ID(rl.getM_RequisitionLine_ID()); mrp.setOrderType(MPPMRP.ORDERTYPE_MaterialRequisition); mrp.setTypeMRP(MPPMRP.TYPEMRP_Supply); mrp.setIsAvailable(true); } + mrp.setAD_Org_ID(r.getAD_Org_ID()); mrp.setName("MRP"); mrp.setDescription(rl.getDescription()); + mrp.setDateOrdered(r.getDateRequired()); mrp.setDatePromised(r.getDateRequired()); mrp.setDateStartSchedule(r.getDateRequired()); mrp.setDateFinishSchedule(r.getDateRequired()); - mrp.setDateOrdered(r.getDateRequired()); mrp.setM_Product_ID(rl.getM_Product_ID()); mrp.setM_Warehouse_ID(r.getM_Warehouse_ID()); // We create a MRP record only for Not Ordered Qty. The Order will generate a MRP record for Ordered Qty. @@ -605,12 +679,9 @@ public class MPPMRP extends X_PP_MRP */ public static BigDecimal getQtyOnHand(Properties ctx, int M_Warehouse_ID ,int M_Product_ID,String trxName) { - final String sql = "SELECT SUM(bomQtyOnHand (M_Product_ID,?,0)) AS OnHand FROM M_Product" + final String sql = "SELECT COALESCE(bomQtyOnHand (M_Product_ID,?,0),0) FROM M_Product" +" WHERE AD_Client_ID=? AND M_Product_ID=?"; - BigDecimal QtyOnHand = DB.getSQLValueBDEx(trxName, sql, new Object[]{M_Warehouse_ID,Env.getAD_Client_ID(ctx),M_Product_ID}); - if (QtyOnHand == null) - QtyOnHand = Env.ZERO; - return QtyOnHand; + return DB.getSQLValueBDEx(trxName, sql, new Object[]{M_Warehouse_ID,Env.getAD_Client_ID(ctx),M_Product_ID}); } /** @@ -624,9 +695,17 @@ public class MPPMRP extends X_PP_MRP */ public static BigDecimal getQtyReserved(Properties ctx, int M_Warehouse_ID ,int M_Product_ID, Timestamp To,String trxName) { - StringBuffer sql = new StringBuffer("SELECT SUM(Qty) FROM PP_MRP WHERE TypeMRP=? AND DocStatus IN ('IN','CO')"); - sql.append(" AND OrderType IN ('SOO','MOP','DOO') AND AD_Client_ID= ? AND DatePromised <=? AND M_Warehouse_ID =? AND M_Product_ID=?"); - BigDecimal qty = DB.getSQLValueBDEx(trxName, sql.toString(), new Object[]{MPPMRP.TYPEMRP_Demand,Env.getAD_Client_ID(ctx), To , M_Warehouse_ID, M_Product_ID}); + final String sql = "SELECT SUM(Qty) FROM PP_MRP WHERE " + +" TypeMRP=?" + +" AND DocStatus IN ('IN','CO')" + +" AND OrderType IN ('SOO','MOP','DOO')" + +" AND AD_Client_ID=? AND M_Warehouse_ID =? AND M_Product_ID=?" + +" AND DatePromised <=?"; + BigDecimal qty = DB.getSQLValueBDEx(trxName, sql, new Object[]{ + MPPMRP.TYPEMRP_Demand, + Env.getAD_Client_ID(ctx),M_Warehouse_ID, M_Product_ID, + To, + }); // SQL may return no rows or null if (qty == null) return Env.ZERO; diff --git a/base/src/org/eevolution/model/MPPOrder.java b/base/src/org/eevolution/model/MPPOrder.java index f9beeff588..d673009048 100644 --- a/base/src/org/eevolution/model/MPPOrder.java +++ b/base/src/org/eevolution/model/MPPOrder.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Properties; import org.adempiere.exceptions.AdempiereException; +import org.adempiere.exceptions.DocTypeNotFoundException; import org.compiere.model.MAcctSchema; import org.compiere.model.MClient; import org.compiere.model.MCost; @@ -66,66 +67,14 @@ public class MPPOrder extends X_PP_Order implements DocAction private static final long serialVersionUID = 1L; /** Product */ private MProduct m_product = null; - - /** - * Create new Order by copying - * @param ctx context - * @param C_Order_ID invoice - * @param dateDoc date of the document date - * @param counter create counter links - * @return Order - */ - public static MPPOrder copyFrom(MPPOrder from, Timestamp dateDoc, int C_DocTypeTarget_ID, - boolean isSOTrx, boolean counter) + + public static MPPOrder forC_OrderLine_ID(Properties ctx, int C_OrderLine_ID, String trxName) { - MPPOrder to = new MPPOrder(from.getCtx(), 0, "PP_Order"); - PO.copyValues(from, to, from.getAD_Client_ID(), from.getAD_Org_ID()); - to.setPP_Order_ID(0); - to.set_ValueNoCheck("DocumentNo", null); - // - to.setDocStatus(DOCSTATUS_Drafted); // Draft - to.setDocAction(DOCACTION_Prepare); - // - //to.setC_DocType_ID(this.C_DOCTYPE_ID_ManufacturingOrder); - //to.setC_DocTypeTarget_ID(C_DocTypeTarget_ID); - to.setIsSOTrx(isSOTrx); - // - to.setIsSelected(false); - /*to.setDateOrdered (dateDoc); - to.setDateAcct (dateDoc); - to.setDatePromised (dateDoc); - to.setDatePrinted(null); - to.setIsPrinted (false); - //*/ - to.setIsApproved(false); - /*to.setIsCreditApproved(false); - to.setC_Payment_ID(0); - to.setC_CashLine_ID(0); - // Amounts are updated when adding lines - to.setGrandTotal(Env.ZERO); - to.setTotalLines(Env.ZERO); - // - to.setIsDelivered(false); - to.setIsInvoiced(false); - to.setIsSelfService(false); - to.setIsTransferred (false);*/ - to.setPosted(false); - to.setProcessed(false); - /*if (counter) - to.setRef_Order_ID(from.getC_Order_ID()); - else - to.setRef_Order_ID(0); - // - */ - to.saveEx(); - /*if (counter) - from.setRef_Order_ID(to.getC_Order_ID()); + return new Query(ctx, MPPOrder.Table_Name, COLUMNNAME_C_OrderLine_ID+"=?", trxName) + .setParameters(new Object[]{C_OrderLine_ID}) + .firstOnly(); + } - if (to.copyLinesFrom(from, counter) == 0) - throw new IllegalStateException("Could not create Order Lines"); - */ - return to; - } // copyFrom /************************************************************************** * Default Constructor @@ -136,7 +85,11 @@ public class MPPOrder extends X_PP_Order implements DocAction { super(ctx, PP_Order_ID, trxName); // New - if (PP_Order_ID == 0) { + if (PP_Order_ID == 0) + { + setQtyDelivered(Env.ZERO); + setQtyReject(Env.ZERO); + setQtyScrap(Env.ZERO); setIsSelected(false); setIsSOTrx(false); setIsApproved(false); @@ -144,17 +97,10 @@ public class MPPOrder extends X_PP_Order implements DocAction setProcessed(false); setProcessing(false); setPosted(false); - MDocType[] doc = MDocType.getOfDocBaseType(getCtx(), MDocType.DOCBASETYPE_ManufacturingOrder); - if(doc == null) - { - throw new IllegalArgumentException ("C_DocType_ID is mandatory."); - } - else - { - setC_DocType_ID(doc[0].getC_DocType_ID()); - setC_DocTypeTarget_ID(doc[0].getC_DocType_ID()); - } - + // + setC_DocType_ID(0); + setC_DocTypeTarget_ID(MDocType.DOCBASETYPE_ManufacturingOrder); + // //set_ValueNoCheck("DocumentNo", null); setDocStatus(DOCSTATUS_Drafted); setDocAction(DOCACTION_Prepare); @@ -229,18 +175,47 @@ public class MPPOrder extends X_PP_Order implements DocAction /** * Get BOM Lines of PP Order + * @param requery * @return Order BOM Lines */ - public MPPOrderBOMLine[] getLines() + public MPPOrderBOMLine[] getLines(boolean requery) { + if (m_lines != null && !requery) + { + set_TrxName(m_lines, get_TrxName()); + return m_lines; + } String whereClause = MPPOrderBOMLine.COLUMNNAME_PP_Order_ID+"=?"; - // List list = new Query(getCtx(), MPPOrderBOMLine.Table_Name, whereClause, get_TrxName()) .setParameters(new Object[]{getPP_Order_ID()}) .setOrderBy(MPPOrderBOMLine.COLUMNNAME_Line) .list(); - return list.toArray(new MPPOrderBOMLine[list.size()]); - } // getLines + m_lines = list.toArray(new MPPOrderBOMLine[list.size()]); + return m_lines; + } + private MPPOrderBOMLine[] m_lines = null; + + /** + * Get BOM Lines of PP Order + * @return Order BOM Lines + */ + public MPPOrderBOMLine[] getLines() + { + return getLines(true); + } + + public void setC_DocTypeTarget_ID(String docBaseType) + { + MDocType[] doc = MDocType.getOfDocBaseType(getCtx(), docBaseType); + if(doc == null) + { + throw new DocTypeNotFoundException(docBaseType, ""); + } + else + { + setC_DocTypeTarget_ID(doc[0].get_ID()); + } + } @Override public void setProcessed(boolean processed) @@ -297,32 +272,9 @@ public class MPPOrder extends X_PP_Order implements DocAction return false; } - if( is_ValueChanged(MPPOrder.COLUMNNAME_QtyEntered) && - getDocStatus().equals(MPPOrder.DOCSTATUS_Drafted)) + if( is_ValueChanged(MPPOrder.COLUMNNAME_QtyEntered) && getDocStatus().equals(MPPOrder.DOCSTATUS_Drafted)) { - for(MPPOrderBOMLine line : getLines()) - { - line.deleteEx(true); - } - MPPOrderBOM bom = getMPPOrderBOM(); - if(bom != null) - bom.deleteEx(true, get_TrxName()); - - MPPOrderWorkflow PP_Order_Workflow = getMPPOrderWorkflow(); - if (PP_Order_Workflow != null) - { - PP_Order_Workflow.setPP_Order_Node_ID(0); - PP_Order_Workflow.saveEx(); - for(MPPOrderNode node : PP_Order_Workflow.getNodes(true, getAD_Client_ID())) - { - for(MPPOrderNodeNext next : node.getTransitions(getAD_Client_ID())) - { - next.deleteEx(true); - } - node.deleteEx(true); - } - PP_Order_Workflow.deleteEx(true); - } + deleteWorkflowAndBOM(); explotion(); } if( is_ValueChanged(MPPOrder.COLUMNNAME_QtyEntered) && !getDocStatus().equals(MPPOrder.DOCSTATUS_Drafted)) @@ -347,22 +299,36 @@ public class MPPOrder extends X_PP_Order implements DocAction { String whereClause = "PP_Order_ID=? AND AD_Client_ID=?"; Object[] params = new Object[]{get_ID(), getAD_Client_ID()}; - - // Delete Cost: + // deletePO(MPPOrderCost.Table_Name, whereClause, params); - // Delete workflow: - DB.executeUpdateEx("UPDATE PP_Order_Workflow SET PP_Order_Node_ID=NULL WHERE "+whereClause, params, get_TrxName()); // Reset workflow start node - deletePO(X_PP_Order_Node_Asset.Table_Name, whereClause, params); - deletePO(X_PP_Order_Node_Product.Table_Name, whereClause, params); - deletePO(MPPOrderNodeNext.Table_Name, whereClause, params); - deletePO(MPPOrderNode.Table_Name, whereClause, params); - deletePO(MPPOrderWorkflow.Table_Name, whereClause, params); - // Delete BOM: - deletePO(MPPOrderBOMLine.Table_Name, whereClause, params); - deletePO(MPPOrderBOM.Table_Name, whereClause, params); + deleteWorkflowAndBOM(); } return true; } // beforeDelete + + private void deleteWorkflowAndBOM() + { + // New record, nothing to do + if (get_ID() <= 0) + { + return; + } + // + String whereClause = "PP_Order_ID=? AND AD_Client_ID=?"; + Object[] params = new Object[]{get_ID(), getAD_Client_ID()}; + // Reset workflow start node + DB.executeUpdateEx("UPDATE PP_Order_Workflow SET PP_Order_Node_ID=NULL WHERE "+whereClause, params, get_TrxName()); + // Delete workflow: + deletePO(X_PP_Order_Node_Asset.Table_Name, whereClause, params); + deletePO(X_PP_Order_Node_Product.Table_Name, whereClause, params); + deletePO(MPPOrderNodeNext.Table_Name, whereClause, params); + deletePO(MPPOrderNode.Table_Name, whereClause, params); + deletePO(MPPOrderWorkflow.Table_Name, whereClause, params); + // Delete BOM: + deletePO(MPPOrderBOMLine.Table_Name, whereClause, params); + deletePO(MPPOrderBOM.Table_Name, whereClause, params); + + } public boolean processIt(String processAction) { @@ -651,13 +617,17 @@ public class MPPOrder extends X_PP_Order implements DocAction return DocAction.STATUS_Completed; } // completeIt + /** + * Check if the Quantity from all BOM Lines is available (QtyOnHand >= QtyRequired) + * @return true if entire Qty is available for this Order + */ public boolean isAvailable() { - String whereClause = "QtyOnHand - QtyRequiered < 0 AND PP_Order_ID=?"; - boolean notAvailable = new Query(getCtx(), X_RV_PP_Order_Storage.Table_Name, whereClause, get_TrxName()) + String whereClause = "QtyOnHand >= QtyRequiered AND PP_Order_ID=?"; + boolean available = new Query(getCtx(), "RV_PP_Order_Storage", whereClause, get_TrxName()) .setParameters(new Object[]{get_ID()}) .match(); - return !notAvailable; + return available; } public boolean voidIt() @@ -879,7 +849,11 @@ public class MPPOrder extends X_PP_Order implements DocAction .first(); } - public void explotion() + /** + * Create PP_Order_BOM from PP_Product_BOM. + * Create PP_Order_Workflow from AD_Workflow. + */ + private void explotion() { // Create BOM Head MPPProductBOM PP_Product_BOM = MPPProductBOM.get(getCtx(), getPP_Product_BOM_ID()); @@ -924,28 +898,22 @@ public class MPPOrder extends X_PP_Order implements DocAction for (MWFNodeNext AD_WF_NodeNext : AD_WF_Node.getTransitions(getAD_Client_ID())) { - MPPOrderNodeNext nodenext = new MPPOrderNodeNext(AD_WF_NodeNext, PP_Order_Node, get_TrxName()); + MPPOrderNodeNext nodenext = new MPPOrderNodeNext(AD_WF_NodeNext, PP_Order_Node); nodenext.setAD_Org_ID(getAD_Org_ID()); nodenext.saveEx(); }// for NodeNext - for (MPPWFNodeProduct wfnp : MPPWFNodeProduct.get(getCtx(), AD_WF_Node.get_ID() , get_TrxName())) + for (MPPWFNodeProduct wfnp : MPPWFNodeProduct.forAD_WF_Node_ID(getCtx(), AD_WF_Node.get_ID())) { - MPPOrderNodeProduct nodeorderproduct = new MPPOrderNodeProduct(wfnp); + MPPOrderNodeProduct nodeorderproduct = new MPPOrderNodeProduct(wfnp, PP_Order_Node); nodeorderproduct.setAD_Org_ID(getAD_Org_ID()); - nodeorderproduct.setPP_Order_ID(getPP_Order_ID()); - nodeorderproduct.setPP_Order_Workflow_ID(PP_Order_Node.getPP_Order_Workflow_ID()); - nodeorderproduct.setPP_Order_Node_ID(PP_Order_Node.getPP_Order_Node_ID()); nodeorderproduct.saveEx(); - }// for NodeNext + } - for (MPPWFNodeAsset wfna : MPPWFNodeAsset.get(getCtx(), AD_WF_Node.get_ID() , get_TrxName())) + for (MPPWFNodeAsset wfna : MPPWFNodeAsset.forAD_WF_Node_ID(getCtx(), AD_WF_Node.get_ID())) { - MPPOrderNodeAsset nodeorderasset = new MPPOrderNodeAsset(wfna); + MPPOrderNodeAsset nodeorderasset = new MPPOrderNodeAsset(wfna, PP_Order_Node); nodeorderasset.setAD_Org_ID(getAD_Org_ID()); - nodeorderasset.setPP_Order_ID(getPP_Order_ID()); - nodeorderasset.setPP_Order_Workflow_ID(PP_Order_Node.getPP_Order_Workflow_ID()); - nodeorderasset.setPP_Order_Node_ID(PP_Order_Node.getPP_Order_Node_ID()); nodeorderasset.saveEx(); } }// for node @@ -956,7 +924,8 @@ public class MPPOrder extends X_PP_Order implements DocAction for (MPPOrderNode orderNode : PP_Order_Workflow.getNodes(false, getAD_Client_ID())) { // set workflow start node - if (PP_Order_Workflow.getAD_WF_Node_ID() == orderNode.getAD_WF_Node_ID()) { + if (PP_Order_Workflow.getAD_WF_Node_ID() == orderNode.getAD_WF_Node_ID()) + { PP_Order_Workflow.setPP_Order_Node_ID(orderNode.getPP_Order_Node_ID()); } // set node next diff --git a/base/src/org/eevolution/model/MPPOrderBOMLine.java b/base/src/org/eevolution/model/MPPOrderBOMLine.java index 7fc7775676..0fd3dfb1e4 100644 --- a/base/src/org/eevolution/model/MPPOrderBOMLine.java +++ b/base/src/org/eevolution/model/MPPOrderBOMLine.java @@ -17,34 +17,42 @@ package org.eevolution.model; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.SQLException; import java.util.Properties; import org.adempiere.exceptions.AdempiereException; +import org.adempiere.exceptions.DBException; import org.compiere.model.MProduct; +import org.compiere.model.MUOM; +import org.compiere.model.MWarehouse; +import org.compiere.model.Query; import org.compiere.util.DB; import org.compiere.util.Env; /** - * PP Order BOM Line Model. + * PP Order BOM Line Model. * - * @author Victor Perez www.e-evolution.com - * @version $Id: MOrderLine.java,v 1.22 2004/03/22 07:15:03 vpj-cd Exp $ - * + * @author Victor Perez www.e-evolution.com * @author Teo Sarca, www.arhipac.ro */ public class MPPOrderBOMLine extends X_PP_Order_BOMLine { private static final long serialVersionUID = 1L; - /** - * Default Constructor - * @param ctx context - * @param C_OrderLine_ID order line to load - */ - public MPPOrderBOMLine(Properties ctx, int PP_Order_BOMLine_ID,String trxName) + public static MPPOrderBOMLine forM_Product_ID(Properties ctx, int PP_Order_ID, int M_Product_ID, String trxName) { - super (ctx, PP_Order_BOMLine_ID,trxName); + final String whereClause = COLUMNNAME_PP_Order_ID+"=? AND "+COLUMNNAME_M_Product_ID+"=?"; + return new Query(ctx, Table_Name, whereClause, trxName) + .setParameters(new Object[]{PP_Order_ID, M_Product_ID}) + .firstOnly(); + } + + public MPPOrderBOMLine(Properties ctx, int PP_Order_BOMLine_ID, String trxName) + { + super (ctx, PP_Order_BOMLine_ID, trxName); if (PP_Order_BOMLine_ID == 0) { setQtyDelivered(Env.ZERO); @@ -57,11 +65,6 @@ public class MPPOrderBOMLine extends X_PP_Order_BOMLine } // PP_Order_BOMLine_ID - /** - * Load Constructor - * @param ctx context - * @param rs result set record - */ public MPPOrderBOMLine(Properties ctx, ResultSet rs,String trxName) { super (ctx, rs,trxName); @@ -105,21 +108,28 @@ public class MPPOrderBOMLine extends X_PP_Order_BOMLine setValidTo(bomLine.getValidTo()); setBackflushGroup(bomLine.getBackflushGroup()); } - + + /** + * Parent (PP_Order) + */ private MPPOrder m_parent = null; - /** Qty used for exploding this BOM Line */ + /** + * Qty used for exploding this BOM Line. + * When ComponentType is Phantom, it is set on beforeSave as QtyRequired and reset on afterSave. + */ private BigDecimal m_qtyToExplode = null; @Override - protected boolean beforeSave(boolean newRecord) { + protected boolean beforeSave(boolean newRecord) + { // Get Line No if (getLine() == 0) { String sql = "SELECT COALESCE(MAX("+COLUMNNAME_Line+"),0)+10 FROM "+Table_Name +" WHERE "+COLUMNNAME_PP_Order_ID+"=?"; - int ii = DB.getSQLValue (get_TrxName(), sql, getPP_Order_ID()); + int ii = DB.getSQLValueEx (get_TrxName(), sql, getPP_Order_ID()); setLine (ii); } @@ -147,15 +157,15 @@ public class MPPOrderBOMLine extends X_PP_Order_BOMLine MProduct parent = MProduct.get(getCtx(), getM_Product_ID()); int PP_Product_BOM_ID = MPPProductBOM.getBOMSearchKey(getCtx(), parent); if (PP_Product_BOM_ID <= 0) + { return true; - + } MPPProductBOM bom = MPPProductBOM.get(getCtx(), PP_Product_BOM_ID); if (bom != null) { - MPPProductBOMLine[] PP_Product_BOMline = bom.getLines(); - for(int i = 0 ; i < PP_Product_BOMline.length ; i++ ) + for(MPPProductBOMLine PP_Product_BOMline : bom.getLines()) { - MPPOrderBOMLine PP_Order_BOMLine = new MPPOrderBOMLine(PP_Product_BOMline[i], + MPPOrderBOMLine PP_Order_BOMLine = new MPPOrderBOMLine(PP_Product_BOMline, getPP_Order_ID(), getPP_Order_BOM_ID(), getM_Warehouse_ID(), get_TrxName()); @@ -176,67 +186,159 @@ public class MPPOrderBOMLine extends X_PP_Order_BOMLine return MProduct.get(getCtx(), getM_Product_ID()); } + @Override + public MUOM getC_UOM() + { + return MUOM.get(getCtx(), getC_UOM_ID()); + } + + @Override + public MWarehouse getM_Warehouse() + { + return MWarehouse.get(getCtx(), getM_Warehouse_ID()); + } + /** * Get Parent - * @return parent + * @return PP_Order */ public MPPOrder getParent() { - if (m_parent == null) - m_parent = new MPPOrder(getCtx(), getPP_Order_ID(), get_TrxName()); + int id = getPP_Order_ID(); + if (id <= 0) + { + m_parent = null; + return null; + } + if (m_parent == null || m_parent.get_ID() != id) + { + m_parent = new MPPOrder(getCtx(), id, get_TrxName()); + } return m_parent; } // getParent public void setQtyOrdered(BigDecimal QtyOrdered) { - // Set Qty Required + BigDecimal multiplier = Env.ZERO; if (isQtyPercentage()) { - BigDecimal qty = getQtyBatch().multiply(QtyOrdered); - if (getComponentType().equals(COMPONENTTYPE_Component) - || getComponentType().equals(COMPONENTTYPE_Phantom)) - { - setQtyRequiered(qty.divide(Env.ONEHUNDRED, 8, BigDecimal.ROUND_UP)); - } - else if (getComponentType().equals(COMPONENTTYPE_Packing)) - { - setQtyRequiered(qty.divide(Env.ONEHUNDRED, 8, BigDecimal.ROUND_UP)); - } - else if (getComponentType().equals(COMPONENTTYPE_Tools)) - { - setQtyRequiered(getQtyBOM()); - } - else - { - throw new AdempiereException("@NotSupported@ @ComponentType@ "+getComponentType()); - } + multiplier = getQtyBatch().divide(Env.ONEHUNDRED, 8, RoundingMode.UP); } else { - if (getComponentType().equals(COMPONENTTYPE_Component) - || getComponentType().equals(COMPONENTTYPE_Phantom)) - { - setQtyRequiered(getQtyBOM().multiply(QtyOrdered)); - } - else if (getComponentType().equals(COMPONENTTYPE_Packing)) - { - setQtyRequiered(getQtyBOM().multiply(QtyOrdered)); - } - else if (getComponentType().equals(COMPONENTTYPE_Tools)) - { - setQtyRequiered(getQtyBOM()); - } - else - { - throw new AdempiereException("@NotSupported@ @ComponentType@ "+getComponentType()); - } + multiplier = getQtyBOM(); } + BigDecimal qty = QtyOrdered.multiply(multiplier).setScale(8, RoundingMode.UP); + if (isComponentType(COMPONENTTYPE_Component,COMPONENTTYPE_Phantom + ,COMPONENTTYPE_Packing + ,COMPONENTTYPE_ByProduct)) + { + setQtyRequiered(qty); + } + else if (isComponentType(COMPONENTTYPE_Tools)) + { + setQtyRequiered(multiplier); + } + else + { + throw new AdempiereException("@NotSupported@ @ComponentType@ "+getComponentType()); + } + // // Set Scrap of Component BigDecimal Scrap = getScrap(); - if (Scrap.signum() != 0) { + if (Scrap.signum() != 0) + { Scrap = Scrap.divide(Env.ONEHUNDRED, 8, BigDecimal.ROUND_UP); setQtyRequiered(getQtyRequiered().divide(Env.ONE.subtract(Scrap), 8, BigDecimal.ROUND_HALF_UP)); } } + + /** + * @return Qty Open (Requiered - Delivered) + */ + public BigDecimal getQtyOpen() + { + return getQtyRequiered().subtract(getQtyDelivered()); + } + + /** Storage Qty On Hand */ + private BigDecimal m_qtyOnHand = null; + /** Storage Qty Available */ + private BigDecimal m_qtyAvailable = null; + + /** + * Load Storage Info + * @param reload + */ + private void loadStorage(boolean reload) + { + if (!reload && m_qtyOnHand != null && m_qtyAvailable != null) + { + return; + } + // + final String sql = "SELECT " + +" bomQtyAvailable("+COLUMNNAME_M_Product_ID+", "+COLUMNNAME_M_Warehouse_ID+", 0)" + +",bomQtyOnHand("+COLUMNNAME_M_Product_ID+", "+COLUMNNAME_M_Warehouse_ID+", 0)" + +" FROM "+Table_Name + +" WHERE "+COLUMNNAME_PP_Order_BOMLine_ID+"=?"; + PreparedStatement pstmt = null; + ResultSet rs = null; + try + { + pstmt = DB.prepareStatement(sql, get_TrxName()); + DB.setParameters(pstmt, new Object[]{get_ID()}); + rs = pstmt.executeQuery(); + if (rs.next()) + { + m_qtyAvailable = rs.getBigDecimal(1); + m_qtyOnHand = rs.getBigDecimal(2); + } + } + catch (SQLException e) + { + throw new DBException(e, sql); + } + finally + { + DB.close(rs, pstmt); + rs = null; pstmt = null; + } + } + + /** + * @return storage Available Qty + */ + public BigDecimal getQtyAvailable() + { + loadStorage(false); + return m_qtyAvailable; + } + + /** + * @return storage Qty On Hand + */ + public BigDecimal getQtyOnHand() + { + loadStorage(false); + return m_qtyOnHand; + } + + /** + * @param componentTypes one or more component types + * @return true of Component Type is any of following types + */ + public boolean isComponentType(String ... componentTypes) + { + String currentType = getComponentType(); + for (String type : componentTypes) + { + if (currentType.equals(type)) + { + return true; + } + } + return false; + } } diff --git a/base/src/org/eevolution/model/MPPOrderBOMLineMA.java b/base/src/org/eevolution/model/MPPOrderBOMLineMA.java index 37124972a0..3fd2f809e3 100644 --- a/base/src/org/eevolution/model/MPPOrderBOMLineMA.java +++ b/base/src/org/eevolution/model/MPPOrderBOMLineMA.java @@ -26,12 +26,10 @@ import org.compiere.util.CLogger; import org.compiere.util.DB; /** - * Shipment Material Allocation - * - * @author Victor Perez www.e-evolution.com - * @version $Id: MPPOrderBOMLineMA.java,v 1.1 2005/04/01 05:59:48 vpj-cd Exp $ - * - * @author Teo Sarca, http://www.arhipac.ro + * Cost Collector Material Allocation + * + * @author Victor Perez www.e-evolution.com + * @author Teo Sarca, http://www.arhipac.ro */ public class MPPOrderBOMLineMA extends X_PP_Order_BOMLineMA { diff --git a/base/src/org/eevolution/model/MPPOrderNode.java b/base/src/org/eevolution/model/MPPOrderNode.java index 7a33fec847..f09437bacb 100644 --- a/base/src/org/eevolution/model/MPPOrderNode.java +++ b/base/src/org/eevolution/model/MPPOrderNode.java @@ -16,33 +16,25 @@ *****************************************************************************/ package org.eevolution.model; -import java.awt.Point; import java.math.BigDecimal; -import java.math.RoundingMode; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.adempiere.exceptions.AdempiereException; -import org.compiere.model.MColumn; import org.compiere.model.MResource; import org.compiere.model.MUOM; import org.compiere.model.Query; import org.compiere.util.CCache; import org.compiere.util.DB; import org.compiere.util.Env; -import org.compiere.util.Msg; import org.compiere.wf.MWFNode; -import org.compiere.wf.MWorkflow; -import org.jfree.util.Log; /** - * PP Order Workflow Node Model + * PP Order Workflow Node Model * - * @author Jorg Janke - * @version $Id: MWFNode.java,v 1.2 2006/07/30 00:51:05 jjanke Exp $ - * + * @author Victor Perez, e-Evolution, S.C. * @author Teo Sarca, http://www.arhipac.ro */ public class MPPOrderNode extends X_PP_Order_Node @@ -66,6 +58,19 @@ public class MPPOrderNode extends X_PP_Order_Node s_cache.put (PP_Order_Node_ID, retValue); return retValue; } // get + + + /** + * @return true if this is last node + */ + public static boolean isLastNode(Properties ctx, int PP_Order_Node_ID, String trxName) + { + String whereClause = MPPOrderNodeNext.COLUMNNAME_PP_Order_Node_ID+"=?"; + return false == new Query(ctx, MPPOrderNodeNext.Table_Name, whereClause, trxName) + .setOnlyActiveRecords(true) + .setParameters(new Object[]{PP_Order_Node_ID}) + .match(); + } /** Cache */ private static CCache s_cache = new CCache (Table_Name, 50); @@ -196,8 +201,6 @@ public class MPPOrderNode extends X_PP_Order_Node /** Next Modes */ private List m_next = new ArrayList(); - /** Column */ - private MColumn m_column = null; /** Duration Base MS */ private long m_durationBaseMS = -1; @@ -207,22 +210,27 @@ public class MPPOrderNode extends X_PP_Order_Node private void loadNext() { boolean splitAnd = SPLITELEMENT_AND.equals(getSplitElement()); - String whereClause = "PP_Order_Node_ID=? "; + String whereClause = MPPOrderNodeNext.COLUMNNAME_PP_Order_Node_ID+"=?"; m_next = new Query(getCtx(), MPPOrderNodeNext.Table_Name, whereClause, get_TrxName()) .setParameters(new Object[]{get_ID()}) .setOnlyActiveRecords(true) .setOrderBy(MPPOrderNodeNext.COLUMNNAME_SeqNo) .list(); - for (MPPOrderNodeNext next : m_next) { + for (MPPOrderNodeNext next : m_next) + { next.setFromSplitAnd(splitAnd); } log.fine("#" + m_next.size()); } // loadNext + /** + * Set Qty Required and DurationRequired (Duration * qtyOrdered) + * @param qtyOrdered + */ public void setQtyOrdered(BigDecimal qtyOrdered) { setQtyRequiered(qtyOrdered); - BigDecimal time = new BigDecimal(getDuration()).multiply(qtyOrdered); + BigDecimal time = BigDecimal.valueOf(getDuration()).multiply(qtyOrdered); setDurationRequiered(time.intValue()); } @@ -243,145 +251,15 @@ public class MPPOrderNode extends X_PP_Order_Node public MPPOrderNodeNext[] getTransitions(int AD_Client_ID) { ArrayList list = new ArrayList(); - for (int i = 0; i < m_next.size(); i++) + for (MPPOrderNodeNext next : m_next) { - MPPOrderNodeNext next = m_next.get(i); if (next.getAD_Client_ID() == 0 || next.getAD_Client_ID() == AD_Client_ID) + { list.add(next); + } } - MPPOrderNodeNext[] retValue = new MPPOrderNodeNext [list.size()]; - list.toArray(retValue); - return retValue; + return list.toArray(new MPPOrderNodeNext [list.size()]); } // getNextNodes - - /** - * Set Position - * @param position point - */ - public void setPosition (Point position) - { - setPosition(position.x, position.y); - } // setPosition - - /** - * Set Position - * @param x x - * @param y y - */ - public void setPosition (int x, int y) - { - setXPosition(x); - setYPosition(y); - } // setPosition - - /** - * Get Position - * @return position point - */ - public Point getPosition () - { - return new Point (getXPosition(), getYPosition()); - } // getPosition - - /** - * Get Action Info - * @return info - */ - public String getActionInfo() - { - String action = getAction(); - if (ACTION_AppsProcess.equals(action)) - return "Process:AD_Process_ID=" + getAD_Process_ID(); - else if (ACTION_DocumentAction.equals(action)) - return "DocumentAction=" + getDocAction(); - else if (ACTION_AppsReport.equals(action)) - return "Report:AD_Process_ID=" + getAD_Process_ID(); - else if (ACTION_AppsTask.equals(action)) - return "Task:AD_Task_ID=" + getAD_Task_ID(); - else if (ACTION_SetVariable.equals(action)) - return "SetVariable:AD_Column_ID=" + getAD_Column_ID(); - else if (ACTION_SubWorkflow.equals(action)) - return "Workflow:PP_Order_Workflow_ID=" + getPP_Order_Workflow_ID(); - else if (ACTION_UserChoice.equals(action)) - return "UserChoice:AD_Column_ID=" + getAD_Column_ID(); - else if (ACTION_UserWorkbench.equals(action)) - return "Workbench:?"; - else if (ACTION_UserForm.equals(action)) - return "Form:AD_Form_ID=" + getAD_Form_ID(); - else if (ACTION_UserWindow.equals(action)) - return "Window:AD_Window_ID=" + getAD_Window_ID(); - //else if (ACTION_WaitSleep.equals(action)) - // return "Sleep:WaitTime=" + getWaitTime(); - return "??"; - } // getActionInfo - - - /** - * Get Attribute Name - * @see org.compiere.model.X_PP_Order_Node#getAttributeName() - * @return Attribute Name - */ - @Override - public String getAttributeName () - { - if (getAD_Column_ID() == 0) - return super.getAttributeName(); - // We have a column - String attribute = super.getAttributeName(); - if (attribute != null && attribute.length() > 0) - return attribute; - setAttributeName(getColumn().getColumnName()); - return super.getAttributeName (); - } // getAttributeName - - - /** - * Get Column - * @return column if valid - */ - public MColumn getColumn() - { - if (getAD_Column_ID() == 0) - return null; - if (m_column == null) - m_column = MColumn.get(getCtx(), getAD_Column_ID()); - return m_column; - } // getColumn - - /** - * Is this an Approval setp? - * @return true if User Approval - */ - public boolean isUserApproval() - { - if (!ACTION_UserChoice.equals(getAction())) - return false; - return getColumn() != null - && "IsApproved".equals(getColumn().getColumnName()); - } // isApproval - - /** - * Is this a User Choice step? - * @return true if User Choice - */ - public boolean isUserChoice() - { - return ACTION_UserChoice.equals(getAction()); - } // isUserChoice - - /** - * Is this a Manual user step? - * @return true if Window/Form/Workbench - */ - public boolean isUserManual() - { - if (ACTION_UserForm.equals(getAction()) - || ACTION_UserWindow.equals(getAction()) - || ACTION_UserWorkbench.equals(getAction())) - return true; - return false; - } // isUserManual - /** * Get Duration in ms @@ -421,7 +299,7 @@ public class MPPOrderNode extends X_PP_Order_Node } // getDurationCalendarField /** - * Get Workflow + * Get Workflow (NoTrx) * @return workflow */ public MPPOrderWorkflow getPPOrderWorkflow() @@ -438,125 +316,9 @@ public class MPPOrderNode extends X_PP_Order_Node StringBuffer sb = new StringBuffer ("MPPOrderNode["); sb.append(get_ID()) .append("-").append(getName()) - .append(",Action=").append(getActionInfo()) .append ("]"); return sb.toString (); } // toString - - /** - * User String Representation - * @return info - */ - public String toStringX() - { - StringBuffer sb = new StringBuffer ("MPPOrderNode["); - sb.append(getName()) - .append("-").append(getActionInfo()) - .append("]"); - return sb.toString (); - } // toStringX - - @Override - protected boolean beforeSave (boolean newRecord) - { - String action = getAction(); - if (action.equals(ACTION_WaitSleep)) - { - ; - } - else if (action.equals(ACTION_AppsProcess) || action.equals(ACTION_AppsReport)) - { - if (getAD_Process_ID() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "AD_Process_ID")); - return false; - } - } - else if (action.equals(ACTION_AppsTask)) - { - if (getAD_Task_ID() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "AD_Task_ID")); - return false; - } - } - else if (action.equals(ACTION_DocumentAction)) - { - if (getDocAction() == null || getDocAction().length() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "DocAction")); - return false; - } - } - /*else if (action.equals(ACTION_EMail)) - { - if (getR_MailText_ID() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "R_MailText_ID")); - return false; - } - }*/ - else if (action.equals(ACTION_SetVariable)) - { - if (getAttributeValue() == null) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "AttributeValue")); - return false; - } - } - else if (action.equals(ACTION_SubWorkflow)) - { - if (getPP_Order_Workflow_ID() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "PP_Order_Workflow_ID")); - return false; - } - } - else if (action.equals(ACTION_UserChoice)) - { - if (getAD_Column_ID() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "AD_Column_ID")); - return false; - } - } - else if (action.equals(ACTION_UserForm)) - { - if (getAD_Form_ID() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "AD_Form_ID")); - return false; - } - } - else if (action.equals(ACTION_UserWindow)) - { - if (getAD_Window_ID() == 0) - { - log.saveError("FillMandatory", Msg.getElement(getCtx(), "AD_Window_ID")); - return false; - } - } -// else if (action.equals(ACTION_UserWorkbench)) -// { -// && getAD_Workbench_ID() == 0) -// log.saveError("FillMandatory", Msg.getElement(getCtx(), "AD_Workbench_ID")); -// return false; -// } - - return true; - } // beforeSave - - /** - * @return true if this is last node - */ - public static boolean isLastNode(Properties ctx, int PP_Order_Node_ID, String trxName) - { - String whereClause = MPPOrderNodeNext.COLUMNNAME_PP_Order_Node_ID+"=?"; - return false == new Query(ctx, MPPOrderNodeNext.Table_Name, whereClause, trxName) - .setOnlyActiveRecords(true) - .setParameters(new Object[]{PP_Order_Node_ID}) - .match(); - } /** * Calculate the cost for this Activity using the Cost Element Type @@ -581,7 +343,7 @@ public class MPPOrderNode extends X_PP_Order_Node return Env.ZERO; } - int C_UOM_ID = DB.getSQLValue(get_TrxName(),"SELECT C_UOM_ID FROM M_Product WHERE S_Resource_ID = ? " , getS_Resource_ID()); + int C_UOM_ID = DB.getSQLValueEx(get_TrxName(),"SELECT C_UOM_ID FROM M_Product WHERE S_Resource_ID = ? " , getS_Resource_ID()); MUOM uom = MUOM.get(getCtx(), C_UOM_ID); if (uom.isHour()) { @@ -597,4 +359,4 @@ public class MPPOrderNode extends X_PP_Order_Node } return cost; } -} // M_WFNext +} diff --git a/base/src/org/eevolution/model/MPPOrderNodeAsset.java b/base/src/org/eevolution/model/MPPOrderNodeAsset.java index e1998b0d8e..22052d5bab 100644 --- a/base/src/org/eevolution/model/MPPOrderNodeAsset.java +++ b/base/src/org/eevolution/model/MPPOrderNodeAsset.java @@ -12,78 +12,50 @@ * For the text or an alternative of this public license, you may reach us * * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * * Contributor(s): Victor Perez www.e-evolution.com * + * Teo Sarca, www.arhipac.ro * *****************************************************************************/ package org.eevolution.model; import java.sql.ResultSet; -import java.util.ArrayList; -import java.util.Collection; import java.util.Properties; -import org.compiere.model.Query; - /** - * Forcast Line Model + * Order Node Asset Model * - * @author Victor Perez www.e-evolution.com - * @version $Id: MPPWFNodeAsset.java,v 1.11 2005/05/17 05:29:52 vpj-cd vpj-cd $ + * @author Victor Perez www.e-evolution.com + * @author Teo Sarca, www.arhipac.ro */ public class MPPOrderNodeAsset extends X_PP_Order_Node_Asset { - /** - * Standard Constructor - * @param ctx context - * @param M_ForecastLine_ID id - */ + private static final long serialVersionUID = 1L; + public MPPOrderNodeAsset (Properties ctx, int PP_Order_Node_Asset_ID, String trxName) { super (ctx, PP_Order_Node_Asset_ID, trxName); if (PP_Order_Node_Asset_ID == 0) { } - } - /** - * Create a new MPPOrderNodeAsset based in MPPWFNodeProduct - * @param np - */ - public MPPOrderNodeAsset (MPPWFNodeAsset na) - { - this(na.getCtx(), 0, na.get_TrxName()); - //setSeqNo(na.getSeqNo()); - setIsActive(na.isActive()); - setA_Asset_ID(na.getA_Asset_ID()); - } - - /** - * Load Constructor - * @param ctx context - * @param rs result set - */ public MPPOrderNodeAsset (Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); - } // MPPWFNodeAsset + } - /** Lines */ - private static Collection m_lines = new ArrayList(); - /** - * Get Lines - * @return array of lines + * Create a new MPPOrderNodeAsset based in MPPWFNodeProduct + * @param na + * @param PP_Order_Node */ - public Collection getNodeAsset() + public MPPOrderNodeAsset (MPPWFNodeAsset na, MPPOrderNode PP_Order_Node) { - if(!m_lines.isEmpty()) - return m_lines; - - String whereClause = "PP_Order_Node_Asset_ID=? "; - m_lines = new Query(getCtx(), MPPOrderNodeAsset.Table_Name, whereClause, get_TrxName()) - .setParameters(new Object[]{get_ID()}) - .setOnlyActiveRecords(true) - //.setOrderBy(MPPOrderNodeAsset.COLUMNNAME_SeqNo) - .list(); - return m_lines; - } // getLines -} // MPPWFNodeAsset + this(PP_Order_Node.getCtx(), 0, PP_Order_Node.get_TrxName()); + setClientOrg(PP_Order_Node); + //setSeqNo(na.getSeqNo()); + setA_Asset_ID(na.getA_Asset_ID()); + // + setPP_Order_ID(PP_Order_Node.getPP_Order_ID()); + setPP_Order_Workflow_ID(PP_Order_Node.getPP_Order_Workflow_ID()); + setPP_Order_Node_ID(PP_Order_Node.get_ID()); + } +} diff --git a/base/src/org/eevolution/model/MPPOrderNodeNext.java b/base/src/org/eevolution/model/MPPOrderNodeNext.java index 7e210e578c..6dca8e5bf3 100644 --- a/base/src/org/eevolution/model/MPPOrderNodeNext.java +++ b/base/src/org/eevolution/model/MPPOrderNodeNext.java @@ -1,6 +1,5 @@ /****************************************************************************** - * Product: Adempiere ERP & CRM Smart Business Solution * - * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * + * Product: Adempiere ERP & CRM Smart Business Solution * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * * by the Free Software Foundation. This program is distributed in the hope * @@ -11,8 +10,9 @@ * with this program; if not, write to the Free Software Foundation, Inc., * * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * * For the text or an alternative of this public license, you may reach us * - * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * - * or via info@compiere.org or http://www.compiere.org/license.html * + * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * + * Contributor(s): Victor Perez www.e-evolution.com * + * Teo Sarca, www.arhipac.ro * *****************************************************************************/ package org.eevolution.model; @@ -23,11 +23,9 @@ import org.compiere.util.DB; import org.compiere.wf.MWFNodeNext; /** - * PP Order Workflow Node Next - Transition + * PP Order Workflow Node Next - Transition * - * @author Jorg Janke - * @version $Id: MPPOrdeNodeNext.java,v 1.3 2006/10/06 00:42:24 jjanke Exp $ - * + * @author Victor Perez www.e-evolution.com * @author Teo Sarca, http://www.arhipac.ro */ public class MPPOrderNodeNext extends X_PP_Order_NodeNext @@ -73,22 +71,20 @@ public class MPPOrderNodeNext extends X_PP_Order_NodeNext { this(parent.getCtx(), 0, parent.get_TrxName()); setClientOrg(parent); - setPP_Order_Node_ID(parent.getPP_Order_Node_ID()); + setPP_Order_ID(parent.getPP_Order_ID()); + setPP_Order_Node_ID(parent.get_ID()); setPP_Order_Next_ID(PP_Order_Next_ID); } // MPPOrderNodeNext /** * Peer constructor * @param wfNodeNext - * @param PP_Order_Node + * @param parent * @param trxName */ - public MPPOrderNodeNext (MWFNodeNext wfNodeNext, MPPOrderNode PP_Order_Node, String trxName) + public MPPOrderNodeNext (MWFNodeNext wfNodeNext, MPPOrderNode parent) { - this(wfNodeNext.getCtx(), 0, trxName); - setPP_Order_Node_ID(PP_Order_Node.get_ID()); - setPP_Order_ID(PP_Order_Node.getPP_Order_ID()); - setPP_Order_Next_ID(0); + this(parent, 0); // setAD_WF_Node_ID(wfNodeNext.getAD_WF_Node_ID()); setAD_WF_Next_ID(wfNodeNext.getAD_WF_Next_ID()); @@ -104,21 +100,8 @@ public class MPPOrderNodeNext extends X_PP_Order_NodeNext /** To (Join Element) is AND */ public Boolean m_toJoinAnd = null; - /** - * Set Client Org - * @param AD_Client_ID client - * @param AD_Org_ID org - */ - public void setClientOrg (int AD_Client_ID, int AD_Org_ID) - { - super.setClientOrg (AD_Client_ID, AD_Org_ID); - } // setClientOrg - - /** - * String Representation - * @return info - */ - public String toString () + @Override + public String toString() { StringBuffer sb = new StringBuffer ("MPPOrderNodeNext["); sb.append(getSeqNo()) @@ -181,8 +164,7 @@ public class MPPOrderNodeNext extends X_PP_Order_NodeNext { final String sql = "SELECT PP_Order_Node_ID FROM PP_Order_Node " + " WHERE PP_Order_ID=? AND AD_WF_Node_ID=? AND AD_Client_ID=?"; - int id = DB.getSQLValue(get_TrxName(), sql, getPP_Order_ID(), getAD_WF_Next_ID(), getAD_Client_ID()); - if (id > 0) - setPP_Order_Next_ID(id); + int id = DB.getSQLValueEx(get_TrxName(), sql, getPP_Order_ID(), getAD_WF_Next_ID(), getAD_Client_ID()); + setPP_Order_Next_ID(id > 0 ? id : 0); } } // MPPOrderNodeNext diff --git a/base/src/org/eevolution/model/MPPOrderNodeProduct.java b/base/src/org/eevolution/model/MPPOrderNodeProduct.java index 763f47522d..dca2e9830a 100644 --- a/base/src/org/eevolution/model/MPPOrderNodeProduct.java +++ b/base/src/org/eevolution/model/MPPOrderNodeProduct.java @@ -12,86 +12,54 @@ * For the text or an alternative of this public license, you may reach us * * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * * Contributor(s): Victor Perez www.e-evolution.com * + * Teo Sarca, www.arhipac.ro * *****************************************************************************/ package org.eevolution.model; import java.sql.ResultSet; -import java.util.ArrayList; -import java.util.Collection; import java.util.Properties; -import org.compiere.model.Query; - /** - * Forcast Line Model - * - * @author Victor Perez www.e-evolution.com - * @version $Id: MPPWFNodeProduct.java,v 1.11 2005/05/17 05:29:52 vpj-cd vpj-cd $ + * Order Node Product Model + * + * @author Victor Perez www.e-evolution.com + * @author Teo Sarca, www.arhipac.ro */ public class MPPOrderNodeProduct extends X_PP_Order_Node_Product { - /** - * Standard Constructor - * @param ctx context - * @param M_ForecastLine_ID id - */ + private static final long serialVersionUID = 1L; + public MPPOrderNodeProduct (Properties ctx, int PP_WF_Order_Product_ID, String trxName) { super (ctx, PP_WF_Order_Product_ID, trxName); if (PP_WF_Order_Product_ID == 0) { } - - } // MQMSpecification + } + + public MPPOrderNodeProduct (Properties ctx, ResultSet rs, String trxName) + { + super(ctx, rs, trxName); + } /** * Create a new MPPOrderNodeProduct based in MPPWFNodeProduct * @param np + * @param PP_Order_Node order node */ - public MPPOrderNodeProduct (MPPWFNodeProduct np) + public MPPOrderNodeProduct (MPPWFNodeProduct np, MPPOrderNode PP_Order_Node) { - this(np.getCtx(), 0, np.get_TrxName()); + this(PP_Order_Node.getCtx(), 0, PP_Order_Node.get_TrxName()); + setClientOrg(PP_Order_Node); setSeqNo(np.getSeqNo()); setIsActive(np.isActive()); setM_Product_ID(np.getM_Product_ID()); setQty(np.getQty()); setIsSubcontracting(np.isSubcontracting()); setYield(np.getYield()); + // + setPP_Order_ID(PP_Order_Node.getPP_Order_ID()); + setPP_Order_Workflow_ID(PP_Order_Node.getPP_Order_Workflow_ID()); + setPP_Order_Node_ID(PP_Order_Node.get_ID()); } - - - /** - * Load Constructor - * @param ctx context - * @param rs result set - */ - public MPPOrderNodeProduct (Properties ctx, ResultSet rs, String trxName) - { - super(ctx, rs, trxName); - } // MQMSpecification - - /** Lines */ - private static Collection m_lines = new ArrayList(); - - /** - * - * @param ctx - * @param AD_WF_Node_ID - * @param trxName - * @return - */ - public Collection getNodeProduct() - { - if(!m_lines.isEmpty()) - return m_lines; - - String whereClause = "PP_Order_Node_Product_ID=? "; - m_lines = new Query(getCtx(), MPPOrderNodeProduct.Table_Name, whereClause, get_TrxName()) - .setParameters(new Object[]{get_ID()}) - .setOnlyActiveRecords(true) - .setOrderBy(MPPOrderNodeProduct.COLUMNNAME_SeqNo) - .list(); - return m_lines; - } // getMPPOrderNodeProduct - -} // MPPWFNodeProduct +} diff --git a/base/src/org/eevolution/model/MPPOrderWorkflow.java b/base/src/org/eevolution/model/MPPOrderWorkflow.java index 0322ffdf39..b53583fd36 100644 --- a/base/src/org/eevolution/model/MPPOrderWorkflow.java +++ b/base/src/org/eevolution/model/MPPOrderWorkflow.java @@ -16,7 +16,6 @@ *****************************************************************************/ package org.eevolution.model; -import java.math.BigDecimal; import java.sql.ResultSet; import java.util.ArrayList; import java.util.Calendar; @@ -28,7 +27,6 @@ import org.compiere.model.MClient; import org.compiere.model.Query; import org.compiere.util.CCache; import org.compiere.util.Env; -import org.compiere.wf.MWFNode; import org.compiere.wf.MWorkflow; /** @@ -183,18 +181,19 @@ public class MPPOrderWorkflow extends X_PP_Order_Workflow public MPPOrderNode[] getNodes(boolean ordered, int AD_Client_ID) { if (ordered) + { return getNodesInOrder(AD_Client_ID); + } // ArrayList list = new ArrayList(); - for (int i = 0; i < m_nodes.size(); i++) + for (MPPOrderNode node : m_nodes) { - MPPOrderNode node = m_nodes.get(i); if (node.getAD_Client_ID() == 0 || node.getAD_Client_ID() == AD_Client_ID) + { list.add(node); + } } - MPPOrderNode[] retValue = new MPPOrderNode [list.size()]; - list.toArray(retValue); - return retValue; + return list.toArray(new MPPOrderNode [list.size()]); } // getNodes /** @@ -207,17 +206,18 @@ public class MPPOrderWorkflow extends X_PP_Order_Workflow } // getFirstNode /** - * Get Node with ID in Workflow + * Get Node with given ID * @param PP_Order_Node_ID ID * @return node or null */ public MPPOrderNode getNode (int PP_Order_Node_ID) { - for (int i = 0; i < m_nodes.size(); i++) + for (MPPOrderNode node : m_nodes) { - MPPOrderNode node = (MPPOrderNode)m_nodes.get(i); if (node.getPP_Order_Node_ID() == PP_Order_Node_ID) + { return node; + } } return null; } // getNode @@ -232,21 +232,22 @@ public class MPPOrderWorkflow extends X_PP_Order_Workflow { MPPOrderNode node = getNode(PP_Order_Node_ID); if (node == null || node.getNextNodeCount() == 0) - return null; - // - MPPOrderNodeNext[] nexts = node.getTransitions(AD_Client_ID); - ArrayList list = new ArrayList(); - for (int i = 0; i < nexts.length; i++) { - MPPOrderNode next = getNode (nexts[i].getPP_Order_Next_ID()); + return null; + } + // + ArrayList list = new ArrayList(); + for (MPPOrderNodeNext nextTr : node.getTransitions(AD_Client_ID)) + { + MPPOrderNode next = getNode (nextTr.getPP_Order_Next_ID()); if (next != null) + { list.add(next); + } } // Return Nodes - MPPOrderNode[] retValue = new MPPOrderNode [list.size()]; - list.toArray(retValue); - return retValue; + return list.toArray(new MPPOrderNode [list.size()]); } // getNextNodes /** diff --git a/base/src/org/eevolution/model/MPPProductBOM.java b/base/src/org/eevolution/model/MPPProductBOM.java index fba1d01aa6..761fe0aae7 100644 --- a/base/src/org/eevolution/model/MPPProductBOM.java +++ b/base/src/org/eevolution/model/MPPProductBOM.java @@ -21,35 +21,30 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import java.util.Properties; -import java.util.logging.Level; import org.compiere.model.MProduct; -import org.compiere.model.PO; import org.compiere.model.Query; import org.compiere.util.CCache; -import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; /** - * PP Product BOM Model. + * PP Product BOM Model. * - * @author Victor Perez www.e-evolution.com - * @version $Id: MOrder.java,v 1.40 2004/04/13 04:19:30 vpj-cd Exp $ - * + * @author Victor Perez www.e-evolution.com * @author Teo Sarca, http://www.arhipac.ro */ public class MPPProductBOM extends X_PP_Product_BOM { private static final long serialVersionUID = 1L; - /** Static Logger */ - private static CLogger log = CLogger.getCLogger(MPPProductBOM.class); /** Cache */ private static CCache s_cache = new CCache(Table_Name, 40, 5); + /** BOM Lines */ + private List m_lines = null; /** - * Load/Get Product BOM by ID (cached) + * Get Product BOM by ID (cached) * @param ctx * @param PP_Product_BOM_ID * @return product bom @@ -62,111 +57,43 @@ public class MPPProductBOM extends X_PP_Product_BOM if (bom != null) return bom; bom = new MPPProductBOM(ctx, PP_Product_BOM_ID, null); - if (bom.get_ID() == PP_Product_BOM_ID) { + if (bom.get_ID() == PP_Product_BOM_ID) + { s_cache.put(PP_Product_BOM_ID, bom); } - else { + else + { bom = null; } return bom; } - + /** - * Default Constructor - * @param ctx context - * @param C_Order_ID order to load, (0 create new order) + * Get PP_Product_BOM_ID for given M_Product_ID + * @param M_Product_ID + * @return PP_Product_BOM_ID */ - public MPPProductBOM(Properties ctx, int PP_Product_BOM_ID,String trxName) + public static int getBOMSearchKey(Properties ctx, MProduct product) { - super (ctx, PP_Product_BOM_ID, trxName); - } // MPPProductBOM - - - /** - * Load Constructor - * @param ctx context - * @param rs result set record - */ - public MPPProductBOM(Properties ctx, ResultSet rs,String trxName) - { - super (ctx, rs,trxName); - } // MOrder - - /** - * Copy Lines From other BOM - * @param order order - * @return number of lines copied - */ - public int copyLinesFrom (MPPProductBOM bom) - { - if (bom == null) - return 0; - MPPProductBOMLine[] fromLines = bom.getLines(); - int count = 0; - for (int i = 0; i < fromLines.length; i++) - { - MPPProductBOMLine line = new MPPProductBOMLine (this); - PO.copyValues(fromLines[i], line, getAD_Client_ID(), getAD_Org_ID()); - line.setPP_Product_BOM_ID(getPP_Product_BOM_ID()); - if (line.save(get_TrxName())) - count++; - } - if (fromLines.length != count) - log.log(Level.SEVERE,"copyLinesFrom - Line difference - From=" + fromLines.length + " <> Saved=" + count); - return count; - } // copyLinesFrom - - /*************************************************************************/ - - /** - * BUG #104 - * @param lines - */ - private void setLines(List lines) - { - this.lines = lines; + int AD_Client_ID = Env.getAD_Client_ID(ctx); + String sql = "SELECT PP_Product_BOM_ID FROM PP_Product_BOM" + +" WHERE Value=? AND M_Product_ID=? AND AD_Client_ID=?"; + return DB.getSQLValueEx(null, sql, product.getValue(), product.get_ID(), AD_Client_ID); } - - private List lines = null; - + /** - * BUG #? - Does not persist objects! - * @param ctx - * @param from - * @param copyLines - * @return + * Get BOM with Default Logic (Product = BOM Product and BOM Value = Product Value) + * @param product + * @param trxName + * @return product BOM */ - public static MPPProductBOM copyFrom(Properties ctx, MPPProductBOM from, boolean copyLines) { - MPPProductBOM newBom = new MPPProductBOM(ctx, 0,null); - PO.copyValues(from, newBom, Env.getAD_Client_ID(ctx), Env.getAD_Org_ID(ctx)); - newBom.setDocumentNo(null); - - if (copyLines) { - List newLines = new ArrayList(); - MPPProductBOMLine[] fromLines = from.getLines(); - for (int i = 0; i < fromLines.length; i++) { - MPPProductBOMLine line = new MPPProductBOMLine(ctx, 0,null); - PO.copyValues(fromLines[i], line, Env.getAD_Client_ID(ctx), Env.getAD_Org_ID(ctx)); - newLines.add(line); - } - newBom.setLines(newLines); - } - - return newBom; - } - - /** - * String Representation - * @return info - */ - public String toString () + public static MPPProductBOM getDefault(MProduct product, String trxName) { - StringBuffer sb = new StringBuffer ("MPP_ProductBOM[") - .append(get_ID()).append("-").append(getDocumentNo()) - .append ("]"); - return sb.toString (); - } // toString - + return new Query(product.getCtx(), Table_Name, "M_Product_ID=? AND Value=?", trxName) + .setParameters(new Object[]{product.getM_Product_ID(), product.getValue()}) + .first(); + } + /** * Get BOM for Product * @param product product @@ -176,13 +103,13 @@ public class MPPProductBOM extends X_PP_Product_BOM */ public static MPPProductBOM get(MProduct product, int ad_org_id, String trxName) { - MPPProductBOM bom = null; + MPPProductBOM bom = null; Properties ctx = product.getCtx(); // find Default BOM in Product Data Planning if (ad_org_id > 0 ) { MPPProductPlanning pp = MPPProductPlanning.get(ctx, product.getAD_Client_ID(),ad_org_id, product.getM_Product_ID(), trxName); - if(pp != null && pp.getPP_Product_BOM_ID() > 0 ) + if(pp != null && pp.getPP_Product_BOM_ID() > 0) { bom = new MPPProductBOM(ctx, pp.getPP_Product_BOM_ID(),trxName); } @@ -194,8 +121,7 @@ public class MPPProductBOM extends X_PP_Product_BOM } return bom; - - } // getBOM + } /** * Get BOM with valid dates for Product @@ -213,8 +139,19 @@ public class MPPProductBOM extends X_PP_Product_BOM return bom; } return null; + } - } // getBOM + + public MPPProductBOM(Properties ctx, int PP_Product_BOM_ID,String trxName) + { + super (ctx, PP_Product_BOM_ID, trxName); + } + + + public MPPProductBOM(Properties ctx, ResultSet rs,String trxName) + { + super (ctx, rs,trxName); + } /** * Get BOM Lines valid date for Product BOM @@ -223,10 +160,11 @@ public class MPPProductBOM extends X_PP_Product_BOM */ public MPPProductBOMLine[] getLines (Timestamp valid) { - MPPProductBOMLine[] bomlines = getLines(); // All BOM Lines List list = new ArrayList(); // Selected BOM Lines Only - for (MPPProductBOMLine bl : bomlines) { - if (bl.isValidFromTo(valid)) { + for (MPPProductBOMLine bl : getLines()) + { + if (bl.isValidFromTo(valid)) + { list.add(bl); } } @@ -240,41 +178,16 @@ public class MPPProductBOM extends X_PP_Product_BOM */ public MPPProductBOMLine[] getLines() { - if (this.lines == null) + if (this.m_lines == null) { final String whereClause = MPPProductBOMLine.COLUMNNAME_PP_Product_BOM_ID+"=?"; - this.lines = new Query(getCtx(), MPPProductBOMLine.Table_Name, whereClause, get_TrxName()) + this.m_lines = new Query(getCtx(), MPPProductBOMLine.Table_Name, whereClause, get_TrxName()) .setParameters(new Object[]{getPP_Product_BOM_ID()}) .setOrderBy(MPPProductBOMLine.COLUMNNAME_Line) .list(); } - return this.lines.toArray(new MPPProductBOMLine[this.lines.size()]); + return this.m_lines.toArray(new MPPProductBOMLine[this.m_lines.size()]); } // getLines - - /** - * Get PP_Product_BOM_ID for given M_Product_ID - * @param M_Product_ID - * @return PP_Product_BOM_ID - */ - public static int getBOMSearchKey(Properties ctx, MProduct product) - { - int AD_Client_ID = Env.getAD_Client_ID(ctx); - String sql = "SELECT pb.PP_Product_BOM_ID FROM PP_Product_BOM pb" - +" WHERE pb.Value = ? AND pb.M_Product_ID=? AND pb.AD_Client_ID = ?"; - return DB.getSQLValue(null, sql, product.getValue(), product.get_ID(), AD_Client_ID); - } - - /** - * Get BOM with Default Logic (Product = BOM Product and BOM Value = Product Value) - * @param product - * @param trxName - * @return product BOM - */ - public static MPPProductBOM getDefault(MProduct product, String trxName) { - return new Query(product.getCtx(), Table_Name, "M_Product_ID=? AND Value=?", trxName) - .setParameters(new Object[]{product.getM_Product_ID(), product.getValue()}) - .first(); - } public boolean isValidFromTo(Timestamp date) { @@ -289,7 +202,8 @@ public class MPPProductBOM extends X_PP_Product_BOM } @Override - protected boolean afterDelete(boolean success) { + protected boolean afterDelete(boolean success) + { if (!success) return false; @@ -298,7 +212,8 @@ public class MPPProductBOM extends X_PP_Product_BOM } @Override - protected boolean afterSave(boolean newRecord, boolean success) { + protected boolean afterSave(boolean newRecord, boolean success) + { if (!success) return false; @@ -311,13 +226,21 @@ public class MPPProductBOM extends X_PP_Product_BOM private void updateProduct() { - int count = new Query(getCtx(), Table_Name, "M_Product_ID=? AND IsActive=?", get_TrxName()) - .setParameters(new Object[]{getM_Product_ID(), "Y"}) + int count = new Query(getCtx(), Table_Name, COLUMNNAME_M_Product_ID+"=?", get_TrxName()) + .setParameters(new Object[]{getM_Product_ID()}) + .setOnlyActiveRecords(true) .count(); MProduct product = new MProduct(getCtx(), getM_Product_ID(), get_TrxName()); product.setIsBOM(count > 0); product.saveEx(); } - + @Override + public String toString () + { + StringBuffer sb = new StringBuffer ("MPP_ProductBOM[") + .append(get_ID()).append("-").append(getDocumentNo()) + .append ("]"); + return sb.toString (); + } } // MPPProductBOM diff --git a/base/src/org/eevolution/model/MPPProductBOMLine.java b/base/src/org/eevolution/model/MPPProductBOMLine.java index 9201163f58..6982bbc557 100644 --- a/base/src/org/eevolution/model/MPPProductBOMLine.java +++ b/base/src/org/eevolution/model/MPPProductBOMLine.java @@ -12,6 +12,7 @@ * For the text or an alternative of this public license, you may reach us * * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * * Contributor(s): Victor Perez www.e-evolution.com * + * Teo Sarca, www.arhipac.ro * *****************************************************************************/ package org.eevolution.model; @@ -38,10 +39,9 @@ import org.compiere.util.Env; * l.setQty(wbl.getQuantity());; * l.saveEx(); * - * @author Victor Perez www.e-evolution.com - * @version $Id: MOrderLine.java,v 1.22 2004/03/22 07:15:03 vpj-cd Exp $ - * - * @author Teo Sarca, SC ARHIPAC SERVICE SRL + * + * @author Victor Perez www.e-evolution.com + * @author Teo Sarca, www.arhipac.ro */ public class MPPProductBOMLine extends X_PP_Product_BOMLine { @@ -108,7 +108,7 @@ public class MPPProductBOMLine extends X_PP_Product_BOMLine { final String sql = "SELECT COALESCE(MAX("+COLUMNNAME_Line+"),0) + 10 FROM "+Table_Name +" WHERE "+COLUMNNAME_PP_Product_BOM_ID+"=?"; - int line = DB.getSQLValue(get_TrxName(), sql, getPP_Product_BOM_ID()); + int line = DB.getSQLValueEx(get_TrxName(), sql, getPP_Product_BOM_ID()); setLine(line); } @@ -141,7 +141,8 @@ public class MPPProductBOMLine extends X_PP_Product_BOMLine } } -class ProductLowLevelCalculator { +class ProductLowLevelCalculator +{ private Hashtable tableproduct = new Hashtable(); private Properties m_ctx = null; private String m_trxName = null; @@ -180,17 +181,15 @@ class ProductLowLevelCalculator { DefaultMutableTreeNode parent = new DefaultMutableTreeNode(Integer.toString(M_Product_ID) + "|" + Integer.toString(PP_Product_BOM_ID)); - String sql = new String( - "SELECT pboml.PP_Product_BOMLine_ID FROM PP_Product_BOMLine pboml" - + " WHERE pboml.IsActive= 'Y' AND pboml.AD_Client_ID = ? AND pboml.M_Product_ID = ? "); + String sql = "SELECT PP_Product_BOMLine_ID FROM PP_Product_BOMLine" + + " WHERE IsActive=? AND AD_Client_ID=? AND M_Product_ID=?"; PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = DB.prepareStatement(sql, m_trxName); - pstmt.setInt(1, AD_Client_ID); - pstmt.setInt(2, M_Product_ID); + DB.setParameters(pstmt, new Object[]{true, AD_Client_ID, M_Product_ID}); rs = pstmt.executeQuery(); while (rs.next()) { @@ -212,10 +211,10 @@ class ProductLowLevelCalculator { { throw new DBException(e); } - finally { + finally + { DB.close(rs, pstmt); - rs = null; - pstmt = null; + rs = null; pstmt = null; } return parent; } @@ -228,17 +227,16 @@ class ProductLowLevelCalculator { */ private DefaultMutableTreeNode icomponent(int AD_Client_ID, int PP_Product_BOMLine_ID, int M_Product_ID, DefaultMutableTreeNode bom) { - String sql = + final String sql = "SELECT pbom.M_Product_ID , pbom.Value , pbom.PP_Product_BOM_ID FROM PP_Product_BOMLine pboml" + " INNER JOIN PP_Product_BOM pbom ON (pbom.PP_Product_BOM_ID = pboml.PP_Product_BOM_ID)" - + " WHERE pbom.IsActive= 'Y' AND pboml.IsActive= 'Y' AND pboml.AD_Client_ID =? AND pboml.PP_Product_BOMLine_ID = ? "; + + " WHERE pbom.IsActive=? AND pboml.IsActive=? AND pboml.AD_Client_ID=? AND pboml.PP_Product_BOMLine_ID=? "; PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = DB.prepareStatement(sql, m_trxName); - pstmt.setInt(1, AD_Client_ID); - pstmt.setInt(2, PP_Product_BOMLine_ID); + DB.setParameters(pstmt, new Object[]{true, true, AD_Client_ID, PP_Product_BOMLine_ID}); rs = pstmt.executeQuery(); while (rs.next()) { @@ -246,7 +244,9 @@ class ProductLowLevelCalculator { { //BOM Loop Error if (!tableproduct(rs.getInt(1), rs.getInt(3))) + { bom.add(iparent(AD_Client_ID, rs.getInt(1), rs.getInt(3))); + } else { throw new AdempiereException("Cycle BOM & Formula:" + rs.getString(2) + "(" + rs.getString(3) + ")"); @@ -265,10 +265,10 @@ class ProductLowLevelCalculator { { throw new DBException(e); } - finally { + finally + { DB.close(rs, pstmt); - rs = null; - pstmt = null; + rs = null; pstmt = null; } return null; } @@ -281,14 +281,11 @@ class ProductLowLevelCalculator { */ private boolean tableproduct(int M_Product_ID, int PP_Product_BOM_ID) { - Integer p = new Integer(M_Product_ID); - Integer bom = new Integer(PP_Product_BOM_ID); - - if (tableproduct.containsKey(p)) + if (tableproduct.containsKey(M_Product_ID)) { return true; } - tableproduct.put(p, bom); + tableproduct.put(M_Product_ID, PP_Product_BOM_ID); return false; } } diff --git a/base/src/org/eevolution/model/MPPProductPlanning.java b/base/src/org/eevolution/model/MPPProductPlanning.java index ad2642b6ab..b447b3f8d0 100644 --- a/base/src/org/eevolution/model/MPPProductPlanning.java +++ b/base/src/org/eevolution/model/MPPProductPlanning.java @@ -16,6 +16,7 @@ *****************************************************************************/ package org.eevolution.model; +import java.math.BigDecimal; import java.sql.ResultSet; import java.util.Properties; @@ -27,13 +28,12 @@ import org.compiere.util.CLogMgt; import org.compiere.util.CLogger; import org.compiere.util.DB; import org.compiere.util.Env; +import org.compiere.wf.MWorkflow; /** - * Product Data Planning + * Product Data Planning * - * @author Victor Perez www.e-evolution.com - * @version $Id: MPProductPlannning.java,v 1.4 2004/05/13 06:05:22 vpj-cd Exp $ - * + * @author Victor Perez www.e-evolution.com * @author Teo Sarca, www.arhipac.ro */ public class MPPProductPlanning extends X_PP_Product_Planning @@ -72,7 +72,7 @@ public class MPPProductPlanning extends X_PP_Product_Planning } /** - * Get Data Product Planning to Organization + * Get Data Product Planning to Organization * @param ctx Context * @param ad_org_id Organization ID * @param m_product_id Product ID @@ -83,19 +83,17 @@ public class MPPProductPlanning extends X_PP_Product_Planning int m_product_id, String trxname) { - int m_M_Warehouse_ID = MOrgInfo.get(ctx, ad_org_id).getM_Warehouse_ID(); - if(m_M_Warehouse_ID <= 0) + int M_Warehouse_ID = MOrgInfo.get(ctx, ad_org_id).getM_Warehouse_ID(); + if(M_Warehouse_ID <= 0) + { + return null; + } + + int S_Resource_ID = getPlantForWarehouse(M_Warehouse_ID); + if (S_Resource_ID <= 0) return null; - // Get plant resource for warehouse. If more than one resource is found, first will be used - final String sql = "SELECT MIN(S_Resource_ID) FROM S_Resource" - +" WHERE IsManufacturingResource=? AND ManufacturingResourceType=?" - +" AND AD_Client_ID=? AND M_Warehouse_ID= ?"; - int m_S_Resource_ID = DB.getSQLValue(trxname, sql, "Y", MResource.MANUFACTURINGRESOURCETYPE_Plant, ad_client_id, m_M_Warehouse_ID); - if (m_S_Resource_ID <= 0) - return null; - - return get(ctx, ad_client_id,ad_org_id, m_M_Warehouse_ID, m_S_Resource_ID, m_product_id, trxname); + return get(ctx, ad_client_id,ad_org_id, M_Warehouse_ID, S_Resource_ID, m_product_id, trxname); } /** @@ -115,7 +113,8 @@ public class MPPProductPlanning extends X_PP_Product_Planning { log.info("AD_Client_ID=" + ad_client_id + " AD_Org_ID=" + ad_org_id + " M_Product_ID=" + m_product_id + " M_Warehouse_ID=" + m_warehouse_id + " S_Resource_ID=" + s_resource_id ); String sql_warehouse = COLUMNNAME_M_Warehouse_ID+"=?"; - if(m_warehouse_id == 0) { + if(m_warehouse_id == 0) + { sql_warehouse += " OR "+COLUMNNAME_M_Warehouse_ID+" IS NULL"; } @@ -127,7 +126,7 @@ public class MPPProductPlanning extends X_PP_Product_Planning return new Query(ctx, MPPProductPlanning.Table_Name, whereClause, trxname) .setParameters(new Object[]{ad_client_id, ad_org_id, m_product_id, m_warehouse_id, s_resource_id}) - .first(); + .firstOnly(); } @@ -158,6 +157,26 @@ public class MPPProductPlanning extends X_PP_Product_Planning .first(); } + public static int getPlantForWarehouse(int M_Warehouse_ID) + { + // Get plant resource for warehouse. If more than one resource is found, first will be used + final String sql = "SELECT MIN("+MResource.COLUMNNAME_S_Resource_ID+")" + +" FROM "+MResource.Table_Name + +" WHERE "+MResource.COLUMNNAME_IsManufacturingResource+"=?" + +" AND "+MResource.COLUMNNAME_ManufacturingResourceType+"=?" + +" AND "+MResource.COLUMNNAME_M_Warehouse_ID+"=?"; + int plant_id = DB.getSQLValueEx(null, sql, true, MResource.MANUFACTURINGRESOURCETYPE_Plant, M_Warehouse_ID); + return plant_id; + } + + /** + * @return Qty On Hand + */ + public BigDecimal getQtyOnHand() + { + return MPPMRP.getQtyOnHand(getCtx(), getM_Warehouse_ID(), getM_Product_ID(), get_TrxName()); + } + @Override protected boolean beforeSave(boolean newRecord) { @@ -170,6 +189,18 @@ public class MPPProductPlanning extends X_PP_Product_Planning } return true; } + + @Override + public MPPProductBOM getPP_Product_BOM() + { + return MPPProductBOM.get(getCtx(), getPP_Product_BOM_ID()); + } + + @Override + public MWorkflow getAD_Workflow() + { + return MWorkflow.get(getCtx(), getAD_Workflow_ID()); + } public void dump() { @@ -184,9 +215,8 @@ public class MPPProductPlanning extends X_PP_Product_Planning log.info(" Network Distribution: " + getDD_NetworkDistribution_ID()); log.info("Delivery Time Promised: " + getDeliveryTime_Promised()); log.info(" TransfertTime: " + getTransfertTime ()); - log.info(" Max Order: " + getOrder_Max()); - log.info(" Min Order: " + getOrder_Min()); - log.info(" Pack Order: " + getOrder_Pack()); + log.info(" Order Min/Max: " + getOrder_Min() + " / " + getOrder_Max()); + log.info(" Order Pack: " + getOrder_Pack()); log.info(" Safety Stock: " + getSafetyStock()); log.info(" Order Period: " + getOrder_Period()); log.info(" Order Policy: " + getOrder_Policy()); diff --git a/base/src/org/eevolution/model/MPPWFNodeAsset.java b/base/src/org/eevolution/model/MPPWFNodeAsset.java index 997f01ca13..73ffc66975 100644 --- a/base/src/org/eevolution/model/MPPWFNodeAsset.java +++ b/base/src/org/eevolution/model/MPPWFNodeAsset.java @@ -12,71 +12,62 @@ * For the text or an alternative of this public license, you may reach us * * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * * Contributor(s): Victor Perez www.e-evolution.com * + * Teo Sarca, www.arhipac.ro * *****************************************************************************/ package org.eevolution.model; import java.sql.ResultSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Properties; import org.compiere.model.Query; +import org.compiere.util.CCache; /** - * Forcast Line Model + * Workflow Node Asset Model * - * @author Victor Perez www.e-evolution.com - * @version $Id: MPPWFNodeAsset.java,v 1.11 2005/05/17 05:29:52 vpj-cd vpj-cd $ + * @author Victor Perez www.e-evolution.com + * @author Teo Sarca, www.arhipac.ro */ -public class MPPWFNodeAsset extends X_PP_WF_Node_Asset +public class MPPWFNodeAsset extends X_PP_WF_Node_Asset { + private static final long serialVersionUID = 1L; + + /** Cache */ + private static CCache> + s_cache = new CCache>(Table_Name, 20); + /** - * Standard Constructor - * @param ctx context - * @param M_ForecastLine_ID id + * @return array of node assets */ + public static Collection forAD_WF_Node_ID(Properties ctx, int AD_WF_Node_ID) + { + Collection lines = s_cache.get(AD_WF_Node_ID); + if (lines != null) + { + return lines; + } + + final String whereClause = COLUMNNAME_AD_WF_Node_ID+"=?"; + lines = new Query(ctx, Table_Name, whereClause, null) + .setParameters(new Object[]{AD_WF_Node_ID}) + .setOnlyActiveRecords(true) + .setOrderBy(COLUMNNAME_SeqNo) + .list(); + s_cache.put(AD_WF_Node_ID, lines); + return lines; + } + public MPPWFNodeAsset (Properties ctx, int PP_WF_Node_Asset_ID, String trxName) { super (ctx, PP_WF_Node_Asset_ID, trxName); if (PP_WF_Node_Asset_ID == 0) { } - - } // MQMSpecification + } - /** - * Load Constructor - * @param ctx context - * @param rs result set - */ public MPPWFNodeAsset (Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); - } // MPPWFNodeAsset - - - - /** Lines */ - private static Collection m_lines = new ArrayList(); - - /** - * - * @param ctx - * @param AD_WF_Node_ID - * @param trxName - * @return - */ - public static Collection get(Properties ctx, int AD_WF_Node_ID , String trxName) - { - if(!m_lines.isEmpty()) - return m_lines; - - String whereClause = "AD_WF_Node_ID=? "; - m_lines = new Query(ctx, MPPWFNodeAsset.Table_Name, whereClause, trxName) - .setParameters(new Object[]{AD_WF_Node_ID}) - .setOnlyActiveRecords(true) - //.setOrderBy(MPPOrderNodeAsset.COLUMNNAME_SeqNo) - .list(); - return m_lines; - } // getLines -} // MPPWFNodeAsset + } +} diff --git a/base/src/org/eevolution/model/MPPWFNodeProduct.java b/base/src/org/eevolution/model/MPPWFNodeProduct.java index 05f57a0e4c..63294fe1e2 100644 --- a/base/src/org/eevolution/model/MPPWFNodeProduct.java +++ b/base/src/org/eevolution/model/MPPWFNodeProduct.java @@ -12,67 +12,80 @@ * For the text or an alternative of this public license, you may reach us * * Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. * * Contributor(s): Victor Perez www.e-evolution.com * + * Teo Sarca, www.arhipac.ro * *****************************************************************************/ package org.eevolution.model; import java.sql.ResultSet; -import java.util.ArrayList; import java.util.Collection; import java.util.Properties; import org.compiere.model.Query; +import org.compiere.util.CCache; +import org.compiere.util.DB; /** - * Forcast Line Model + * Workflow Node Product Model * - * @author Victor Perez www.e-evolution.com - * @version $Id: MPPWFNodeProduct.java,v 1.11 2005/05/17 05:29:52 vpj-cd vpj-cd $ + * @author Victor Perez www.e-evolution.com + * @author Teo Sarca, www.arhipac.ro */ -public class MPPWFNodeProduct extends X_PP_WF_Node_Product +public class MPPWFNodeProduct extends X_PP_WF_Node_Product { + private static final long serialVersionUID = 1L; + + /** Cache */ + private static CCache> + s_cache = new CCache>(Table_Name, 20); + /** - * Standard Constructor - * @param ctx context - * @param M_ForecastLine_ID id + * @return array of node products */ + public static Collection forAD_WF_Node_ID(Properties ctx, int AD_WF_Node_ID) + { + Collection lines = s_cache.get(AD_WF_Node_ID); + if (lines != null) + { + return lines; + } + + final String whereClause = COLUMNNAME_AD_WF_Node_ID+"=?"; + lines = new Query(ctx, Table_Name, whereClause, null) + .setParameters(new Object[]{AD_WF_Node_ID}) + .setOnlyActiveRecords(true) + .setOrderBy(COLUMNNAME_SeqNo) + .list(); + s_cache.put(AD_WF_Node_ID, lines); + return lines; + } + public MPPWFNodeProduct (Properties ctx, int PP_WF_Node_Product_ID, String trxName) { super (ctx, PP_WF_Node_Product_ID, trxName); if (PP_WF_Node_Product_ID == 0) { } - - } // MQMSpecification + } - /** - * Load Constructor - * @param ctx context - * @param rs result set - */ public MPPWFNodeProduct (Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); - } // MQMSpecification - - /** Lines */ - private static Collection m_lines = new ArrayList(); - - /** - * Get Lines - * @return array of lines - */ - public static Collection get(Properties ctx, int AD_WF_Node_ID , String trxName) + } + + @Override + protected boolean beforeSave(boolean newRecord) { - if(!m_lines.isEmpty()) - return m_lines; - - String whereClause = "AD_WF_Node_ID=?"; - m_lines = new Query(ctx, MPPWFNodeProduct.Table_Name, whereClause, trxName) - .setParameters(new Object[]{AD_WF_Node_ID}) - .setOnlyActiveRecords(true) - .setOrderBy(MPPWFNodeProduct.COLUMNNAME_SeqNo) - .list(); - return m_lines; - } // getMPPOrderNodeProduct + if (getSeqNo() == 0) + { + final String sql = "SELECT COALESCE(MAX("+COLUMNNAME_SeqNo+"),0)+10 FROM "+Table_Name+" WHERE " + +" "+COLUMNNAME_AD_WF_Node_ID+"=?" + +" AND "+COLUMNNAME_PP_WF_Node_Product_ID+"<>?"; + int seqNo = DB.getSQLValueEx(get_TrxName(), sql, getAD_WF_Node_ID(), get_ID()); + setSeqNo(seqNo); + } + // + return true; + } + } // MPPWFNodeProduct diff --git a/base/src/org/eevolution/model/X_RV_PP_Order_Storage.java b/base/src/org/eevolution/model/X_RV_PP_Order_Storage.java deleted file mode 100644 index 9097d5ee68..0000000000 --- a/base/src/org/eevolution/model/X_RV_PP_Order_Storage.java +++ /dev/null @@ -1,109 +0,0 @@ -/****************************************************************************** - * Product: Adempiere ERP & CRM Smart Business Solution * - * Copyright (C) 1999-2007 ComPiere, Inc. All Rights Reserved. * - * This program is free software; - you can redistribute it and/or modify it * - * under the terms version 2 of the GNU General Public License as published * - * by the Free Software Foundation. This program is distributed in the hope * - * that it will be useful, but WITHOUT ANY WARRANTY; - without even the implied * - * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * - * See the GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License along * - * with this program; - if not, write to the Free Software Foundation, Inc., * - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * - * For the text or an alternative of this public license, you may reach us * - * ComPiere, Inc., 2620 Augustine Dr. #245, Santa Clara, CA 95054, USA * - * or via info@compiere.org or http://www.compiere.org/license.html * - *****************************************************************************/ -package org.eevolution.model; - -/** Generated Model - DO NOT CHANGE */ -import java.math.BigDecimal; -import java.sql.ResultSet; -import java.util.Properties; - -import org.compiere.model.MTable; -import org.compiere.model.PO; -import org.compiere.model.POInfo; -import org.compiere.util.KeyNamePair; -/** Generated Model for RV_PP_Order_Storage - * @author Adempiere (generated) - * @version Release 3.1.5 - $Id$ */ -public class X_RV_PP_Order_Storage extends PO -{ -/** Standard Constructor -@param ctx context -@param RV_PP_Order_Storage_ID id -@param trxName transaction -*/ -public X_RV_PP_Order_Storage (Properties ctx, int RV_PP_Order_Storage_ID, String trxName) -{ -super (ctx, RV_PP_Order_Storage_ID, trxName); -/** if (RV_PP_Order_Storage_ID == 0) -{ -setRV_PP_Order_Storage_ID (0); -} - */ -} -/** Load Constructor -@param ctx context -@param rs result set -@param trxName transaction -*/ -public X_RV_PP_Order_Storage (Properties ctx, ResultSet rs, String trxName) -{ -super (ctx, rs, trxName); -} -/** AD_Table_ID=50057 */ -public static final int Table_ID=MTable.getTable_ID("RV_PP_Order_Storage"); - -/** TableName=RV_PP_Order_Storage */ -public static final String Table_Name="RV_PP_Order_Storage"; - -protected static KeyNamePair Model = new KeyNamePair(Table_ID,"RV_PP_Order_Storage"); - -protected BigDecimal accessLevel = BigDecimal.valueOf(3); -/** AccessLevel -@return 3 - Client - Org -*/ -protected int get_AccessLevel() -{ -return accessLevel.intValue(); -} -/** Load Meta Data -@param ctx context -@return PO Info -*/ -protected POInfo initPO (Properties ctx) -{ -POInfo poi = POInfo.getPOInfo (ctx, Table_ID); -return poi; -} -/** Info -@return info -*/ -public String toString() -{ -StringBuffer sb = new StringBuffer ("X_RV_PP_Order_Storage[").append(get_ID()).append("]"); -return sb.toString(); -} -/** Set RV_PP_Order_Storage. -@param RV_PP_Order_Storage_ID RV_PP_Order_Storage */ -public void setRV_PP_Order_Storage_ID (int RV_PP_Order_Storage_ID) -{ -if (RV_PP_Order_Storage_ID < 1) throw new IllegalArgumentException ("RV_PP_Order_Storage_ID is mandatory."); -set_ValueNoCheck ("RV_PP_Order_Storage_ID", Integer.valueOf(RV_PP_Order_Storage_ID)); -} -/** Get RV_PP_Order_Storage. -@return RV_PP_Order_Storage */ -public int getRV_PP_Order_Storage_ID() -{ -Integer ii = (Integer)get_Value("RV_PP_Order_Storage_ID"); -if (ii == null) return 0; -return ii.intValue(); -} -/** Column name RV_PP_Order_Storage_ID */ -public static final String COLUMNNAME_RV_PP_Order_Storage_ID = "RV_PP_Order_Storage_ID"; -} diff --git a/base/src/org/eevolution/model/reasoner/CRPReasoner.java b/base/src/org/eevolution/model/reasoner/CRPReasoner.java index 2a2d6a4099..9589c169fd 100644 --- a/base/src/org/eevolution/model/reasoner/CRPReasoner.java +++ b/base/src/org/eevolution/model/reasoner/CRPReasoner.java @@ -97,7 +97,10 @@ public class CRPReasoner params.add(Env.getAD_Client_ID(getCtx())); // Skip voided, reversed and closed orders: - whereClause.append(" AND ").append(MPPOrder.COLUMNNAME_DocStatus).append(" NOT IN ('VO', 'RE', 'CL')"); + whereClause.append(" AND ").append(MPPOrder.COLUMNNAME_DocStatus).append(" NOT IN (?,?,?)"); + params.add(MPPOrder.DOCSTATUS_Voided); + params.add(MPPOrder.DOCSTATUS_Reversed); + params.add(MPPOrder.DOCSTATUS_Closed); // For given resource (if any) @@ -124,7 +127,9 @@ public class CRPReasoner params.add(r.get_ID()); final String whereClause = // Checks the requested resource id directly on order node, not on resource id of the order - "PP_Order_ID IN (SELECT PP_Order_ID FROM PP_Order_Node WHERE S_Resource_ID=?" + "EXISTS (SELECT 1 FROM PP_Order_Node WHERE " + +" PP_Order_Node.PP_Order_ID=PP_Order.PP_Order_ID" + +" AND S_Resource_ID=?" // ... and only the orders running on given day +" AND "+getSQLDayRestriction(dateTime, r, params) +")" @@ -167,7 +172,14 @@ public class CRPReasoner { return r.getResourceType().isAvailable(); } - + + /** + * Get Next/Previous Available Date + * @param t + * @param dateTime + * @param isScheduleBackward + * @return + */ private Timestamp getAvailableDate(MResourceType t, Timestamp dateTime, boolean isScheduleBackward) { Timestamp date = TimeUtil.trunc(dateTime, TimeUtil.TRUNC_DAY); diff --git a/base/src/org/eevolution/process/CRP.java b/base/src/org/eevolution/process/CRP.java index 5a7417b962..e13bc363e7 100644 --- a/base/src/org/eevolution/process/CRP.java +++ b/base/src/org/eevolution/process/CRP.java @@ -77,8 +77,8 @@ public class CRP extends SvrProcess { } } - protected String doIt() throws Exception { - + protected String doIt() throws Exception + { return runCRP(); } @@ -122,7 +122,8 @@ public class CRP extends SvrProcess { log.fine("PP_Order Node:" + node.getName() != null ? node.getName() : "" + " Description:" + node.getDescription() != null ? node.getDescription() : ""); MResource resource = MResource.get(getCtx(), node.getS_Resource_ID()); - if(resource== null) + // Skip this node if there is no resource + if(resource == null) { nodeId = owf.getNext(nodeId, getAD_Client_ID()); continue; @@ -145,6 +146,7 @@ public class CRP extends SvrProcess { date = node.getDateFinishSchedule(); nodeId = owf.getNext(nodeId, getAD_Client_ID()); } + // Update order finish date if (node != null && node.getDateFinishSchedule()!= null) { order.setDateFinishSchedule(node.getDateFinishSchedule()); @@ -163,7 +165,8 @@ public class CRP extends SvrProcess { log.fine("PP_Order Node:" + node.getName() != null ? node.getName() : "" + " Description:" + node.getDescription() != null ? node.getDescription() : ""); MResource resource = MResource.get(getCtx(), node.getS_Resource_ID()); - if(resource== null) + // Skip this node if there is no resource + if(resource == null) { nodeId = owf.getPrevious(nodeId, getAD_Client_ID()); continue; @@ -186,14 +189,15 @@ public class CRP extends SvrProcess { date = node.getDateStartSchedule(); nodeId = owf.getPrevious(nodeId, getAD_Client_ID()); } - if (node != null && node.getDateFinishSchedule()!= null) + // Update order start date + if (node != null && node.getDateStartSchedule() != null) { order.setDateStartSchedule(node.getDateStartSchedule()) ; } } else { - throw new AdempiereException("@Unknown scheduling method - "+p_ScheduleType); + throw new AdempiereException("Unknown scheduling method - "+p_ScheduleType); } order.saveEx(get_TrxName()); @@ -210,7 +214,7 @@ public class CRP extends SvrProcess { // ... its static single parts ... long totalDuration = //node.getQueuingTime() - node.getSetupTimeRequiered() // Use the present required setup time to notice later changes + + node.getSetupTimeRequiered() // Use the present required setup time to notice later changes + node.getMovingTime() + node.getWaitingTime() ; @@ -222,7 +226,7 @@ public class CRP extends SvrProcess { return (long)(totalDuration * commonBase * 1000); } - private Timestamp scheduleForward(Timestamp start, long nodeDuration, MResource r, MResourceType t) + private Timestamp scheduleForward(Timestamp start, long nodeDurationMillis, MResource r, MResourceType t) { Timestamp end = null; int iteration = 0; // statistical interation count @@ -242,39 +246,40 @@ public class CRP extends SvrProcess { long availableDayDuration = dayEnd.getTime() - dayStart.getTime(); // The work can be finish on this day. - if(availableDayDuration >= nodeDuration) + if(availableDayDuration >= nodeDurationMillis) { - end = new Timestamp(dayStart.getTime() + nodeDuration); - nodeDuration = 0; + end = new Timestamp(dayStart.getTime() + nodeDurationMillis); + nodeDurationMillis = 0; break; } // Otherwise recall with next day and the remained node duration. else { start = TimeUtil.addDays(TimeUtil.getDayBorder(start, null, false), 1); - nodeDuration -= availableDayDuration; + nodeDurationMillis -= availableDayDuration; } iteration++; - } while (nodeDuration > 0); + } while (nodeDurationMillis > 0); return end; } - private Timestamp scheduleBackward(Timestamp end, long nodeDuration, MResource r, MResourceType t) + private Timestamp scheduleBackward(Timestamp end, long nodeDurationMillis, MResource r, MResourceType t) { log.fine("--> ResourceType " + t); Timestamp start = null; - int iteration = 0; // statistical interation count + int iteration = 0; // statistical iteration count do { - log.fine("--> end " +end); - log.fine("--> nodeDuration=" +nodeDuration); + log.fine("--> end=" + end); + log.fine("--> nodeDuration=" + nodeDurationMillis); end = reasoner.getAvailableDate(r, end, true); Timestamp dayEnd = t.getDayEnd(end); Timestamp dayStart = t.getDayStart(end); - log.fine("--> dayEnd=" + dayEnd + ", dayStart=" + dayStart); + log.fine("--> dayStart=" + dayStart + ", dayEnd=" + dayEnd); + // If working has already began at this day and the value is in the range of the // resource's availability, switch end time to the given again if(end.before(dayEnd) && end.after(dayStart)) @@ -287,26 +292,26 @@ public class CRP extends SvrProcess { log.fine("--> availableDayDuration " + availableDayDuration); // The work can be finish on this day. - if(availableDayDuration >= nodeDuration) + if(availableDayDuration >= nodeDurationMillis) { - log.fine("--> availableDayDuration >= nodeDuration true " + availableDayDuration + "|" + nodeDuration ); - start = new Timestamp(dayEnd.getTime() - nodeDuration); - nodeDuration = 0; + log.fine("--> availableDayDuration >= nodeDuration true " + availableDayDuration + "|" + nodeDurationMillis ); + start = new Timestamp(dayEnd.getTime() - nodeDurationMillis); + nodeDurationMillis = 0; break; } // Otherwise recall with previous day and the remained node duration. else { - log.fine("--> availableDayDuration >= nodeDuration false " + availableDayDuration + "|" + nodeDuration ); - log.fine("--> nodeDuration-availableDayDuration " + (nodeDuration-availableDayDuration) ); + log.fine("--> availableDayDuration >= nodeDuration false " + availableDayDuration + "|" + nodeDurationMillis ); + log.fine("--> nodeDuration-availableDayDuration " + (nodeDurationMillis-availableDayDuration) ); end = TimeUtil.addDays(TimeUtil.getDayBorder(end, null, true), -1); - nodeDuration -= availableDayDuration; + nodeDurationMillis -= availableDayDuration; } // iteration++; } - while(nodeDuration > 0); + while(nodeDurationMillis > 0); log.fine(" --> start=" + start + " <---------------------------------------- "); return start; diff --git a/base/src/org/eevolution/process/MRP.java b/base/src/org/eevolution/process/MRP.java index 5e9609b53f..6aac0c4d15 100644 --- a/base/src/org/eevolution/process/MRP.java +++ b/base/src/org/eevolution/process/MRP.java @@ -311,7 +311,7 @@ public class MRP extends SvrProcess * @param M_Warehuse_ID Warehouse ID */ public String runMRP(int AD_Client_ID , int AD_Org_ID, int S_Resource_ID , int M_Warehouse_ID) - { + { deleteMRP(AD_Client_ID,AD_Org_ID,S_Resource_ID,M_Warehouse_ID); PreparedStatement pstmt = null; @@ -371,9 +371,9 @@ public class MRP extends SvrProcess } // New Product - if (product == null || product.get_ID() != rs.getInt("M_Product_ID")) + if (product == null || product.get_ID() != rs.getInt(MPPMRP.COLUMNNAME_M_Product_ID)) { - product = MProduct.get(getCtx(), rs.getInt("M_Product_ID")); + product = MProduct.get(getCtx(), rs.getInt(MPPMRP.COLUMNNAME_M_Product_ID)); log.info("Calculte Plan to this Product:" + product.getName()); //if exist QtyGrossReq of last Demand verify plan diff --git a/base/src/org/eevolution/process/RollupBillOfMaterial.java b/base/src/org/eevolution/process/RollupBillOfMaterial.java index 2d6564d6dd..f2ac655d80 100644 --- a/base/src/org/eevolution/process/RollupBillOfMaterial.java +++ b/base/src/org/eevolution/process/RollupBillOfMaterial.java @@ -59,24 +59,22 @@ public class RollupBillOfMaterial extends SvrProcess */ protected void prepare() { - ProcessInfoParameter[] para = getParameter(); - - for (int i = 0; i < para.length; i++) + for (ProcessInfoParameter para : getParameter()) { - String name = para[i].getParameterName(); + String name = para.getParameterName(); - if (para[i].getParameter() == null) + if (para.getParameter() == null) ; else if (name.equals("AD_Org_ID")) - p_AD_Org_ID = para[i].getParameterAsInt(); + p_AD_Org_ID = para.getParameterAsInt(); else if (name.equals(MAcctSchema.COLUMNNAME_C_AcctSchema_ID)) - p_C_AcctSchema_ID = para[i].getParameterAsInt(); + p_C_AcctSchema_ID = para.getParameterAsInt(); else if (name.equals(MCostType.COLUMNNAME_M_CostType_ID)) - p_M_CostType_ID = para[i].getParameterAsInt(); + p_M_CostType_ID = para.getParameterAsInt(); else if (name.equals(MProduct.COLUMNNAME_M_Product_ID)) - p_M_Product_ID = para[i].getParameterAsInt(); + p_M_Product_ID = para.getParameterAsInt(); else if (name.equals(MProduct.COLUMNNAME_M_Product_Category_ID)) - p_M_Product_Category_ID = para[i].getParameterAsInt(); + p_M_Product_Category_ID = para.getParameterAsInt(); else log.log(Level.SEVERE,"prepare - Unknown Parameter: " + name); } @@ -92,7 +90,7 @@ public class RollupBillOfMaterial extends SvrProcess int maxLowLevel = MPPMRP.getMaxLowLevel(getCtx(), get_TrxName()); // Cost Roll-up for all levels for (int lowLevel = maxLowLevel; lowLevel >= 0; lowLevel--) - { + { for (MProduct product : getProducts(lowLevel)) { for (MCost cost : getCosts(product.get_ID()))