1003754 Landed cost issue -- related to IDEMPIERE-1285. Fix rounding issue with current product cost for average costing.

This commit is contained in:
Heng Sin Low 2014-05-19 14:40:07 +08:00
parent 86207e9729
commit b8c2ed4b2b
2 changed files with 30 additions and 8 deletions

View File

@ -22,6 +22,8 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import org.adempiere.exceptions.AverageCostingZeroQtyException;
@ -826,6 +828,8 @@ public class Doc_Invoice extends Doc
for (int i = 0; i < lcas.length; i++)
totalBase += lcas[i].getBase().doubleValue();
Map<String, BigDecimal> costDetailAmtMap = new HashMap<String, BigDecimal>();
// Create New
MInvoiceLine il = new MInvoiceLine (getCtx(), C_InvoiceLine_ID, getTrxName());
for (int i = 0; i < lcas.length; i++)
@ -878,11 +882,11 @@ public class Doc_Invoice extends Doc
if (estimatedAmt.scale() > as.getCostingPrecision())
{
estimatedAmt.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP);
estimatedAmt = estimatedAmt.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP);
}
BigDecimal costAdjustmentAmt = allocationAmt;
if (estimatedAmt.signum() > 0)
{
{
//get other allocation amt
StringBuilder sql = new StringBuilder("SELECT Sum(Amt) FROM C_LandedCostAllocation WHERE M_InOutLine_ID=? ")
.append("AND C_LandedCostAllocation_ID<>? ")
@ -900,7 +904,7 @@ public class Doc_Invoice extends Doc
}
}
if (estimatedAmt.signum() > 0)
{
{
if (allocationAmt.signum() > 0)
costAdjustmentAmt = allocationAmt.subtract(estimatedAmt);
else if (allocationAmt.signum() < 0)
@ -928,6 +932,12 @@ public class Doc_Invoice extends Doc
if (costDetailAmt.scale() > as.getCostingPrecision())
costDetailAmt = costDetailAmt.setScale(as.getCostingPrecision(), BigDecimal.ROUND_HALF_UP);
String key = lca.getM_Product_ID()+"_"+lca.getM_AttributeSetInstance_ID();
BigDecimal prevAmt = costDetailAmtMap.remove(key);
if (prevAmt != null) {
costDetailAmt = costDetailAmt.add(prevAmt);
}
costDetailAmtMap.put(key, costDetailAmt);
if (!MCostDetail.createInvoice(as, lca.getAD_Org_ID(),
lca.getM_Product_ID(), lca.getM_AttributeSetInstance_ID(),
C_InvoiceLine_ID, lca.getM_CostElement_ID(),
@ -963,6 +973,14 @@ public class Doc_Invoice extends Doc
if (allocationAmt.signum() > 0)
{
if (allocationAmt.scale() > as.getStdPrecision())
{
allocationAmt = allocationAmt.setScale(as.getStdPrecision(), BigDecimal.ROUND_HALF_UP);
}
if (estimatedAmt.scale() > as.getStdPrecision())
{
estimatedAmt = estimatedAmt.setScale(as.getStdPrecision(), BigDecimal.ROUND_HALF_UP);
}
int compare = allocationAmt.compareTo(estimatedAmt);
if (compare > 0)
{

View File

@ -1500,14 +1500,18 @@ public class MCost extends X_M_Cost
throw new AverageCostingNegativeQtyException("Product(ID)="+getM_Product_ID()+", Current Qty="+getCurrentQty()+", Trx Qty="+qty
+", CostElement="+getM_CostElement().getName()+", Schema="+getC_AcctSchema().getName());
}
BigDecimal oldSum = getCurrentCostPrice().multiply(getCurrentQty());
BigDecimal newSum = amt; // is total already
BigDecimal sumAmt = oldSum.add(newSum);
BigDecimal sumQty = getCurrentQty().add(qty);
if (sumQty.signum() != 0)
{
BigDecimal cost = sumAmt.divide(sumQty, getPrecision(), BigDecimal.ROUND_HALF_UP);
BigDecimal oldSum = getCurrentCostPrice().multiply(getCurrentQty());
BigDecimal oldCost = oldSum.divide(sumQty, 12, BigDecimal.ROUND_HALF_UP);
BigDecimal newCost = amt.divide(sumQty, 12, BigDecimal.ROUND_HALF_UP); //amt is total already
BigDecimal cost = oldCost.add(newCost);
if (cost.scale() > (getPrecision()*2))
{
cost = cost.setScale((getPrecision()*2), BigDecimal.ROUND_HALF_UP);
}
setCurrentCostPrice(cost);
}
//