diff --git a/org.adempiere.base/src/org/compiere/model/MInOutLine.java b/org.adempiere.base/src/org/compiere/model/MInOutLine.java index 2489de1d82..0479bda181 100644 --- a/org.adempiere.base/src/org/compiere/model/MInOutLine.java +++ b/org.adempiere.base/src/org/compiere/model/MInOutLine.java @@ -651,8 +651,12 @@ public class MInOutLine extends X_M_InOutLine MInvoiceLine m_il = MInvoiceLine.getOfInOutLine(this); if (m_il == null) { - log.severe("No Invoice Line for: " + this.toString()); - return Env.ZERO; + m_il = MInvoiceLine.getOfInOutLineFromMatchInv(this); + if (m_il == null) + { + log.severe("No Invoice Line for: " + this.toString()); + return Env.ZERO; + } } return this.getMovementQty().multiply(m_il.getPriceActual()); // Actual delivery } diff --git a/org.adempiere.base/src/org/compiere/model/MInvoiceLine.java b/org.adempiere.base/src/org/compiere/model/MInvoiceLine.java index f55d4f5c05..b087747a1e 100644 --- a/org.adempiere.base/src/org/compiere/model/MInvoiceLine.java +++ b/org.adempiere.base/src/org/compiere/model/MInvoiceLine.java @@ -52,7 +52,7 @@ public class MInvoiceLine extends X_C_InvoiceLine /** * */ - private static final long serialVersionUID = -5113860437274708398L; + private static final long serialVersionUID = 6157080330492848409L; /** * Get Invoice Line referencing InOut Line @@ -78,6 +78,29 @@ public class MInvoiceLine extends X_C_InvoiceLine return retValue; } // getOfInOutLine + /** + * Get Invoice Line referencing InOut Line - from MatchInv + * @param sLine shipment line + * @return (first) invoice line + */ + public static MInvoiceLine getOfInOutLineFromMatchInv(MInOutLine sLine) { + if (sLine == null) + return null; + final String whereClause = "C_InvoiceLine_ID IN (SELECT C_InvoiceLine_ID FROM M_MatchInv WHERE M_InOutLine_ID=?)"; + List list = new Query(sLine.getCtx(),I_C_InvoiceLine.Table_Name,whereClause,sLine.get_TrxName()) + .setParameters(sLine.getM_InOutLine_ID()) + .list(); + + MInvoiceLine retValue = null; + if (list.size() > 0) { + retValue = list.get(0); + if (list.size() > 1) + s_log.warning("More than one C_InvoiceLine of " + sLine); + } + + return retValue; + } + /** Static Logger */ private static CLogger s_log = CLogger.getCLogger (MInvoiceLine.class); @@ -1053,9 +1076,9 @@ public class MInvoiceLine extends X_C_InvoiceLine // end MZ if (base.signum() != 0) { - double result = getLineNetAmt().multiply(base).doubleValue(); - result /= total.doubleValue(); - lca.setAmt(result, getPrecision()); + BigDecimal result = getLineNetAmt().multiply(base); + result = result.divide(total, BigDecimal.ROUND_HALF_UP); + lca.setAmt(result.doubleValue(), getPrecision()); } if (!lca.save()){ msgreturn = new StringBuilder("Cannot save line Allocation = ").append(lca); @@ -1079,6 +1102,8 @@ public class MInvoiceLine extends X_C_InvoiceLine lca.setM_Product_ID(iol.getM_Product_ID()); lca.setM_AttributeSetInstance_ID(iol.getM_AttributeSetInstance_ID()); BigDecimal base = iol.getBase(lc.getLandedCostDistribution()); + if (base.signum() == 0) + return "Base value is 0 - " + lc.getLandedCostDistribution(); lca.setBase(base); lca.setAmt(getLineNetAmt()); // MZ Goodwill @@ -1174,9 +1199,9 @@ public class MInvoiceLine extends X_C_InvoiceLine // end MZ if (base.signum() != 0) { - double result = getLineNetAmt().multiply(base).doubleValue(); - result /= total.doubleValue(); - lca.setAmt(result, getPrecision()); + BigDecimal result = getLineNetAmt().multiply(base); + result = result.divide(total, BigDecimal.ROUND_HALF_UP); + lca.setAmt(result.doubleValue(), getPrecision()); } if (!lca.save()){ msgreturn = new StringBuilder("Cannot save line Allocation = ").append(lca);