📄 mcost.java
字号:
}
}
// Still nothing try Purchase Price List
// ....
s_log.fine(product.getName() + " = " + retValue);
return retValue;
} // getSeedCosts
/**
* Get Last Invoice Price in currency
* @param product product
* @param AD_Org_ID org
* @param C_Currency_ID accounting currency
* @return last invoice price in currency
*/
public static BigDecimal getLastInvoicePrice (MProduct product,
int M_ASI_ID, int AD_Org_ID, int C_Currency_ID)
{
BigDecimal retValue = null;
String sql = "SELECT currencyConvert(il.PriceActual, i.C_Currency_ID, ?, i.DateAcct, i.C_ConversionType_ID, il.AD_Client_ID, il.AD_Org_ID) "
// ,il.PriceActual, il.QtyInvoiced, i.DateInvoiced, il.Line
+ "FROM C_InvoiceLine il "
+ " INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID) "
+ "WHERE il.M_Product_ID=?"
+ " AND i.IsSOTrx='N'";
if (AD_Org_ID != 0)
sql += " AND il.AD_Org_ID=?";
else if (M_ASI_ID != 0)
sql += " AND il.M_AttributeSetInstance_ID=?";
sql += " ORDER BY i.DateInvoiced DESC, il.Line DESC";
//
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, product.get_TrxName());
pstmt.setInt (1, C_Currency_ID);
pstmt.setInt (2, product.getM_Product_ID());
if (AD_Org_ID != 0)
pstmt.setInt (3, AD_Org_ID);
else if (M_ASI_ID != 0)
pstmt.setInt(3, M_ASI_ID);
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
retValue = rs.getBigDecimal(1);
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
if (retValue != null)
{
s_log.finer(product.getName() + " = " + retValue);
return retValue;
}
return null;
} // getLastInvoicePrice
/**
* Get Last PO Price in currency
* @param product product
* @param AD_Org_ID org
* @param C_Currency_ID accounting currency
* @return last PO price in currency or null
*/
public static BigDecimal getLastPOPrice (MProduct product,
int M_ASI_ID, int AD_Org_ID, int C_Currency_ID)
{
BigDecimal retValue = null;
String sql = "SELECT currencyConvert(ol.PriceCost, o.C_Currency_ID, ?, o.DateAcct, o.C_ConversionType_ID, ol.AD_Client_ID, ol.AD_Org_ID),"
+ " currencyConvert(ol.PriceActual, o.C_Currency_ID, ?, o.DateAcct, o.C_ConversionType_ID, ol.AD_Client_ID, ol.AD_Org_ID) "
// ,ol.PriceCost,ol.PriceActual, ol.QtyOrdered, o.DateOrdered, ol.Line
+ "FROM C_OrderLine ol"
+ " INNER JOIN C_Order o ON (ol.C_Order_ID=o.C_Order_ID) "
+ "WHERE ol.M_Product_ID=?"
+ " AND o.IsSOTrx='N'";
if (AD_Org_ID != 0)
sql += " AND ol.AD_Org_ID=?";
else if (M_ASI_ID != 0)
sql += " AND t.M_AttributeSetInstance_ID=?";
sql += " ORDER BY o.DateOrdered DESC, ol.Line DESC";
//
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, product.get_TrxName());
pstmt.setInt (1, C_Currency_ID);
pstmt.setInt (2, C_Currency_ID);
pstmt.setInt (3, product.getM_Product_ID());
if (AD_Org_ID != 0)
pstmt.setInt (4, AD_Org_ID);
else if (M_ASI_ID != 0)
pstmt.setInt(4, M_ASI_ID);
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
{
retValue = rs.getBigDecimal(1);
if (retValue == null || retValue.signum() == 0)
retValue = rs.getBigDecimal(2);
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
if (retValue != null)
{
s_log.finer(product.getName() + " = " + retValue);
return retValue;
}
return null;
} // getLastPOPrice
/**
* Get PO Price in currency
* @param product product
* @param C_OrderLine_ID order line
* @param C_Currency_ID accounting currency
* @return last PO price in currency or null
*/
public static BigDecimal getPOPrice (MProduct product, int C_OrderLine_ID, int C_Currency_ID)
{
BigDecimal retValue = null;
String sql = "SELECT currencyConvert(ol.PriceCost, o.C_Currency_ID, ?, o.DateAcct, o.C_ConversionType_ID, ol.AD_Client_ID, ol.AD_Org_ID),"
+ " currencyConvert(ol.PriceActual, o.C_Currency_ID, ?, o.DateAcct, o.C_ConversionType_ID, ol.AD_Client_ID, ol.AD_Org_ID) "
// ,ol.PriceCost,ol.PriceActual, ol.QtyOrdered, o.DateOrdered, ol.Line
+ "FROM C_OrderLine ol"
+ " INNER JOIN C_Order o ON (ol.C_Order_ID=o.C_Order_ID) "
+ "WHERE ol.C_OrderLine_ID=?"
+ " AND o.IsSOTrx='N'";
//
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, product.get_TrxName());
pstmt.setInt (1, C_Currency_ID);
pstmt.setInt (2, C_Currency_ID);
pstmt.setInt (3, C_OrderLine_ID);
ResultSet rs = pstmt.executeQuery ();
if (rs.next ())
{
retValue = rs.getBigDecimal(1);
if (retValue == null || retValue.signum() == 0)
retValue = rs.getBigDecimal(2);
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
if (retValue != null)
{
s_log.finer(product.getName() + " = " + retValue);
return retValue;
}
return null;
} // getPOPrice
/**************************************************************************
* Create costing for client.
* Handles Transaction if not in a transaction
* @param client client
*/
protected static void create (MClient client)
{
MAcctSchema[] ass = MAcctSchema.getClientAcctSchema(client.getCtx(), client.getAD_Client_ID());
String trxName = client.get_TrxName();
String trxNameUsed = trxName;
Trx trx = null;
if (trxName == null)
{
trxNameUsed = Trx.createTrxName("Cost");
trx = Trx.get(trxNameUsed, true);
}
boolean success = true;
// For all Products
String sql = "SELECT * FROM M_Product p "
+ "WHERE AD_Client_ID=?"
+ " AND EXISTS (SELECT * FROM M_CostDetail cd "
+ "WHERE p.M_Product_ID=cd.M_Product_ID AND Processed='N')";
PreparedStatement pstmt = null;
try
{
pstmt = DB.prepareStatement (sql, trxNameUsed);
pstmt.setInt (1, client.getAD_Client_ID());
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
{
MProduct product = new MProduct (client.getCtx(), rs, trxNameUsed);
for (int i = 0; i < ass.length; i++)
{
BigDecimal cost = getCurrentCost(product, 0, ass[i], 0,
null, Env.ONE, 0, false, null); // create non-zero costs
s_log.info(product.getName() + " = " + cost);
}
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
// Transaction
if (trx != null)
{
if (success)
trx.commit();
else
trx.rollback();
}
} // create
/**************************************************************************
* Calculate Average Invoice from Trx
* @param product product
* @param M_AttributeSetInstance_ID optional asi
* @param as acct schema
* @param AD_Org_ID optonal org
* @return average costs or null
*/
public static BigDecimal calculateAverageInv (MProduct product, int M_AttributeSetInstance_ID,
MAcctSchema as, int AD_Org_ID)
{
String sql = "SELECT t.MovementQty, mi.Qty, il.QtyInvoiced, il.PriceActual,"
+ " i.C_Currency_ID, i.DateAcct, i.C_ConversionType_ID, i.AD_Client_ID, i.AD_Org_ID, t.M_Transaction_ID "
+ "FROM M_Transaction t"
+ " INNER JOIN M_MatchInv mi ON (t.M_InOutLine_ID=mi.M_InOutLine_ID)"
+ " INNER JOIN C_InvoiceLine il ON (mi.C_InvoiceLine_ID=il.C_InvoiceLine_ID)"
+ " INNER JOIN C_Invoice i ON (il.C_Invoice_ID=i.C_Invoice_ID) "
+ "WHERE t.M_Product_ID=?";
if (AD_Org_ID != 0)
sql += " AND t.AD_Org_ID=?";
else if (M_AttributeSetInstance_ID != 0)
sql += " AND t.M_AttributeSetInstance_ID=?";
sql += " ORDER BY t.M_Transaction_ID";
PreparedStatement pstmt = null;
BigDecimal newStockQty = Env.ZERO;
//
BigDecimal newAverageAmt = Env.ZERO;
int oldTransaction_ID = 0;
try
{
pstmt = DB.prepareStatement (sql, null);
pstmt.setInt (1, product.getM_Product_ID());
if (AD_Org_ID != 0)
pstmt.setInt (2, AD_Org_ID);
else if (M_AttributeSetInstance_ID != 0)
pstmt.setInt (2, M_AttributeSetInstance_ID);
ResultSet rs = pstmt.executeQuery ();
while (rs.next ())
{
BigDecimal oldStockQty = newStockQty;
BigDecimal movementQty = rs.getBigDecimal(1);
int M_Transaction_ID = rs.getInt(10);
if (M_Transaction_ID != oldTransaction_ID)
newStockQty = oldStockQty.add(movementQty);
M_Transaction_ID = oldTransaction_ID;
//
BigDecimal matchQty = rs.getBigDecimal(2);
if (matchQty == null)
{
s_log.finer("Movement=" + movementQty + ", StockQty=" + newStockQty);
continue;
}
// Assumption: everything is matched
BigDecimal price = rs.getBigDecimal(4);
int C_Currency_ID = rs.getInt(5);
Timestamp DateAcct = rs.getTimestamp(6);
int C_ConversionType_ID = rs.getInt(7);
int Client_ID = rs.getInt(8);
int Org_ID = rs.getInt(9);
BigDecimal cost = MConversionRate.convert(product.getCtx(), price,
C_Currency_ID, as.getC_Currency_ID(),
DateAcct, C_ConversionType_ID, Client_ID, Org_ID);
//
BigDecimal oldAverageAmt = newAverageAmt;
BigDecimal averageCurrent = oldStockQty.multiply(oldAverageAmt);
BigDecimal averageIncrease = matchQty.multiply(cost);
BigDecimal newAmt = averageCurrent.add(averageIncrease);
newAmt = newAmt.setScale(as.getCostingPrecision());
newAverageAmt = newAmt.divide(newStockQty, as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP);
s_log.finer("Movement=" + movementQty + ", StockQty=" + newStockQty
+ ", Match=" + matchQty + ", Cost=" + cost + ", NewAvg=" + newAverageAmt);
}
rs.close ();
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
s_log.log (Level.SEVERE, sql, e);
}
try
{
if (pstmt != null)
pstmt.close ();
pstmt = null;
}
catch (Exception e)
{
pstmt = null;
}
//
if (newAverageAmt != null & newAverageAmt.signum() != 0)
{
s_log.finer(product.getName() + " = " + newAverageAmt);
return newAverageAmt;
}
return null;
} // calculateAverageInv
/**
* Calculate Average PO
* @param product product
* @param M_AttributeSetInstance_ID asi
* @param as acct schema
* @param AD_Org_ID org
* @return costs or null
*/
public static BigDecimal calculateAveragePO (MProduct product, int M_AttributeSetInstance_ID,
MAcctSchema as, int AD_Org_ID)
{
String sql = "SELECT t.MovementQty, mp.Qty, ol.QtyOrdered, ol.PriceCost, ol.PriceActual," // 1..5
+ " o.C_Currency_ID, o.DateAcct, o.C_ConversionType_ID," // 6..8
+ " o.AD_Client_ID, o.AD_Org_ID, t.M_Transaction_ID " // 9..11
+ "FROM M_Transaction t"
+ " INNER JOIN M_MatchPO mp ON (t.M_InOutLine_ID=mp.M_InOutLine_ID)"
+ " INNER JOIN C_OrderLine ol ON (mp.C_OrderLine_ID=ol.C_OrderLine_ID)"
+ " INNER JOIN C_Order o ON (ol.C_Order_ID=o.C_Order_ID) "
+ "WHERE t.M_Product_ID=?";
if (AD_Org_ID != 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -