📄 mcostdetail.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.model;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import org.compiere.util.*;
/**
* Cost Detail Model
*
* @author Jorg Janke
* @version $Id: MCostDetail.java,v 1.12 2005/12/20 04:21:04 jjanke Exp $
*/
public class MCostDetail extends X_M_CostDetail
{
/**
* Create New Order Cost Detail for Purchase Orders.
* Called from Doc_MatchPO
* @param as accounting schema
* @param AD_Org_ID org
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID asi
* @param C_OrderLine_ID order
* @param M_CostElement_ID optional cost element for Freight
* @param Amt amt total amount
* @param Qty qty
* @param Description optional description
*/
public static boolean createOrder (MAcctSchema as, int AD_Org_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
int C_OrderLine_ID, int M_CostElement_ID,
BigDecimal Amt, BigDecimal Qty,
String Description, String trxName)
{
// Delete Unprocessed zero Differences
String sql = "DELETE M_CostDetail "
+ "WHERE Processed='N' AND COALESCE(DeltaAmt,0)=0 AND COALESCE(DeltaQty,0)=0"
+ " AND C_OrderLine_ID=" + C_OrderLine_ID
+ " AND M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID;
int no = DB.executeUpdate(sql, trxName);
if (no != 0)
s_log.config("Deleted #" + no);
MCostDetail cd = get (as.getCtx(), "C_OrderLine_ID=? AND M_AttributeSetInstance_ID=?",
C_OrderLine_ID, M_AttributeSetInstance_ID, trxName);
//
if (cd == null) // createNew
{
cd = new MCostDetail (as, AD_Org_ID,
M_Product_ID, M_AttributeSetInstance_ID,
M_CostElement_ID,
Amt, Qty, Description, trxName);
cd.setC_OrderLine_ID (C_OrderLine_ID);
}
else
{
cd.setDeltaAmt(cd.getAmt().subtract(Amt));
cd.setDeltaQty(cd.getQty().subtract(Qty));
if (cd.isDelta())
cd.setProcessed(false);
else
return true; // nothing to do
}
boolean ok = cd.save();
if (ok && !cd.isProcessed())
{
MClient client = MClient.get(as.getCtx(), as.getAD_Client_ID());
if (client.isCostImmediate())
cd.process();
}
s_log.config("(" + ok + ") " + cd);
return ok;
} // createOrder
/**
* Create New Invoice Cost Detail for AP Invoices.
* Called from Doc_Invoice - for Invoice Adjustments
* @param as accounting schema
* @param AD_Org_ID org
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID asi
* @param C_InvoiceLine_ID invoice
* @param M_CostElement_ID optional cost element for Freight
* @param Amt amt
* @param Qty qty
* @param Description optional description
* @return true if created
*/
public static boolean createInvoice (MAcctSchema as, int AD_Org_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
int C_InvoiceLine_ID, int M_CostElement_ID,
BigDecimal Amt, BigDecimal Qty,
String Description, String trxName)
{
// Delete Unprocessed zero Differences
String sql = "DELETE M_CostDetail "
+ "WHERE Processed='N' AND COALESCE(DeltaAmt,0)=0 AND COALESCE(DeltaQty,0)=0"
+ " AND C_InvoiceLine_ID=" + C_InvoiceLine_ID
+ " AND M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID;
int no = DB.executeUpdate(sql, trxName);
if (no != 0)
s_log.config("Deleted #" + no);
MCostDetail cd = get (as.getCtx(), "C_InvoiceLine_ID=? AND M_AttributeSetInstance_ID=?",
C_InvoiceLine_ID, M_AttributeSetInstance_ID, trxName);
//
if (cd == null) // createNew
{
cd = new MCostDetail (as, AD_Org_ID,
M_Product_ID, M_AttributeSetInstance_ID,
M_CostElement_ID,
Amt, Qty, Description, trxName);
cd.setC_InvoiceLine_ID (C_InvoiceLine_ID);
}
else
{
cd.setDeltaAmt(cd.getAmt().subtract(Amt));
cd.setDeltaQty(cd.getQty().subtract(Qty));
if (cd.isDelta())
cd.setProcessed(false);
else
return true; // nothing to do
}
boolean ok = cd.save();
if (ok && !cd.isProcessed())
{
MClient client = MClient.get(as.getCtx(), as.getAD_Client_ID());
if (client.isCostImmediate())
cd.process();
}
s_log.config("(" + ok + ") " + cd);
return ok;
} // createInvoice
/**
* Create New Shipment Cost Detail for SO Shipments.
* Called from Doc_MInOut - for SO Shipments
* @param as accounting schema
* @param AD_Org_ID org
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID asi
* @param M_InOutLine_ID shipment
* @param M_CostElement_ID optional cost element for Freight
* @param Amt amt
* @param Qty qty
* @param Description optional description
* @param IsSOTrx sales order
*/
public static boolean createShipment (MAcctSchema as, int AD_Org_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
int M_InOutLine_ID, int M_CostElement_ID,
BigDecimal Amt, BigDecimal Qty,
String Description, boolean IsSOTrx, String trxName)
{
// Delete Unprocessed zero Differences
String sql = "DELETE M_CostDetail "
+ "WHERE Processed='N' AND COALESCE(DeltaAmt,0)=0 AND COALESCE(DeltaQty,0)=0"
+ " AND M_InOutLine_ID=" + M_InOutLine_ID
+ " AND M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID;
int no = DB.executeUpdate(sql, trxName);
if (no != 0)
s_log.config("Deleted #" + no);
MCostDetail cd = get (as.getCtx(), "M_InOutLine_ID=? AND M_AttributeSetInstance_ID=?",
M_InOutLine_ID, M_AttributeSetInstance_ID, trxName);
//
if (cd == null) // createNew
{
cd = new MCostDetail (as, AD_Org_ID,
M_Product_ID, M_AttributeSetInstance_ID,
M_CostElement_ID,
Amt, Qty, Description, trxName);
cd.setM_InOutLine_ID(M_InOutLine_ID);
cd.setIsSOTrx(IsSOTrx);
}
else
{
cd.setDeltaAmt(cd.getAmt().subtract(Amt));
cd.setDeltaQty(cd.getQty().subtract(Qty));
if (cd.isDelta())
cd.setProcessed(false);
else
return true; // nothing to do
}
boolean ok = cd.save();
if (ok && !cd.isProcessed())
{
MClient client = MClient.get(as.getCtx(), as.getAD_Client_ID());
if (client.isCostImmediate())
cd.process();
}
s_log.config("(" + ok + ") " + cd);
return ok;
} // createShipment
/**
* Create New Order Cost Detail for Physical Inventory.
* Called from Doc_Inventory
* @param as accounting schema
* @param AD_Org_ID org
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID asi
* @param M_InventoryLine_ID order
* @param M_CostElement_ID optional cost element
* @param Amt amt total amount
* @param Qty qty
* @param Description optional description
*/
public static boolean createInventory (MAcctSchema as, int AD_Org_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
int M_InventoryLine_ID, int M_CostElement_ID,
BigDecimal Amt, BigDecimal Qty,
String Description, String trxName)
{
// Delete Unprocessed zero Differences
String sql = "DELETE M_CostDetail "
+ "WHERE Processed='N' AND COALESCE(DeltaAmt,0)=0 AND COALESCE(DeltaQty,0)=0"
+ " AND M_InventoryLine_ID=" + M_InventoryLine_ID
+ " AND M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID;
int no = DB.executeUpdate(sql, trxName);
if (no != 0)
s_log.config("Deleted #" + no);
MCostDetail cd = get (as.getCtx(), "M_InventoryLine_ID=? AND M_AttributeSetInstance_ID=?",
M_InventoryLine_ID, M_AttributeSetInstance_ID, trxName);
//
if (cd == null) // createNew
{
cd = new MCostDetail (as, AD_Org_ID,
M_Product_ID, M_AttributeSetInstance_ID,
M_CostElement_ID,
Amt, Qty, Description, trxName);
cd.setM_InventoryLine_ID(M_InventoryLine_ID);
}
else
{
cd.setDeltaAmt(cd.getAmt().subtract(Amt));
cd.setDeltaQty(cd.getQty().subtract(Qty));
if (cd.isDelta())
cd.setProcessed(false);
else
return true; // nothing to do
}
boolean ok = cd.save();
if (ok && !cd.isProcessed())
{
MClient client = MClient.get(as.getCtx(), as.getAD_Client_ID());
if (client.isCostImmediate())
cd.process();
}
s_log.config("(" + ok + ") " + cd);
return ok;
} // createInventory
/**
* Create New Order Cost Detail for Movements.
* Called from Doc_Movement
* @param as accounting schema
* @param AD_Org_ID org
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID asi
* @param M_MovementLine_ID movement
* @param M_CostElement_ID optional cost element for Freight
* @param Amt amt total amount
* @param Qty qty
* @param from if true the from (reduction)
* @param Description optional description
*/
public static boolean createMovement (MAcctSchema as, int AD_Org_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
int M_MovementLine_ID, int M_CostElement_ID,
BigDecimal Amt, BigDecimal Qty, boolean from,
String Description, String trxName)
{
// Delete Unprocessed zero Differences
String sql = "DELETE M_CostDetail "
+ "WHERE Processed='N' AND COALESCE(DeltaAmt,0)=0 AND COALESCE(DeltaQty,0)=0"
+ " AND M_MovementLine_ID=" + M_MovementLine_ID
+ " AND IsSOTrx=" + (from ? "'Y'" : "'N'")
+ " AND M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID;
int no = DB.executeUpdate(sql, trxName);
if (no != 0)
s_log.config("Deleted #" + no);
MCostDetail cd = get (as.getCtx(), "M_MovementLine_ID=? AND M_AttributeSetInstance_ID=? AND IsSOTrx="
+ (from ? "'Y'" : "'N'"),
M_MovementLine_ID, M_AttributeSetInstance_ID, trxName);
//
if (cd == null) // createNew
{
cd = new MCostDetail (as, AD_Org_ID,
M_Product_ID, M_AttributeSetInstance_ID,
M_CostElement_ID,
Amt, Qty, Description, trxName);
cd.setM_MovementLine_ID (M_MovementLine_ID);
cd.setIsSOTrx(from);
}
else
{
cd.setDeltaAmt(cd.getAmt().subtract(Amt));
cd.setDeltaQty(cd.getQty().subtract(Qty));
if (cd.isDelta())
cd.setProcessed(false);
else
return true; // nothing to do
}
boolean ok = cd.save();
if (ok && !cd.isProcessed())
{
MClient client = MClient.get(as.getCtx(), as.getAD_Client_ID());
if (client.isCostImmediate())
cd.process();
}
s_log.config("(" + ok + ") " + cd);
return ok;
} // createMovement
/**
* Create New Order Cost Detail for Production.
* Called from Doc_Production
* @param as accounting schema
* @param AD_Org_ID org
* @param M_Product_ID product
* @param M_AttributeSetInstance_ID asi
* @param M_ProductionLine_ID production line
* @param M_CostElement_ID optional cost element
* @param Amt amt total amount
* @param Qty qty
* @param Description optional description
*/
public static boolean createProduction (MAcctSchema as, int AD_Org_ID,
int M_Product_ID, int M_AttributeSetInstance_ID,
int M_ProductionLine_ID, int M_CostElement_ID,
BigDecimal Amt, BigDecimal Qty,
String Description, String trxName)
{
// Delete Unprocessed zero Differences
String sql = "DELETE M_CostDetail "
+ "WHERE Processed='N' AND COALESCE(DeltaAmt,0)=0 AND COALESCE(DeltaQty,0)=0"
+ " AND M_ProductionLine_ID=" + M_ProductionLine_ID
+ " AND M_AttributeSetInstance_ID=" + M_AttributeSetInstance_ID;
int no = DB.executeUpdate(sql, trxName);
if (no != 0)
s_log.config("Deleted #" + no);
MCostDetail cd = get (as.getCtx(), "M_ProductionLine_ID=? AND M_AttributeSetInstance_ID=?",
M_ProductionLine_ID, M_AttributeSetInstance_ID, trxName);
//
if (cd == null) // createNew
{
cd = new MCostDetail (as, AD_Org_ID,
M_Product_ID, M_AttributeSetInstance_ID,
M_CostElement_ID,
Amt, Qty, Description, trxName);
cd.setM_ProductionLine_ID(M_ProductionLine_ID);
}
else
{
cd.setDeltaAmt(cd.getAmt().subtract(Amt));
cd.setDeltaQty(cd.getQty().subtract(Qty));
if (cd.isDelta())
cd.setProcessed(false);
else
return true; // nothing to do
}
boolean ok = cd.save();
if (ok && !cd.isProcessed())
{
MClient client = MClient.get(as.getCtx(), as.getAD_Client_ID());
if (client.isCostImmediate())
cd.process();
}
s_log.config("(" + ok + ") " + cd);
return ok;
} // createProduction
/**************************************************************************
* Get Cost Detail
* @param ctx context
* @param whereClause where clause
* @param ID 1st parameter
* @param ID2 2nd parameter
* @param trxName trx
* @return cost detail
*/
private static MCostDetail get (Properties ctx, String whereClause,
int ID, int ID2, String trxName)
{
String sql = "SELECT * FROM M_CostDetail WHERE " + whereClause;
MCostDetail retValue = null;
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt (1, ID);
pstmt.setInt (2, ID2);
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
retValue = new MCostDetail (ctx, rs, trxName);
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql + " - " + ID, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
return retValue;
} // get
/**
* Process Cost Details for product
* @param product product
* @param trxName
*/
public static boolean processProduct (MProduct product, String trxName)
{
String sql = "SELECT * FROM M_CostDetail "
+ "WHERE M_Product_ID=?"
+ " AND Processed='N' "
+ "ORDER BY C_AcctSchema_ID, M_CostElement_ID, AD_Org_ID, M_AttributeSetInstance_ID, Created";
int counterOK = 0;
int counterError = 0;
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, trxName);
pstmt.setInt (1, product.getM_Product_ID());
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
{
MCostDetail cd = new MCostDetail(product.getCtx(), rs, trxName);
if (cd.process()) // saves
counterOK++;
else
counterError++;
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql, e);
counterError++;
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
s_log.config("OK=" + counterOK + ", Errors=" + counterError);
return counterError == 0;
} // processProduct
/** Logger */
private static CLogger s_log = CLogger.getCLogger (MCostDetail.class);
/**************************************************************************
* Standard Constructor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -