Index: Doc_MatchInv.java =================================================================== --- Doc_MatchInv.java (revision 7272) +++ Doc_MatchInv.java (working copy) @@ -29,7 +29,9 @@ import org.compiere.model.MInvoice; import org.compiere.model.MInvoiceLine; import org.compiere.model.MMatchInv; +import org.compiere.model.MProduct; import org.compiere.model.ProductCost; +import org.compiere.model.MOrderLine; import org.compiere.util.DB; import org.compiere.util.Env; @@ -205,24 +207,6 @@ { log.fine("Line Net Amt=0 - M_Product_ID=" + getM_Product_ID() + ",Qty=" + getQty() + ",InOutQty=" + m_receiptLine.getMovementQty()); - - // Invoice Price Variance - BigDecimal ipv = dr.getSourceBalance().negate(); - if (ipv.signum() != 0) - { - MInvoice m_invoice = m_invoiceLine.getParent(); - int C_Currency_ID = m_invoice.getC_Currency_ID(); - FactLine pv = fact.createLine(null, - m_pc.getAccount(ProductCost.ACCTTYPE_P_IPV, as), - C_Currency_ID, ipv); - pv.setC_Activity_ID(m_invoiceLine.getC_Activity_ID()); - pv.setC_Campaign_ID(m_invoiceLine.getC_Campaign_ID()); - pv.setC_Project_ID(m_invoiceLine.getC_Project_ID()); - pv.setC_UOM_ID(m_invoiceLine.getC_UOM_ID()); - pv.setUser1_ID(m_invoiceLine.getUser1_ID()); - pv.setUser2_ID(m_invoiceLine.getUser2_ID()); - } - log.fine("IPV=" + ipv + "; Balance=" + fact.getSourceBalance()); facts.add(fact); return facts; } @@ -284,17 +268,66 @@ BigDecimal ipv = cr.getSourceBalance().add(dr.getSourceBalance()).negate(); if (ipv.signum() != 0) { + MProduct product = MProduct.get(getCtx(), getM_Product_ID()); + String costingMethod = product.getCostingMethod(as); MInvoice m_invoice = m_invoiceLine.getParent(); int C_Currency_ID = m_invoice.getC_Currency_ID(); - FactLine pv = fact.createLine(null, - m_pc.getAccount(ProductCost.ACCTTYPE_P_IPV, as), - C_Currency_ID, ipv); - pv.setC_Activity_ID(m_invoiceLine.getC_Activity_ID()); - pv.setC_Campaign_ID(m_invoiceLine.getC_Campaign_ID()); - pv.setC_Project_ID(m_invoiceLine.getC_Project_ID()); - pv.setC_UOM_ID(m_invoiceLine.getC_UOM_ID()); - pv.setUser1_ID(m_invoiceLine.getUser1_ID()); - pv.setUser2_ID(m_invoiceLine.getUser2_ID()); + + // non Standard Costing + if (!MAcctSchema.COSTINGMETHOD_StandardCosting.equals(costingMethod)) + { + FactLine pv = fact.createLine(null, + m_pc.getAccount(ProductCost.ACCTTYPE_P_IPV, as), + C_Currency_ID, ipv); + pv.setC_Activity_ID(m_invoiceLine.getC_Activity_ID()); + pv.setC_Campaign_ID(m_invoiceLine.getC_Campaign_ID()); + pv.setC_Project_ID(m_invoiceLine.getC_Project_ID()); + pv.setC_UOM_ID(m_invoiceLine.getC_UOM_ID()); + pv.setUser1_ID(m_invoiceLine.getUser1_ID()); + pv.setUser2_ID(m_invoiceLine.getUser2_ID()); + + } + else + // Standard Costing + { + // check for real invoice price variance + int C_OrderLine_ID = m_receiptLine.getC_OrderLine_ID(); + MOrderLine orderLine = new MOrderLine(getCtx(), C_OrderLine_ID, getTrxName()); + + BigDecimal ttlPurchasePrice = orderLine.getLineNetAmt().divide(orderLine.getQtyOrdered()) + .multiply(getQty()); + BigDecimal ttlInvoice = m_invoiceLine.getLineNetAmt().divide(m_invoiceLine.getQtyInvoiced()) + .multiply(getQty()); + BigDecimal realIPV = ttlInvoice.subtract(ttlPurchasePrice); + + if (realIPV.compareTo(Env.ZERO) != 0) + { + FactLine rpv = fact.createLine(null, + m_pc.getAccount(ProductCost.ACCTTYPE_P_IPV, as), + C_Currency_ID, realIPV); + rpv.setC_Activity_ID(m_invoiceLine.getC_Activity_ID()); + rpv.setC_Campaign_ID(m_invoiceLine.getC_Campaign_ID()); + rpv.setC_Project_ID(m_invoiceLine.getC_Project_ID()); + rpv.setC_UOM_ID(m_invoiceLine.getC_UOM_ID()); + rpv.setUser1_ID(m_invoiceLine.getUser1_ID()); + rpv.setUser2_ID(m_invoiceLine.getUser2_ID()); + + } + + if (ipv.subtract(realIPV).compareTo(Env.ZERO) != 0) + { + FactLine pv = fact.createLine(null, + getAccount(Doc.ACCTTYPE_PPVOffset, as), + C_Currency_ID, ipv.subtract(realIPV)); + pv.setC_Activity_ID(m_invoiceLine.getC_Activity_ID()); + pv.setC_Campaign_ID(m_invoiceLine.getC_Campaign_ID()); + pv.setC_Project_ID(m_invoiceLine.getC_Project_ID()); + pv.setC_UOM_ID(m_invoiceLine.getC_UOM_ID()); + pv.setUser1_ID(m_invoiceLine.getUser1_ID()); + pv.setUser2_ID(m_invoiceLine.getUser2_ID()); + + } + } } log.fine("IPV=" + ipv + "; Balance=" + fact.getSourceBalance()); // end Bayu