diff --git a/base/src/org/compiere/acct/Fact.java b/base/src/org/compiere/acct/Fact.java index cc1d5af076..0c4c578cd1 100644 --- a/base/src/org/compiere/acct/Fact.java +++ b/base/src/org/compiere/acct/Fact.java @@ -720,7 +720,7 @@ public final class Fact } // Prepare - distribution.distribute(dLine.getAccount(), dLine.getSourceBalance(), dLine.getC_Currency_ID()); + distribution.distribute(dLine.getAccount(), dLine.getSourceBalance(), dLine.getQty(), dLine.getC_Currency_ID()); MDistributionLine[] lines = distribution.getLines(false); for (int j = 0; j < lines.length; j++) { @@ -740,6 +740,7 @@ public final class Fact factLine.setAmtSource(dLine.getC_Currency_ID(), null, dl.getAmt().abs()); else factLine.setAmtSource(dLine.getC_Currency_ID(), dl.getAmt(), null); + factLine.setQty(dl.getQty()); // Convert factLine.convert(); // diff --git a/base/src/org/compiere/acct/FactLine.java b/base/src/org/compiere/acct/FactLine.java index 6ffb1efefe..6da07e2638 100644 --- a/base/src/org/compiere/acct/FactLine.java +++ b/base/src/org/compiere/acct/FactLine.java @@ -106,6 +106,7 @@ public final class FactLine extends X_Fact_Acct reversal.setPostingType(getPostingType()); // reversal.setAmtSource(getC_Currency_ID(), getAmtSourceDr().negate(), getAmtSourceCr().negate()); + reversal.setQty(getQty().negate()); reversal.convert(); reversal.setDescription(description); return reversal; diff --git a/base/src/org/compiere/model/MDistribution.java b/base/src/org/compiere/model/MDistribution.java index 6606a076c1..8726615c3c 100644 --- a/base/src/org/compiere/model/MDistribution.java +++ b/base/src/org/compiere/model/MDistribution.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Product: Adempiere ERP & CRM Smart Business Solution * + * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * @@ -40,7 +40,7 @@ public class MDistribution extends X_GL_Distribution /** * */ - private static final long serialVersionUID = -7136322027476009173L; + private static final long serialVersionUID = -906547096682610205L; /** @@ -355,15 +355,17 @@ public class MDistribution extends X_GL_Distribution * Distribute Amount to Lines * @param acct account * @param Amt amount + * @param Qty * @param C_Currency_ID currency */ - public void distribute (MAccount acct, BigDecimal Amt, int C_Currency_ID) + public void distribute (MAccount acct, BigDecimal Amt, BigDecimal Qty, int C_Currency_ID) { - log.info("distribute - Amt=" + Amt + " - " + acct); + log.info("distribute - Amt=" + Amt + " - Qty=" + Qty + " - " + acct); getLines(false); int precision = MCurrency.getStdPrecision(getCtx(), C_Currency_ID); // First Round BigDecimal total = Env.ZERO; + BigDecimal totalQty = Env.ZERO; int indexBiggest = -1; int indexZeroPercent = -1; for (int i = 0; i < m_lines.length; i++) @@ -374,7 +376,10 @@ public class MDistribution extends X_GL_Distribution dl.setAccount(acct); // Calculate Amount dl.calculateAmt (Amt, precision); + // Calculate Quantity + dl.calculateQty (Qty); total = total.add(dl.getAmt()); + totalQty = totalQty.add(dl.getQty()); // log.fine("distribute - Line=" + dl.getLine() + " - " + dl.getPercent() + "% " + dl.getAmt() + " - Total=" + total); // Remainder if (dl.getPercent().compareTo(Env.ZERO) == 0) @@ -404,6 +409,23 @@ public class MDistribution extends X_GL_Distribution else log.warning("distribute - Remaining Difference=" + difference); } + // Adjust Remainder + BigDecimal differenceQty = Qty.subtract(totalQty); + if (differenceQty.compareTo(Env.ZERO) != 0) + { + if (indexZeroPercent != -1) + { + // log.fine("distribute - Difference=" + difference + " - 0%Line=" + m_lines[indexZeroPercent]); + m_lines[indexZeroPercent].setQty (differenceQty); + } + else if (indexBiggest != -1) + { + // log.fine("distribute - Difference=" + difference + " - MaxLine=" + m_lines[indexBiggest] + " - " + m_lines[indexBiggest].getAmt()); + m_lines[indexBiggest].setQty (m_lines[indexBiggest].getQty().add(differenceQty)); + } + else + log.warning("distribute - Remaining Qty Difference=" + differenceQty); + } // if (CLogMgt.isLevelFinest()) { diff --git a/base/src/org/compiere/model/MDistributionLine.java b/base/src/org/compiere/model/MDistributionLine.java index bad6d4d7dd..b957343fde 100644 --- a/base/src/org/compiere/model/MDistributionLine.java +++ b/base/src/org/compiere/model/MDistributionLine.java @@ -1,5 +1,5 @@ /****************************************************************************** - * Product: Adempiere ERP & CRM Smart Business Solution * + * Product: Adempiere ERP & CRM Smart Business Solution * * Copyright (C) 1999-2006 ComPiere, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * * under the terms version 2 of the GNU General Public License as published * @@ -35,7 +35,7 @@ public class MDistributionLine extends X_GL_DistributionLine /** * */ - private static final long serialVersionUID = -8967296538546883724L; + private static final long serialVersionUID = 6148743556518054326L; /** * Standard Constructor @@ -84,6 +84,8 @@ public class MDistributionLine extends X_GL_DistributionLine private MDistribution m_parent = null; /** The Amount */ private BigDecimal m_amt = null; + /** The Quantity */ + private BigDecimal m_qty = null; /** The Base Account */ private MAccount m_account = null; @@ -164,6 +166,24 @@ public class MDistributionLine extends X_GL_DistributionLine m_amt = amt; } // setAmt + /************************************************************************** + * Get Distribution Quantity + * @return Returns the qty. + */ + public BigDecimal getQty () + { + return m_qty; + } // getQty + + /** + * Set Distribution Quantity + * @param qty The qty to set. + */ + public void setQty (BigDecimal qty) + { + m_qty = qty; + } // setQty + /** * Set Distribution Amount * @param amt The amt to set to be multiplied by percent. @@ -175,7 +195,16 @@ public class MDistributionLine extends X_GL_DistributionLine m_amt = m_amt.divide(Env.ONEHUNDRED, precision, BigDecimal.ROUND_HALF_UP); } // setAmt - + /** + * Set Distribution Quantity + * @param qty The qty to set to be multiplied by percent. + */ + public void calculateQty (BigDecimal qty) + { + m_qty = qty.multiply(getPercent()); + m_qty = m_qty.divide(Env.ONEHUNDRED, BigDecimal.ROUND_HALF_UP); + } // setAmt + /************************************************************************** * Before Save