📄 mcost.java
字号:
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(11);
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);
if (price == null && price.signum() == 0)
price = rs.getBigDecimal(5);
int C_Currency_ID = rs.getInt(6);
Timestamp DateAcct = rs.getTimestamp(7);
int C_ConversionType_ID = rs.getInt(8);
int Client_ID = rs.getInt(9);
int Org_ID = rs.getInt(10);
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;
} // calculateAveragePO
/**
* Calculate FiFo Cost
* @param product product
* @param M_AttributeSetInstance_ID asi
* @param as acct schema
* @param AD_Org_ID org
* @return costs or null
*/
public static BigDecimal calculateFiFo (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;
//
int oldTransaction_ID = 0;
ArrayList<QtyCost> fifo = new ArrayList<QtyCost>();
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 movementQty = rs.getBigDecimal(1);
int M_Transaction_ID = rs.getInt(10);
if (M_Transaction_ID == oldTransaction_ID)
continue; // assuming same price for receipt
M_Transaction_ID = oldTransaction_ID;
//
BigDecimal matchQty = rs.getBigDecimal(2);
if (matchQty == null) // out (negative)
{
if (fifo.size() > 0)
{
QtyCost pp = (QtyCost)fifo.get(0);
pp.Qty = pp.Qty.add(movementQty);
BigDecimal remainder = pp.Qty;
if (remainder.signum() == 0)
fifo.remove(0);
else
{
while (remainder.signum() != 0)
{
if (fifo.size() == 1) // Last
{
pp.Cost = Env.ZERO;
remainder = Env.ZERO;
}
else
{
fifo.remove(0);
pp = (QtyCost)fifo.get(0);
pp.Qty = pp.Qty.add(movementQty);
remainder = pp.Qty;
}
}
}
}
else
{
QtyCost pp = new QtyCost (movementQty, Env.ZERO);
fifo.add(pp);
}
s_log.finer("Movement=" + movementQty + ", Size=" + fifo.size());
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);
// Add Stock
boolean used = false;
if (fifo.size() == 1)
{
QtyCost pp = (QtyCost)fifo.get(0);
if (pp.Qty.signum() < 0)
{
pp.Qty = pp.Qty.add(movementQty);
if (pp.Qty.signum() == 0)
fifo.remove(0);
else
pp.Cost = cost;
used = true;
}
}
if (!used)
{
QtyCost pp = new QtyCost (movementQty, cost);
fifo.add(pp);
}
s_log.finer("Movement=" + movementQty + ", Size=" + fifo.size());
}
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 (fifo.size() == 0)
return null;
QtyCost pp = (QtyCost)fifo.get(0);
s_log.finer(product.getName() + " = " + pp.Cost);
return pp.Cost;
} // calculateFiFo
/**
* Calculate LiFo costs
* @param product product
* @param M_AttributeSetInstance_ID asi
* @param as acct schema
* @param AD_Org_ID org
* @return costs or null
*/
public static BigDecimal calculateLiFo (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=?";
// Starting point?
sql += " ORDER BY t.M_Transaction_ID DESC";
PreparedStatement pstmt = null;
//
int oldTransaction_ID = 0;
ArrayList<QtyCost> lifo = new ArrayList<QtyCost>();
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 movementQty = rs.getBigDecimal(1);
int M_Transaction_ID = rs.getInt(10);
if (M_Transaction_ID == oldTransaction_ID)
continue; // assuming same price for receipt
M_Transaction_ID = oldTransaction_ID;
//
BigDecimal matchQty = rs.getBigDecimal(2);
if (matchQty == null) // out (negative)
{
if (lifo.size() > 0)
{
QtyCost pp = (QtyCost)lifo.get(lifo.size()-1);
pp.Qty = pp.Qty.add(movementQty);
BigDecimal remainder = pp.Qty;
if (remainder.signum() == 0)
lifo.remove(lifo.size()-1);
else
{
while (remainder.signum() != 0)
{
if (lifo.size() == 1) // Last
{
pp.Cost = Env.ZERO;
remainder = Env.ZERO;
}
else
{
lifo.remove(lifo.size()-1);
pp = (QtyCost)lifo.get(lifo.size()-1);
pp.Qty = pp.Qty.add(movementQty);
remainder = pp.Qty;
}
}
}
}
else
{
QtyCost pp = new QtyCost (movementQty, Env.ZERO);
lifo.add(pp);
}
s_log.finer("Movement=" + movementQty + ", Size=" + lifo.size());
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);
//
QtyCost pp = new QtyCost (movementQty, cost);
lifo.add(pp);
s_log.finer("Movement=" + movementQty + ", Size=" + lifo.size());
}
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 (lifo.size() == 0)
return null;
QtyCost pp = (QtyCost)lifo.get(lifo.size()-1);
s_log.finer(product.getName() + " = " + pp.Cost);
return pp.Cost;
} // calculateLiFo
/**************************************************************************
* MCost Qty-Cost Pair
*/
static class QtyCost
{
public QtyCost (BigDecimal qty, BigDecimal cost)
{
Qty = qty;
Cost = cost;
}
public BigDecimal Qty;
public BigDecimal Cost;
/**
* String Representation
* @return info
*/
public String toString ()
{
StringBuffer sb = new StringBuffer ("Qty=").append(Qty)
.append (",Cost=").append (Cost);
return sb.toString ();
} // toString
} // QtyCost
/**
* Get/Create Cost Record.
* CostingLevel is not validated
* @param product product
* @param M_AttributeSetInstance_ID costing level asi
* @param as accounting schema
* @param AD_Org_ID costing level org
* @param M_CostElement_ID element
* @return cost price or null
*/
public static MCost get (MProduct product, int M_AttributeSetInstance_ID,
MAcctSchema as, int AD_Org_ID, int M_CostElement_ID)
{
MCost cost = null;
String sql = "SELECT * "
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -