From d7379218fbeb0975e4e054459c4e978376346d2f Mon Sep 17 00:00:00 2001 From: hodianto Date: Fri, 21 Sep 2018 14:48:53 +0700 Subject: [PATCH] [EDII] : For EDII --HG-- branch : EDII --- .../META-INF/MANIFEST.MF | 3 +- .../callout/MID_CalloutInventoryLine.java | 32 ++ .../midsuit/factory/MID_CalloutFactory.java | 4 + .../midsuit/factory/MID_ModelFactory.java | 2 + .../midsuit/factory/MID_ValidatorFactory.java | 20 +- .../midsuit/model/I_ps_ppoline.java | 225 +++++++++++++ .../src/andromedia/midsuit/model/MID_PPO.java | 135 +++++++- .../andromedia/midsuit/model/MID_PPOLine.java | 25 ++ .../midsuit/model/X_ps_ppoline.java | 303 ++++++++++++++++++ .../process/MID_InventoryLineCreate.java | 62 ++++ .../midsuit/process/MID_ProductionCreate.java | 87 +++++ .../validator/MID_InventoryLineValidator.java | 47 +++ .../validator/MID_InventoryValidator.java | 73 +++++ .../validator/MID_InvoiceValidator.java | 1 + .../midsuit/callout/EDI_CalloutOrderLine.java | 22 +- .../midsuit/factory/MID_ValidatorFactory.java | 10 +- .../validator/EDI_OrderLineValidator.java | 51 +++ .../midsuit/validator/EDI_OrderValidator.java | 35 +- 18 files changed, 1103 insertions(+), 34 deletions(-) create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/callout/MID_CalloutInventoryLine.java create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/model/I_ps_ppoline.java create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPOLine.java create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/model/X_ps_ppoline.java create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/process/MID_InventoryLineCreate.java create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/process/MID_ProductionCreate.java create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryLineValidator.java create mode 100644 andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryValidator.java create mode 100644 edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderLineValidator.java diff --git a/andromeida.midsuit.project/META-INF/MANIFEST.MF b/andromeida.midsuit.project/META-INF/MANIFEST.MF index 373b858..c1f1cdd 100644 --- a/andromeida.midsuit.project/META-INF/MANIFEST.MF +++ b/andromeida.midsuit.project/META-INF/MANIFEST.MF @@ -17,4 +17,5 @@ Service-Component: OSGI-INF/MID_ProcessFactory.xml,OSGI-INF/MID_ModelFactory.xml OSGI-INF/MID_DocFactory.xml Import-Package: org.compiere.apps, org.compiere.grid, - org.compiere.minigrid + org.compiere.minigrid, + org.compiere.process diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/callout/MID_CalloutInventoryLine.java b/andromeida.midsuit.project/src/andromedia/midsuit/callout/MID_CalloutInventoryLine.java new file mode 100644 index 0000000..10b68d1 --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/callout/MID_CalloutInventoryLine.java @@ -0,0 +1,32 @@ +package andromedia.midsuit.callout; + +import java.math.BigDecimal; +import java.util.Properties; + +import org.adempiere.base.IColumnCallout; +import org.compiere.model.CalloutEngine; +import org.compiere.model.GridField; +import org.compiere.model.GridTab; +import org.compiere.model.X_M_InventoryLine; + +public class MID_CalloutInventoryLine extends CalloutEngine implements IColumnCallout { + + @Override + public String start(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value, Object oldValue) { + if (mField.getColumnName().equals("QtyEntered")) + return setInternalUseQty(ctx, WindowNo, mTab, mField, value, oldValue); + return null; + } + + public String setInternalUseQty(Properties ctx, int WindowNo, GridTab mTab, GridField mField, Object value, + Object oldValue) { + if (value == null) { + return ""; + } + + BigDecimal retValue = (BigDecimal) value; + mTab.setValue(X_M_InventoryLine.COLUMNNAME_QtyInternalUse, retValue); + return ""; + } + +} diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_CalloutFactory.java b/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_CalloutFactory.java index 4dd8915..15f6f38 100644 --- a/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_CalloutFactory.java +++ b/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_CalloutFactory.java @@ -7,6 +7,7 @@ import org.adempiere.base.IColumnCallout; import org.adempiere.base.IColumnCalloutFactory; import org.compiere.model.MInOut; import org.compiere.model.MInOutLine; +import org.compiere.model.MInventoryLine; import org.compiere.model.MOrder; import org.compiere.model.MProduction; import org.compiere.model.MProductionLine; @@ -14,6 +15,7 @@ import org.compiere.model.MProductionLine; import andromedia.midsuit.callout.MID_CalloutAnalysisQC; import andromedia.midsuit.callout.MID_CalloutInOut; import andromedia.midsuit.callout.MID_CalloutInOutLine; +import andromedia.midsuit.callout.MID_CalloutInventoryLine; import andromedia.midsuit.callout.MID_CalloutOrder; import andromedia.midsuit.callout.MID_CalloutProduction; import andromedia.midsuit.callout.MID_CalloutProductionLine; @@ -41,6 +43,8 @@ public class MID_CalloutFactory implements IColumnCalloutFactory{ list.add(new MID_CalloutInOut()); if(tableName.equals(MInOutLine.Table_Name)) list.add(new MID_CalloutInOutLine()); + if(tableName.equals(MInventoryLine.Table_Name)) + list.add(new MID_CalloutInventoryLine()); return list != null ? list.toArray(new IColumnCallout[0]) : new IColumnCallout[0]; } diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ModelFactory.java b/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ModelFactory.java index 30e4b4c..8499af8 100644 --- a/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ModelFactory.java +++ b/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ModelFactory.java @@ -21,6 +21,7 @@ import andromedia.midsuit.model.MID_MProductionConfirm; import andromedia.midsuit.model.MID_MRequisitionTrx; import andromedia.midsuit.model.MID_MRequisitionTrxLine; import andromedia.midsuit.model.MID_PPO; +import andromedia.midsuit.model.MID_PPOLine; import andromedia.midsuit.model.X_zpos_Cashier; public class MID_ModelFactory implements IModelFactory{ @@ -40,6 +41,7 @@ public class MID_ModelFactory implements IModelFactory{ mapTableModels.put(MID_AnalysisLine.Table_Name, "andromedia.midsuit.model.MID_AnalysisLine"); mapTableModels.put(MID_MDDOrder.Table_Name, "andromedia.midsuit.model.MID_MDDOrder"); mapTableModels.put(MID_MDDOrderLine.Table_Name, "andromedia.midsuit.model.MID_MDDOrderLine"); + mapTableModels.put(MID_PPOLine.Table_Name, "andromedia.midsuit.model.MID_PPOLine"); } @Override diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ValidatorFactory.java b/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ValidatorFactory.java index 64450bc..ea693d4 100644 --- a/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ValidatorFactory.java +++ b/andromeida.midsuit.project/src/andromedia/midsuit/factory/MID_ValidatorFactory.java @@ -4,6 +4,8 @@ import org.adempiere.base.event.AbstractEventHandler; import org.adempiere.base.event.IEventTopics; import org.adempiere.exceptions.AdempiereException; import org.compiere.model.MInOut; +import org.compiere.model.MInventory; +import org.compiere.model.MInventoryLine; import org.compiere.model.MOrder; import org.compiere.model.MPaymentAllocate; import org.compiere.model.MPriceList; @@ -13,6 +15,9 @@ import org.compiere.model.PO; import org.compiere.util.CLogger; import org.osgi.service.event.Event; +import andromedia.midsuit.validator.MID_InventoryLineValidator; +import andromedia.midsuit.validator.MID_InventoryValidator; + public class MID_ValidatorFactory extends AbstractEventHandler { public CLogger log = CLogger.getCLogger(MID_ValidatorFactory.class); @@ -35,8 +40,11 @@ public class MID_ValidatorFactory extends AbstractEventHandler { // msg = MID_PaymentAllocateValidator.executeEvent(event, getPO(event)); // if(getPO(event).get_TableName().equals(MProductPrice.Table_Name)) // msg = MID_ProductPriceValidator.executeEvent(event, getPO(event)); -// if(getPO(event).get_TableName().equals(MPriceList.Table_Name)) -// msg = MID_PriceListValidator.executeEvent(event, getPO(event)); + if(getPO(event).get_TableName().equals(MInventoryLine.Table_Name)) + msg = MID_InventoryLineValidator.executeEvent(event, getPO(event)); + if(getPO(event).get_TableName().equals(MInventory.Table_Name)) + msg = MID_InventoryValidator.executeEvent(event, getPO(event)); + logEvent(event, getPO(event), msg); } @@ -68,6 +76,14 @@ public class MID_ValidatorFactory extends AbstractEventHandler { registerTableEvent(IEventTopics.PO_AFTER_CHANGE,MProductPrice.Table_Name); registerTableEvent(IEventTopics.PO_BEFORE_NEW,MPriceList.Table_Name); + + registerTableEvent(IEventTopics.PO_BEFORE_NEW, MInventoryLine.Table_Name); + registerTableEvent(IEventTopics.PO_BEFORE_CHANGE, MInventoryLine.Table_Name); + + registerTableEvent(IEventTopics.DOC_BEFORE_COMPLETE, MInventory.Table_Name); + registerTableEvent(IEventTopics.DOC_BEFORE_PREPARE, MInventory.Table_Name); + registerTableEvent(IEventTopics.DOC_BEFORE_REVERSEACCRUAL,MInventory.Table_Name); + registerTableEvent(IEventTopics.DOC_BEFORE_REVERSECORRECT,MInventory.Table_Name); // registerTableEvent(IEventTopics.PO_AFTER_NEW,MInvoice.Table_Name); } diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/model/I_ps_ppoline.java b/andromeida.midsuit.project/src/andromedia/midsuit/model/I_ps_ppoline.java new file mode 100644 index 0000000..28ef42a --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/model/I_ps_ppoline.java @@ -0,0 +1,225 @@ +/****************************************************************************** + * Product: iDempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2012 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 andromedia.midsuit.model; + +import java.math.BigDecimal; +import java.sql.Timestamp; +import org.compiere.model.*; +import org.compiere.util.KeyNamePair; + +/** Generated Interface for ps_ppoline + * @author iDempiere (generated) + * @version Release 5.1 + */ +@SuppressWarnings("all") +public interface I_ps_ppoline +{ + + /** TableName=ps_ppoline */ + public static final String Table_Name = "ps_ppoline"; + + /** AD_Table_ID=30103 */ + public static final int Table_ID = 30103; + + KeyNamePair Model = new KeyNamePair(Table_ID, Table_Name); + + /** AccessLevel = 3 - Client - Org + */ + BigDecimal accessLevel = BigDecimal.valueOf(3); + + /** Load Meta Data */ + + /** Column name AD_Client_ID */ + public static final String COLUMNNAME_AD_Client_ID = "AD_Client_ID"; + + /** Get Client. + * Client/Tenant for this installation. + */ + public int getAD_Client_ID(); + + /** Column name AD_Org_ID */ + public static final String COLUMNNAME_AD_Org_ID = "AD_Org_ID"; + + /** Set Organization. + * Organizational entity within client + */ + public void setAD_Org_ID (int AD_Org_ID); + + /** Get Organization. + * Organizational entity within client + */ + public int getAD_Org_ID(); + + /** Column name Created */ + public static final String COLUMNNAME_Created = "Created"; + + /** Get Created. + * Date this record was created + */ + public Timestamp getCreated(); + + /** Column name CreatedBy */ + public static final String COLUMNNAME_CreatedBy = "CreatedBy"; + + /** Get Created By. + * User who created this records + */ + public int getCreatedBy(); + + /** Column name Description */ + public static final String COLUMNNAME_Description = "Description"; + + /** Set Description. + * Optional short description of the record + */ + public void setDescription (String Description); + + /** Get Description. + * Optional short description of the record + */ + public String getDescription(); + + /** Column name IsActive */ + public static final String COLUMNNAME_IsActive = "IsActive"; + + /** Set Active. + * The record is active in the system + */ + public void setIsActive (boolean IsActive); + + /** Get Active. + * The record is active in the system + */ + public boolean isActive(); + + /** Column name IsEndProduct */ + public static final String COLUMNNAME_IsEndProduct = "IsEndProduct"; + + /** Set End Product. + * End Product of production + */ + public void setIsEndProduct (boolean IsEndProduct); + + /** Get End Product. + * End Product of production + */ + public boolean isEndProduct(); + + /** Column name M_Inventory_Issue_ID */ + public static final String COLUMNNAME_M_Inventory_Issue_ID = "M_Inventory_Issue_ID"; + + /** Set Inventory Issue */ + public void setM_Inventory_Issue_ID (int M_Inventory_Issue_ID); + + /** Get Inventory Issue */ + public int getM_Inventory_Issue_ID(); + + public org.compiere.model.I_M_Inventory getM_Inventory_Issue() throws RuntimeException; + + /** Column name M_Inventory_Receipt_ID */ + public static final String COLUMNNAME_M_Inventory_Receipt_ID = "M_Inventory_Receipt_ID"; + + /** Set Inventory Receipt */ + public void setM_Inventory_Receipt_ID (int M_Inventory_Receipt_ID); + + /** Get Inventory Receipt */ + public int getM_Inventory_Receipt_ID(); + + public org.compiere.model.I_M_Inventory getM_Inventory_Receipt() throws RuntimeException; + + /** Column name M_Product_ID */ + public static final String COLUMNNAME_M_Product_ID = "M_Product_ID"; + + /** Set Product. + * Product, Service, Item + */ + public void setM_Product_ID (int M_Product_ID); + + /** Get Product. + * Product, Service, Item + */ + public int getM_Product_ID(); + + public org.compiere.model.I_M_Product getM_Product() throws RuntimeException; + + /** Column name Processed */ + public static final String COLUMNNAME_Processed = "Processed"; + + /** Set Processed. + * The document has been processed + */ + public void setProcessed (boolean Processed); + + /** Get Processed. + * The document has been processed + */ + public boolean isProcessed(); + + /** Column name ps_ppo_ID */ + public static final String COLUMNNAME_ps_ppo_ID = "ps_ppo_ID"; + + /** Set Production Planning Order */ + public void setps_ppo_ID (int ps_ppo_ID); + + /** Get Production Planning Order */ + public int getps_ppo_ID(); + + public I_ps_ppo getps_ppo() throws RuntimeException; + + /** Column name ps_ppoline_ID */ + public static final String COLUMNNAME_ps_ppoline_ID = "ps_ppoline_ID"; + + /** Set PPO Line */ + public void setps_ppoline_ID (int ps_ppoline_ID); + + /** Get PPO Line */ + public int getps_ppoline_ID(); + + /** Column name ps_ppoline_UU */ + public static final String COLUMNNAME_ps_ppoline_UU = "ps_ppoline_UU"; + + /** Set ps_ppoline_UU */ + public void setps_ppoline_UU (String ps_ppoline_UU); + + /** Get ps_ppoline_UU */ + public String getps_ppoline_UU(); + + /** Column name QtyUsed */ + public static final String COLUMNNAME_QtyUsed = "QtyUsed"; + + /** Set Quantity Used */ + public void setQtyUsed (BigDecimal QtyUsed); + + /** Get Quantity Used */ + public BigDecimal getQtyUsed(); + + /** Column name Updated */ + public static final String COLUMNNAME_Updated = "Updated"; + + /** Get Updated. + * Date this record was updated + */ + public Timestamp getUpdated(); + + /** Column name UpdatedBy */ + public static final String COLUMNNAME_UpdatedBy = "UpdatedBy"; + + /** Get Updated By. + * User who updated this records + */ + public int getUpdatedBy(); +} diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPO.java b/andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPO.java index 64c1d69..6f0cc86 100644 --- a/andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPO.java +++ b/andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPO.java @@ -2,14 +2,23 @@ package andromedia.midsuit.model; import java.io.File; import java.math.BigDecimal; +import java.sql.PreparedStatement; import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; import java.util.Properties; import org.adempiere.exceptions.AdempiereException; +import org.compiere.model.MInventory; +import org.compiere.model.MInventoryLine; +import org.compiere.model.Query; import org.compiere.process.DocAction; +import org.compiere.process.DocOptions; import org.compiere.process.DocumentEngine; +import org.compiere.util.DB; +import org.compiere.util.Env; -public class MID_PPO extends X_ps_ppo implements DocAction{ +public class MID_PPO extends X_ps_ppo implements DocAction, DocOptions{ public MID_PPO(Properties ctx, ResultSet rs, String trxName) { super(ctx, rs, trxName); @@ -48,8 +57,30 @@ public class MID_PPO extends X_ps_ppo implements DocAction{ public String prepareIt() { setC_DocType_ID(getC_DocTypeTarget_ID()); - if(getQtyOrdered().signum()==0) - throw new AdempiereException("Qty Ordered = 0"); + List lines = new Query(getCtx(), MID_PPOLine.Table_Name, "ps_ppo_ID =? ", get_TrxName()) + .setParameters(new Object[] { getps_ppo_ID() }) + .setOnlyActiveRecords(true) + .list(); + for(MID_PPOLine line : lines) { + /** + * For EDII Only + */ + if(line.getQtyUsed().signum()==0) + throw new AdempiereException("Qty Ordered = 0"); + } + + int receiptDocType = DB.getSQLValueEx(get_TrxName(), " SELECT C_DocType_ID FROM C_DocType WHERE Name = ? ", new Object[] {"Inventory Receipt"}); + int issueDocType = DB.getSQLValueEx(get_TrxName(), " SELECT C_DocType_ID FROM C_DocType WHERE Name = ? ", new Object[] {"Inventory Issue"}); + int countReceipt = new Query(getCtx(), MInventory.Table_Name, "DocStatus IN (?) AND C_DocType_ID IN (?) AND ps_ppo_ID =?", get_TrxName()) + .setParameters(new Object[] {DocAction.STATUS_Completed, receiptDocType, getps_ppo_ID()}) + .count(); + int countIssue = new Query(getCtx(), MInventory.Table_Name, "DocStatus IN (?) AND C_DocType_ID IN (?) AND ps_ppo_ID =?", get_TrxName()) + .setParameters(new Object[] {DocAction.STATUS_Completed, issueDocType, getps_ppo_ID()}) + .count(); + + if(countReceipt<=0 || countIssue<=0) + throw new AdempiereException("Pastikan ada Inventory Receipt / Issue yang diproses !!!"); + return DocAction.STATUS_InProgress; } @@ -65,6 +96,38 @@ public class MID_PPO extends X_ps_ppo implements DocAction{ @Override public String completeIt() { + /** + * EDII Only + */ + List lines = new Query(getCtx(), MInventoryLine.Table_Name, "M_InventoryLine.ps_ppo_ID =? AND i.DocStatus IN (?)", get_TrxName()) + .addJoinClause(" JOIN M_Inventory i ON i.M_Inventory_ID=M_InventoryLine.M_Inventory_ID ") + .setOnlyActiveRecords(true) + .setParameters(new Object[] { getps_ppo_ID(),DocAction.STATUS_Completed }) + .list(); + DB.executeUpdateEx(" UPDATE PS_PPOLine SET QtyUsed=0 WHERE PS_PPO_ID =? ", new Object[] { getps_ppo_ID() }, get_TrxName() ); + for(MInventoryLine line : lines) { + int PS_PPOLine_ID = line.get_ValueAsInt("ps_ppoline_ID"); + if(PS_PPOLine_ID >0) { + MID_PPOLine ppoLine = new MID_PPOLine(getCtx(), line.get_ValueAsInt("ps_ppoline_ID"), get_TrxName()); + ppoLine.setQtyUsed(ppoLine.getQtyUsed().add((BigDecimal) line.get_Value("QtyEntered"))); + ppoLine.saveEx(); + }else { + int existingPPOLineID = new Query(getCtx(), MID_PPOLine.Table_Name, "M_Product_ID =? AND ps_ppo_ID =?", get_TrxName()) + .setParameters(new Object[] { line.getM_Product_ID(), line.get_ValueAsInt("ps_ppo_ID") }) + .firstId(); + if(existingPPOLineID >0) { + MID_PPOLine ppoLine = new MID_PPOLine(getCtx(), existingPPOLineID, get_TrxName()); + ppoLine.setQtyUsed(ppoLine.getQtyUsed().add((BigDecimal) line.get_Value("QtyEntered"))); + ppoLine.saveEx(); + DB.executeUpdateEx("UPDATE M_InventoryLine SET ps_ppoline_ID =? WHERE M_InventoryLine_ID =?", new Object[] { existingPPOLineID, line.getM_InventoryLine_ID() }, get_TrxName()); + } + else { + int lineNo = DB.getSQLValueEx(get_TrxName(), "SELECT COALESCE(MAX(lineno),0)+10 FROM PS_PPOLine WHERE PS_PPO_ID =?", new Object[] {getps_ppo_ID()}); + int ppoLine = createLines(line.getM_Product_ID(), line.getQtyInternalUse().abs(), line.getQtyInternalUse().signum()<0 ?true:false, lineNo); + DB.executeUpdateEx("UPDATE M_InventoryLine SET ps_ppoline_ID =? WHERE M_InventoryLine_ID =?", new Object[] { ppoLine, line.getM_InventoryLine_ID() }, get_TrxName()); + } + } + } setProcessed(true); return DocAction.STATUS_Completed; } @@ -91,6 +154,9 @@ public class MID_PPO extends X_ps_ppo implements DocAction{ @Override public boolean reActivateIt() { + setDocAction(DocAction.ACTION_Complete); + setDocStatus(DocAction.STATUS_InProgress); + setProcessed(false); return true; } @@ -128,5 +194,68 @@ public class MID_PPO extends X_ps_ppo implements DocAction{ // TODO Auto-generated method stub return 0; } + + public void deleteLines() { + String sql = "DELETE FROM PS_PPOLine WHERE PS_PPO_ID =?"; + DB.executeUpdateEx(sql, new Object[] { getps_ppo_ID() }, get_TrxName()); + } + + public int createLines() { + int retValue = 0; + + createLines(getM_Product_ID(), getQtyOrdered(), true, retValue+1); + retValue++; + + String sql = "SELECT M_ProductBom_ID, BOMQty " + " FROM M_Product_BOM" + + " WHERE M_Product_ID=" + getM_Product_ID() + " AND IsActive='Y' ORDER BY Line"; + + PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName()); + ResultSet rs = null; + try { + rs = pstmt.executeQuery(); + while(rs.next()) { + createLines(rs.getInt(1), rs.getBigDecimal(2), false, retValue+1); + retValue++; + } + } catch (SQLException e) { + log.severe("Failed to create Lines"); + }finally { + DB.close(rs,pstmt); + } + return retValue; + } + + private int createLines(int M_Product_ID, BigDecimal qtyOrdered, boolean isEndProduct, int lineNo) { + MID_PPOLine line = new MID_PPOLine(getCtx(), 0, get_TrxName()); + line.setps_ppo_ID(getps_ppo_ID()); + line.setLineNo(lineNo); + line.setIsEndProduct(isEndProduct); + line.setM_Product_ID(M_Product_ID); + line.setQtyUsed(qtyOrdered); + line.saveEx(); + + return line.get_ID(); + } + + @Override + public int customizeValidActions(String docStatus, Object processing, String orderType, String isSOTrx, + int AD_Table_ID, String[] docAction, String[] options, int index) { + if (options == null) + throw new IllegalArgumentException("Option array parameter is null"); + if (docAction == null) + throw new IllegalArgumentException("Doc action array parameter is null"); + index = 0; + if (docStatus.equals(DocumentEngine.STATUS_Drafted) || docStatus.equals(DocumentEngine.STATUS_Invalid)) { + options[index++] = DocumentEngine.ACTION_Complete; + options[index++] = DocumentEngine.ACTION_Prepare; + options[index++] = DocumentEngine.ACTION_Void; + } else if (docStatus.equals(DocumentEngine.STATUS_Completed)) { + options[index++] = DocumentEngine.ACTION_Close; + options[index++] = DocumentEngine.ACTION_ReActivate; + } else if (docStatus.equals(DocumentEngine.STATUS_InProgress)) + options[index++] = DocumentEngine.ACTION_Complete; + + return index; + } } diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPOLine.java b/andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPOLine.java new file mode 100644 index 0000000..68fde99 --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/model/MID_PPOLine.java @@ -0,0 +1,25 @@ +package andromedia.midsuit.model; + +import java.sql.ResultSet; +import java.util.Properties; + +public class MID_PPOLine extends X_ps_ppoline { + + /** + * + */ + private static final long serialVersionUID = 1982819110671783202L; + + public MID_PPOLine(Properties ctx, int ps_ppoline_ID, String trxName) { + super(ctx, ps_ppoline_ID, trxName); + // TODO Auto-generated constructor stub + } + + public MID_PPOLine(Properties ctx, ResultSet rs, String trxName) { + super(ctx, rs, trxName); + // TODO Auto-generated constructor stub + } + + + +} diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/model/X_ps_ppoline.java b/andromeida.midsuit.project/src/andromedia/midsuit/model/X_ps_ppoline.java new file mode 100644 index 0000000..8e6a6c9 --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/model/X_ps_ppoline.java @@ -0,0 +1,303 @@ +/****************************************************************************** + * Product: iDempiere ERP & CRM Smart Business Solution * + * Copyright (C) 1999-2012 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 * + *****************************************************************************/ +/** Generated Model - DO NOT CHANGE */ +package andromedia.midsuit.model; + +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.util.Properties; +import org.compiere.model.*; +import org.compiere.util.Env; + +/** Generated Model for ps_ppoline + * @author iDempiere (generated) + * @version Release 5.1 - $Id$ */ +public class X_ps_ppoline extends PO implements I_ps_ppoline, I_Persistent +{ + + /** + * + */ + private static final long serialVersionUID = 20180914L; + + /** Standard Constructor */ + public X_ps_ppoline (Properties ctx, int ps_ppoline_ID, String trxName) + { + super (ctx, ps_ppoline_ID, trxName); + /** if (ps_ppoline_ID == 0) + { + } */ + } + + /** Load Constructor */ + public X_ps_ppoline (Properties ctx, ResultSet rs, String trxName) + { + super (ctx, rs, trxName); + } + + /** AccessLevel + * @return 3 - Client - Org + */ + protected int get_AccessLevel() + { + return accessLevel.intValue(); + } + + /** Load Meta Data */ + protected POInfo initPO (Properties ctx) + { + POInfo poi = POInfo.getPOInfo (ctx, Table_ID, get_TrxName()); + return poi; + } + + public String toString() + { + StringBuffer sb = new StringBuffer ("X_ps_ppoline[") + .append(get_ID()).append("]"); + return sb.toString(); + } + + /** Set Description. + @param Description + Optional short description of the record + */ + public void setDescription (String Description) + { + set_Value (COLUMNNAME_Description, Description); + } + + /** Get Description. + @return Optional short description of the record + */ + public String getDescription () + { + return (String)get_Value(COLUMNNAME_Description); + } + + /** Set End Product. + @param IsEndProduct + End Product of production + */ + public void setIsEndProduct (boolean IsEndProduct) + { + set_Value (COLUMNNAME_IsEndProduct, Boolean.valueOf(IsEndProduct)); + } + + /** Get End Product. + @return End Product of production + */ + public boolean isEndProduct () + { + Object oo = get_Value(COLUMNNAME_IsEndProduct); + if (oo != null) + { + if (oo instanceof Boolean) + return ((Boolean)oo).booleanValue(); + return "Y".equals(oo); + } + return false; + } + + public org.compiere.model.I_M_Inventory getM_Inventory_Issue() throws RuntimeException + { + return (org.compiere.model.I_M_Inventory)MTable.get(getCtx(), org.compiere.model.I_M_Inventory.Table_Name) + .getPO(getM_Inventory_Issue_ID(), get_TrxName()); } + + /** Set Inventory Issue. + @param M_Inventory_Issue_ID Inventory Issue */ + public void setM_Inventory_Issue_ID (int M_Inventory_Issue_ID) + { + if (M_Inventory_Issue_ID < 1) + set_Value (COLUMNNAME_M_Inventory_Issue_ID, null); + else + set_Value (COLUMNNAME_M_Inventory_Issue_ID, Integer.valueOf(M_Inventory_Issue_ID)); + } + + /** Get Inventory Issue. + @return Inventory Issue */ + public int getM_Inventory_Issue_ID () + { + Integer ii = (Integer)get_Value(COLUMNNAME_M_Inventory_Issue_ID); + if (ii == null) + return 0; + return ii.intValue(); + } + + public org.compiere.model.I_M_Inventory getM_Inventory_Receipt() throws RuntimeException + { + return (org.compiere.model.I_M_Inventory)MTable.get(getCtx(), org.compiere.model.I_M_Inventory.Table_Name) + .getPO(getM_Inventory_Receipt_ID(), get_TrxName()); } + + /** Set Inventory Receipt. + @param M_Inventory_Receipt_ID Inventory Receipt */ + public void setM_Inventory_Receipt_ID (int M_Inventory_Receipt_ID) + { + if (M_Inventory_Receipt_ID < 1) + set_Value (COLUMNNAME_M_Inventory_Receipt_ID, null); + else + set_Value (COLUMNNAME_M_Inventory_Receipt_ID, Integer.valueOf(M_Inventory_Receipt_ID)); + } + + /** Get Inventory Receipt. + @return Inventory Receipt */ + public int getM_Inventory_Receipt_ID () + { + Integer ii = (Integer)get_Value(COLUMNNAME_M_Inventory_Receipt_ID); + if (ii == null) + return 0; + return ii.intValue(); + } + + public org.compiere.model.I_M_Product getM_Product() throws RuntimeException + { + return (org.compiere.model.I_M_Product)MTable.get(getCtx(), org.compiere.model.I_M_Product.Table_Name) + .getPO(getM_Product_ID(), get_TrxName()); } + + /** Set Product. + @param M_Product_ID + Product, Service, Item + */ + public void setM_Product_ID (int M_Product_ID) + { + if (M_Product_ID < 1) + set_Value (COLUMNNAME_M_Product_ID, null); + else + set_Value (COLUMNNAME_M_Product_ID, Integer.valueOf(M_Product_ID)); + } + + /** Get Product. + @return Product, Service, Item + */ + public int getM_Product_ID () + { + Integer ii = (Integer)get_Value(COLUMNNAME_M_Product_ID); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** Set Processed. + @param Processed + The document has been processed + */ + public void setProcessed (boolean Processed) + { + set_Value (COLUMNNAME_Processed, Boolean.valueOf(Processed)); + } + + /** Get Processed. + @return The document has been processed + */ + public boolean isProcessed () + { + Object oo = get_Value(COLUMNNAME_Processed); + if (oo != null) + { + if (oo instanceof Boolean) + return ((Boolean)oo).booleanValue(); + return "Y".equals(oo); + } + return false; + } + + public I_ps_ppo getps_ppo() throws RuntimeException + { + return (I_ps_ppo)MTable.get(getCtx(), I_ps_ppo.Table_Name) + .getPO(getps_ppo_ID(), get_TrxName()); } + + /** Set Production Planning Order. + @param ps_ppo_ID Production Planning Order */ + public void setps_ppo_ID (int ps_ppo_ID) + { + if (ps_ppo_ID < 1) + set_ValueNoCheck (COLUMNNAME_ps_ppo_ID, null); + else + set_ValueNoCheck (COLUMNNAME_ps_ppo_ID, Integer.valueOf(ps_ppo_ID)); + } + + /** Get Production Planning Order. + @return Production Planning Order */ + public int getps_ppo_ID () + { + Integer ii = (Integer)get_Value(COLUMNNAME_ps_ppo_ID); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** Set PPO Line. + @param ps_ppoline_ID PPO Line */ + public void setps_ppoline_ID (int ps_ppoline_ID) + { + if (ps_ppoline_ID < 1) + set_ValueNoCheck (COLUMNNAME_ps_ppoline_ID, null); + else + set_ValueNoCheck (COLUMNNAME_ps_ppoline_ID, Integer.valueOf(ps_ppoline_ID)); + } + + /** Get PPO Line. + @return PPO Line */ + public int getps_ppoline_ID () + { + Integer ii = (Integer)get_Value(COLUMNNAME_ps_ppoline_ID); + if (ii == null) + return 0; + return ii.intValue(); + } + + /** Set ps_ppoline_UU. + @param ps_ppoline_UU ps_ppoline_UU */ + public void setps_ppoline_UU (String ps_ppoline_UU) + { + set_ValueNoCheck (COLUMNNAME_ps_ppoline_UU, ps_ppoline_UU); + } + + /** Get ps_ppoline_UU. + @return ps_ppoline_UU */ + public String getps_ppoline_UU () + { + return (String)get_Value(COLUMNNAME_ps_ppoline_UU); + } + + /** Set Quantity Used. + @param QtyUsed Quantity Used */ + public void setQtyUsed (BigDecimal QtyUsed) + { + set_Value (COLUMNNAME_QtyUsed, QtyUsed); + } + + /** Get Quantity Used. + @return Quantity Used */ + public BigDecimal getQtyUsed () + { + BigDecimal bd = (BigDecimal)get_Value(COLUMNNAME_QtyUsed); + if (bd == null) + return Env.ZERO; + return bd; + } + + public void setLineNo (int line) { + set_Value("LineNo", line); + } + + public int getLineNo() { + Integer ii = (Integer)get_Value("LineNo"); + if (ii == null) + return 0; + return ii.intValue(); + } +} \ No newline at end of file diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/process/MID_InventoryLineCreate.java b/andromeida.midsuit.project/src/andromedia/midsuit/process/MID_InventoryLineCreate.java new file mode 100644 index 0000000..48e7784 --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/process/MID_InventoryLineCreate.java @@ -0,0 +1,62 @@ +package andromedia.midsuit.process; + +import org.adempiere.exceptions.AdempiereException; +import org.compiere.model.MDocType; +import org.compiere.model.MInventory; +import org.compiere.model.MInventoryLine; +import org.compiere.model.Query; +import org.compiere.process.ProcessInfoParameter; +import org.compiere.process.SvrProcess; + +import andromedia.midsuit.model.MID_PPOLine; +import andromedia.midsuit.model.X_ps_ppoline; + +import java.util.List; +import java.util.logging.Level; + +public class MID_InventoryLineCreate extends SvrProcess{ + MInventory inv = null; + int p_C_Charge_ID = 0; + @Override + protected void prepare() { + ProcessInfoParameter[] para = getParameter(); + for (int i = 0; i < para.length; i++) { + String name = para[i].getParameterName(); + if (para[i].getParameter() == null) + ; + if (para[i].getParameterName().equals("C_Charge_ID")) + p_C_Charge_ID = para[i].getParameterAsInt(); + else + log.log(Level.SEVERE, "Unknown Parameter: " + name); + } + inv = new MInventory(getCtx(), getRecord_ID(), get_TrxName()); + } + + @Override + protected String doIt() throws Exception { + int PS_PPO_ID = inv.get_ValueAsInt("ps_ppo_ID"); + if(PS_PPO_ID == 0) throw new AdempiereException("No Production to be Processed"); + MDocType dt = (MDocType) inv.getC_DocType(); + + String whereClause = "PS_PPO_ID =? AND IsEndProduct=?"; + List lines = new Query(getCtx(), X_ps_ppoline.Table_Name, whereClause, get_TrxName()) + .setOnlyActiveRecords(true) + .setParameters(new Object[] { PS_PPO_ID, dt.get_ValueAsBoolean("IsReceipt") }) + .list(); + + for(MID_PPOLine line : lines) { + MInventoryLine invL = new MInventoryLine(getCtx(), 0, get_TrxName()); + invL.setAD_Org_ID(inv.getAD_Org_ID()); + invL.setM_Inventory_ID(inv.getM_Inventory_ID()); + invL.setM_Product_ID(line.getM_Product_ID()); + invL.setQtyInternalUse(line.getQtyUsed()); + invL.set_ValueOfColumn("ps_ppo_ID", PS_PPO_ID); + invL.setC_Charge_ID(p_C_Charge_ID); + invL.set_ValueOfColumn("ps_ppoline_ID", line.getps_ppoline_ID()); + invL.set_ValueOfColumn("QtyEntered", line.getQtyUsed()); + invL.saveEx(); + } + return ""; + } + +} diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/process/MID_ProductionCreate.java b/andromeida.midsuit.project/src/andromedia/midsuit/process/MID_ProductionCreate.java new file mode 100644 index 0000000..b906c61 --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/process/MID_ProductionCreate.java @@ -0,0 +1,87 @@ +package andromedia.midsuit.process; + +import java.math.BigDecimal; +import java.util.logging.Level; + +import org.compiere.process.ProcessInfoParameter; +import org.compiere.process.SvrProcess; +import org.compiere.util.AdempiereUserError; +import org.compiere.util.DB; + +import andromedia.midsuit.model.MID_PPO; + + +/** + * + * Process to create production lines based on the plans + * defined for a particular production header + * @author Paul Bowden + * + */ +public class MID_ProductionCreate extends SvrProcess { + + MID_PPO ppo = null; + private boolean isRecreate = false; + private BigDecimal qtyProduction = null; + + protected void prepare() { + + ProcessInfoParameter[] para = getParameter(); + for (int i = 0; i < para.length; i++) + { + String name = para[i].getParameterName(); + if ("Recreate".equals(name)) + isRecreate = "Y".equals(para[i].getParameter()); + else if ("ProductionQty".equals(name)) + qtyProduction = (BigDecimal) para[i].getParameter(); + else + log.log(Level.SEVERE, "Unknown Parameter: " + name); + } + + ppo = new MID_PPO(getCtx(), getRecord_ID(), get_TrxName()); + } //prepare + + @Override + protected String doIt() throws Exception { + if (ppo.isProcessed()) + return "Already processed"; + return createLines(); + } + + protected String createLines() throws Exception { + int created = 0; + + isBom(ppo.getM_Product_ID()); + if (!isRecreate && "Y".equalsIgnoreCase(ppo.get_ValueAsString("IsCreated"))) + throw new AdempiereUserError("Production already created."); + + if (qtyProduction != null) + ppo.setQtyOrdered(qtyProduction); + + ppo.deleteLines(); + created = ppo.createLines(); + + if ( created == 0 ) + {return "Failed to create production lines"; } + + + ppo.set_ValueOfColumn("IsCreated", "Y"); + ppo.saveEx(); + StringBuilder msgreturn = new StringBuilder().append(created).append(" production lines were created"); + return msgreturn.toString(); + } + + protected void isBom(int M_Product_ID) throws Exception + { + String bom = DB.getSQLValueString(get_TrxName(), "SELECT isbom FROM M_Product WHERE M_Product_ID = ?", M_Product_ID); + if ("N".compareTo(bom) == 0) + { + throw new AdempiereUserError ("Attempt to create product line for Non Bill Of Materials"); + } + int materials = DB.getSQLValue(get_TrxName(), "SELECT count(M_Product_BOM_ID) FROM M_Product_BOM WHERE M_Product_ID = ?", M_Product_ID); + if (materials == 0) + { + throw new AdempiereUserError ("Attempt to create product line for Bill Of Materials with no BOM Products"); + } + } +} diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryLineValidator.java b/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryLineValidator.java new file mode 100644 index 0000000..958a780 --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryLineValidator.java @@ -0,0 +1,47 @@ +package andromedia.midsuit.validator; + +import org.adempiere.base.event.IEventTopics; +import org.compiere.model.MInventoryLine; +import org.compiere.model.PO; +import org.osgi.service.event.Event; + +import andromedia.midsuit.model.MID_PPOLine; + +public class MID_InventoryLineValidator { + public static String executeEvent(Event e, PO po) { + MInventoryLine inv = (MInventoryLine) po; + if (e.getTopic().equals(IEventTopics.PO_BEFORE_NEW)) + return beforeSave(inv); + else if (e.getTopic().equals(IEventTopics.PO_BEFORE_CHANGE)) + return beforeChange(inv); + + return ""; + } + private static String beforeChange(MInventoryLine inv) { + int PS_PPOLine_ID = inv.get_ValueAsInt("ps_ppoline_ID"); + if(! inv.is_ValueChanged("QtyEntered")) return ""; + if(PS_PPOLine_ID>0 ) { + MID_PPOLine line = new MID_PPOLine(inv.getCtx(), PS_PPOLine_ID,inv.get_TrxName()); + if(line.isEndProduct() && inv.getQtyInternalUse().signum()>0) + inv.setQtyInternalUse(inv.getQtyInternalUse().negate()); + } + else if (inv.getM_Product().getM_Product_Category().getValue().contains("SCRAP")) { + if(inv.getQtyInternalUse().signum()>0) + inv.setQtyInternalUse(inv.getQtyInternalUse().negate()); + } + return ""; + } + + private static String beforeSave(MInventoryLine inv){ + int PS_PPOLine_ID = inv.get_ValueAsInt("ps_ppoline_ID"); + if(PS_PPOLine_ID>0) { + MID_PPOLine line = new MID_PPOLine(inv.getCtx(), PS_PPOLine_ID,inv.get_TrxName()); + if(line.isEndProduct() && inv.getQtyInternalUse().signum()>0) + inv.setQtyInternalUse(inv.getQtyInternalUse().negate()); + }else if (inv.getM_Product().getM_Product_Category().getValue().contains("SCRAP")) { + if(inv.getQtyInternalUse().signum()>0) + inv.setQtyInternalUse(inv.getQtyInternalUse().negate()); + } + return ""; + } +} diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryValidator.java b/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryValidator.java new file mode 100644 index 0000000..9c5f57a --- /dev/null +++ b/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InventoryValidator.java @@ -0,0 +1,73 @@ +package andromedia.midsuit.validator; + +import org.adempiere.base.event.IEventTopics; +import org.adempiere.exceptions.AdempiereException; +import org.compiere.model.MInventory; +import org.compiere.model.MInventoryLine; +import org.compiere.model.PO; +import org.compiere.model.X_M_Inventory; +import org.compiere.process.DocAction; +import org.compiere.util.DB; +import org.osgi.service.event.Event; + +public class MID_InventoryValidator { + public static String executeEvent(Event e, PO po) { + MInventory inv = (MInventory) po; + if (e.getTopic().equals(IEventTopics.DOC_BEFORE_COMPLETE)) + return beforeComplete(inv); + else if (e.getTopic().equals(IEventTopics.DOC_BEFORE_PREPARE)) + return beforePrepare(inv); + else if (e.getTopic().equals(IEventTopics.PO_BEFORE_NEW)) + return beforeNew(inv); + else if (e.getTopic().equals(IEventTopics.PO_BEFORE_CHANGE)) + return beforeChange(inv); + else if (e.getTopic().equals(IEventTopics.DOC_BEFORE_REVERSEACCRUAL) || + e.getTopic().equals(IEventTopics.DOC_BEFORE_REVERSECORRECT)) + return beforeReverse(inv); + return ""; + } + + private static String beforeReverse(MInventory inv) { + if(inv.getC_DocType().getName().equals("Inventory Receipt") || + inv.getC_DocType().getName().equals("Inventory Issue")) { + String docStatus = DB.getSQLValueStringEx(inv.get_TrxName(), "SELECT DocStatus FROM ps_ppo WHERE ps_ppo_ID =?", new Object[] {inv.get_ValueAsInt("ps_ppo_ID")}); + if(docStatus.equals(DocAction.STATUS_Completed)) + throw new AdempiereException("Production berstatus Completed !!! silahkan di aktifkan terlebih dahulu !!!"); + } + return ""; + } + + private static String beforeChange(MInventory inv) { + if(inv.is_ValueChanged(X_M_Inventory.COLUMNNAME_C_DocType_ID)) { + if(inv.getC_DocType().getName().equals("Inventory Receipt") || + inv.getC_DocType().getName().equals("Inventory Issue")) { + if(inv.get_ValueAsInt("ps_ppo_ID")==0) + throw new AdempiereException("Production Wajib diisi !!!"); + } + } + return ""; + } + + private static String beforeNew(MInventory inv) { + if(inv.getC_DocType().getName().equals("Inventory Receipt") || + inv.getC_DocType().getName().equals("Inventory Issue")) { + if(inv.get_ValueAsInt("ps_ppo_ID")==0) + throw new AdempiereException("Production Wajib diisi !!!"); + } + return ""; + } + + private static String beforePrepare(MInventory inv) { + for(MInventoryLine lines : inv.getLines(false)) { + if(lines.getM_Locator_ID()==0) + throw new AdempiereException("No Locator ON Line "+lines.getLine()); + } + + return ""; + } + private static String beforeComplete(MInventory inv){ + int PS_PPO_ID = inv.get_ValueAsInt("ps_ppo_ID"); + if(PS_PPO_ID==0) return ""; + return ""; + } +} diff --git a/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InvoiceValidator.java b/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InvoiceValidator.java index e7a3fc4..736337a 100644 --- a/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InvoiceValidator.java +++ b/andromeida.midsuit.project/src/andromedia/midsuit/validator/MID_InvoiceValidator.java @@ -1,5 +1,6 @@ /** * USED FOR CAPITA VENTURA ONLY ! + * Author @Hodianto * Invoice UPPER DOCUMENT NO */ diff --git a/edii.midsuit.project/src/edii/midsuit/callout/EDI_CalloutOrderLine.java b/edii.midsuit.project/src/edii/midsuit/callout/EDI_CalloutOrderLine.java index c55fd8a..33830e4 100644 --- a/edii.midsuit.project/src/edii/midsuit/callout/EDI_CalloutOrderLine.java +++ b/edii.midsuit.project/src/edii/midsuit/callout/EDI_CalloutOrderLine.java @@ -7,9 +7,7 @@ import org.compiere.model.CalloutEngine; import org.compiere.model.GridField; import org.compiere.model.GridTab; import org.compiere.model.MOrder; -import org.compiere.model.MProduct; import org.compiere.model.X_C_OrderLine; -import org.compiere.util.DB; public class EDI_CalloutOrderLine extends CalloutEngine implements IColumnCallout { @@ -24,7 +22,7 @@ public class EDI_CalloutOrderLine extends CalloutEngine implements IColumnCallou if(value==null) return null; MOrder Order = new MOrder(ctx, (int) mTab.getValue(X_C_OrderLine.COLUMNNAME_C_Order_ID), null); - MProduct Product = new MProduct(ctx, (int)value, null); +// MProduct Product = new MProduct(ctx, (int)value, null); String retValue = Order.get_ValueAsString("NoAju1") + "/" + Order.get_ValueAsString("NoAju2") + "/" + Order.get_ValueAsString("NoAju3") + "/" @@ -32,15 +30,15 @@ public class EDI_CalloutOrderLine extends CalloutEngine implements IColumnCallou mTab.setValue("NoAju", retValue); - String sqlExec = "SELECT M_AttributeSetInstance_ID " + - " FROM M_Storage S " + - " WHERE M_Product_ID = ? AND " + - " DateMaterialPolicy = (SELECT MIN(DateMaterialPolicy) FROM M_StorageOnHand SOH " + - " WHERE SOH.QtyOnHand>0 AND M_AttributeSetInstance_ID > 0 AND M_Product_ID = S.M_Product_ID)"; - int M_AttributeSetInstance_ID = DB.getSQLValueEx(null, sqlExec, new Object[] { Product.getM_Product_ID() }); - if(M_AttributeSetInstance_ID>0) - mTab.setValue(X_C_OrderLine.COLUMNNAME_M_AttributeSetInstance_ID, M_AttributeSetInstance_ID); - else +// String sqlExec = "SELECT M_AttributeSetInstance_ID " + +// " FROM M_Storage S " + +// " WHERE M_Product_ID = ? AND " + +// " DateMaterialPolicy = (SELECT MIN(DateMaterialPolicy) FROM M_StorageOnHand SOH " + +// " WHERE SOH.QtyOnHand>0 AND M_AttributeSetInstance_ID > 0 AND M_Product_ID = S.M_Product_ID)"; +// int M_AttributeSetInstance_ID = DB.getSQLValueEx(null, sqlExec, new Object[] { Product.getM_Product_ID() }); +// if(M_AttributeSetInstance_ID>0) +// mTab.setValue(X_C_OrderLine.COLUMNNAME_M_AttributeSetInstance_ID, M_AttributeSetInstance_ID); +// else mTab.setValue(X_C_OrderLine.COLUMNNAME_M_AttributeSetInstance_ID, 0); diff --git a/edii.midsuit.project/src/edii/midsuit/factory/MID_ValidatorFactory.java b/edii.midsuit.project/src/edii/midsuit/factory/MID_ValidatorFactory.java index c39b1f9..6d0e3e3 100644 --- a/edii.midsuit.project/src/edii/midsuit/factory/MID_ValidatorFactory.java +++ b/edii.midsuit.project/src/edii/midsuit/factory/MID_ValidatorFactory.java @@ -4,12 +4,14 @@ import org.adempiere.base.event.AbstractEventHandler; import org.adempiere.base.event.IEventTopics; import org.adempiere.exceptions.AdempiereException; import org.compiere.model.MOrder; +import org.compiere.model.MOrderLine; import org.compiere.model.MProduction; import org.compiere.model.MProductionLine; import org.compiere.model.PO; import org.compiere.util.CLogger; import org.osgi.service.event.Event; +import edii.midsuit.validator.EDI_OrderLineValidator; import edii.midsuit.validator.EDI_OrderValidator; import edii.midsuit.validator.EDI_ProductionLineValidator; import edii.midsuit.validator.EDI_ProductionValidator; @@ -23,13 +25,15 @@ public class MID_ValidatorFactory extends AbstractEventHandler { String msg = ""; if (getPO(event).get_TableName().equals(MOrder.Table_Name)) msg = EDI_OrderValidator.executeEvent(event, getPO(event)); + if (getPO(event).get_TableName().equals(MOrderLine.Table_Name)) + msg = EDI_OrderLineValidator.executeEvent(event, getPO(event)); if (getPO(event).get_TableName().equals(MProductionLine.Table_Name)) msg = EDI_ProductionLineValidator.executeEvent(event, getPO(event)); if (getPO(event).get_TableName().equals(MProduction.Table_Name)) msg = EDI_ProductionValidator.executeEvent(event, getPO(event)); logEvent(event, getPO(event), msg); } - + private void logEvent(Event event, PO po, String msg) { log.fine("EVENT MANAGER // " + event.getTopic() + " po =" + po + " MESSAGE=" + msg); if (msg.length() > 0) @@ -43,7 +47,9 @@ public class MID_ValidatorFactory extends AbstractEventHandler { registerTableEvent(IEventTopics.PO_BEFORE_CHANGE, MOrder.Table_Name); registerTableEvent(IEventTopics.PO_BEFORE_NEW, MProduction.Table_Name); registerTableEvent(IEventTopics.DOC_BEFORE_COMPLETE, MProduction.Table_Name); - registerTableEvent(IEventTopics.PO_BEFORE_NEW,MProductionLine.Table_Name); + registerTableEvent(IEventTopics.PO_BEFORE_NEW, MProductionLine.Table_Name); + registerTableEvent(IEventTopics.PO_BEFORE_NEW, MOrderLine.Table_Name); + registerTableEvent(IEventTopics.PO_BEFORE_CHANGE, MOrderLine.Table_Name); } } diff --git a/edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderLineValidator.java b/edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderLineValidator.java new file mode 100644 index 0000000..b050752 --- /dev/null +++ b/edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderLineValidator.java @@ -0,0 +1,51 @@ +package edii.midsuit.validator; + +import org.adempiere.base.event.IEventTopics; +import org.compiere.model.MOrder; +import org.compiere.model.MOrderLine; +import org.compiere.model.PO; +import org.compiere.util.DB; +import org.osgi.service.event.Event; + +public class EDI_OrderLineValidator { + public static String executeEvent(Event e, PO po) { + MOrderLine OrderLine = (MOrderLine) po; + MOrder order = new MOrder(OrderLine.getCtx(), OrderLine.getC_Order_ID(), OrderLine.get_TrxName()); + + if (e.getTopic().equals(IEventTopics.PO_BEFORE_NEW)) + return beforeNew(OrderLine, order); + else if (e.getTopic().equals(IEventTopics.PO_BEFORE_CHANGE)) + return beforeChange(OrderLine, order); + return ""; + } + + private static String beforeChange(MOrderLine orderLine, MOrder order) { + if(order.get_ValueAsString("NoAju1").equals("") || order.get_ValueAsString("NoAju2").equals("") + || order.get_ValueAsString("NoAju3").equals("") || order.get_ValueAsString("NoAju4").equals("")) { + orderLine.set_ValueNoCheck("NoAju", ""); + } + else { + String noAju = order.get_ValueAsString("NoAju1")+"/" + + order.get_ValueAsString("NoAju2") + "/" + + order.get_ValueAsString("NoAju3") + "/" + + order.get_ValueAsString("NoAju4"); + orderLine.set_ValueNoCheck("NoAju", noAju); + } + return ""; + } + + public static String beforeNew(MOrderLine line, MOrder order) { + if(order.get_ValueAsString("NoAju1").equals("") || order.get_ValueAsString("NoAju2").equals("") + || order.get_ValueAsString("NoAju3").equals("") || order.get_ValueAsString("NoAju4").equals("")) { + line.set_ValueOfColumn("NoAju", ""); + } + else if(line.get_ValueAsString("NoAju").equals("")) { + String noAju = order.get_ValueAsString("NoAju1")+"/" + + order.get_ValueAsString("NoAju2") + "/" + + order.get_ValueAsString("NoAju3") + "/" + + order.get_ValueAsString("NoAju4"); + line.set_ValueNoCheck("NoAju", noAju); + } + return ""; + } +} diff --git a/edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderValidator.java b/edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderValidator.java index 5be5a7c..5221670 100644 --- a/edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderValidator.java +++ b/edii.midsuit.project/src/edii/midsuit/validator/EDI_OrderValidator.java @@ -50,23 +50,30 @@ public class EDI_OrderValidator { if(line.getM_Product().getM_AttributeSet_ID()==0) throw new AdempiereException("Product "+line.getM_Product().getName()+" tidak memiliki attribute set !!!"); - int M_AttributeSetInstance_ID = new Query(Order.getCtx(), X_M_AttributeSetInstance.Table_Name - , "M_AttributeSet_ID =? AND Lot =?", Order.get_TrxName()) - .setParameters(new Object[] { line.getM_Product().getM_AttributeSet_ID(), noAju }) - .firstId(); - - if(M_AttributeSetInstance_ID==-1) { - MAttributeSetInstance ASI = new MAttributeSetInstance(Order.getCtx(), 0, Order.get_TrxName()); - ASI.setLot(noAju); - ASI.setM_AttributeSet_ID(line.getM_Product().getM_AttributeSet_ID()); - ASI.setDescription(noAju); + if(line.getM_AttributeSetInstance_ID()>0) { + MAttributeSetInstance ASI = new MAttributeSetInstance(Order.getCtx(), line.getM_AttributeSetInstance_ID(), Order.get_TrxName()); + ASI.setSerNo(line.get_ValueAsString("NoAju")); + ASI.setDescription(); ASI.saveEx(); - - M_AttributeSetInstance_ID = ASI.getM_AttributeSetInstance_ID(); } - line.setM_AttributeSetInstance_ID(M_AttributeSetInstance_ID); - line.saveEx(); +// int M_AttributeSetInstance_ID = new Query(Order.getCtx(), X_M_AttributeSetInstance.Table_Name +// , "M_AttributeSet_ID =? AND Lot =?", Order.get_TrxName()) +// .setParameters(new Object[] { line.getM_Product().getM_AttributeSet_ID(), noAju }) +// .firstId(); + +// if(M_AttributeSetInstance_ID==-1) { +// MAttributeSetInstance ASI = new MAttributeSetInstance(Order.getCtx(), 0, Order.get_TrxName()); +// ASI.setSerNo(noAju); +// ASI.setM_AttributeSet_ID(line.getM_Product().getM_AttributeSet_ID()); +// ASI.setDescription(noAju); +// ASI.saveEx(); +// +// M_AttributeSetInstance_ID = ASI.getM_AttributeSetInstance_ID(); +// } +// +// line.setM_AttributeSetInstance_ID(M_AttributeSetInstance_ID); +// line.saveEx(); } return ""; }