Author: lektran
Date: Fri May 4 16:28:32 2007 New Revision: 535415 URL: http://svn.apache.org/viewvc?view=rev&rev=535415 Log: Further support for calculating tax to 3 decimal places: - Removed premature rounding from the order and invoices services - Changed InvoiceItem to use currency-precise instead of currency-amount Note: the UI is still displaying currency amounts to 2 decimal places so until that is changed an order/invoice total may not match the sum of the various items/adjustments displayed. Modified: ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java Modified: ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml?view=diff&rev=535415&r1=535414&r2=535415 ============================================================================== --- ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml (original) +++ ofbiz/trunk/applications/accounting/entitydef/entitymodel.xml Fri May 4 16:28:32 2007 @@ -1031,7 +1031,7 @@ <field name="uomId" type="id"></field> <field name="taxableFlag" type="indicator"></field> <field name="quantity" type="floating-point"></field> - <field name="amount" type="currency-amount"></field> + <field name="amount" type="currency-precise"></field> <field name="description" type="description"></field> <field name="taxAuthPartyId" type="id-ne"/> <field name="taxAuthGeoId" type="id-ne"/> Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java?view=diff&rev=535415&r1=535414&r2=535415 ============================================================================== --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java (original) +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java Fri May 4 16:28:32 2007 @@ -104,7 +104,7 @@ private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals"); private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding"); private static int taxDecimals = UtilNumber.getBigDecimalScale("salestax.calc.decimals"); - private static int taxRounding = UtilNumber.getBigDecimalScale("salestax.rounding"); + private static int taxRounding = UtilNumber.getBigDecimalRoundingMode("salestax.rounding"); public static final int taxCalcScale = UtilNumber.getBigDecimalScale("salestax.calc.decimals"); private static final int INVOICE_ITEM_SEQUENCE_ID_DIGITS = 5; // this is the number of digits used for invoiceItemSeqId: 00001, 00002... @@ -510,7 +510,12 @@ // set decimals = 100 means we don't round this intermediate value, which is very important amount = adj.getBigDecimal("amount").divide(originalOrderItem.getBigDecimal("quantity"), 100, rounding); amount = amount.multiply(billingQuantity); - amount = amount.setScale(decimals, rounding); + // Tax needs to be rounded differently from other order adjustments + if (adj.getString("orderAdjustmentTypeId").equals("SALES_TAX")) { + amount = amount.setScale(taxDecimals, taxRounding); + } else { + amount = amount.setScale(decimals, rounding); + } } else if (adj.get("sourcePercentage") != null) { // pro-rate the amount @@ -566,7 +571,7 @@ } // this adjustment amount - BigDecimal thisAdjAmount = new BigDecimal(amount.doubleValue()).setScale(decimals, rounding); + BigDecimal thisAdjAmount = new BigDecimal(amount.doubleValue()); // adjustments only apply to totals when they are not tax or shipping adjustments if (!"SALES_TAX".equals(adj.getString("orderAdjustmentTypeId")) && Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java?view=diff&rev=535415&r1=535414&r2=535415 ============================================================================== --- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java (original) +++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceWorker.java Fri May 4 16:28:32 2007 @@ -45,6 +45,8 @@ private static BigDecimal ZERO = new BigDecimal("0"); private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals"); private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding"); + private static int taxDecimals = UtilNumber.getBigDecimalScale("salestax.calc.decimals"); + private static int taxRounding = UtilNumber.getBigDecimalRoundingMode("salestax.rounding"); /** * Method to return the total amount of an invoice @@ -134,6 +136,7 @@ public static BigDecimal getInvoiceTotalBd(GenericValue invoice) { BigDecimal invoiceTotal = ZERO; + BigDecimal invoiceTaxTotal = ZERO; List invoiceItems = null; try { invoiceItems = invoice.getRelated("InvoiceItem"); @@ -150,10 +153,14 @@ amount = ZERO; if (quantity == null) quantity = new BigDecimal("1"); - invoiceTotal = invoiceTotal.add( amount.multiply(quantity)).setScale(decimals,rounding); + if ("ITM_SALES_TAX".equals(invoiceItem.get("invoiceItemTypeId"))) { + invoiceTaxTotal = invoiceTaxTotal.add( amount.multiply(quantity)).setScale(taxDecimals, taxRounding); + } else { + invoiceTotal = invoiceTotal.add( amount.multiply(quantity)).setScale(decimals,rounding); + } } } - return invoiceTotal; + return invoiceTotal.add(invoiceTaxTotal).setScale(decimals, rounding); } /** Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java?view=diff&rev=535415&r1=535414&r2=535415 ============================================================================== --- ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java (original) +++ ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java Fri May 4 16:28:32 2007 @@ -2613,7 +2613,7 @@ Iterator itemIter = UtilMisc.toIterator(orderItems); while (itemIter != null && itemIter.hasNext()) { - result = result.add(getOrderItemTotalBd((GenericValue) itemIter.next(), adjustments)).setScale(scale, rounding); + result = result.add(getOrderItemTotalBd((GenericValue) itemIter.next(), adjustments)); } return result.setScale(scale, rounding); } @@ -2625,7 +2625,7 @@ public static BigDecimal getOrderItemTotalBd(GenericValue orderItem, List adjustments) { // add tax and shipping to subtotal - return getOrderItemSubTotalBd(orderItem, adjustments).add(getOrderItemAdjustmentsTotalBd(orderItem, adjustments, false, true, true)).setScale(scale, rounding); + return getOrderItemSubTotalBd(orderItem, adjustments).add(getOrderItemAdjustmentsTotalBd(orderItem, adjustments, false, true, true)); } /** @deprecated */ @@ -2676,7 +2676,7 @@ Iterator itemIter = UtilMisc.toIterator(orderItems); while (itemIter != null && itemIter.hasNext()) { - result = result.add(getOrderItemAdjustmentsTotalBd((GenericValue) itemIter.next(), adjustments, includeOther, includeTax, includeShipping)).setScale(scale, rounding); + result = result.add(getOrderItemAdjustmentsTotalBd((GenericValue) itemIter.next(), adjustments, includeOther, includeTax, includeShipping)); } return result; } @@ -2729,7 +2729,7 @@ while (adjIt.hasNext()) { GenericValue orderAdjustment = (GenericValue) adjIt.next(); - adjTotal = adjTotal.add(OrderReadHelper.calcItemAdjustmentBd(orderAdjustment, quantity, unitPrice)).setScale(scale, rounding); + adjTotal = adjTotal.add(OrderReadHelper.calcItemAdjustmentBd(orderAdjustment, quantity, unitPrice)); } } return adjTotal; @@ -2774,7 +2774,7 @@ adjustment = adjustment.add(setScaleByType("SALES_TAX".equals(itemAdjustment.get("orderAdjustmentTypeId")), itemAdjustment.getBigDecimal("sourcePercentage").multiply(quantity).multiply(unitPrice).multiply(percentage))); } if (Debug.verboseOn()) Debug.logVerbose("calcItemAdjustment: " + itemAdjustment + ", quantity=" + quantity + ", unitPrice=" + unitPrice + ", adjustment=" + adjustment, module); - return adjustment.setScale(scale, rounding); + return adjustment; } public static BigDecimal calcItemAdjustmentRecurringBd(GenericValue itemAdjustment, BigDecimal quantity, BigDecimal unitPrice) { |
Free forum by Nabble | Edit this page |