svn commit: r574397 - in /ofbiz/trunk/applications/accounting: config/arithmetic.properties src/org/ofbiz/accounting/invoice/InvoiceServices.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r574397 - in /ofbiz/trunk/applications/accounting: config/arithmetic.properties src/org/ofbiz/accounting/invoice/InvoiceServices.java

sichen
Author: sichen
Date: Mon Sep 10 15:53:33 2007
New Revision: 574397

URL: http://svn.apache.org/viewvc?rev=574397&view=rev
Log:
Allow for different levels of precision for sales invoice and purchase invoice amounts

Modified:
    ofbiz/trunk/applications/accounting/config/arithmetic.properties
    ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java

Modified: ofbiz/trunk/applications/accounting/config/arithmetic.properties
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/config/arithmetic.properties?rev=574397&r1=574396&r2=574397&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/config/arithmetic.properties (original)
+++ ofbiz/trunk/applications/accounting/config/arithmetic.properties Mon Sep 10 15:53:33 2007
@@ -27,6 +27,8 @@
 
 # For setting decimal precision and rounding method of operations related to invoices
 invoice.decimals = 2
+invoice.SALES_INVOICE.decimals = 2
+invoice.PURCHASE_INVOICE.decimals = 4
 invoice.rounding = ROUND_HALF_UP
 
 # For setting decimal precision and rounding method of operations related to orders,

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?rev=574397&r1=574396&r2=574397&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/invoice/InvoiceServices.java Mon Sep 10 15:53:33 2007
@@ -196,6 +196,10 @@
                 invoiceType = "PURCHASE_INVOICE";
             }
 
+            // Set the precision depending on the type of invoice
+            int invoiceTypeDecimals = UtilNumber.getBigDecimalScale("invoice." + invoiceType + ".decimals");
+            if (invoiceTypeDecimals == -1) invoiceTypeDecimals = decimals;
+            
             // Make an order read helper from the order
             OrderReadHelper orh = new OrderReadHelper(orderHeader);
 
@@ -418,7 +422,7 @@
                         shippingApplies = true;
                     }
 
-                    BigDecimal billingAmount = orderItem.getBigDecimal("unitPrice").setScale(decimals, rounding);
+                    BigDecimal billingAmount = orderItem.getBigDecimal("unitPrice").setScale(invoiceTypeDecimals, rounding);
                     
                     Map createInvoiceItemContext = FastMap.newInstance();
                     createInvoiceItemContext.put("invoiceId", invoiceId);
@@ -449,18 +453,18 @@
                     }
 
                     // this item total
-                    BigDecimal thisAmount = billingAmount.multiply(billingQuantity).setScale(decimals, rounding);
+                    BigDecimal thisAmount = billingAmount.multiply(billingQuantity).setScale(invoiceTypeDecimals, rounding);
 
                     // add to the ship amount only if it applies to this item
                     if (shippingApplies) {
-                        invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAmount).setScale(decimals, rounding);
+                        invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAmount).setScale(invoiceTypeDecimals, rounding);
                     }
 
                     // increment the invoice subtotal
                     invoiceSubTotal = invoiceSubTotal.add(thisAmount).setScale(100, rounding);
 
                     // increment the invoice quantity
-                    invoiceQuantity = invoiceQuantity.add(billingQuantity).setScale(decimals, rounding);
+                    invoiceQuantity = invoiceQuantity.add(billingQuantity).setScale(invoiceTypeDecimals, rounding);
 
                     // create the OrderItemBilling record
                     Map createOrderItemBillingContext = FastMap.newInstance();
@@ -520,7 +524,7 @@
                         if (adj.get("amount") == null) { // JLR 17/4/7 : fix a bug coming from POS in case of use of a discount (on item(s) or sale, item(s) here) and a cash amount higher than total (hence issuing change)
                             continue;
                         }                        
-                        if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(decimals, rounding).abs()) > 0) {
+                        if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).abs()) > 0) {
                             continue;
                         }
         
@@ -534,7 +538,7 @@
                             if (adj.getString("orderAdjustmentTypeId").equals("SALES_TAX")) {
                                 amount = amount.setScale(taxDecimals, taxRounding);
                             } else {
-                                amount = amount.setScale(decimals, rounding);
+                                amount = amount.setScale(invoiceTypeDecimals, rounding);
                             }
                         } else if (adj.get("sourcePercentage") != null) {
                             // pro-rate the amount
@@ -544,7 +548,7 @@
                             amount = billingAmount.multiply(percent);
                             amount = amount.divide(originalOrderItem.getBigDecimal("quantity"), 100, rounding);
                             amount = amount.multiply(billingQuantity);
-                            amount = amount.setScale(decimals, rounding);
+                            amount = amount.setScale(invoiceTypeDecimals, rounding);
                         }
                         if (amount.signum() != 0) {
                             Map createInvoiceItemAdjContext = FastMap.newInstance();
@@ -615,7 +619,7 @@
     
                                 // add to the ship amount only if it applies to this item
                                 if (shippingApplies) {
-                                    invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAdjAmount).setScale(decimals, rounding);
+                                    invoiceShipProRateAmount = invoiceShipProRateAmount.add(thisAdjAmount).setScale(invoiceTypeDecimals, rounding);
                                 }
                             }
     
@@ -640,7 +644,7 @@
                 BigDecimal adjAlreadyInvoicedAmount = null;
                 try {
                     Map checkResult = dispatcher.runSync("calculateInvoicedAdjustmentTotal", UtilMisc.toMap("orderAdjustment", adj));
-                    adjAlreadyInvoicedAmount = ((BigDecimal) checkResult.get("invoicedTotal")).setScale(decimals, rounding);
+                    adjAlreadyInvoicedAmount = ((BigDecimal) checkResult.get("invoicedTotal")).setScale(invoiceTypeDecimals, rounding);
                 } catch (GenericServiceException e) {
                     String errMsg = UtilProperties.getMessage(resource, "AccountingTroubleCallingCalculateInvoicedAdjustmentTotalService", locale);
                     Debug.logError(e, errMsg, module);
@@ -652,7 +656,7 @@
                 if (null == adj.get("amount")) { // JLR 17/4/7 : fix a bug coming from POS in case of use of a discount (on item(s) or sale, sale here) and a cash amount higher than total (hence issuing change)
                     continue;
                 }
-                if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(decimals, rounding).abs()) > 0) {
+                if (adjAlreadyInvoicedAmount.abs().compareTo(adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).abs()) > 0) {
                     continue;
                 }
 
@@ -664,7 +668,7 @@
                     // these will effect the shipping pro-rate (unless commented)
                     // other adjustment type
                     BigDecimal adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            orderSubTotal, invoiceSubTotal, adj.getBigDecimal("amount").setScale(decimals, rounding), decimals, rounding, userLogin, dispatcher, locale);
+                            orderSubTotal, invoiceSubTotal, adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding), invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
                     // invoiceShipProRateAmount += adjAmount;
                     // do adjustments compound or are they based off subtotal? Here we will (unless commented)
                     // invoiceSubTotal += adjAmount;
@@ -690,9 +694,9 @@
                     
                     // The base amount in this case is the adjustment amount minus the total already invoiced for that adjustment, since
                     //  it won't be prorated
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(decimals, rounding).subtract(adjAlreadyInvoicedAmount);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).subtract(adjAlreadyInvoicedAmount);
                     BigDecimal adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            divisor, multiplier, baseAmount, decimals, rounding, userLogin, dispatcher, locale);
+                            divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
                 } else {
 
                     // Pro-rate the shipping amount based on shippable information
@@ -700,9 +704,9 @@
                     BigDecimal multiplier = invoiceShipProRateAmount;
                     
                     // The base amount in this case is the adjustment amount, since we want to prorate based on the full amount
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(decimals, rounding);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding);
                     BigDecimal adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            divisor, multiplier, baseAmount, decimals, rounding, userLogin, dispatcher, locale);
+                            divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
                 }
 
                 // Increment the counter
@@ -730,9 +734,9 @@
                     // The base amount in this case is the adjustment amount minus the total already invoiced for that adjustment, since
                     //  it won't be prorated
                     //  Note this should use invoice decimals & rounding instead of taxDecimals and taxRounding for tax adjustments, because it will be added to the invoice
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(decimals, rounding).subtract(adjAlreadyInvoicedAmount);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding).subtract(adjAlreadyInvoicedAmount);
                     adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                             divisor, multiplier, baseAmount, decimals, rounding, userLogin, dispatcher, locale);
+                             divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
                 } else {
 
                     // Pro-rate the tax amount based on shippable information
@@ -741,11 +745,11 @@
                     
                     // The base amount in this case is the adjustment amount, since we want to prorate based on the full amount
                     //  Note this should use invoice decimals & rounding instead of taxDecimals and taxRounding for tax adjustments, because it will be added to the invoice
-                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(decimals, rounding);
+                    BigDecimal baseAmount = adj.getBigDecimal("amount").setScale(invoiceTypeDecimals, rounding);
                     adjAmount = calcHeaderAdj(delegator, adj, invoiceType, invoiceId, invoiceItemSeqId,
-                            divisor, multiplier, baseAmount, decimals, rounding, userLogin, dispatcher, locale);
+                            divisor, multiplier, baseAmount, invoiceTypeDecimals, rounding, userLogin, dispatcher, locale);
                 }
-                invoiceSubTotal = invoiceSubTotal.add(adjAmount).setScale(decimals, rounding);                
+                invoiceSubTotal = invoiceSubTotal.add(adjAmount).setScale(invoiceTypeDecimals, rounding);                
 
                 // Increment the counter
                 invoiceItemSeqNum++;