[ 2097563 ] Compatibility with old functionality the production
http://sourceforge.net/tracker/index.php?func=detail&aid=2097563&group_id=176962&atid=879332
This commit is contained in:
parent
505c7bd4ca
commit
5b750b1abe
|
@ -1,6 +1,5 @@
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Product: Adempiere ERP & CRM Smart Business Solution *
|
* Product: Adempiere ERP & CRM Smart Business Solution *
|
||||||
* Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. *
|
|
||||||
* This program is free software; you can redistribute it and/or modify it *
|
* 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 *
|
* 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 *
|
* by the Free Software Foundation. This program is distributed in the hope *
|
||||||
|
@ -11,25 +10,35 @@
|
||||||
* with this program; if not, write to the Free Software Foundation, Inc., *
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||||
* For the text or an alternative of this public license, you may reach us *
|
* 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 *
|
* Copyright (C) 2003-2007 e-Evolution,SC. All Rights Reserved. *
|
||||||
* or via info@compiere.org or http://www.compiere.org/license.html *
|
* Contributor(s): Victor Perez www.e-evolution.com *
|
||||||
* Portions created by Layda Salas are Copyright (C) 2005 QSS Ltda.
|
|
||||||
* Contributor(s): Layda Salas (globalqss)
|
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
package org.compiere.process;
|
package org.compiere.process;
|
||||||
|
|
||||||
import java.sql.*;
|
import java.math.BigDecimal;
|
||||||
import java.util.logging.*;
|
import java.sql.Timestamp;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.compiere.model.MLocator;
|
||||||
|
import org.compiere.model.MProduct;
|
||||||
import org.compiere.model.MSequence;
|
import org.compiere.model.MSequence;
|
||||||
import org.compiere.util.*;
|
import org.compiere.model.MStorage;
|
||||||
|
import org.compiere.model.MTransaction;
|
||||||
|
import org.compiere.model.Query;
|
||||||
|
import org.compiere.model.X_M_Production;
|
||||||
|
import org.compiere.model.X_M_ProductionLine;
|
||||||
|
import org.compiere.model.X_M_ProductionPlan;
|
||||||
|
import org.compiere.util.AdempiereUserError;
|
||||||
|
import org.compiere.util.DB;
|
||||||
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Msg;
|
||||||
|
import org.eevolution.model.MPPProductBOM;
|
||||||
|
import org.eevolution.model.MPPProductBOMLine;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Copy and overwrite Accounts to products of this category
|
* @author victor.perez@e-evolution.com
|
||||||
*
|
|
||||||
* @author Layda Salas (globalqss)
|
|
||||||
* @version $Id: M_Production_Run,v 1.0 2005/10/09 22:19:00 globalqss Exp $
|
|
||||||
*/
|
*/
|
||||||
public class M_Production_Run extends SvrProcess {
|
public class M_Production_Run extends SvrProcess {
|
||||||
|
|
||||||
|
@ -38,6 +47,8 @@ public class M_Production_Run extends SvrProcess {
|
||||||
|
|
||||||
private String mustBeStocked;
|
private String mustBeStocked;
|
||||||
|
|
||||||
|
private int m_level = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare - e.g., get Parameters.
|
* Prepare - e.g., get Parameters.
|
||||||
*/
|
*/
|
||||||
|
@ -62,442 +73,165 @@ public class M_Production_Run extends SvrProcess {
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
|
|
||||||
protected String doIt() throws Exception {
|
protected String doIt() throws Exception
|
||||||
String sql;
|
{
|
||||||
String sqlupd;
|
|
||||||
String sqlins;
|
|
||||||
String sqldel;
|
|
||||||
int cntu = 0;
|
|
||||||
int cntd = 0;
|
|
||||||
int cnti = 0;
|
|
||||||
int totu = 0;
|
|
||||||
int toti = 0;
|
|
||||||
int totd = 0;
|
|
||||||
int nextNo;
|
|
||||||
boolean isCreated = false;
|
|
||||||
boolean processed = false;
|
|
||||||
int ad_Client_ID = 0;
|
|
||||||
int ad_Org_ID = 0;
|
|
||||||
|
|
||||||
log.info("Search fields in M_Production");
|
log.info("Search fields in M_Production");
|
||||||
|
|
||||||
/**
|
X_M_Production production = new X_M_Production(getCtx(), p_Record_ID, get_TrxName());
|
||||||
* Get Info + Lock
|
|
||||||
*/
|
|
||||||
sql = " SELECT IsCreated " + ", Processed " + ", AD_Client_ID "
|
|
||||||
+ ", AD_Org_ID " + " FROM M_Production "
|
|
||||||
+ " WHERE M_Production_ID = " + p_Record_ID;
|
|
||||||
PreparedStatement pstmt = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet rs = pstmt.executeQuery();
|
|
||||||
while (rs.next()) {
|
|
||||||
isCreated = rs.getString("IsCreated").equals("Y");
|
|
||||||
processed = rs.getString("Processed").equals("Y");
|
|
||||||
ad_Client_ID = rs.getInt("AD_Client_ID");
|
|
||||||
ad_Org_ID = rs.getInt("AD_Org_ID");
|
|
||||||
}
|
|
||||||
rs.close();
|
|
||||||
pstmt.close();
|
|
||||||
pstmt = null;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* No Action
|
* No Action
|
||||||
*/
|
*/
|
||||||
if (processed) {
|
if (production.isProcessed())
|
||||||
|
{
|
||||||
log.info("Already Posted");
|
log.info("Already Posted");
|
||||||
return "@AlreadyPosted@";
|
return "@AlreadyPosted@";
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
String whereClause = "M_Production_ID=? ";
|
||||||
* Create Lines
|
List<X_M_ProductionPlan> lines = new Query(getCtx(), X_M_ProductionPlan.Table_Name , whereClause, get_TrxName())
|
||||||
*/
|
.setParameters(new Object[]{p_Record_ID })
|
||||||
if (!isCreated) {
|
.list();
|
||||||
// For every Production Plan
|
for (X_M_ProductionPlan pp :lines)
|
||||||
sql = "SELECT m_productionplan_id " + " ,ad_client_id "
|
{
|
||||||
+ " ,ad_org_id " + " ,isactive " + " ,created "
|
|
||||||
+ " ,createdby " + " ,updated " + " ,updatedby "
|
|
||||||
+ " ,m_production_id " + " ,line " + " ,m_product_id "
|
|
||||||
+ " ,productionqty " + " ,m_locator_id "
|
|
||||||
+ " ,description " + " ,processed "
|
|
||||||
+ " FROM M_ProductionPlan " + " WHERE M_Production_ID= "
|
|
||||||
+ p_Record_ID + " ORDER BY Line, M_Product_ID";
|
|
||||||
PreparedStatement curpp = null;
|
|
||||||
curpp = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet pp = curpp.executeQuery();
|
|
||||||
while (pp.next()) {
|
|
||||||
// Delete prior lines
|
|
||||||
sqldel = "DELETE M_ProductionLine "
|
|
||||||
+ "WHERE M_ProductionPlan_ID ="
|
|
||||||
+ pp.getInt("M_ProductionPlan_ID");
|
|
||||||
|
|
||||||
cntd = DB.executeUpdate(sqldel, get_TrxName());
|
if (!production.isCreated())
|
||||||
if (cntd == -1)
|
{
|
||||||
raiseError("Deleting Production Line:ERROR", sqldel);
|
|
||||||
totd += cntd;
|
|
||||||
|
|
||||||
// OriginLine
|
|
||||||
int line = 100;
|
int line = 100;
|
||||||
// Getsequenses
|
DB.executeUpdateEx("DELETE M_ProductionLine WHERE M_ProductionPlan_ID = ?", new Object[]{pp.get_ID()},get_TrxName());
|
||||||
nextNo = MSequence.getNextID(ad_Client_ID, "M_ProductionLine",
|
MProduct product = MProduct.get(getCtx(), pp.getM_Product_ID());
|
||||||
get_TrxName());
|
|
||||||
// INSERT IN M_ProductionLine
|
|
||||||
sqlins = "INSERT INTO M_ProductionLine "
|
|
||||||
+ "(M_ProductionLine_ID " + ", M_ProductionPlan_ID"
|
|
||||||
+ ", Line " + ", AD_Client_ID " + ", AD_Org_ID "
|
|
||||||
+ ", IsActive " + ", Created " + ", CreatedBy "
|
|
||||||
+ ", Updated " + ", UpdatedBy " + ", M_Product_ID "
|
|
||||||
+ ", MovementQty " + ", M_Locator_ID "
|
|
||||||
+ ", Description) " + " VALUES ( " + nextNo + ", "
|
|
||||||
+ pp.getInt("M_ProductionPlan_ID") + ", " + line + ", "
|
|
||||||
+ pp.getInt("ad_client_id") + ", "
|
|
||||||
+ pp.getInt("AD_Org_ID") + ", 'Y' " + ", sysdate "
|
|
||||||
+ ", 0 " + ", sysdate " + ", 0 " + ", "
|
|
||||||
+ pp.getInt("M_Product_ID") + ", "
|
|
||||||
+ pp.getInt("ProductionQty") + ", "
|
|
||||||
+ pp.getInt("M_Locator_ID") + ", '"
|
|
||||||
+ pp.getString("Description") + "')";
|
|
||||||
cnti = DB.executeUpdate(sqlins, get_TrxName());
|
|
||||||
if (cnti == -1)
|
|
||||||
raiseError("INSERT IN M_ProductionLine", sqlins);
|
|
||||||
toti += cnti;
|
|
||||||
// Create First Level
|
|
||||||
sql = " SELECT m_product_bom_id, " + "ad_client_id, "
|
|
||||||
+ "ad_org_id, " + "isactive, " + "created, "
|
|
||||||
+ "createdby, " + "updated, " + "updatedby, "
|
|
||||||
+ "line, " + "m_product_id, " + "m_productbom_id, "
|
|
||||||
+ "bomqty, " + "description, " + "bomtype "
|
|
||||||
+ " FROM M_Product_BOM " + " WHERE M_Product_ID="
|
|
||||||
+ pp.getInt("M_product_id") + " ORDER BY Line";
|
|
||||||
PreparedStatement curbom = null;
|
|
||||||
curbom = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet bom = curbom.executeQuery();
|
|
||||||
while (bom.next()) {
|
|
||||||
line = line + 100;
|
|
||||||
nextNo = MSequence.getNextID(pp.getInt("ad_client_id"),
|
|
||||||
"M_ProductionLine", get_TrxName());
|
|
||||||
sqlins = "INSERT INTO M_ProductionLine "
|
|
||||||
+ "(M_ProductionLine_ID, M_ProductionPlan_ID, Line, "
|
|
||||||
+ "AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy, "
|
|
||||||
+ "M_Product_ID, MovementQty, M_Locator_ID) "
|
|
||||||
+ "VALUES "
|
|
||||||
+ "("
|
|
||||||
+ nextNo
|
|
||||||
+ ","
|
|
||||||
+ pp.getInt("M_ProductionPlan_ID")
|
|
||||||
+ ","
|
|
||||||
+ line
|
|
||||||
+ ","
|
|
||||||
+ pp.getInt("AD_Client_ID")
|
|
||||||
+ ","
|
|
||||||
+ pp.getInt("AD_Org_ID")
|
|
||||||
+ ",'Y',SysDate,0,SysDate,0"
|
|
||||||
+ ","
|
|
||||||
+ bom.getInt("M_ProductBOM_ID")
|
|
||||||
+ ","
|
|
||||||
+ (-pp.getInt("ProductionQty") * bom
|
|
||||||
.getInt("BOMQty")) + ","
|
|
||||||
+ pp.getInt("M_Locator_ID") + ")";
|
|
||||||
cnti = DB.executeUpdate(sqlins, get_TrxName());
|
|
||||||
if (cnti == -1)
|
|
||||||
raiseError("INSERT IN M_ProductionLine First Level",
|
|
||||||
sqlins);
|
|
||||||
toti += cnti;
|
|
||||||
}
|
|
||||||
bom.close();
|
|
||||||
curbom.close();
|
|
||||||
curbom = null;
|
|
||||||
|
|
||||||
// While we have BOMs
|
|
||||||
while (true) {
|
|
||||||
// Are there non-stored BOMs to list details?
|
|
||||||
sql = " SELECT COUNT(*) " + " FROM M_ProductionLine pl"
|
|
||||||
+ " , M_Product p "
|
|
||||||
+ " WHERE pl.M_Product_ID=p.M_Product_ID "
|
|
||||||
+ " AND pl.M_ProductionPlan_ID="
|
|
||||||
+ pp.getInt("M_ProductionPlan_ID")
|
|
||||||
+ " AND pl.Line<>100 " // Origin Line
|
|
||||||
+ " AND p.IsBOM='Y' AND " + " p.IsStocked='N'";
|
|
||||||
|
|
||||||
PreparedStatement cntlp = null;
|
|
||||||
cntlp = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet ct = cntlp.executeQuery();
|
|
||||||
int countNo = 0;
|
|
||||||
if (ct.next())
|
|
||||||
countNo = ct.getInt(1);
|
|
||||||
ct.close();
|
|
||||||
cntlp.close();
|
|
||||||
cntlp = null;
|
|
||||||
|
|
||||||
// Nothing to do
|
|
||||||
if (countNo == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Resolve BOMs in ProductLine which are not stocked
|
|
||||||
sql = " SELECT pl.M_ProductionLine_ID, "
|
|
||||||
+ " pl.Line, "
|
|
||||||
+ " pl.M_Product_ID,"
|
|
||||||
+ " pl.MovementQty "
|
|
||||||
+ " FROM M_ProductionLine pl, "
|
|
||||||
+ " M_Product p "
|
|
||||||
+ " WHERE pl.M_ProductionPlan_ID = "
|
|
||||||
+ pp.getInt("M_ProductionPlan_ID")
|
|
||||||
+ " AND pl.M_Product_ID = p.M_Product_ID "
|
|
||||||
+ " AND pl.Line<>100 " // Origin Line
|
|
||||||
+ " AND p.IsBOM='Y' AND p.IsStocked='N' ";
|
|
||||||
PreparedStatement curPLineBOM = null;
|
|
||||||
curPLineBOM = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet pl = curPLineBOM.executeQuery();
|
|
||||||
while (pl.next()) {
|
|
||||||
line = pl.getInt("line");
|
|
||||||
|
|
||||||
// Resolve BOM Line in product line
|
|
||||||
sql = " SELECT m_product_bom_id, " + "ad_client_id, "
|
|
||||||
+ "ad_org_id, " + "isactive, " + "created, "
|
|
||||||
+ "createdby, " + "updated, " + "updatedby, "
|
|
||||||
+ "line, " + "m_product_id, "
|
|
||||||
+ "m_productbom_id, " + "bomqty, "
|
|
||||||
+ "description, " + "bomtype "
|
|
||||||
+ " FROM M_Product_BOM "
|
|
||||||
+ " WHERE M_Product_ID="
|
|
||||||
+ pl.getInt("M_Product_ID") + " ORDER BY Line";
|
|
||||||
PreparedStatement curbom1 = null;
|
|
||||||
curbom1 = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet bom1 = curbom1.executeQuery();
|
|
||||||
while (bom1.next()) {
|
|
||||||
line = line + 10;
|
|
||||||
nextNo = MSequence.getNextID(pp
|
|
||||||
.getInt("ad_client_id"),
|
|
||||||
"M_ProductionLine", get_TrxName());
|
|
||||||
sqlins = " INSERT INTO M_ProductionLine "
|
|
||||||
+ " (M_ProductionLine_ID, M_ProductionPlan_ID, Line, "
|
|
||||||
+ "AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy, "
|
|
||||||
+ " M_Product_ID, MovementQty, M_Locator_ID) "
|
|
||||||
+ " VALUES "
|
|
||||||
+ "("
|
|
||||||
+ nextNo
|
|
||||||
+ ","
|
|
||||||
+ pp.getInt("M_ProductionPlan_ID")
|
|
||||||
+ ","
|
|
||||||
+ line
|
|
||||||
+ ","
|
|
||||||
+ pp.getInt("AD_Client_ID")
|
|
||||||
+ ","
|
|
||||||
+ pp.getInt("AD_Org_ID")
|
|
||||||
+ ",'Y',SysDate,0,SysDate,0"
|
|
||||||
+ ","
|
|
||||||
+ bom1.getInt("M_ProductBOM_ID")
|
|
||||||
+ ","
|
|
||||||
+ (pl.getInt("MovementQty") * bom1
|
|
||||||
.getInt("BOMQty")) + ","
|
|
||||||
+ pp.getInt("M_Locator_ID") + ")";
|
|
||||||
cnti = DB.executeUpdate(sqlins, get_TrxName());
|
|
||||||
if (cnti == -1)
|
|
||||||
raiseError(
|
|
||||||
"INSERT IN M_ProductionLine For Resolve BOM Line in product line",
|
|
||||||
sqlins);
|
|
||||||
toti += cnti;
|
|
||||||
|
|
||||||
}
|
|
||||||
bom1.close();
|
|
||||||
curbom1.close();
|
|
||||||
curbom1 = null;
|
|
||||||
|
|
||||||
//Delete BOM line
|
|
||||||
sqldel = " DELETE M_ProductionLine "
|
|
||||||
+ " WHERE M_ProductionLine_ID= "
|
|
||||||
+ pl.getInt("M_ProductionLine_ID");
|
|
||||||
|
|
||||||
cntd = DB.executeUpdate(sqldel, get_TrxName());
|
|
||||||
if (cntd == -1)
|
|
||||||
raiseError("Delete BOM line", sqldel);
|
|
||||||
totd += cntd;
|
|
||||||
}
|
|
||||||
pl.close();
|
|
||||||
curPLineBOM.close();
|
|
||||||
curPLineBOM = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pp.close();
|
|
||||||
curpp.close();
|
|
||||||
curpp = null;
|
|
||||||
|
|
||||||
// Modifying locator to have sufficient stock
|
|
||||||
// Indicate that it is Created
|
|
||||||
sqlupd = " UPDATE M_Production " + " SET IsCreated='Y' "
|
|
||||||
+ " WHERE M_Production_ID=" + p_Record_ID;
|
|
||||||
cntu = DB.executeUpdate(sqlupd, get_TrxName());
|
|
||||||
if (cntu == -1)
|
|
||||||
raiseError("Modifying locator to have sufficient stock", sqlupd);
|
|
||||||
totu += cntu;
|
|
||||||
|
|
||||||
/*******************************************************************
|
|
||||||
* Post Lines
|
|
||||||
*/
|
|
||||||
} else {
|
|
||||||
|
|
||||||
// All Production Lines
|
|
||||||
sql = " SELECT pl.M_ProductionLine_ID, pl.AD_Client_ID, pl.AD_Org_ID,p.MovementDate, "
|
|
||||||
+ " pl.M_Product_ID, pl.M_AttributeSetInstance_ID, pl.MovementQty,pl.M_Locator_ID "
|
|
||||||
+ " FROM M_Production p, M_ProductionLine pl, M_ProductionPlan pp "
|
|
||||||
+ " WHERE p.M_Production_ID=pp.M_Production_ID "
|
|
||||||
+ " AND pp.M_ProductionPlan_ID=pl.M_ProductionPlan_ID "
|
|
||||||
+ " AND pp.M_Production_ID= "
|
|
||||||
+ p_Record_ID
|
|
||||||
+ " ORDER BY pp.Line, pl.Line";
|
|
||||||
|
|
||||||
PreparedStatement CUR_PL_Post = null;
|
|
||||||
|
|
||||||
CUR_PL_Post = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet pl = CUR_PL_Post.executeQuery();
|
|
||||||
while (pl.next()) {
|
|
||||||
sql = " select bomQtyOnHand (" + pl.getInt("M_Product_ID")
|
|
||||||
+ ", null," + pl.getInt("M_Locator_ID") + ") FROM DUAL";
|
|
||||||
PreparedStatement cnsql = null;
|
|
||||||
cnsql = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet cs = cnsql.executeQuery();
|
|
||||||
int countTo = 0;
|
|
||||||
if (cs.next())
|
|
||||||
countTo = cs.getInt(1);
|
|
||||||
cs.close();
|
|
||||||
cnsql.close();
|
|
||||||
cnsql = null;
|
|
||||||
|
|
||||||
// Check Stock levels for reductions
|
|
||||||
if ((pl.getInt("MovementQty") < 0)
|
|
||||||
&& ((countTo) + pl.getInt("MovementQty") < 0))
|
|
||||||
|
|
||||||
|
X_M_ProductionLine pl = new X_M_ProductionLine(getCtx(), 0 , get_TrxName());
|
||||||
|
pl.setLine(line);
|
||||||
|
pl.setDescription(pp.getDescription());
|
||||||
|
pl.setIsActive(true);
|
||||||
|
pl.setM_Product_ID(pp.getM_Product_ID());
|
||||||
|
pl.setM_Locator_ID(pp.getM_Locator_ID());
|
||||||
|
pl.setM_ProductionPlan_ID(pp.get_ID());
|
||||||
|
pl.setMovementQty(pp.getProductionQty());
|
||||||
|
pl.saveEx();
|
||||||
|
if (explosion(pp, product, pp.getProductionQty() , line) > 0 )
|
||||||
{
|
{
|
||||||
|
production.setIsCreated(true);
|
||||||
DB.rollback(true, get_TrxName());
|
production.saveEx();
|
||||||
|
|
||||||
sql = " SELECT '@NotEnoughStocked@: ' || Name "//INTO
|
|
||||||
// Message
|
|
||||||
+ " FROM M_Product WHERE M_Product_ID="
|
|
||||||
+ pl.getInt("M_Product_ID");
|
|
||||||
PreparedStatement cnMess = null;
|
|
||||||
cnMess = DB.prepareStatement(sql, get_TrxName());
|
|
||||||
ResultSet cm = cnMess.executeQuery();
|
|
||||||
String varmess = null;
|
|
||||||
if (cm.next())
|
|
||||||
varmess = cm.getString(1);
|
|
||||||
cm.close();
|
|
||||||
cnMess.close();
|
|
||||||
cnMess = null;
|
|
||||||
return varmess;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// Adjust Quantity at Location
|
return "Do not exist componets";
|
||||||
sqlupd = " UPDATE M_Storage " + " SET QtyOnHand = QtyOnHand + "
|
|
||||||
+ pl.getInt("MovementQty") + ","
|
|
||||||
+ " Updated = SysDate " + " WHERE M_Locator_ID = "
|
|
||||||
+ pl.getInt("M_Locator_ID")
|
|
||||||
+ " AND M_AttributeSetInstance_ID = COALESCE("
|
|
||||||
+ pl.getInt("M_AttributeSetInstance_ID") + ",0)"
|
|
||||||
+ " AND M_Product_ID =" + pl.getInt("M_Product_ID");
|
|
||||||
cntu = DB.executeUpdate(sqlupd, get_TrxName());
|
|
||||||
if (cntu == -1)
|
|
||||||
raiseError("Adjust Quantity at Location", sqlupd);
|
|
||||||
totu += cntu;
|
|
||||||
|
|
||||||
// Product not on Stock yet
|
|
||||||
if (cntu == 0) {
|
|
||||||
sqlins = "INSERT INTO M_Storage "
|
|
||||||
+ " (M_Product_ID, M_Locator_ID, M_AttributeSetInstance_ID, "
|
|
||||||
+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy, "
|
|
||||||
+ " QtyOnHand, QtyReserved, QtyOrdered) "
|
|
||||||
+ " VALUES " + "(" + pl.getInt("M_Product_ID")
|
|
||||||
+ "," + pl.getInt("M_Locator_ID") + ", COALESCE("
|
|
||||||
+ pl.getInt("M_AttributeSetInstance_ID") + ",0), "
|
|
||||||
+ pl.getInt("AD_Client_ID") + ","
|
|
||||||
+ pl.getInt("AD_Org_ID")
|
|
||||||
+ ", 'Y', SysDate, 0, SysDate, 0, "
|
|
||||||
+ pl.getInt("MovementQty") + ", 0, 0)";
|
|
||||||
cnti = DB.executeUpdate(sqlins, get_TrxName());
|
|
||||||
if (cnti == -1)
|
|
||||||
raiseError(" Product not on Stock yet", sqlins);
|
|
||||||
toti += cnti;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create Transaction Entry
|
|
||||||
nextNo = MSequence.getNextID(pl.getInt("AD_Org_ID"),
|
|
||||||
"M_Transaction", get_TrxName());
|
|
||||||
sqlins = " INSERT INTO M_Transaction"
|
|
||||||
+ " (M_Transaction_ID, M_ProductionLine_ID,"
|
|
||||||
+ " AD_Client_ID, AD_Org_ID, IsActive, Created, CreatedBy, Updated, UpdatedBy,"
|
|
||||||
+ " MovementType, M_Locator_ID, M_Product_ID, M_AttributeSetInstance_ID,"
|
|
||||||
+ " MovementDate, MovementQty)" + " VALUES "
|
|
||||||
+ "(?,?,?,?,'Y',SysDate,0,SysDate,0,"
|
|
||||||
+ "'P+',?,?,COALESCE(?,0)," // not distinguishing
|
|
||||||
// between
|
|
||||||
// assemby/disassembly
|
|
||||||
+ "?,?)";
|
|
||||||
pstmt = DB.prepareStatement(sqlins,
|
|
||||||
ResultSet.TYPE_SCROLL_INSENSITIVE,
|
|
||||||
ResultSet.CONCUR_UPDATABLE, get_TrxName());
|
|
||||||
pstmt.setInt(1, nextNo);
|
|
||||||
pstmt.setInt(2, pl.getInt("M_ProductionLine_ID"));
|
|
||||||
pstmt.setInt(3, pl.getInt("AD_Client_ID"));
|
|
||||||
pstmt.setInt(4, pl.getInt("AD_Org_ID"));
|
|
||||||
pstmt.setInt(5, pl.getInt("M_Locator_ID"));
|
|
||||||
pstmt.setInt(6, pl.getInt("M_Product_ID"));
|
|
||||||
pstmt.setInt(7, pl.getInt("M_AttributeSetInstance_ID"));
|
|
||||||
pstmt.setTimestamp(8, pl.getTimestamp("MovementDate"));
|
|
||||||
pstmt.setDouble(9, pl.getDouble("MovementQty"));
|
|
||||||
cnti = pstmt.executeUpdate();
|
|
||||||
//
|
|
||||||
if (cnti == -1)
|
|
||||||
raiseError("Create Transaction Entry", sqlins);
|
|
||||||
toti += cnti;
|
|
||||||
|
|
||||||
// Update M_ProductionLine
|
|
||||||
sqlupd = " UPDATE M_ProductionLine " + " SET Processed='Y' "
|
|
||||||
+ " WHERE M_ProductionLine_ID="
|
|
||||||
+ pl.getInt("M_ProductionLine_ID");
|
|
||||||
cntu = DB.executeUpdate(sqlupd, get_TrxName());
|
|
||||||
if (cntu == -1)
|
|
||||||
raiseError("Update M_ProductionLine ", sqlupd);
|
|
||||||
totu += cntu;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
pl.close();
|
else
|
||||||
CUR_PL_Post.close();
|
{
|
||||||
CUR_PL_Post = null;
|
whereClause = "M_ProductionPlan_ID= ? ";
|
||||||
|
List<X_M_ProductionLine> production_lines = new Query(getCtx(), X_M_ProductionLine.Table_Name , whereClause, get_TrxName())
|
||||||
|
.setParameters(new Object[]{pp.get_ID()})
|
||||||
|
.list();
|
||||||
|
|
||||||
// Indicate that we are done
|
for (X_M_ProductionLine pline : production_lines)
|
||||||
sqlupd = "UPDATE M_Production " + "SET Processed='Y' "
|
{
|
||||||
+ "WHERE M_Production_ID=" + p_Record_ID;
|
MLocator locator = MLocator.get(getCtx(), pline.getM_Locator_ID());
|
||||||
cntu = DB.executeUpdate(sqlupd, get_TrxName());
|
String MovementType = MTransaction.MOVEMENTTYPE_ProductionPlus;
|
||||||
if (cntu == -1)
|
BigDecimal MovementQty = pline.getMovementQty();
|
||||||
raiseError("Indicate that we are done ", sqlupd);
|
if (MovementQty.signum() == 0)
|
||||||
totu += cntu;
|
continue ;
|
||||||
|
else if(MovementQty.signum() < 0)
|
||||||
|
{
|
||||||
|
BigDecimal QtyAvailable = MStorage.getQtyAvailable(
|
||||||
|
locator.getM_Warehouse_ID(),
|
||||||
|
locator.getM_Locator_ID(),
|
||||||
|
pline.getM_Product_ID(),
|
||||||
|
pline.getM_AttributeSetInstance_ID(),
|
||||||
|
get_TrxName());
|
||||||
|
|
||||||
sqlupd = " UPDATE M_ProductionPlan " + " SET Processed='Y' "
|
if(QtyAvailable.add(MovementQty).signum() < 0)
|
||||||
+ " WHERE M_Production_ID=" + p_Record_ID;
|
{
|
||||||
cntu = DB.executeUpdate(sqlupd, get_TrxName());
|
return Msg.getMsg(getCtx(),"NoQtyAvailable");
|
||||||
if (cntu == -1)
|
}
|
||||||
raiseError(
|
|
||||||
"Update the indicator of Processed in M_ProductionPlan",
|
|
||||||
sqlupd);
|
|
||||||
totu += cntu;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only commit when entire job successful
|
MovementType = MTransaction.MOVEMENTTYPE_Production_;
|
||||||
log.fine("Committing ...");
|
}
|
||||||
DB.commit(true, get_TrxName());
|
|
||||||
|
|
||||||
return "OK";
|
if (!MStorage.add(getCtx(), locator.getM_Warehouse_ID(),
|
||||||
|
locator.getM_Locator_ID(),
|
||||||
|
pline.getM_Product_ID(),
|
||||||
|
pline.getM_AttributeSetInstance_ID(), 0 ,
|
||||||
|
MovementQty,
|
||||||
|
Env.ZERO,
|
||||||
|
Env.ZERO,
|
||||||
|
get_TrxName()))
|
||||||
|
{
|
||||||
|
return "Cannot correct Inventory";
|
||||||
|
}
|
||||||
|
|
||||||
} // del doIt
|
//Create Transaction
|
||||||
|
MTransaction mtrx = new MTransaction (getCtx(), pline.getAD_Org_ID(),
|
||||||
|
MovementType, locator.getM_Locator_ID(),
|
||||||
|
pline.getM_Product_ID(), pline.getM_AttributeSetInstance_ID(),
|
||||||
|
MovementQty, production.getMovementDate(), get_TrxName());
|
||||||
|
mtrx.setM_ProductionLine_ID(pline.get_ID());
|
||||||
|
mtrx.saveEx();
|
||||||
|
|
||||||
|
pline.setProcessed(true);
|
||||||
|
pline.saveEx();
|
||||||
|
} // Production Line
|
||||||
|
|
||||||
|
pp.setProcessed(true);
|
||||||
|
pp.saveEx();
|
||||||
|
|
||||||
|
production.setProcessed(true);
|
||||||
|
production.saveEx();
|
||||||
|
}
|
||||||
|
} // Production Plan
|
||||||
|
|
||||||
|
return "@OK@";
|
||||||
|
|
||||||
private void raiseError(String string, String sql) throws Exception {
|
|
||||||
DB.rollback(false, get_TrxName());
|
|
||||||
String msg = string;
|
|
||||||
ValueNamePair pp = CLogger.retrieveError();
|
|
||||||
if (pp != null)
|
|
||||||
msg = pp.getName() + " - ";
|
|
||||||
msg += sql;
|
|
||||||
throw new AdempiereUserError(msg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Explosion the Production Plan
|
||||||
|
* @param pp
|
||||||
|
* @param product
|
||||||
|
* @param qty
|
||||||
|
* @throws AdempiereUserError
|
||||||
|
*/
|
||||||
|
private int explosion(X_M_ProductionPlan pp , MProduct product , BigDecimal qty , int line) throws AdempiereUserError
|
||||||
|
{
|
||||||
|
MPPProductBOM bom = MPPProductBOM.getDefault(product, get_TrxName());
|
||||||
|
if(bom == null )
|
||||||
|
{
|
||||||
|
throw new AdempiereUserError ("Do not exist default BOM for this product :"
|
||||||
|
+ product.getValue() + "-"
|
||||||
|
+ product.getName());
|
||||||
|
}
|
||||||
|
MPPProductBOMLine[] bom_lines = bom.getLines(new Timestamp (System.currentTimeMillis()));
|
||||||
|
m_level += 1;
|
||||||
|
int components = 0;
|
||||||
|
line = line * m_level;
|
||||||
|
for(MPPProductBOMLine bomline : bom_lines)
|
||||||
|
{
|
||||||
|
MProduct componet = MProduct.get(getCtx(), bomline.getM_Product_ID());
|
||||||
|
|
||||||
|
if(componet.isBOM() && !componet.isStocked())
|
||||||
|
{
|
||||||
|
explosion(pp, componet, bomline.getQtyBOM() , line);
|
||||||
|
}
|
||||||
|
else if(!componet.isBOM() && componet.isStocked())
|
||||||
|
{
|
||||||
|
line += 1;
|
||||||
|
X_M_ProductionLine pl = new X_M_ProductionLine(getCtx(), 0 , get_TrxName());
|
||||||
|
pl.setLine(line);
|
||||||
|
pl.setDescription(bomline.getDescription());
|
||||||
|
pl.setIsActive(true);
|
||||||
|
pl.setM_Product_ID(bomline.getM_Product_ID());
|
||||||
|
pl.setM_Locator_ID(pp.getM_Locator_ID());
|
||||||
|
pl.setM_ProductionPlan_ID(pp.get_ID());
|
||||||
|
pl.setMovementQty(bomline.getQtyBOM().multiply(qty).negate());
|
||||||
|
pl.saveEx();
|
||||||
|
components += 1;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return components;
|
||||||
|
}
|
||||||
} // M_Production_Run
|
} // M_Production_Run
|
||||||
|
|
Loading…
Reference in New Issue