Make To Kit functionality
http://sourceforge.net/tracker2/?func=detail&atid=879335&aid=2501713&group_id=176962 The kit functionality let define a BOM Type of Make To Kit Type when it is combined with BOM Use Manufacturing ADempiere let create a Manufacturing Order from Standard Sales Order this functionality is very similar to Make To Order but with de different that when a Customer Shipment for this Sales Order is completed the Manufacturing Order is close , finish product is receipt and the components are issue automatically.
This commit is contained in:
parent
9e72e117e6
commit
0824224a28
|
@ -35,6 +35,17 @@ import org.compiere.util.Env;
|
|||
*/
|
||||
public class MDocType extends X_C_DocType
|
||||
{
|
||||
/**
|
||||
* Return the first Doc Type for this BaseType
|
||||
* @param DocBaseType
|
||||
* @return
|
||||
*/
|
||||
static public int getDocType(String DocBaseType)
|
||||
{
|
||||
MDocType[] doc = MDocType.getOfDocBaseType(Env.getCtx(), DocBaseType);
|
||||
return doc.length > 0 ? doc[0].get_ID() : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Client Document Type with DocBaseType
|
||||
* @param ctx context
|
||||
|
|
|
@ -176,32 +176,60 @@ public class LiberoValidator implements ModelValidator
|
|||
public String docValidate (PO po, int timing)
|
||||
{
|
||||
log.info(po.get_TableName() + " Timing: "+timing);
|
||||
if(po instanceof MInOut && timing == TIMING_BEFORE_COMPLETE)
|
||||
{
|
||||
MInOut inout = (MInOut)po;
|
||||
if(inout.isSOTrx())
|
||||
{
|
||||
final String whereClause = "C_OrderLine_ID IS NOT NULL AND EXISTS ( SELECT 1 FROM C_OrderLine ol , M_InOutLine iol WHERE ol.C_OrderLine_ID=iol.C_OrderLine_ID AND iol.M_InOut_ID=? )";
|
||||
Collection<MPPOrder> orders = new Query(po.getCtx(), MPPOrder.Table_Name, whereClause, po.get_TrxName())
|
||||
.setParameters(new Object[]{inout.getM_InOut_ID()})
|
||||
.list();
|
||||
for(MPPOrder order : orders)
|
||||
{
|
||||
String description = order.getDescription() != null ? order.getDescription() : ""
|
||||
+ Msg.translate(inout.getCtx(), MInOut.COLUMNNAME_M_InOut_ID)
|
||||
+ " : "
|
||||
+ Msg.translate(inout.getCtx(), MInOut.COLUMNNAME_DocumentNo);
|
||||
|
||||
order.setDescription(description);
|
||||
order.closeIt();
|
||||
order.setDocStatus(MPPOrder.DOCACTION_Close);
|
||||
order.setDocAction(MPPOrder.DOCACTION_None);
|
||||
order.saveEx();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
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<MOrderLine> olines = new Query(po.getCtx(), MOrderLine.Table_Name, whereClause, po.get_TrxName())
|
||||
.setParameters(new Object[]{line.getC_OrderLine_ID()})
|
||||
.list();
|
||||
for (MOrderLine oline : olines)
|
||||
|
||||
for (MInOutLine line : inout.getLines())
|
||||
{
|
||||
if(oline.getQtyOrdered().compareTo(oline.getQtyDelivered()) >= 0)
|
||||
{
|
||||
MPPCostCollector cc = new MPPCostCollector(po.getCtx(), oline.getPP_Cost_Collector_ID(), po.get_TrxName());
|
||||
String docStatus = cc.completeIt();
|
||||
cc.setDocStatus(docStatus);
|
||||
cc.setDocAction(MPPCostCollector.DOCACTION_Close);
|
||||
cc.saveEx();
|
||||
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();
|
||||
final String whereClause = "C_OrderLine_ID=? AND PP_Cost_Collector_ID IS NOT NULL";
|
||||
Collection<MOrderLine> olines = new Query(po.getCtx(), MOrderLine.Table_Name, whereClause, po.get_TrxName())
|
||||
.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());
|
||||
String docStatus = cc.completeIt();
|
||||
cc.setDocStatus(docStatus);
|
||||
cc.setDocAction(MPPCostCollector.DOCACTION_Close);
|
||||
cc.saveEx();
|
||||
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;
|
||||
} // docValidate
|
||||
|
||||
|
|
|
@ -854,7 +854,7 @@ public class MPPCostCollector extends X_PP_Cost_Collector implements DocAction
|
|||
//
|
||||
// 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()))
|
||||
if(!product.isPurchased() || !MProduct.PRODUCTTYPE_Service.equals(product.getProductType()))
|
||||
continue;
|
||||
|
||||
//
|
||||
|
|
|
@ -29,6 +29,7 @@ import org.compiere.model.MLocator;
|
|||
import org.compiere.model.MOrder;
|
||||
import org.compiere.model.MOrderLine;
|
||||
import org.compiere.model.MProduct;
|
||||
import org.compiere.model.MRefList;
|
||||
import org.compiere.model.MRequisition;
|
||||
import org.compiere.model.MRequisitionLine;
|
||||
import org.compiere.model.MResource;
|
||||
|
@ -40,6 +41,7 @@ import org.compiere.process.DocAction;
|
|||
import org.compiere.util.CLogger;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.Msg;
|
||||
import org.compiere.util.TimeUtil;
|
||||
import org.compiere.wf.MWorkflow;
|
||||
|
||||
|
@ -367,10 +369,16 @@ public class MPPMRP extends X_PP_MRP
|
|||
MPPOrder order = MPPOrder.forC_OrderLine_ID(ol.getCtx(), ol.get_ID(), ol.get_TrxName());
|
||||
if (order == null)
|
||||
{
|
||||
final String whereClause = MPPProductBOM.COLUMNNAME_BOMType+"=?"
|
||||
final String whereClause = MPPProductBOM.COLUMNNAME_BOMType+"=? "
|
||||
+" OR "+MPPProductBOM.COLUMNNAME_BOMType+"=? "
|
||||
+" AND "+MPPProductBOM.COLUMNNAME_BOMUse+"=?"
|
||||
+" AND "+MPPProductBOM.COLUMNNAME_M_Product_ID+"=?";
|
||||
MPPProductBOM bom = new Query(ol.getCtx(), MPPProductBOM.Table_Name, whereClause, null)
|
||||
.setParameters(new Object[]{MPPProductBOM.BOMTYPE_Make_To_Order, ol.getM_Product_ID()})
|
||||
.setParameters(new Object[]{
|
||||
MPPProductBOM.BOMTYPE_Make_To_Order,
|
||||
MPPProductBOM.BOMTYPE_Make_To_Kit,
|
||||
MPPProductBOM.BOMUSE_Manufacturing,
|
||||
ol.getM_Product_ID()})
|
||||
.firstOnly();
|
||||
|
||||
MPPProductPlanning pp = null;
|
||||
|
@ -385,6 +393,10 @@ public class MPPMRP extends X_PP_MRP
|
|||
{
|
||||
bom = null;
|
||||
}
|
||||
if(bom != null && !MPPProductBOM.BOMTYPE_Make_To_Kit.equals(bom.getBOMType()))
|
||||
{
|
||||
bom = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bom != null)
|
||||
|
@ -402,7 +414,12 @@ public class MPPMRP extends X_PP_MRP
|
|||
{
|
||||
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 = new MPPOrder(ol.getCtx(), 0 , ol.get_TrxName());
|
||||
order.setDescription( Msg.translate(ol.getCtx(),MRefList.getListName(ol.getCtx(), MPPOrderBOM.BOMTYPE_AD_Reference_ID, bom.getBOMType()))
|
||||
+ " "
|
||||
+ Msg.translate(ol.getCtx(), MOrder.COLUMNNAME_C_Order_ID)
|
||||
+ " : "
|
||||
+ o.getDocumentNo());
|
||||
order.setC_OrderLine_ID(ol.getC_OrderLine_ID());
|
||||
order.setS_Resource_ID(plant_id);
|
||||
order.setM_Warehouse_ID(ol.getM_Warehouse_ID());
|
||||
|
@ -420,7 +437,8 @@ public class MPPMRP extends X_PP_MRP
|
|||
order.setQty(ol.getQtyOrdered());
|
||||
order.setPriorityRule(MPPOrder.PRIORITYRULE_High);
|
||||
order.saveEx();
|
||||
order.prepareIt();
|
||||
order.setDocStatus(order.prepareIt());
|
||||
order.setDocAction(MPPOrder.ACTION_Complete);
|
||||
order.saveEx();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,17 +21,22 @@ import java.math.BigDecimal;
|
|||
import java.math.RoundingMode;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.Timestamp;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Vector;
|
||||
|
||||
import org.adempiere.exceptions.AdempiereException;
|
||||
import org.adempiere.exceptions.DocTypeNotFoundException;
|
||||
import org.compiere.apps.ADialog;
|
||||
import org.compiere.minigrid.IDColumn;
|
||||
import org.compiere.model.MAcctSchema;
|
||||
import org.compiere.model.MClient;
|
||||
import org.compiere.model.MCost;
|
||||
import org.compiere.model.MDocType;
|
||||
import org.compiere.model.MProduct;
|
||||
import org.compiere.model.MProject;
|
||||
import org.compiere.model.MRefList;
|
||||
import org.compiere.model.MResource;
|
||||
import org.compiere.model.MStorage;
|
||||
import org.compiere.model.MTable;
|
||||
|
@ -47,6 +52,8 @@ import org.compiere.process.DocAction;
|
|||
import org.compiere.process.DocumentEngine;
|
||||
import org.compiere.util.DB;
|
||||
import org.compiere.util.Env;
|
||||
import org.compiere.util.KeyNamePair;
|
||||
import org.compiere.util.Msg;
|
||||
import org.compiere.wf.MWFNode;
|
||||
import org.compiere.wf.MWFNodeNext;
|
||||
import org.compiere.wf.MWorkflow;
|
||||
|
@ -58,9 +65,7 @@ import org.compiere.wf.MWorkflow;
|
|||
* Use DocAction and C_DocTypeTarget_ID instead.
|
||||
*
|
||||
* @author Victor Perez www.e-evolution.com
|
||||
* @version $Id: MOrder.java,v 1.57 2004/05/21 02:27:38 vpj-cd Exp $
|
||||
*
|
||||
* @author Teo Sarca, www.arhipac.ro
|
||||
* @author Teo Sarca, www.arhipac.ro
|
||||
*/
|
||||
public class MPPOrder extends X_PP_Order implements DocAction
|
||||
{
|
||||
|
@ -429,9 +434,9 @@ public class MPPOrder extends X_PP_Order implements DocAction
|
|||
M_Locator_ID = MStorage.getM_Locator_ID(getM_Warehouse_ID(), getM_Product_ID(), getM_AttributeSetInstance_ID(), ordered,
|
||||
get_TrxName());
|
||||
// Get default Location
|
||||
if (M_Locator_ID == 0) {
|
||||
MWarehouse wh = MWarehouse.get(getCtx(), getM_Warehouse_ID());
|
||||
M_Locator_ID = wh.getDefaultLocator().getM_Locator_ID();
|
||||
if (M_Locator_ID == 0)
|
||||
{
|
||||
M_Locator_ID = getM_Locator_ID();
|
||||
}
|
||||
//4Layers - Necessary to clear order quantities when called from closeIt
|
||||
if (DOCACTION_Close.equals(getDocAction()))
|
||||
|
@ -604,6 +609,90 @@ public class MPPOrder extends X_PP_Order implements DocAction
|
|||
PP_Order_Cost.saveEx();
|
||||
}
|
||||
}
|
||||
|
||||
MPPOrderBOM obom = (MPPOrderBOM)getMPPOrderBOM();
|
||||
|
||||
// Auto receipt and issue for kit
|
||||
if (MPPOrderBOM.BOMTYPE_Make_To_Kit.equals(obom.getBOMType()) && MPPOrderBOM.BOMUSE_Manufacturing.equals(obom.getBOMUse()))
|
||||
{
|
||||
if(!MPPOrder.DOCSTATUS_Completed.equals(getDocStatus()))
|
||||
throw new AdempiereException( Msg.translate(getCtx(),MRefList.getListName(getCtx(), MPPOrderBOM.BOMTYPE_AD_Reference_ID, MPPOrderBOM.BOMTYPE_Make_To_Kit))
|
||||
+ " "
|
||||
+ Msg.translate(getCtx(), MPPOrder.COLUMNNAME_PP_Order_ID)
|
||||
+" : "
|
||||
+ getDocumentNo()
|
||||
+ " "+Msg.getMsg(getCtx(), "ShipmentCreateDocNotCompleted"));
|
||||
ArrayList[][] issue = new ArrayList[m_lines.length][1];
|
||||
Timestamp today = new Timestamp(System.currentTimeMillis());
|
||||
|
||||
int row = 0;
|
||||
for (int i = 0; i < getLines().length ; i++)
|
||||
{
|
||||
MPPOrderBOMLine line = m_lines[i];
|
||||
IDColumn id = new IDColumn(line.get_ID());
|
||||
|
||||
if(MPPOrderBOMLine.ISSUEMETHOD_Backflush.equals(line.getIssueMethod()))
|
||||
id.setSelected(true);
|
||||
else
|
||||
id.setSelected(false);
|
||||
|
||||
ArrayList<Object> data = new ArrayList<Object>();
|
||||
|
||||
data.add(id); //0 - ASI
|
||||
data.add(line.isCritical()); //1 - Critical
|
||||
MProduct product = (MProduct) line.getM_Product();
|
||||
data.add(product.getValue()); //2 - Value
|
||||
KeyNamePair productKey = new KeyNamePair(product.get_ID(),product.getName());
|
||||
data.add(productKey); //3 - KeyNamePair Product
|
||||
data.add(line.getQtyRequiered()); //4 - QtyToDeliver
|
||||
data.add(Env.ZERO); //5 - QtyScrapComponent
|
||||
issue[i][0] = data;
|
||||
|
||||
}
|
||||
|
||||
boolean isCompleteQtyDeliver = MPPOrder.isAvailableQty(this, issue ,today);
|
||||
if (!isCompleteQtyDeliver)
|
||||
{
|
||||
throw new AdempiereException("@NoQtyAvailable@");
|
||||
}
|
||||
|
||||
for(int i = 0; i < issue.length; i++ )
|
||||
{
|
||||
IDColumn id = (IDColumn) issue[i][0].get(0);
|
||||
Boolean isCritical = (Boolean) issue[i][0].get(1);
|
||||
String value = (String)issue[i][0].get(2);
|
||||
KeyNamePair productkey = (KeyNamePair) issue[i][0].get(3);
|
||||
int M_Product_ID = productkey.getKey();
|
||||
BigDecimal qtyToDeliver = (BigDecimal)issue[i][0].get(4);
|
||||
BigDecimal qtyScrapComponent = (BigDecimal) issue[i][0].get(5);
|
||||
|
||||
MStorage[] storages = MPPOrder.getStorages(
|
||||
M_Product_ID,
|
||||
getM_Warehouse_ID(),
|
||||
0,
|
||||
getM_AttributeSetInstance_ID(),
|
||||
1, today);
|
||||
|
||||
MPPOrder.createIssue(
|
||||
this,
|
||||
id.getRecord_ID(),
|
||||
today, qtyToDeliver,
|
||||
qtyScrapComponent,
|
||||
Env.ZERO,
|
||||
storages,
|
||||
get_TrxName());
|
||||
}
|
||||
MPPOrder.createReceipt(
|
||||
this,
|
||||
today ,
|
||||
this.getQtyDelivered(),
|
||||
this.getQtyOpen(),
|
||||
this.getQtyScrap(),
|
||||
this.getQtyReject(),
|
||||
this.getM_Locator_ID(),
|
||||
this.getM_AttributeSetInstance_ID(), true, get_TrxName());
|
||||
return DocAction.ACTION_None;
|
||||
}
|
||||
|
||||
setProcessed(true);
|
||||
setDocAction(DOCACTION_Close);
|
||||
|
@ -650,31 +739,22 @@ public class MPPOrder extends X_PP_Order implements DocAction
|
|||
public boolean closeIt()
|
||||
{
|
||||
log.info(toString());
|
||||
if(MPPOrder.DOCSTATUS_Closed.equals(getDocStatus()))
|
||||
return true;
|
||||
|
||||
if(!MPPOrder.DOCSTATUS_Completed.equals(this.getDocStatus()))
|
||||
{
|
||||
String DocStatus = completeIt();
|
||||
setDocStatus(DocStatus);
|
||||
setDocAction(MPPOrder.ACTION_Close);
|
||||
}
|
||||
// Before Close
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(this,ModelValidator.TIMING_BEFORE_CLOSE);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
// Close Not delivered Qty - SO/PO
|
||||
MPPOrderBOMLine[] lines = getLines();
|
||||
/*
|
||||
for (int i = 0; i < lines.length; i++)
|
||||
{
|
||||
MPPOrderBOMLine line = lines[i];
|
||||
BigDecimal old = line.getQtyRequiered();
|
||||
if (old.compareTo(line.getQtyDelivered()) != 0)
|
||||
{
|
||||
//line.setQtyLostSales(line.getQtyRequiered().subtract(line.getQtyDelivered()));
|
||||
line.setQtyRequiered(line.getQtyDelivered());
|
||||
// QtyEntered unchanged
|
||||
//line.addDescription("Close (" + old + ")");
|
||||
line.save(get_TrxName());
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
orderStock(); // Clear Ordered Quantities
|
||||
reserveStock(lines); // Clear Reservations
|
||||
reserveStock(getLines()); // Clear Reservations
|
||||
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(this,ModelValidator.TIMING_AFTER_CLOSE);
|
||||
if (m_processMsg != null)
|
||||
|
@ -699,8 +779,14 @@ public class MPPOrder extends X_PP_Order implements DocAction
|
|||
|
||||
public boolean reActivateIt()
|
||||
{
|
||||
log.info("reActivateIt - " + toString());
|
||||
return false;
|
||||
// After reActivate
|
||||
m_processMsg = ModelValidationEngine.get().fireDocValidate(this,ModelValidator.TIMING_AFTER_REACTIVATE);
|
||||
if (m_processMsg != null)
|
||||
return false;
|
||||
|
||||
setDocAction(DOCACTION_Complete);
|
||||
setProcessed(false);
|
||||
return true;
|
||||
} // reActivateIt
|
||||
|
||||
public int getDoc_User_ID()
|
||||
|
@ -951,6 +1037,326 @@ public class MPPOrder extends X_PP_Order implements DocAction
|
|||
} // workflow valid from/to
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Receipt Finish Good
|
||||
* @param pp_order
|
||||
* @param movementDate
|
||||
* @param deliveredQty
|
||||
* @param toDeliverQty
|
||||
* @param scrapQty
|
||||
* @param rejectQty
|
||||
* @param M_Locator_ID
|
||||
* @param M_AttributeSetInstance_ID
|
||||
* @param IsCloseDocument
|
||||
* @param trxName
|
||||
*/
|
||||
static public void createReceipt(MPPOrder pp_order,
|
||||
Timestamp movementDate,
|
||||
BigDecimal deliveredQty,
|
||||
BigDecimal toDeliverQty,
|
||||
BigDecimal scrapQty,
|
||||
BigDecimal rejectQty,
|
||||
int M_Locator_ID,
|
||||
int M_AttributeSetInstance_ID,
|
||||
boolean IsCloseDocument,
|
||||
String trxName)
|
||||
{
|
||||
|
||||
if (toDeliverQty.signum() != 0 || scrapQty.signum() != 0 || rejectQty.signum() != 0)
|
||||
{
|
||||
createCollector(pp_order, pp_order.getM_Product_ID(),
|
||||
M_Locator_ID,
|
||||
M_AttributeSetInstance_ID,
|
||||
movementDate,
|
||||
toDeliverQty, scrapQty, rejectQty,
|
||||
MDocType.getDocType(MDocType.DOCBASETYPE_ManufacturingOrder),
|
||||
0, // PP_Order_BOMLine_ID
|
||||
MPPCostCollector.COSTCOLLECTORTYPE_MaterialReceipt,
|
||||
trxName
|
||||
);
|
||||
}
|
||||
|
||||
if (IsCloseDocument)
|
||||
{
|
||||
pp_order.setDateFinish(movementDate);
|
||||
pp_order.closeIt();
|
||||
pp_order.saveEx();
|
||||
}
|
||||
|
||||
pp_order.setDateDelivered(movementDate);
|
||||
if (pp_order.getDateStart() == null)
|
||||
{
|
||||
pp_order.setDateStart(movementDate);
|
||||
}
|
||||
|
||||
BigDecimal DQ = deliveredQty;
|
||||
BigDecimal SQ = scrapQty;
|
||||
BigDecimal OQ = toDeliverQty;
|
||||
if (DQ.add(SQ).compareTo(OQ) >= 0)
|
||||
{
|
||||
pp_order.setDateFinish(movementDate);
|
||||
}
|
||||
|
||||
pp_order.saveEx(trxName);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Issue
|
||||
* @param PP_OrderBOMLine_ID
|
||||
* @param movementdate
|
||||
* @param qty
|
||||
* @param qtyScrap
|
||||
* @param qtyReject
|
||||
* @param storages
|
||||
*/
|
||||
public static void createIssue(MPPOrder pp_order, int PP_OrderBOMLine_ID,
|
||||
Timestamp movementdate,
|
||||
BigDecimal qty, BigDecimal qtyScrap, BigDecimal qtyReject,
|
||||
MStorage[] storages ,String trxName)
|
||||
{
|
||||
if (qty.signum() == 0)
|
||||
return;
|
||||
|
||||
BigDecimal toIssue = qty.add(qtyScrap);
|
||||
for (MStorage storage : storages)
|
||||
{
|
||||
// TODO Selection of ASI
|
||||
|
||||
if (storage.getQtyOnHand().signum() == 0)
|
||||
continue;
|
||||
|
||||
BigDecimal qtyIssue = toIssue.min(storage.getQtyOnHand());
|
||||
//log.fine("ToIssue: " + issue);
|
||||
MPPOrderBOMLine PP_orderbomLine = new MPPOrderBOMLine(Env.getCtx(), PP_OrderBOMLine_ID, null);
|
||||
//create record for negative and positive transaction
|
||||
if (qtyIssue.signum() != 0 || qtyScrap.signum() != 0 || qtyReject.signum() != 0)
|
||||
{
|
||||
String CostCollectorType = null;
|
||||
int C_DocType_ID = MDocType.getDocType(MDocType.DOCBASETYPE_ManufacturingOrder);
|
||||
// Method Variance
|
||||
if (PP_orderbomLine.getQtyBatch().signum() == 0
|
||||
&& PP_orderbomLine.getQtyBOM().signum() == 0)
|
||||
{
|
||||
CostCollectorType = MPPCostCollector.COSTCOLLECTORTYPE_MethodChangeVariance;
|
||||
}
|
||||
// Order Issue
|
||||
else
|
||||
{
|
||||
CostCollectorType = MPPCostCollector.COSTCOLLECTORTYPE_ComponentIssue;
|
||||
}
|
||||
//
|
||||
createCollector (pp_order,
|
||||
PP_orderbomLine.getM_Product_ID(),
|
||||
storage.getM_Locator_ID(),
|
||||
storage.getM_AttributeSetInstance_ID(),
|
||||
movementdate,
|
||||
qtyIssue, qtyScrap, qtyReject,
|
||||
C_DocType_ID,
|
||||
PP_OrderBOMLine_ID,
|
||||
CostCollectorType, // Production "-"
|
||||
trxName
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
toIssue = toIssue.subtract(qtyIssue);
|
||||
if (toIssue.signum() == 0)
|
||||
break;
|
||||
}
|
||||
//
|
||||
if (toIssue.signum() != 0)
|
||||
{
|
||||
// should not happen because we validate Qty On Hand on start of this process
|
||||
throw new AdempiereException("Should not happen toIssue="+toIssue);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Collector Cost
|
||||
* @param pp_order
|
||||
* @param M_Product_ID
|
||||
* @param M_Locator_ID
|
||||
* @param M_AttributeSetInstance_ID
|
||||
* @param movementdate
|
||||
* @param qty
|
||||
* @param scrap
|
||||
* @param reject
|
||||
* @param C_DocType_ID
|
||||
* @param PP_Order_BOMLine_ID
|
||||
* @param CostCollectorType
|
||||
* @param trxName
|
||||
*/
|
||||
static private void createCollector (MPPOrder pp_order ,
|
||||
int M_Product_ID,
|
||||
int M_Locator_ID,
|
||||
int M_AttributeSetInstance_ID,
|
||||
Timestamp movementdate,
|
||||
BigDecimal qty,
|
||||
BigDecimal scrap,
|
||||
BigDecimal reject,
|
||||
int C_DocType_ID,
|
||||
int PP_Order_BOMLine_ID,
|
||||
String CostCollectorType,
|
||||
String trxName
|
||||
)
|
||||
{
|
||||
|
||||
MPPCostCollector PP_Cost_Collector = new MPPCostCollector(Env.getCtx(), 0, trxName);
|
||||
PP_Cost_Collector.setPP_Order_ID(pp_order.getPP_Order_ID());
|
||||
PP_Cost_Collector.setPP_Order_BOMLine_ID(PP_Order_BOMLine_ID);
|
||||
PP_Cost_Collector.setAD_OrgTrx_ID(pp_order.getAD_OrgTrx_ID());
|
||||
PP_Cost_Collector.setC_Activity_ID(pp_order.getC_Activity_ID());
|
||||
PP_Cost_Collector.setC_Campaign_ID(pp_order.getC_Campaign_ID());
|
||||
PP_Cost_Collector.setC_DocType_ID(C_DocType_ID);
|
||||
PP_Cost_Collector.setC_DocTypeTarget_ID(C_DocType_ID);
|
||||
PP_Cost_Collector.setCostCollectorType(CostCollectorType);
|
||||
PP_Cost_Collector.setC_Project_ID(pp_order.getC_Project_ID());
|
||||
PP_Cost_Collector.setDescription(pp_order.getDescription());
|
||||
PP_Cost_Collector.setDocAction(MPPCostCollector.ACTION_Complete);
|
||||
PP_Cost_Collector.setDocStatus(MPPCostCollector.DOCSTATUS_Drafted);
|
||||
PP_Cost_Collector.setIsActive(true);
|
||||
PP_Cost_Collector.setM_Warehouse_ID(pp_order.getM_Warehouse_ID());
|
||||
PP_Cost_Collector.setM_Locator_ID(M_Locator_ID);
|
||||
PP_Cost_Collector.setM_AttributeSetInstance_ID(M_AttributeSetInstance_ID);
|
||||
PP_Cost_Collector.setS_Resource_ID(pp_order.getS_Resource_ID());
|
||||
PP_Cost_Collector.setMovementDate(movementdate);
|
||||
PP_Cost_Collector.setDateAcct(movementdate);
|
||||
PP_Cost_Collector.setMovementQty(qty);
|
||||
PP_Cost_Collector.setScrappedQty(scrap);
|
||||
PP_Cost_Collector.setQtyReject(reject);
|
||||
PP_Cost_Collector.setPosted(false);
|
||||
PP_Cost_Collector.setProcessed(false);
|
||||
PP_Cost_Collector.setProcessing(false);
|
||||
PP_Cost_Collector.setUser1_ID(pp_order.getUser1_ID());
|
||||
PP_Cost_Collector.setUser2_ID(pp_order.getUser2_ID());
|
||||
PP_Cost_Collector.setM_Product_ID(M_Product_ID);
|
||||
PP_Cost_Collector.saveEx();
|
||||
if (!PP_Cost_Collector.processIt(MPPCostCollector.DOCACTION_Complete)) {
|
||||
throw new AdempiereException(PP_Cost_Collector.getProcessMsg());
|
||||
}
|
||||
PP_Cost_Collector.saveEx();
|
||||
}
|
||||
|
||||
/**
|
||||
* get if Component is Available
|
||||
* @param MPPOrdrt Manufacturing order
|
||||
* @param ArrayList Issues
|
||||
* @param minGuaranteeDate Guarantee Date
|
||||
* @return true when the qty available is enough
|
||||
*/
|
||||
public static boolean isAvailableQty(MPPOrder order ,ArrayList[][] issue,Timestamp minGuaranteeDate)
|
||||
{
|
||||
boolean isCompleteQtyDeliver = false;
|
||||
int ANY_ASI = 1;
|
||||
|
||||
for(int i = 0; i < issue.length; i++ )
|
||||
{
|
||||
IDColumn id = (IDColumn) issue[i][0].get(0);
|
||||
if (id == null || !id.isSelected())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
Boolean isCritical = (Boolean)issue[i][0].get(1);
|
||||
String value = (String)issue[i][0].get(2);
|
||||
KeyNamePair productkey = (KeyNamePair) issue[i][0].get(3);
|
||||
int M_Product_ID = productkey.getKey();
|
||||
BigDecimal qtyToDeliver = (BigDecimal)issue[i][0].get(4);
|
||||
BigDecimal qtyScrapComponent = (BigDecimal) issue[i][0].get(5);
|
||||
|
||||
MProduct product = MProduct.get(order.getCtx(), M_Product_ID);
|
||||
|
||||
if (product != null && product.get_ID() != 0 && product.isStocked())
|
||||
{
|
||||
int M_AttributeSetInstance_ID = ANY_ASI;
|
||||
if (value == null && id.isSelected())
|
||||
{
|
||||
M_AttributeSetInstance_ID = (Integer)id.getRecord_ID();
|
||||
}
|
||||
|
||||
MStorage[] storages = MPPOrder.getStorages(
|
||||
M_Product_ID,
|
||||
order.getM_Warehouse_ID(),
|
||||
M_AttributeSetInstance_ID,
|
||||
order.getM_AttributeSetInstance_ID(),
|
||||
ANY_ASI,
|
||||
minGuaranteeDate);
|
||||
|
||||
if (M_AttributeSetInstance_ID == ANY_ASI)
|
||||
{
|
||||
BigDecimal toIssue = qtyToDeliver.add(qtyScrapComponent);
|
||||
for (MStorage storage : storages)
|
||||
{
|
||||
// TODO Selection of ASI
|
||||
if (storage.getQtyOnHand().signum() == 0)
|
||||
continue;
|
||||
BigDecimal issueActual = toIssue.min(storage.getQtyOnHand());
|
||||
toIssue = toIssue.subtract(issueActual);
|
||||
if (toIssue.signum() <= 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BigDecimal qtydelivered = qtyToDeliver;
|
||||
qtydelivered.setScale(4, BigDecimal.ROUND_HALF_UP);
|
||||
qtydelivered = Env.ZERO;
|
||||
}
|
||||
|
||||
BigDecimal onHand = Env.ZERO;
|
||||
for (MStorage storage : storages)
|
||||
{
|
||||
onHand = onHand.add(storage.getQtyOnHand());
|
||||
}
|
||||
|
||||
isCompleteQtyDeliver = onHand.compareTo(qtyToDeliver.add(qtyScrapComponent)) >= 0;
|
||||
if (!isCompleteQtyDeliver)
|
||||
break;
|
||||
|
||||
}
|
||||
} // for each line
|
||||
|
||||
return isCompleteQtyDeliver;
|
||||
}
|
||||
|
||||
public static MStorage[] getStorages(
|
||||
int m_M_Product_ID, int M_Warehouse_ID,
|
||||
int M_ASI_ID,
|
||||
int O_ASI_ID,
|
||||
int ANY_ASI,
|
||||
Timestamp minGuaranteeDate)
|
||||
{
|
||||
Properties ctx = Env.getCtx();
|
||||
MProduct product = MProduct.get(ctx, m_M_Product_ID);
|
||||
if (product != null && product.get_ID() != 0 && product.isStocked()) {
|
||||
String MMPolicy = product.getMMPolicy();
|
||||
return MStorage.getWarehouse(ctx,
|
||||
M_Warehouse_ID,
|
||||
m_M_Product_ID,
|
||||
M_ASI_ID == ANY_ASI ? O_ASI_ID : M_ASI_ID,
|
||||
product.getM_AttributeSet_ID(),
|
||||
true, // all attribute set instances
|
||||
minGuaranteeDate,
|
||||
MClient.MMPOLICY_FiFo.equals(MMPolicy),
|
||||
null // no trx
|
||||
);
|
||||
}
|
||||
else {
|
||||
return new MStorage[0];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Default Location
|
||||
* @return
|
||||
*/
|
||||
private int getM_Locator_ID()
|
||||
{
|
||||
MWarehouse wh = MWarehouse.get(getCtx(), getM_Warehouse_ID());
|
||||
return wh.getDefaultLocator().getM_Locator_ID();
|
||||
}
|
||||
|
||||
public String toString()
|
||||
{
|
||||
StringBuffer sb = new StringBuffer("MPPOrder[").append(get_ID())
|
||||
|
|
|
@ -98,6 +98,8 @@ public class X_PP_Order_BOM extends PO implements I_PP_Order_BOM, I_Persistent
|
|||
public static final String BOMTYPE_Repair = "R";
|
||||
/** Product Configure = C */
|
||||
public static final String BOMTYPE_ProductConfigure = "C";
|
||||
/** Make-To-Kit = K */
|
||||
public static final String BOMTYPE_Make_To_Kit = "K";
|
||||
/** Set BOM Type.
|
||||
@param BOMType
|
||||
Type of BOM
|
||||
|
@ -105,8 +107,8 @@ public class X_PP_Order_BOM extends PO implements I_PP_Order_BOM, I_Persistent
|
|||
public void setBOMType (String BOMType)
|
||||
{
|
||||
|
||||
if (BOMType == null || BOMType.equals("A") || BOMType.equals("O") || BOMType.equals("P") || BOMType.equals("S") || BOMType.equals("F") || BOMType.equals("M") || BOMType.equals("R") || BOMType.equals("C"));
|
||||
else throw new IllegalArgumentException ("BOMType Invalid value - " + BOMType + " - Reference_ID=347 - A - O - P - S - F - M - R - C");
|
||||
if (BOMType == null || BOMType.equals("A") || BOMType.equals("O") || BOMType.equals("P") || BOMType.equals("S") || BOMType.equals("F") || BOMType.equals("M") || BOMType.equals("R") || BOMType.equals("C") || BOMType.equals("K"));
|
||||
else throw new IllegalArgumentException ("BOMType Invalid value - " + BOMType + " - Reference_ID=347 - A - O - P - S - F - M - R - C - K");
|
||||
|
||||
set_Value (COLUMNNAME_BOMType, BOMType);
|
||||
}
|
||||
|
|
|
@ -97,6 +97,8 @@ public class X_PP_Product_BOM extends PO implements I_PP_Product_BOM, I_Persiste
|
|||
public static final String BOMTYPE_Repair = "R";
|
||||
/** Product Configure = C */
|
||||
public static final String BOMTYPE_ProductConfigure = "C";
|
||||
/** Make-To-Kit = K */
|
||||
public static final String BOMTYPE_Make_To_Kit = "K";
|
||||
/** Set BOM Type.
|
||||
@param BOMType
|
||||
Type of BOM
|
||||
|
@ -104,8 +106,8 @@ public class X_PP_Product_BOM extends PO implements I_PP_Product_BOM, I_Persiste
|
|||
public void setBOMType (String BOMType)
|
||||
{
|
||||
|
||||
if (BOMType == null || BOMType.equals("A") || BOMType.equals("O") || BOMType.equals("P") || BOMType.equals("S") || BOMType.equals("F") || BOMType.equals("M") || BOMType.equals("R") || BOMType.equals("C"));
|
||||
else throw new IllegalArgumentException ("BOMType Invalid value - " + BOMType + " - Reference_ID=347 - A - O - P - S - F - M - R - C");
|
||||
if (BOMType == null || BOMType.equals("A") || BOMType.equals("O") || BOMType.equals("P") || BOMType.equals("S") || BOMType.equals("F") || BOMType.equals("M") || BOMType.equals("R") || BOMType.equals("C") || BOMType.equals("K"));
|
||||
else throw new IllegalArgumentException ("BOMType Invalid value - " + BOMType + " - Reference_ID=347 - A - O - P - S - F - M - R - C - K");
|
||||
|
||||
set_Value (COLUMNNAME_BOMType, BOMType);
|
||||
}
|
||||
|
|
|
@ -196,7 +196,7 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
/**
|
||||
* Fill Picks
|
||||
* Column_ID from C_Order
|
||||
* This is only run as part of the windows initialisation process
|
||||
* This is only run as part of the windows initialization process
|
||||
* @throws Exception if Lookups cannot be initialized
|
||||
*/
|
||||
private void fillPicks() throws Exception {
|
||||
|
@ -423,10 +423,10 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
northPanel.add(attribute, new GridBagConstraints(5, 7, 1, 1, 0.0, 0.0,
|
||||
GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL,
|
||||
new Insets(5, 5, 5, 5), 0, 0));
|
||||
northPanel.add(backflushGroupLabel, new GridBagConstraints(4, 5, 1, 1, 0.0, 0.0,
|
||||
northPanel.add(backflushGroupLabel, new GridBagConstraints(2, 5, 1, 1, 0.0, 0.0,
|
||||
GridBagConstraints.EAST, GridBagConstraints.NONE,
|
||||
new Insets(5, 5, 5, 5), 0, 0));
|
||||
northPanel.add(backflushGroup, new GridBagConstraints(5, 5, 1, 1, 0.0, 0.0,
|
||||
northPanel.add(backflushGroup, new GridBagConstraints(3, 5, 1, 1, 0.0, 0.0,
|
||||
GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL,
|
||||
new Insets(5, 5, 5, 5), 0, 0));
|
||||
|
||||
|
@ -664,10 +664,12 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
IDColumn id = new IDColumn(rs.getInt(1));
|
||||
BigDecimal qtyBom = rs.getBigDecimal(15);
|
||||
Boolean isQtyPercentage = rs.getString(16).equals("Y");
|
||||
Boolean isCritical = rs.getString(2).equals("Y");
|
||||
BigDecimal qtyBatch = rs.getBigDecimal(17);
|
||||
BigDecimal qtyRequired = rs.getBigDecimal(8);
|
||||
BigDecimal qtyOnHand = rs.getBigDecimal(11);
|
||||
BigDecimal qtyOpen = rs.getBigDecimal(19);
|
||||
BigDecimal qtyDelivered = rs.getBigDecimal(20);
|
||||
String componentType = rs.getString(18);
|
||||
BigDecimal toDeliverQty = getToDeliverQty();
|
||||
BigDecimal openQty = getOpenQty();
|
||||
|
@ -680,13 +682,14 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
id.setSelected(isOnlyReceipt());
|
||||
|
||||
issue.setValueAt(id, row, 0); // PP_OrderBOMLine_ID
|
||||
issue.setValueAt(rs.getString(2).equals("Y"), row, 1); // IsCritical
|
||||
issue.setValueAt(isCritical, row, 1); // IsCritical
|
||||
issue.setValueAt(rs.getString(3), row, 2); // Product's Search key
|
||||
issue.setValueAt(new KeyNamePair(rs.getInt(4), rs.getString(5)), row, 3); // Product
|
||||
issue.setValueAt(new KeyNamePair(rs.getInt(6), rs.getString(7)), row, 4); // UOM
|
||||
// ... 5 - ASI
|
||||
issue.setValueAt(qtyRequired, row, 6); // QtyRequiered
|
||||
issue.setValueAt(rs.getBigDecimal(20), row, 7); // QtyDelivered
|
||||
issue.setValueAt(qtyDelivered, row, 7); // QtyDelivered
|
||||
|
||||
// ... 8, 9, 10 - QtyToDeliver, QtyScrap, QtyOnHand
|
||||
issue.setValueAt(qtyOnHand, row, 10); // OnHand
|
||||
issue.setValueAt(rs.getBigDecimal(9), row, 11); // QtyReserved
|
||||
|
@ -710,22 +713,25 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
|
||||
if (isBackflush())
|
||||
{ // Is Backflush - Calculate Component from Qty To Deliver
|
||||
if (qtyRequired.signum() == 0)
|
||||
if (qtyRequired.signum() == 0 || qtyOpen.signum() == 0)
|
||||
{
|
||||
componentToDeliverQty = Env.ZERO;
|
||||
}
|
||||
else
|
||||
{
|
||||
componentToDeliverQty = toDeliverQty.multiply(qtyBatchPerc);
|
||||
|
||||
if(qtyRequired.subtract(qtyDelivered).signum() < 0 | componentToDeliverQty.signum() == 0)
|
||||
componentToDeliverQty = qtyRequired.subtract(qtyDelivered);
|
||||
|
||||
}
|
||||
|
||||
if (componentToDeliverQty.signum() != 0)
|
||||
{
|
||||
// TODO: arhipac: teo_sarca: is this a bug ? ...instead of toDeliverQty, qtyRequired should be used!
|
||||
componentQtyReq = toDeliverQty.multiply(qtyBatchPerc); // TODO: set scale 4
|
||||
//componentQtyReq = toDeliverQty.multiply(qtyBatchPerc); // TODO: set scale 4
|
||||
componentQtyToDel = componentToDeliverQty.setScale(4, BigDecimal.ROUND_HALF_UP);
|
||||
|
||||
issue.setValueAt(toDeliverQty.multiply(qtyBatchPerc), row, 6); // QtyRequiered
|
||||
//issue.setValueAt(toDeliverQty.multiply(qtyBatchPerc), row, 6); // QtyRequiered
|
||||
issue.setValueAt(componentToDeliverQty, row, 8); // QtyToDelivery
|
||||
|
||||
}
|
||||
|
@ -974,11 +980,25 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
createIssue();
|
||||
}
|
||||
if (isOnlyReceipt() || isBackflush()) {
|
||||
createReceipt();
|
||||
|
||||
boolean isCloseDocument = ADialog.ask(m_WindowNo, this,
|
||||
Msg.translate(Env.getCtx(), "IsCloseDocument"),
|
||||
Msg.translate(Env.getCtx(), "DocumentNo") + getPP_Order().getDocumentNo());
|
||||
|
||||
MPPOrder.createReceipt(this.getPP_Order(),
|
||||
getMovementDate(),
|
||||
getDeliveredQty(),
|
||||
getToDeliverQty(),
|
||||
getScrapQty(),
|
||||
getRejectQty(),
|
||||
getM_Locator_ID(),
|
||||
getM_AttributeSetInstance_ID(),
|
||||
isCloseDocument,
|
||||
null);
|
||||
}
|
||||
ADialog.info(m_WindowNo, this,
|
||||
Msg.translate(Env.getCtx(), "OnlyReceipt"),
|
||||
Msg.translate(Env.getCtx(), "DocumentNo") + getPP_Order().getDocumentNo());
|
||||
//ADialog.info(m_WindowNo, this,
|
||||
// Msg.translate(Env.getCtx(), "OnlyReceipt"),
|
||||
// Msg.translate(Env.getCtx(), "DocumentNo") + getPP_Order().getDocumentNo());
|
||||
}
|
||||
catch (Exception e) {
|
||||
ADialog.error(m_WindowNo, this, e.getLocalizedMessage());
|
||||
|
@ -993,60 +1013,27 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
Timestamp movementDate = getMovementDate();
|
||||
Timestamp minGuaranteeDate = movementDate;
|
||||
boolean isCompleteQtyDeliver = false;
|
||||
|
||||
//
|
||||
|
||||
ArrayList[][] m_issue = new ArrayList[issue.getRowCount()][1];
|
||||
|
||||
int row = 0;
|
||||
// Check Available On Hand Qty
|
||||
for (int i = 0; i < issue.getRowCount(); i++)
|
||||
{
|
||||
IDColumn id = (IDColumn) issue.getValueAt(i, 0);
|
||||
if (id == null || !id.isSelected())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
KeyNamePair productkey = (KeyNamePair) issue.getValueAt(i, 3);
|
||||
int product_ID = productkey.getKey();
|
||||
BigDecimal qtyToDeliver = getValueBigDecimal(i, 8);
|
||||
BigDecimal qtyScrapComponent = getValueBigDecimal(i, 9);
|
||||
|
||||
MStorage[] storages = getStorages(product_ID, getPP_Order().getM_AttributeSetInstance_ID(), minGuaranteeDate);
|
||||
ArrayList<Object> data = new ArrayList<Object>();
|
||||
|
||||
int M_AttributeSetInstance_ID = ANY_ASI;
|
||||
if (issue.getValueAt(i, 2) == null && id.isSelected())
|
||||
{
|
||||
M_AttributeSetInstance_ID = (Integer)id.getRecord_ID();
|
||||
}
|
||||
if (M_AttributeSetInstance_ID == ANY_ASI)
|
||||
{
|
||||
BigDecimal toIssue = qtyToDeliver.add(qtyScrapComponent);
|
||||
for (MStorage storage : storages) {
|
||||
// TODO Selection of ASI
|
||||
|
||||
if (storage.getQtyOnHand().signum() == 0)
|
||||
continue;
|
||||
BigDecimal issueActual = toIssue.min(storage.getQtyOnHand());
|
||||
toIssue = toIssue.subtract(issueActual);
|
||||
if (toIssue.signum() <= 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BigDecimal qtydelivered = qtyToDeliver;
|
||||
qtydelivered.setScale(4, BigDecimal.ROUND_HALF_UP);
|
||||
qtydelivered = Env.ZERO;
|
||||
}
|
||||
|
||||
BigDecimal onHand = Env.ZERO;
|
||||
for (MStorage storage : storages)
|
||||
{
|
||||
onHand = onHand.add(storage.getQtyOnHand());
|
||||
}
|
||||
|
||||
isCompleteQtyDeliver = onHand.compareTo(qtyToDeliver.add(qtyScrapComponent)) >= 0;
|
||||
if (!isCompleteQtyDeliver)
|
||||
break;
|
||||
} // for each line
|
||||
data.add(issue.getValueAt (i, 0)); //0 - ID
|
||||
data.add(issue.getValueAt (i, 1)); //1 - IsCritical
|
||||
data.add(issue.getValueAt (i, 2)); //2 - Value
|
||||
data.add(issue.getValueAt (i, 3)); //3 - KeyNamePair Product
|
||||
data.add(getValueBigDecimal(i, 8)); //4 - QtyToDeliver
|
||||
data.add(getValueBigDecimal(i, 9)); //5 - QtyScrapComponent
|
||||
|
||||
m_issue[row][0] = data;
|
||||
row ++ ;
|
||||
}
|
||||
|
||||
isCompleteQtyDeliver = MPPOrder.isAvailableQty(getPP_Order(), m_issue , minGuaranteeDate);
|
||||
|
||||
if (!isCompleteQtyDeliver)
|
||||
{
|
||||
|
@ -1054,217 +1041,54 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
throw new AdempiereException("@NoQtyAvailable@");
|
||||
}
|
||||
|
||||
//
|
||||
// Issue Qty
|
||||
for (int ok = 0; ok < issue.getRowCount(); ok++)
|
||||
for(int i = 0; i < m_issue.length; i++ )
|
||||
{
|
||||
IDColumn id = (IDColumn) issue.getValueAt(ok, 0);
|
||||
if (id == null || !id.isSelected()) {
|
||||
IDColumn id = (IDColumn) m_issue[i][0].get(0);
|
||||
if (id == null || !id.isSelected())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
KeyNamePair m_productkey = (KeyNamePair) issue.getValueAt(ok, 3);
|
||||
int m_M_Product_ID = m_productkey.getKey();
|
||||
Boolean isCritical = (Boolean)m_issue[i][0].get(1);
|
||||
String value = (String)m_issue[i][0].get(2);
|
||||
KeyNamePair productkey = (KeyNamePair) m_issue[i][0].get(3);
|
||||
int M_Product_ID = productkey.getKey();
|
||||
|
||||
int PP_Order_BOMLine_ID = 0;
|
||||
int M_AttributeSetInstance_ID = ANY_ASI;
|
||||
if (issue.getValueAt(ok, 2) == null && id.isSelected()) {
|
||||
M_AttributeSetInstance_ID = (Integer) id.getRecord_ID();
|
||||
|
||||
String sql = "SELECT PP_Order_BOMLine_ID FROM PP_Order_BOMLine"
|
||||
+" WHERE M_Product_ID=? AND PP_Order_ID=?";
|
||||
PP_Order_BOMLine_ID = DB.getSQLValue(null, sql, m_M_Product_ID, getPP_Order_ID());
|
||||
}
|
||||
else if (issue.getValueAt(ok, 2) != null && id.isSelected()) {
|
||||
PP_Order_BOMLine_ID = ((Integer) id.getRecord_ID());
|
||||
}
|
||||
BigDecimal qtyToDeliver = (BigDecimal) m_issue[i][0].get(4);
|
||||
BigDecimal qtyScrapComponent = (BigDecimal) m_issue[i][0].get(5);
|
||||
|
||||
BigDecimal m_qtyToDeliver = getValueBigDecimal(ok, 8);
|
||||
BigDecimal m_scrapQtyComponent = getValueBigDecimal(ok, 9);
|
||||
|
||||
BigDecimal onHand = Env.ZERO;
|
||||
MStorage[] storages = getStorages(m_M_Product_ID, M_AttributeSetInstance_ID, minGuaranteeDate);
|
||||
for (MStorage storage : storages) {
|
||||
onHand = onHand.add(storage.getQtyOnHand());
|
||||
}
|
||||
|
||||
createIssue(PP_Order_BOMLine_ID, movementDate,
|
||||
m_qtyToDeliver, m_scrapQtyComponent,
|
||||
Env.ZERO, storages);
|
||||
}
|
||||
}
|
||||
|
||||
private void createReceipt()
|
||||
{
|
||||
MPPOrder pp_order = getPP_Order();
|
||||
Timestamp movementDate = getMovementDate();
|
||||
BigDecimal toDeliverQty = getToDeliverQty();
|
||||
BigDecimal scrapQty = getScrapQty();
|
||||
BigDecimal rejectQty = getRejectQty();
|
||||
|
||||
if (toDeliverQty.signum() > 0 || scrapQty.signum() > 0 || rejectQty.signum() > 0)
|
||||
{
|
||||
createCollector(pp_order.getM_Product_ID(),
|
||||
getM_Locator_ID(),
|
||||
getM_AttributeSetInstance_ID(),
|
||||
movementDate,
|
||||
toDeliverQty, scrapQty, rejectQty,
|
||||
getDocType(MDocType.DOCBASETYPE_ManufacturingOrder),
|
||||
0, // PP_Order_BOMLine_ID
|
||||
MPPCostCollector.COSTCOLLECTORTYPE_MaterialReceipt);
|
||||
}
|
||||
|
||||
if (ADialog.ask(m_WindowNo, this,
|
||||
Msg.translate(Env.getCtx(), "IsCloseDocument"),
|
||||
Msg.translate(Env.getCtx(), "DocumentNo") + pp_order.getDocumentNo())
|
||||
)
|
||||
{
|
||||
pp_order.setDateFinish(movementDate);
|
||||
pp_order.closeIt();
|
||||
pp_order.saveEx();
|
||||
}
|
||||
|
||||
pp_order.setDateDelivered(movementDate);
|
||||
if (pp_order.getDateStart() == null)
|
||||
{
|
||||
pp_order.setDateStart(movementDate);
|
||||
}
|
||||
|
||||
BigDecimal DQ = getDeliveredQty();
|
||||
BigDecimal SQ = getScrapQty();
|
||||
BigDecimal OQ = getToDeliverQty();
|
||||
if (DQ.add(SQ).compareTo(OQ) >= 0)
|
||||
{
|
||||
pp_order.setDateFinish(movementDate);
|
||||
}
|
||||
|
||||
pp_order.saveEx();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Issue
|
||||
* @param PP_OrderBOMLine_ID
|
||||
* @param movementdate
|
||||
* @param qty
|
||||
* @param qtyScrap
|
||||
* @param qtyReject
|
||||
* @param storages
|
||||
*/
|
||||
private void createIssue(int PP_OrderBOMLine_ID,
|
||||
Timestamp movementdate,
|
||||
BigDecimal qty, BigDecimal qtyScrap, BigDecimal qtyReject,
|
||||
MStorage[] storages)
|
||||
{
|
||||
if (qty.signum() == 0)
|
||||
return;
|
||||
|
||||
BigDecimal toIssue = qty.add(qtyScrap);
|
||||
for (MStorage storage : storages)
|
||||
{
|
||||
// TODO Selection of ASI
|
||||
|
||||
if (storage.getQtyOnHand().signum() == 0)
|
||||
continue;
|
||||
|
||||
BigDecimal issue = toIssue.min(storage.getQtyOnHand());
|
||||
log.fine("ToIssue: " + issue);
|
||||
MPPOrderBOMLine PP_orderbomLine = new MPPOrderBOMLine(Env.getCtx(), PP_OrderBOMLine_ID, null);
|
||||
if (issue.signum() > 0 || qtyScrap.signum() > 0 || qtyReject.signum() > 0)
|
||||
MProduct product = MProduct.get(getPP_Order().getCtx(), M_Product_ID);
|
||||
if (product != null && product.get_ID() != 0 && product.isStocked())
|
||||
{
|
||||
String CostCollectorType = null;
|
||||
int C_DocType_ID = getDocType(MDocType.DOCBASETYPE_ManufacturingOrder);
|
||||
// Method Variance
|
||||
if (PP_orderbomLine.getQtyBatch().signum() == 0
|
||||
&& PP_orderbomLine.getQtyBOM().signum() == 0)
|
||||
{
|
||||
CostCollectorType = MPPCostCollector.COSTCOLLECTORTYPE_MethodChangeVariance;
|
||||
}
|
||||
// Order Issue
|
||||
else
|
||||
{
|
||||
CostCollectorType = MPPCostCollector.COSTCOLLECTORTYPE_ComponentIssue;
|
||||
}
|
||||
//
|
||||
createCollector (
|
||||
PP_orderbomLine.getM_Product_ID(),
|
||||
storage.getM_Locator_ID(),
|
||||
storage.getM_AttributeSetInstance_ID(),
|
||||
movementdate,
|
||||
issue, qtyScrap, qtyReject,
|
||||
C_DocType_ID,
|
||||
PP_OrderBOMLine_ID,
|
||||
CostCollectorType // Production "-"
|
||||
);
|
||||
|
||||
if (value == null && id.isSelected())
|
||||
{
|
||||
M_AttributeSetInstance_ID = (Integer) id.getRecord_ID();
|
||||
//TODO: vpj-cd What happen when a product it more the time in Order
|
||||
String sql = "SELECT PP_Order_BOMLine_ID FROM PP_Order_BOMLine"
|
||||
+" WHERE M_Product_ID=? AND PP_Order_ID=?";
|
||||
PP_Order_BOMLine_ID = DB.getSQLValue(null, sql, M_Product_ID, getPP_Order_ID());
|
||||
}
|
||||
else if (value != null && id.isSelected())
|
||||
{
|
||||
PP_Order_BOMLine_ID = ((Integer) id.getRecord_ID());
|
||||
}
|
||||
|
||||
MStorage[] storages = MPPOrder.getStorages(
|
||||
M_Product_ID,
|
||||
getPP_Order().getM_Warehouse_ID(),
|
||||
M_AttributeSetInstance_ID,
|
||||
getPP_Order().getM_AttributeSetInstance_ID(),
|
||||
ANY_ASI, minGuaranteeDate);
|
||||
|
||||
MPPOrder.createIssue(getPP_Order(),PP_Order_BOMLine_ID, movementDate,
|
||||
qtyToDeliver, qtyScrapComponent,
|
||||
Env.ZERO, storages , null);
|
||||
}
|
||||
|
||||
toIssue = toIssue.subtract(issue);
|
||||
if (toIssue.signum() == 0)
|
||||
break;
|
||||
}
|
||||
//
|
||||
if (toIssue.signum() != 0)
|
||||
{
|
||||
// should not happen because we validate Qty On Hand on start of this process
|
||||
throw new AdempiereException("Should not happen toIssue="+toIssue);
|
||||
}
|
||||
}
|
||||
|
||||
private void createCollector (
|
||||
int M_Product_ID,
|
||||
int M_Locator_ID,
|
||||
int M_AttributeSetInstance_ID,
|
||||
Timestamp movementdate,
|
||||
BigDecimal qty,
|
||||
BigDecimal scrap,
|
||||
BigDecimal reject,
|
||||
int C_DocType_ID,
|
||||
int PP_Order_BOMLine_ID,
|
||||
String CostCollectorType
|
||||
)
|
||||
{
|
||||
MPPOrder pp_order = getPP_Order();
|
||||
MPPCostCollector PP_Cost_Collector = new MPPCostCollector(Env.getCtx(), 0, null);
|
||||
PP_Cost_Collector.setPP_Order_ID(pp_order.getPP_Order_ID());
|
||||
PP_Cost_Collector.setPP_Order_BOMLine_ID(PP_Order_BOMLine_ID);
|
||||
PP_Cost_Collector.setAD_OrgTrx_ID(pp_order.getAD_OrgTrx_ID());
|
||||
PP_Cost_Collector.setC_Activity_ID(pp_order.getC_Activity_ID());
|
||||
PP_Cost_Collector.setC_Campaign_ID(pp_order.getC_Campaign_ID());
|
||||
PP_Cost_Collector.setC_DocType_ID(C_DocType_ID);
|
||||
PP_Cost_Collector.setC_DocTypeTarget_ID(C_DocType_ID);
|
||||
PP_Cost_Collector.setCostCollectorType(CostCollectorType);
|
||||
PP_Cost_Collector.setC_Project_ID(pp_order.getC_Project_ID());
|
||||
PP_Cost_Collector.setDescription(pp_order.getDescription());
|
||||
PP_Cost_Collector.setDocAction(MPPCostCollector.ACTION_Complete);
|
||||
PP_Cost_Collector.setDocStatus(MPPCostCollector.DOCSTATUS_Drafted);
|
||||
PP_Cost_Collector.setIsActive(true);
|
||||
PP_Cost_Collector.setM_Warehouse_ID(pp_order.getM_Warehouse_ID());
|
||||
PP_Cost_Collector.setM_Locator_ID(M_Locator_ID);
|
||||
PP_Cost_Collector.setM_AttributeSetInstance_ID(M_AttributeSetInstance_ID);
|
||||
PP_Cost_Collector.setS_Resource_ID(pp_order.getS_Resource_ID());
|
||||
PP_Cost_Collector.setMovementDate(movementdate);
|
||||
PP_Cost_Collector.setDateAcct(movementdate);
|
||||
PP_Cost_Collector.setMovementQty(qty);
|
||||
PP_Cost_Collector.setScrappedQty(scrap);
|
||||
PP_Cost_Collector.setQtyReject(reject);
|
||||
PP_Cost_Collector.setPosted(false);
|
||||
PP_Cost_Collector.setProcessed(false);
|
||||
PP_Cost_Collector.setProcessing(false);
|
||||
PP_Cost_Collector.setUser1_ID(pp_order.getUser1_ID());
|
||||
PP_Cost_Collector.setUser2_ID(pp_order.getUser2_ID());
|
||||
PP_Cost_Collector.setM_Product_ID(M_Product_ID);
|
||||
PP_Cost_Collector.saveEx();
|
||||
if (!PP_Cost_Collector.processIt(MPPCostCollector.DOCACTION_Complete)) {
|
||||
throw new AdempiereException(PP_Cost_Collector.getProcessMsg());
|
||||
}
|
||||
PP_Cost_Collector.saveEx();
|
||||
}
|
||||
|
||||
private int getDocType(String DocBaseType)
|
||||
{
|
||||
MDocType[] doc = MDocType.getOfDocBaseType(Env.getCtx(), DocBaseType);
|
||||
return doc.length > 0 ? doc[0].get_ID() : 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1324,7 +1148,12 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
{
|
||||
Timestamp m_movementDate = getMovementDate();
|
||||
Timestamp minGuaranteeDate = m_movementDate;
|
||||
MStorage[] storages = getStorages(m_M_Product_ID, getPP_Order().getM_AttributeSetInstance_ID(), minGuaranteeDate);
|
||||
MStorage[] storages = MPPOrder.getStorages(
|
||||
m_M_Product_ID,
|
||||
getPP_Order().getM_Warehouse_ID(),
|
||||
0,
|
||||
getPP_Order().getM_AttributeSetInstance_ID(),
|
||||
ANY_ASI, minGuaranteeDate);
|
||||
|
||||
BigDecimal todelivery = getValueBigDecimal(i, 8); //QtyOpen
|
||||
BigDecimal scrap = getValueBigDecimal(i, 9); //QtyScrap
|
||||
|
@ -1622,28 +1451,6 @@ public class VOrderReceiptIssue extends CPanel implements FormPanel,
|
|||
public void unlockUI(org.compiere.process.ProcessInfo processInfo) {
|
||||
}
|
||||
|
||||
private MStorage[] getStorages(int m_M_Product_ID, int M_ASI_ID, Timestamp minGuaranteeDate)
|
||||
{
|
||||
Properties ctx = Env.getCtx();
|
||||
MProduct product = MProduct.get(ctx, m_M_Product_ID);
|
||||
if (product != null && product.get_ID() != 0 && product.isStocked()) {
|
||||
String MMPolicy = product.getMMPolicy();
|
||||
return MStorage.getWarehouse(ctx,
|
||||
m_PP_order.getM_Warehouse_ID(),
|
||||
m_M_Product_ID,
|
||||
M_ASI_ID == ANY_ASI ? m_PP_order.getM_AttributeSetInstance_ID() : M_ASI_ID,
|
||||
product.getM_AttributeSet_ID(),
|
||||
true, // all attribute set instances
|
||||
minGuaranteeDate,
|
||||
MClient.MMPOLICY_FiFo.equals(MMPolicy),
|
||||
null // no trx
|
||||
);
|
||||
}
|
||||
else {
|
||||
return new MStorage[0];
|
||||
}
|
||||
}
|
||||
|
||||
private BigDecimal getValueBigDecimal(int row, int col) {
|
||||
BigDecimal bd = (BigDecimal)issue.getValueAt(row, col);
|
||||
return bd == null ? Env.ZERO: bd;
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
-- Jan 12, 2009 12:08:51 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
INSERT INTO AD_Ref_List (AD_Client_ID,AD_Org_ID,AD_Ref_List_ID,AD_Reference_ID,Created,CreatedBy,EntityType,IsActive,Name,Updated,UpdatedBy,Value) VALUES (0,0,53450,347,TO_DATE('2009-01-12 00:08:45','YYYY-MM-DD HH24:MI:SS'),100,'EE01','Y','Make-To-Kit',TO_DATE('2009-01-12 00:08:45','YYYY-MM-DD HH24:MI:SS'),100,'K')
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:08:51 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
INSERT INTO AD_Ref_List_Trl (AD_Language,AD_Ref_List_ID, Description,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy) SELECT l.AD_Language,t.AD_Ref_List_ID, t.Description,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy FROM AD_Language l, AD_Ref_List t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Ref_List_ID=53450 AND EXISTS (SELECT * FROM AD_Ref_List_Trl tt WHERE tt.AD_Language!=l.AD_Language OR tt.AD_Ref_List_ID!=t.AD_Ref_List_ID)
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:09 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_DATE('2009-01-12 00:09:09','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=746
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:12 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_DATE('2009-01-12 00:09:12','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=747
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:17 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_DATE('2009-01-12 00:09:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=744
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:21 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_DATE('2009-01-12 00:09:21','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=745
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:35:52 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET Description='Create a Manufacturing Order, Receipt the finish product and issue the Components automaticaly ',Updated=TO_DATE('2009-01-12 00:35:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=0 WHERE AD_Ref_List_ID=53450
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:35:52 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List_Trl SET IsTranslated='N' WHERE AD_Ref_List_ID=53450
|
||||
;
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
-- Jan 12, 2009 12:08:51 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
INSERT INTO AD_Ref_List (AD_Client_ID,AD_Org_ID,AD_Ref_List_ID,AD_Reference_ID,Created,CreatedBy,EntityType,IsActive,Name,Updated,UpdatedBy,Value) VALUES (0,0,53450,347,TO_TIMESTAMP('2009-01-12 00:08:45','YYYY-MM-DD HH24:MI:SS'),100,'EE01','Y','Make-To-Kit',TO_TIMESTAMP('2009-01-12 00:08:45','YYYY-MM-DD HH24:MI:SS'),100,'K')
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:08:51 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
INSERT INTO AD_Ref_List_Trl (AD_Language,AD_Ref_List_ID, Description,Name, IsTranslated,AD_Client_ID,AD_Org_ID,Created,Createdby,Updated,UpdatedBy) SELECT l.AD_Language,t.AD_Ref_List_ID, t.Description,t.Name, 'N',t.AD_Client_ID,t.AD_Org_ID,t.Created,t.Createdby,t.Updated,t.UpdatedBy FROM AD_Language l, AD_Ref_List t WHERE l.IsActive='Y' AND l.IsSystemLanguage='Y' AND l.IsBaseLanguage='N' AND t.AD_Ref_List_ID=53450 AND EXISTS (SELECT * FROM AD_Ref_List_Trl tt WHERE tt.AD_Language!=l.AD_Language OR tt.AD_Ref_List_ID!=t.AD_Ref_List_ID)
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:09 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_TIMESTAMP('2009-01-12 00:09:09','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=746
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:12 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_TIMESTAMP('2009-01-12 00:09:12','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=747
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:17 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_TIMESTAMP('2009-01-12 00:09:17','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=744
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:09:21 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_TIMESTAMP('2009-01-12 00:09:21','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=745
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:35:52 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List SET Description='Create a Manufacturing Order, Receipt the finish product and issue the Components automaticaly ',Updated=TO_TIMESTAMP('2009-01-12 00:35:52','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=0 WHERE AD_Ref_List_ID=53450
|
||||
;
|
||||
|
||||
-- Jan 12, 2009 12:35:52 AM ECT
|
||||
-- New BOM Type for KIT
|
||||
UPDATE AD_Ref_List_Trl SET IsTranslated='N' WHERE AD_Ref_List_ID=53450
|
||||
;
|
Loading…
Reference in New Issue