svn commit: r731851 [4/22] - in /ofbiz/trunk: applications/accounting/entitydef/ applications/accounting/script/org/ofbiz/accounting/finaccount/ applications/accounting/script/org/ofbiz/accounting/fixedasset/ applications/accounting/script/org/ofbiz/ac...

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

svn commit: r731851 [4/22] - in /ofbiz/trunk: applications/accounting/entitydef/ applications/accounting/script/org/ofbiz/accounting/finaccount/ applications/accounting/script/org/ofbiz/accounting/fixedasset/ applications/accounting/script/org/ofbiz/ac...

jonesde
Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java Mon Jan  5 23:13:36 2009
@@ -30,6 +30,7 @@
 import org.ofbiz.accounting.invoice.InvoiceWorker;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
+import org.ofbiz.base.util.ObjectType;
 import org.ofbiz.base.util.StringUtil;
 import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.UtilMisc;
@@ -83,7 +84,7 @@
     /**
      * Authorizes a single order preference with an option to specify an amount. The result map has the Booleans
      * "errors" and "finished" which notify the user if there were any errors and if the authorizatoin was finished.
-     * There is also a List "messages" for the authorization response messages and a Double, "processAmount" as the
+     * There is also a List "messages" for the authorization response messages and a BigDecimal, "processAmount" as the
      * amount processed.
      *
      * TODO: it might be nice to return the paymentGatewayResponseId
@@ -94,12 +95,12 @@
         GenericValue userLogin = (GenericValue) context.get("userLogin");
 
         String orderPaymentPreferenceId = (String) context.get("orderPaymentPreferenceId");
-        Double overrideAmount = (Double) context.get("overrideAmount");
+        BigDecimal overrideAmount = (BigDecimal) context.get("overrideAmount");
 
         // validate overrideAmount if its available
         if (overrideAmount != null) {
-            if (overrideAmount.doubleValue() < 0) return ServiceUtil.returnError("Amount entered (" + overrideAmount + ") is negative.");
-            if (overrideAmount.doubleValue() == 0) return ServiceUtil.returnError("Amount entered (" + overrideAmount + ") is zero.");
+            if (overrideAmount.compareTo(BigDecimal.ZERO) < 0) return ServiceUtil.returnError("Amount entered (" + overrideAmount + ") is negative.");
+            if (overrideAmount.compareTo(BigDecimal.ZERO) == 0) return ServiceUtil.returnError("Amount entered (" + overrideAmount + ") is zero.");
         }
 
         GenericValue orderHeader = null;
@@ -114,9 +115,7 @@
         OrderReadHelper orh = new OrderReadHelper(orderHeader);
 
         // get the total remaining
-        BigDecimal orderGrandTotal = orh.getOrderGrandTotal();
-        orderGrandTotal = orderGrandTotal.setScale(decimals, rounding);
-        double totalRemaining = orderGrandTotal.doubleValue();
+        BigDecimal totalRemaining = orh.getOrderGrandTotal();
 
         // get the process attempts so far
         Long procAttempt = orderPaymentPreference.getLong("processAttempt");
@@ -141,18 +140,18 @@
         }
 
         // use overrideAmount or maxAmount
-        Double transAmount = null;
+        BigDecimal transAmount = null;
         if (overrideAmount != null) {
             transAmount = overrideAmount;
         } else {
-            transAmount = orderPaymentPreference.getDouble("maxAmount");
+            transAmount = orderPaymentPreference.getBigDecimal("maxAmount");
         }
         
         // round this before moving on just in case a funny number made it this far
-        transAmount = (new BigDecimal(transAmount)).setScale(decimals, rounding).doubleValue();
+        transAmount = transAmount.setScale(decimals, rounding);
 
         // if our transaction amount exists and is zero, there's nothing to process, so return
-        if ((transAmount != null) && (transAmount.doubleValue() <= 0)) {
+        if ((transAmount != null) && (transAmount.compareTo(BigDecimal.ZERO) <= 0)) {
             Map results = ServiceUtil.returnSuccess();
             results.put("finished", Boolean.TRUE); // finished is true since there is nothing to do
             results.put("errors", Boolean.FALSE); // errors is false since no error occured
@@ -166,7 +165,7 @@
             // handle the response
             if (authPaymentResult != null) {
                 // not null result means either an approval or decline; null would mean error
-                Double thisAmount = (Double) authPaymentResult.get("processAmount");
+                BigDecimal thisAmount = (BigDecimal) authPaymentResult.get("processAmount");
 
                 // process the auth results
                 try {
@@ -333,9 +332,7 @@
 
         // get the order amounts
         OrderReadHelper orh = new OrderReadHelper(orderHeader);
-        BigDecimal orderGrandTotal = orh.getOrderGrandTotal();
-        orderGrandTotal = orderGrandTotal.setScale(decimals, rounding);
-        double totalRemaining = orderGrandTotal.doubleValue();
+        BigDecimal totalRemaining = orh.getOrderGrandTotal();
 
         // loop through and auth each order payment preference
         int finished = 0;
@@ -383,7 +380,7 @@
             if (((Boolean) results.get("finished")).booleanValue()) finished += 1;
             if (((Boolean) results.get("errors")).booleanValue()) hadError += 1;
             if (results.get("messages") != null) messages.addAll((List) results.get("messages"));
-            if (results.get("processAmount") != null) totalRemaining -= ((Double) results.get("processAmount")).doubleValue();
+            if (results.get("processAmount") != null) totalRemaining = totalRemaining.subtract(((BigDecimal) results.get("processAmount")));
         }
 
         Debug.logInfo("Finished with auth(s) checking results", module);
@@ -410,7 +407,7 @@
     }
 
 
-    private static Map authPayment(LocalDispatcher dispatcher, GenericValue userLogin, OrderReadHelper orh, GenericValue paymentPreference, double totalRemaining, boolean reauth, Double overrideAmount) throws GeneralException {
+    private static Map authPayment(LocalDispatcher dispatcher, GenericValue userLogin, OrderReadHelper orh, GenericValue paymentPreference, BigDecimal totalRemaining, boolean reauth, BigDecimal overrideAmount) throws GeneralException {
         String paymentConfig = null;
         String serviceName = null;
 
@@ -471,31 +468,22 @@
         getBillingInformation(orh, paymentPreference, processContext);
 
         // default charge is totalRemaining
-        double thisAmount = totalRemaining;
+        BigDecimal processAmount = totalRemaining;
 
         // use override or max amount available
         if (overrideAmount != null) {
-            thisAmount = overrideAmount.doubleValue();
+            processAmount = overrideAmount;
         } else if (paymentPreference.get("maxAmount") != null) {
-            thisAmount = paymentPreference.getDouble("maxAmount").doubleValue();
+            processAmount = paymentPreference.getBigDecimal("maxAmount");
         }
 
         // don't authorized more then what is required
-        if (thisAmount > totalRemaining) {
-            thisAmount = totalRemaining;
+        if (processAmount.compareTo(totalRemaining) > 0) {
+            processAmount = totalRemaining;
         }
 
         // format the decimal
-        String currencyFormat = UtilProperties.getPropertyValue("general.properties", "currency.decimal.format", "##0.00");
-        DecimalFormat formatter = new DecimalFormat(currencyFormat);
-        String amountString = formatter.format(thisAmount);
-        Double processAmount = null;
-        try {
-            processAmount = new Double(formatter.parse(amountString).doubleValue());
-        } catch (ParseException e) {
-            Debug.logError(e, "Problems parsing string formatted double to Double", module);
-            throw new GeneralException("ParseException in number format", e);
-        }
+        processAmount = processAmount.setScale(decimals, rounding);
 
         if (Debug.verboseOn()) Debug.logVerbose("Charging amount: " + processAmount, module);
         processContext.put("processAmount", processAmount);
@@ -815,7 +803,7 @@
         GenericValue authTransaction = PaymentGatewayServices.getAuthTransaction(paymentPref);
         Map releaseContext = new HashMap();
         releaseContext.put("orderPaymentPreference", paymentPref);
-        releaseContext.put("releaseAmount", authTransaction.getDouble("amount"));
+        releaseContext.put("releaseAmount", authTransaction.getBigDecimal("amount"));
         releaseContext.put("currency", currency);
         releaseContext.put("paymentConfig", paymentConfig);
         releaseContext.put("userLogin", userLogin);
@@ -1001,11 +989,11 @@
         }
 
         // get the invoice amount (amount to bill)
-        double invoiceTotal = InvoiceWorker.getInvoiceNotApplied(invoice).doubleValue();
+        BigDecimal invoiceTotal = InvoiceWorker.getInvoiceNotApplied(invoice);
         if (Debug.infoOn()) Debug.logInfo("(Capture) Invoice [#" + invoiceId + "] total: " + invoiceTotal, module);
 
         // now capture the order
-        Map serviceContext = UtilMisc.toMap("userLogin", userLogin, "orderId", testOrderId, "invoiceId", invoiceId, "captureAmount", new Double(invoiceTotal));
+        Map serviceContext = UtilMisc.toMap("userLogin", userLogin, "orderId", testOrderId, "invoiceId", invoiceId, "captureAmount", invoiceTotal);
         if (UtilValidate.isNotEmpty(billingAccountId)) {
             serviceContext.put("billingAccountId", billingAccountId);
         }
@@ -1028,8 +1016,7 @@
         String orderId = (String) context.get("orderId");
         String invoiceId = (String) context.get("invoiceId");
         String billingAccountId = (String) context.get("billingAccountId");
-        Double captureAmount = (Double) context.get("captureAmount");
-        BigDecimal amountToCapture = new BigDecimal(captureAmount.doubleValue());
+        BigDecimal amountToCapture = (BigDecimal) context.get("captureAmount");
         amountToCapture = amountToCapture.setScale(decimals, rounding);
 
         // get the order header and payment preferences
@@ -1066,10 +1053,10 @@
         orderGrandTotal = orderGrandTotal.setScale(decimals, rounding);
         BigDecimal totalPayments = PaymentWorker.getPaymentsTotal(orh.getOrderPayments());
         totalPayments = totalPayments.setScale(decimals, rounding);
-        BigDecimal remainingTotalBd = orderGrandTotal.subtract(totalPayments);
-        if (Debug.infoOn()) Debug.logInfo("The Remaining Total for order: " + orderId + " is: " + remainingTotalBd, module);
+        BigDecimal remainingTotal = orderGrandTotal.subtract(totalPayments);
+        if (Debug.infoOn()) Debug.logInfo("The Remaining Total for order: " + orderId + " is: " + remainingTotal, module);
         // The amount to capture cannot be greater than the remaining total
-        amountToCapture = amountToCapture.min(remainingTotalBd);
+        amountToCapture = amountToCapture.min(remainingTotal);
         if (Debug.infoOn()) Debug.logInfo("Actual Expected Capture Amount : " + amountToCapture, module);
 
         // Process billing accounts payments
@@ -1100,7 +1087,7 @@
                     try {
                         captureResult = dispatcher.runSync("captureBillingAccountPayments", UtilMisc.<String, Object>toMap("invoiceId", invoiceId,
                                                                                                           "billingAccountId", billingAccountId,
-                                                                                                          "captureAmount", new Double(amountThisCapture.doubleValue()),
+                                                                                                          "captureAmount", amountThisCapture,
                                                                                                           "orderId", orderId,
                                                                                                           "userLogin", userLogin));
                         if (ServiceUtil.isError(captureResult)) {
@@ -1111,14 +1098,12 @@
                     }
                     if (captureResult != null) {
                         
-                        Double amountCaptured = (Double) captureResult.get("captureAmount");
+                        BigDecimal amountCaptured = (BigDecimal) captureResult.get("captureAmount");
                         Debug.logInfo("Amount captured for order [" + orderId + "] from unapplied payments associated to billing account [" + billingAccountId + "] is: " + amountCaptured, module);
 
-                        // big decimal reference to the capture amount
-                        BigDecimal amountCapturedBd = BigDecimal.valueOf(amountCaptured);
-                        amountCapturedBd = amountCapturedBd.setScale(decimals, rounding);
+                        amountCaptured = amountCaptured.setScale(decimals, rounding);
 
-                        if (amountCapturedBd.compareTo(BigDecimal.ZERO) == 0) {
+                        if (amountCaptured.compareTo(BigDecimal.ZERO) == 0) {
                             continue;
                         }
                         // add the invoiceId to the result for processing
@@ -1130,7 +1115,7 @@
                         // process the capture's results
                         try {
                             // the following method will set on the OrderPaymentPreference:
-                            // maxAmount = amountCapturedBd and
+                            // maxAmount = amountCaptured and
                             // statusId = PAYMENT_RECEIVED
                             processResult(dctx, captureResult, userLogin, paymentPref);
                         } catch (GeneralException e) {
@@ -1139,8 +1124,8 @@
                         }
 
                         // create any splits which are needed
-                        if (authAmount.compareTo(amountCapturedBd) == 1) {
-                            BigDecimal splitAmount = authAmount.subtract(amountCapturedBd);
+                        if (authAmount.compareTo(amountCaptured) > 0) {
+                            BigDecimal splitAmount = authAmount.subtract(amountCaptured);
                             try {
                                 Map splitCtx = UtilMisc.toMap("userLogin", userLogin, "orderPaymentPreference", paymentPref, "splitAmount", splitAmount);
                                 dispatcher.addCommitService("processCaptureSplitPayment", splitCtx, true);
@@ -1203,20 +1188,18 @@
                     amountThisCapture = authAmount;
                 }
 
-                Map captureResult = capturePayment(dctx, userLogin, orh, paymentPref, amountThisCapture.doubleValue());
+                Map captureResult = capturePayment(dctx, userLogin, orh, paymentPref, amountThisCapture);
                 if (captureResult != null && !ServiceUtil.isError(captureResult)) {
                     // credit card processors return captureAmount, but gift certificate processors return processAmount
-                    Double amountCaptured = (Double) captureResult.get("captureAmount");
+                    BigDecimal amountCaptured = (BigDecimal) captureResult.get("captureAmount");
                     if (amountCaptured == null) {
-                        amountCaptured = (Double) captureResult.get("processAmount");
+                        amountCaptured = (BigDecimal) captureResult.get("processAmount");
                     }
 
-                    // big decimal reference to the capture amount
-                    BigDecimal amountCapturedBd = new BigDecimal(amountCaptured.doubleValue());
-                    amountCapturedBd = amountCapturedBd.setScale(decimals, rounding);
+                    amountCaptured = amountCaptured.setScale(decimals, rounding);
 
                     // decrease amount of next payment preference to capture
-                    amountToCapture = amountToCapture.subtract(amountCapturedBd);                
+                    amountToCapture = amountToCapture.subtract(amountCaptured);                
 
                     // add the invoiceId to the result for processing
                     captureResult.put("invoiceId", invoiceId);
@@ -1230,8 +1213,8 @@
                     }
 
                     // create any splits which are needed
-                    if (authAmount.compareTo(amountCapturedBd) == 1) {
-                        BigDecimal splitAmount = authAmount.subtract(amountCapturedBd);
+                    if (authAmount.compareTo(amountCaptured) > 0) {
+                        BigDecimal splitAmount = authAmount.subtract(amountCaptured);
                         try {
                             Map splitCtx = UtilMisc.toMap("userLogin", userLogin, "orderPaymentPreference", paymentPref, "splitAmount", splitAmount);
                             dispatcher.addCommitService("processCaptureSplitPayment", splitCtx, true);
@@ -1298,7 +1281,7 @@
 
             if ("PAYMENT_NOT_AUTH".equals(statusId)) {
                 // authorize the new preference
-                processorResult = authPayment(dispatcher, userLogin, orh, newPref, splitAmount.doubleValue(), false, null);
+                processorResult = authPayment(dispatcher, userLogin, orh, newPref, splitAmount, false, null);
                 if (processorResult != null) {
                     // process the auth results
                     boolean authResult = processResult(dctx, processorResult, userLogin, newPref);
@@ -1328,7 +1311,7 @@
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         String invoiceId = (String) context.get("invoiceId");
         String billingAccountId = (String) context.get("billingAccountId");
-        Double captureAmount = (Double) context.get("captureAmount");
+        BigDecimal captureAmount = (BigDecimal) context.get("captureAmount");
         String orderId = (String) context.get("orderId");
         Map results = ServiceUtil.returnSuccess();
         
@@ -1357,7 +1340,7 @@
             }
             results.put("paymentId", paymentId);
             
-            if (orderId != null && captureAmount.doubleValue() > 0) {
+            if (orderId != null && captureAmount.compareTo(BigDecimal.ZERO) > 0) {
                 // Create a paymentGatewayResponse, if necessary
                 GenericValue order = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId));
                 if (order == null) {
@@ -1411,8 +1394,7 @@
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         String invoiceId = (String) context.get("invoiceId");
         String billingAccountId = (String) context.get("billingAccountId");
-        Double captureAmountDbl = (Double) context.get("captureAmount");
-        BigDecimal captureAmount = new BigDecimal(captureAmountDbl.doubleValue());
+        BigDecimal captureAmount = (BigDecimal) context.get("captureAmount");
         captureAmount = captureAmount.setScale(decimals, rounding);
         String orderId = (String) context.get("orderId");
         BigDecimal capturedAmount = BigDecimal.ZERO;
@@ -1466,15 +1448,15 @@
         }
         capturedAmount = capturedAmount.setScale(decimals, rounding);
         Map results = ServiceUtil.returnSuccess();
-        results.put("captureAmount", new Double(capturedAmount.doubleValue()));
+        results.put("captureAmount", capturedAmount);
         return results;
     }
     
-    private static Map capturePayment(DispatchContext dctx, GenericValue userLogin, OrderReadHelper orh, GenericValue paymentPref, double amount) {
+    private static Map capturePayment(DispatchContext dctx, GenericValue userLogin, OrderReadHelper orh, GenericValue paymentPref, BigDecimal amount) {
         return capturePayment(dctx, userLogin, orh, paymentPref, amount, null);
     }
 
-    private static Map capturePayment(DispatchContext dctx, GenericValue userLogin, OrderReadHelper orh, GenericValue paymentPref, double amount, GenericValue authTrans) {
+    private static Map capturePayment(DispatchContext dctx, GenericValue userLogin, OrderReadHelper orh, GenericValue paymentPref, BigDecimal amount, GenericValue authTrans) {
         LocalDispatcher dispatcher = dctx.getDispatcher();
         // look up the payment configuration settings
         String serviceName = null;
@@ -1545,9 +1527,9 @@
             ModelService captureService = dctx.getModelService(serviceName);
             Set inParams = captureService.getInParamNames();
             if (inParams.contains("captureAmount")) {
-                captureContext.put("captureAmount", new Double(amount));    
+                captureContext.put("captureAmount", amount);    
             } else if (inParams.contains("processAmount")) {
-                captureContext.put("processAmount", new Double(amount));    
+                captureContext.put("processAmount", amount);    
             } else {
                 return ServiceUtil.returnError("Service [" + serviceName + "] does not have a captureAmount or processAmount.  Its parameters are: " + inParams);
             }
@@ -1733,7 +1715,8 @@
             response.set("gatewayScoreResult", context.get("scoreCode"));
 
             // set the auth info
-            response.set("amount", context.get("processAmount"));
+            BigDecimal processAmount = (BigDecimal) context.get("processAmount");
+            response.set("amount", processAmount);
             response.set("referenceNum", context.get("authRefNum"));
             response.set("altReference", context.get("authAltRefNum"));
             response.set("gatewayCode", context.get("authCode"));
@@ -1764,7 +1747,7 @@
                 }
             }
     
-            if (response.getDouble("amount").doubleValue() != ((Double) context.get("processAmount")).doubleValue()) {
+            if (response.getBigDecimal("amount").compareTo((BigDecimal)context.get("processAmount")) != 0) {
                 Debug.logWarning("The authorized amount does not match the max amount : Response - " + response + " : result - " + context, module);
             }
     
@@ -1881,11 +1864,11 @@
 
         LocalDispatcher dispatcher = dctx.getDispatcher();
         Boolean captureResult = (Boolean) result.get("captureResult");
-        Double amount = null;
+        BigDecimal amount = null;
         if (result.get("captureAmount") != null) {
-            amount = (Double) result.get("captureAmount");
+            amount = (BigDecimal) result.get("captureAmount");
         } else if (result.get("processAmount") != null) {
-            amount = (Double) result.get("processAmount");
+            amount = (BigDecimal) result.get("processAmount");
             result.put("captureAmount", amount);
         }
 
@@ -1894,8 +1877,7 @@
         }
 
         // setup the amount big decimal
-        BigDecimal amtBd = new BigDecimal(amount.doubleValue());
-        amtBd = amtBd.setScale(decimals, rounding);
+        amount = amount.setScale(decimals, rounding);
 
         result.put("orderPaymentPreference", paymentPreference);
         result.put("userLogin", userLogin);
@@ -1916,7 +1898,7 @@
         if (!captureResult.booleanValue()) {
             // capture returned false (error)
             try {
-                processReAuthFromCaptureFailure(dctx, result, amtBd, userLogin, paymentPreference);
+                processReAuthFromCaptureFailure(dctx, result, amount, userLogin, paymentPreference);
             } catch (GeneralException e) {
                 // just log this for now (same as previous implementation)
                 Debug.logError(e, module);
@@ -1953,7 +1935,7 @@
         Debug.log("reauth with amount: " + amount, module);
 
         // first re-auth the card
-        Map authPayRes = authPayment(dispatcher, userLogin, orh, paymentPreference, amount.doubleValue(), true, null);
+        Map authPayRes = authPayment(dispatcher, userLogin, orh, paymentPreference, amount, true, null);
         if (authPayRes == null) {
             throw new GeneralException("Null result returned from payment re-authorization");
         }
@@ -1968,7 +1950,7 @@
                 processCaptureResult(dctx, result, userLogin, paymentPreference);
             } else {
                 // no auto-capture; do manual capture now
-                Map capPayRes = capturePayment(dctx, userLogin, orh, paymentPreference, amount.doubleValue(), authTrans);
+                Map capPayRes = capturePayment(dctx, userLogin, orh, paymentPreference, amount, authTrans);
                 if (capPayRes == null) {
                     throw new GeneralException("Problems trying to capture payment (null result)");
                 }
@@ -1995,7 +1977,7 @@
         GenericValue userLogin = (GenericValue) context.get("userLogin");
         String invoiceId = (String) context.get("invoiceId");
         String payTo = (String) context.get("payToPartyId");
-        Double amount = (Double) context.get("captureAmount");
+        BigDecimal amount = (BigDecimal) context.get("captureAmount");
         String serviceType = (String) context.get("serviceTypeEnum");
         String currencyUomId = (String) context.get("currencyUomId");
         boolean captureSuccessful = ((Boolean) context.get("captureResult")).booleanValue();
@@ -2176,7 +2158,7 @@
         GenericValue userLogin = (GenericValue) context.get("userLogin");
 
         GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
-        Double refundAmount = (Double) context.get("refundAmount");
+        BigDecimal refundAmount = (BigDecimal) context.get("refundAmount");
 
         GenericValue orderHeader = null;
         try {
@@ -2211,17 +2193,7 @@
                     return ServiceUtil.returnError("Problems getting billing information");
                 }
 
-                // format the price
-                String currencyFormat = UtilProperties.getPropertyValue("general.properties", "currency.decimal.format", "##0.00");
-                DecimalFormat formatter = new DecimalFormat(currencyFormat);
-                String amountString = formatter.format(refundAmount);
-                Double processAmount = null;
-                try {
-                    processAmount = new Double(formatter.parse(amountString).doubleValue());
-                } catch (ParseException e) {
-                    Debug.logError(e, "Problem parsing amount using DecimalFormat", module);
-                    return ServiceUtil.returnError("Refund processor problems; see logs");
-                }
+                BigDecimal processAmount = refundAmount.setScale(decimals, rounding);
                 serviceContext.put("refundAmount", processAmount);
                 serviceContext.put("userLogin", userLogin);
 
@@ -2258,8 +2230,8 @@
                     // such as having to void the entire original auth amount and re-authorize the new order total.
                     // However, since some legacy services might be non-compliant, so as a safety measure we will
                     // override the original refund amount if the refund response has a positive value
-                    Double actualRefundAmount = (Double) refundResponse.get("refundAmount");
-                    if (actualRefundAmount != null && actualRefundAmount.doubleValue() > 0) {
+                    BigDecimal actualRefundAmount = (BigDecimal) refundResponse.get("refundAmount");
+                    if (actualRefundAmount != null && actualRefundAmount.compareTo(BigDecimal.ZERO) > 0) {
                         refundResCtx.put("refundAmount", refundResponse.get("refundAmount"));
                     }
                     refundResRes = dispatcher.runSync(model.name, refundResCtx);
@@ -2695,7 +2667,7 @@
         String paymentMethodId = (String) context.get("paymentMethodId");
         String productStoreId = (String) context.get("productStoreId");
         String securityCode = (String) context.get("securityCode");
-        Double amount = (Double) context.get("amount");
+        BigDecimal amount = (BigDecimal) context.get("amount");
 
         // check the payment method; verify type
         GenericValue paymentMethod;
@@ -2936,8 +2908,8 @@
         Debug.logInfo("Running credit card verification [" + paymentMethodId + "] (" + amount + ") : " + productStorePaymentProperties + " : " + mode, module);
 
         if (amount != null && amount.length() > 0) {
-            double authAmount = Double.parseDouble(amount);
-            if (authAmount > 0.0) {
+            BigDecimal authAmount = new BigDecimal(amount);
+            if (authAmount.compareTo(BigDecimal.ZERO) > 0) {
                 Map<String, Object> ccAuthContext = FastMap.newInstance();
                 ccAuthContext.put("paymentMethodId", paymentMethodId);
                 ccAuthContext.put("productStoreId", productStoreId);
@@ -2972,11 +2944,11 @@
      */
     public static Map testProcessor(DispatchContext dctx, Map context) {
         Map result = new HashMap();
-        Double processAmount = (Double) context.get("processAmount");
+        BigDecimal processAmount = (BigDecimal) context.get("processAmount");
 
-        if (processAmount != null && processAmount.doubleValue() >= 100.00)
+        if (processAmount != null && processAmount.compareTo(new BigDecimal("100.00")) >= 0)
             result.put("authResult", Boolean.TRUE);
-        if (processAmount != null && processAmount.doubleValue() < 100.00)
+        if (processAmount != null && processAmount.compareTo(new BigDecimal("100.00")) < 0)
             result.put("authResult", Boolean.FALSE);
             result.put("customerRespMsgs", UtilMisc.toList("Sorry this processor requires at least a $100.00 purchase."));
         if (processAmount == null)
@@ -2999,12 +2971,12 @@
      */
     public static Map testProcessorWithCapture(DispatchContext dctx, Map context) {
         Map result = new HashMap();
-        Double processAmount = (Double) context.get("processAmount");
+        BigDecimal processAmount = (BigDecimal) context.get("processAmount");
 
-        if (processAmount != null && processAmount.doubleValue() >= 100.00)
+        if (processAmount != null && processAmount.compareTo(new BigDecimal("100.00")) >= 0)
             result.put("authResult", Boolean.TRUE);
             result.put("captureResult", Boolean.TRUE);
-        if (processAmount != null && processAmount.doubleValue() < 100.00)
+        if (processAmount != null && processAmount.compareTo(new BigDecimal("100.00")) < 0)
             result.put("authResult", Boolean.FALSE);
             result.put("captureResult", Boolean.FALSE);
             result.put("customerRespMsgs", UtilMisc.toList("Sorry this processor requires at least a $100.00 purchase."));
@@ -3095,7 +3067,7 @@
      */
     public static Map alwaysDeclineProcessor(DispatchContext dctx, Map context) {
         Map result = ServiceUtil.returnSuccess();
-        Double processAmount = (Double) context.get("processAmount");
+        BigDecimal processAmount = (BigDecimal) context.get("processAmount");
         Debug.logInfo("Test Processor Declining Credit Card", module);
 
         String refNum = UtilDateTime.nowAsString();
@@ -3114,7 +3086,7 @@
      */
     public static Map alwaysNsfProcessor(DispatchContext dctx, Map context) {
         Map result = ServiceUtil.returnSuccess();
-        Double processAmount = (Double) context.get("processAmount");
+        BigDecimal processAmount = (BigDecimal) context.get("processAmount");
         Debug.logInfo("Test Processor NSF Credit Card", module);
 
         String refNum = UtilDateTime.nowAsString();
@@ -3134,7 +3106,7 @@
      */
     public static Map alwaysBadExpireProcessor(DispatchContext dctx, Map context) {
         Map result = ServiceUtil.returnSuccess();
-        Double processAmount = (Double) context.get("processAmount");
+        BigDecimal processAmount = (BigDecimal) context.get("processAmount");
         Debug.logInfo("Test Processor Bad Expire Date Credit Card", module);
 
         String refNum = UtilDateTime.nowAsString();
@@ -3170,7 +3142,7 @@
      */
     public static Map alwaysBadCardNumberProcessor(DispatchContext dctx, Map context) {
         Map result = ServiceUtil.returnSuccess();
-        Double processAmount = (Double) context.get("processAmount");
+        BigDecimal processAmount = (BigDecimal) context.get("processAmount");
         Debug.logInfo("Test Processor Bad Card Number Credit Card", module);
 
         String refNum = UtilDateTime.nowAsString();
@@ -3229,7 +3201,7 @@
      */
     public static Map testCCProcessorCaptureAlwaysDecline(DispatchContext dctx, Map context) {
         Map result = ServiceUtil.returnSuccess();
-        Double processAmount = (Double) context.get("captureAmount");
+        BigDecimal processAmount = (BigDecimal) context.get("captureAmount");
         Debug.logInfo("Test Processor Declining Credit Card capture", module);
 
         String refNum = UtilDateTime.nowAsString();

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentWorker.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentWorker.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentWorker.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentWorker.java Mon Jan  5 23:13:36 2009
@@ -233,13 +233,13 @@
     /**
      * Method to return the total amount of an payment which is applied to a payment
      * @param payment GenericValue object of the Payment
-     * @return the applied total as double
+     * @return the applied total as BigDecimal
      */
-    public static double getPaymentApplied(GenericDelegator delegator, String paymentId) {
-        return getPaymentAppliedBd(delegator, paymentId, false).doubleValue();
+    public static BigDecimal getPaymentApplied(GenericDelegator delegator, String paymentId) {
+        return getPaymentApplied(delegator, paymentId, false);
     }
     
-    public static BigDecimal getPaymentAppliedBd(GenericDelegator delegator, String paymentId, Boolean actual) {
+    public static BigDecimal getPaymentApplied(GenericDelegator delegator, String paymentId, Boolean actual) {
         if (delegator == null) {
             throw new IllegalArgumentException("Null delegator is not allowed in this method");
         }
@@ -255,7 +255,7 @@
             throw new IllegalArgumentException("The paymentId passed does not match an existing payment");
         }
         
-        return getPaymentAppliedBd(payment, actual);
+        return getPaymentApplied(payment, actual);
     }
     /**
      * Method to return the amount applied converted to the currency of payment
@@ -286,19 +286,10 @@
     /**
      * Method to return the total amount of an payment which is applied to a payment
      * @param payment GenericValue object of the Payment
-     * @return the applied total as double
-     */
-    public static double getPaymentApplied(GenericValue payment) {
-        return getPaymentAppliedBd(payment).doubleValue();
-    }
-
-    /**
-     * Method to return the total amount of an payment which is applied to a payment
-     * @param payment GenericValue object of the Payment
      * @return the applied total as BigDecimal in the currency of the payment
      */
-    public static BigDecimal getPaymentAppliedBd(GenericValue payment) {
-     return getPaymentAppliedBd(payment, false);
+    public static BigDecimal getPaymentApplied(GenericValue payment) {
+     return getPaymentApplied(payment, false);
     }
     
     /**
@@ -307,7 +298,7 @@
      * @param false for currency of the payment, true for the actual currency
      * @return the applied total as BigDecimal in the currency of the payment
      */
-    public static BigDecimal getPaymentAppliedBd(GenericValue payment, Boolean actual) {
+    public static BigDecimal getPaymentApplied(GenericValue payment, Boolean actual) {
         BigDecimal paymentApplied = BigDecimal.ZERO;
         List paymentApplications = null;
         try {
@@ -337,28 +328,20 @@
         }
         return paymentApplied;        
     }
-    public static double getPaymentNotApplied(GenericValue payment) {
-        return getPaymentNotAppliedBd(payment).doubleValue();
-    }
-
-    public static BigDecimal getPaymentNotAppliedBd(GenericValue payment) {
-        return payment.getBigDecimal("amount").subtract(getPaymentAppliedBd(payment)).setScale(decimals,rounding);
+    public static BigDecimal getPaymentNotApplied(GenericValue payment) {
+        return payment.getBigDecimal("amount").subtract(getPaymentApplied(payment)).setScale(decimals,rounding);
     }
-    public static BigDecimal getPaymentNotAppliedBd(GenericValue payment, Boolean actual) {
+    public static BigDecimal getPaymentNotApplied(GenericValue payment, Boolean actual) {
      if (actual.equals(Boolean.TRUE) && UtilValidate.isNotEmpty(payment.getBigDecimal("actualCurrencyAmount"))) {
-     return payment.getBigDecimal("actualCurrencyAmount").subtract(getPaymentAppliedBd(payment, actual)).setScale(decimals,rounding);
+     return payment.getBigDecimal("actualCurrencyAmount").subtract(getPaymentApplied(payment, actual)).setScale(decimals,rounding);
      }
-   return payment.getBigDecimal("amount").subtract(getPaymentAppliedBd(payment)).setScale(decimals,rounding);
+   return payment.getBigDecimal("amount").subtract(getPaymentApplied(payment)).setScale(decimals,rounding);
     }
-    public static double getPaymentNotApplied(GenericDelegator delegator, String paymentId) {
-        return getPaymentNotAppliedBd(delegator,paymentId, false).doubleValue();
+    public static BigDecimal getPaymentNotApplied(GenericDelegator delegator, String paymentId) {
+        return getPaymentNotApplied(delegator,paymentId, false);
     }
 
     public static BigDecimal getPaymentNotApplied(GenericDelegator delegator, String paymentId, Boolean actual) {
-        return getPaymentNotAppliedBd(delegator,paymentId, actual);
-    }
-
-    public static BigDecimal getPaymentNotAppliedBd(GenericDelegator delegator, String paymentId, Boolean actual) {
         if (delegator == null) {
             throw new IllegalArgumentException("Null delegator is not allowed in this method");
         }
@@ -373,6 +356,6 @@
         if (payment == null) {
             throw new IllegalArgumentException("The paymentId passed does not match an existing payment");
         }
-        return payment.getBigDecimal("amount").subtract(getPaymentAppliedBd(delegator,paymentId, actual)).setScale(decimals,rounding);
+        return payment.getBigDecimal("amount").subtract(getPaymentApplied(delegator,paymentId, actual)).setScale(decimals,rounding);
     }
 }

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/tax/TaxAuthorityServices.java Mon Jan  5 23:13:36 2009
@@ -409,7 +409,7 @@
             GenericValue partyTaxInfo = (GenericValue) partyTaxInfos.get(0);
             adjValue.set("customerReferenceId", partyTaxInfo.get("partyTaxId"));
             if ("Y".equals(partyTaxInfo.getString("isExempt"))) {
-                adjValue.set("amount", new Double(0));
+                adjValue.set("amount", BigDecimal.ZERO);
                 adjValue.set("exemptAmount", taxAmount);
                 foundExemption = true;
             }

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/test/FinAccountTests.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/test/FinAccountTests.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/test/FinAccountTests.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/test/FinAccountTests.java Mon Jan  5 23:13:36 2009
@@ -27,6 +27,7 @@
 import org.ofbiz.service.ModelService;
 import org.ofbiz.base.util.UtilMisc;
 
+import java.math.BigDecimal;
 import java.util.Map;
 
 import javolution.util.FastMap;
@@ -65,21 +66,21 @@
     public void testDeposit() throws Exception {
         Map ctx = FastMap.newInstance();
         ctx.put("finAccountId", "TESTACCOUNT1");
-        ctx.put("amount", new Double(100.00));
+        ctx.put("amount", new BigDecimal("100.00"));
         ctx.put("userLogin", userLogin);
         Map resp = dispatcher.runSync("finAccountDeposit", ctx);
-        Double balance = ((Double) resp.get("balance")).doubleValue();
-        assertEquals(balance, 100.00, 0.0);
+        BigDecimal balance = (BigDecimal) resp.get("balance");
+        assertEquals(balance.toPlainString(), "100.00");
     }
 
     public void testWithdraw() throws Exception {
         Map ctx = FastMap.newInstance();
         ctx.put("finAccountId", "TESTACCOUNT1");
-        ctx.put("amount", new Double(50.00));
+        ctx.put("amount", new BigDecimal("50.00"));
         ctx.put("userLogin", userLogin);
         Map resp = dispatcher.runSync("finAccountWithdraw", ctx);
-        Double previousBalance = (Double) resp.get("previousBalance");
-        Double balance = ((Double) resp.get("balance")).doubleValue();
-        assertEquals((balance + 50.00), previousBalance.doubleValue(), 0.0);
+        BigDecimal previousBalance = (BigDecimal) resp.get("previousBalance");
+        BigDecimal balance = ((BigDecimal) resp.get("balance"));
+        assertEquals(balance.add(new BigDecimal("50.00")).toPlainString(), previousBalance.toPlainString());
     }
 }

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/authorizedotnet/AIMPaymentServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/authorizedotnet/AIMPaymentServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/authorizedotnet/AIMPaymentServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/authorizedotnet/AIMPaymentServices.java Mon Jan  5 23:13:36 2009
@@ -28,6 +28,7 @@
 import org.ofbiz.service.ModelService;
 import org.ofbiz.service.ServiceUtil;
 
+import java.math.BigDecimal;
 import java.sql.Timestamp;
 import java.util.*;
 
@@ -212,13 +213,13 @@
 
             if (canDoVoid) {
                 Debug.logWarning("Refund was unsuccessful; will now attempt a VOID transaction.", module);
-                Double authAmountObj = authTransaction.getDouble("amount");
-                Double refundAmountObj = (Double)context.get("refundAmount");
+                BigDecimal authAmountObj = authTransaction.getBigDecimal("amount");
+                BigDecimal refundAmountObj = (BigDecimal)context.get("refundAmount");
 
-                double authAmount = authAmountObj != null? authAmountObj.doubleValue() : 0.0;
-                double refundAmount = refundAmountObj != null? refundAmountObj.doubleValue() : 0.0;
+                BigDecimal authAmount = authAmountObj != null ? authAmountObj : BigDecimal.ZERO;
+                BigDecimal refundAmount = refundAmountObj != null ? refundAmountObj : BigDecimal.ZERO;
 
-                if (authAmount == refundAmount) {
+                if (authAmount.compareTo(refundAmount) == 0) {
                     reply = voidTransaction(authTransaction, context);
                     if (ServiceUtil.isError(reply)) {
                         return reply;
@@ -534,7 +535,7 @@
     private static void buildAuthTransaction(Map params, Properties props, Map AIMRequest) {
         GenericValue cc = (GenericValue)params.get("creditCard");
         String currency = (String) params.get("currency");
-        String amount = ((Double)params.get("processAmount")).toString();
+        String amount = ((BigDecimal)params.get("processAmount")).toString();
         String number = UtilFormatOut.checkNull(cc.getString("cardNumber"));
         String expDate = UtilFormatOut.checkNull(cc.getString("expireDate"));
         String cardSecurityCode = (String) params.get("cardSecurityCode");
@@ -555,7 +556,7 @@
         GenericValue at = (GenericValue)params.get("authTransaction");
         GenericValue cc = (GenericValue)params.get("creditCard");
         String currency = (String) params.get("currency");
-        String amount = ((Double)params.get("captureAmount")).toString();
+        String amount = ((BigDecimal)params.get("captureAmount")).toString();
         String number = UtilFormatOut.checkNull(cc.getString("cardNumber"));
         String expDate = UtilFormatOut.checkNull(cc.getString("expireDate"));
 
@@ -573,7 +574,7 @@
         GenericValue at = (GenericValue)params.get("authTransaction");
         GenericValue cc = (GenericValue)params.get("creditCard");
         String currency = (String) params.get("currency");
-        String amount = ((Double)params.get("refundAmount")).toString();
+        String amount = ((BigDecimal)params.get("refundAmount")).toString();
         String number = UtilFormatOut.checkNull(cc.getString("cardNumber"));
         String expDate = UtilFormatOut.checkNull(cc.getString("expireDate"));
 
@@ -622,10 +623,10 @@
             results.put("authRefNum", ar.getResponseField(AuthorizeResponse.TRANSACTION_ID));
             results.put("cvCode", ar.getResponseField(AuthorizeResponse.CID_RESPONSE_CODE));
             results.put("avsCode", ar.getResponseField(AuthorizeResponse.AVS_RESULT_CODE));
-            results.put("processAmount", new Double(ar.getResponseField(AuthorizeResponse.AMOUNT)));
+            results.put("processAmount", new BigDecimal(ar.getResponseField(AuthorizeResponse.AMOUNT)));
         } else {
             results.put("authCode", ar.getResponseCode());
-            results.put("processAmount", new Double("0.00"));
+            results.put("processAmount", new BigDecimal("0.00"));
             results.put("authRefNum", AuthorizeResponse.ERROR);
 
         }
@@ -643,9 +644,9 @@
 
         if(captureResult.booleanValue()) { //passed
             results.put("captureCode", ar.getResponseField(AuthorizeResponse.AUTHORIZATION_CODE));
-            results.put("captureAmount", new Double(ar.getResponseField(AuthorizeResponse.AMOUNT)));
+            results.put("captureAmount", new BigDecimal(ar.getResponseField(AuthorizeResponse.AMOUNT)));
         } else {
-            results.put("captureAmount", new Double("0.00"));
+            results.put("captureAmount", new BigDecimal("0.00"));
 
         }
 
@@ -663,9 +664,9 @@
 
         if(captureResult.booleanValue()) { //passed
             results.put("refundCode", ar.getResponseField(AuthorizeResponse.AUTHORIZATION_CODE));
-            results.put("refundAmount", new Double(ar.getResponseField(AuthorizeResponse.AMOUNT)));
+            results.put("refundAmount", new BigDecimal(ar.getResponseField(AuthorizeResponse.AMOUNT)));
         } else {
-            results.put("refundAmount", new Double("0.00"));
+            results.put("refundAmount", new BigDecimal("0.00"));
         }
 
         Debug.logInfo("processRefundTransResult: " + results.toString(),module);
@@ -683,9 +684,9 @@
 
         if(captureResult.booleanValue()) { //passed
             results.put("releaseCode", ar.getResponseField(AuthorizeResponse.AUTHORIZATION_CODE));
-            results.put("releaseAmount", new Double(ar.getResponseField(AuthorizeResponse.AMOUNT)));
+            results.put("releaseAmount", new BigDecimal(ar.getResponseField(AuthorizeResponse.AMOUNT)));
         } else {
-            results.put("releaseAmount", new Double("0.00"));
+            results.put("releaseAmount", new BigDecimal("0.00"));
 
         }
 
@@ -709,10 +710,10 @@
             results.put("authRefNum", ar.getResponseField(AuthorizeResponse.TRANSACTION_ID));
             results.put("cvCode", ar.getResponseField(AuthorizeResponse.CID_RESPONSE_CODE));
             results.put("avsCode", ar.getResponseField(AuthorizeResponse.AVS_RESULT_CODE));
-            results.put("processAmount", new Double(ar.getResponseField(AuthorizeResponse.AMOUNT)));
+            results.put("processAmount", new BigDecimal(ar.getResponseField(AuthorizeResponse.AMOUNT)));
         } else {
             results.put("authCode", ar.getResponseCode());
-            results.put("processAmount", new Double("0.00"));
+            results.put("processAmount", new BigDecimal("0.00"));
             results.put("authRefNum", AuthorizeResponse.ERROR);
         }
 

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCPaymentServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCPaymentServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCPaymentServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCPaymentServices.java Mon Jan  5 23:13:36 2009
@@ -26,6 +26,7 @@
 import java.io.OutputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.math.BigDecimal;
 
 import javax.xml.parsers.ParserConfigurationException;
 
@@ -48,11 +49,14 @@
 public class CCPaymentServices {
 
     public final static String module = CCPaymentServices.class.getName();
+    private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
+    private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
+
 
     public static Map ccAuth(DispatchContext dctx, Map context) {
         String ccAction = (String) context.get("ccAction");
         if (ccAction == null) ccAction = new String("PreAuth");
-        Document authRequestDoc = buildPrimaryTxRequest(context, ccAction, (Double) context.get("processAmount"),
+        Document authRequestDoc = buildPrimaryTxRequest(context, ccAction, (BigDecimal) context.get("processAmount"),
                 (String) context.get("orderId"));
 
         Document authResponseDoc = null;
@@ -65,7 +69,7 @@
         if (getMessageListMaxSev(authResponseDoc) > 4) {  // 5 and higher, process error from HSBC
             Map result = ServiceUtil.returnSuccess();
             result.put("authResult", new Boolean(false));
-            result.put("processAmount", new Double(0.00));
+            result.put("processAmount", new BigDecimal("0.00"));
             result.put("authRefNum", getReferenceNum(authResponseDoc));
             List messages = getMessageList(authResponseDoc);
             if (UtilValidate.isNotEmpty(messages)) {
@@ -83,7 +87,7 @@
             action = new String("Auth");  // required for periodic billing....
         }
 
-        Document creditRequestDoc = buildPrimaryTxRequest(context, action, (Double) context.get("creditAmount"),
+        Document creditRequestDoc = buildPrimaryTxRequest(context, action, (BigDecimal) context.get("creditAmount"),
                 (String) context.get("referenceCode"));
         Document creditResponseDoc = null;
         try {
@@ -95,7 +99,7 @@
         if (getMessageListMaxSev(creditResponseDoc) > 4) {
             Map result = ServiceUtil.returnSuccess();
             result.put("creditResult", new Boolean(false));
-            result.put("creditAmount", new Double(0.00));
+            result.put("creditAmount", new BigDecimal("0.00"));
             result.put("creditRefNum", getReferenceNum(creditResponseDoc));
             List messages = getMessageList(creditResponseDoc);
             if (UtilValidate.isNotEmpty(messages)) {
@@ -116,7 +120,7 @@
         }
 
         Document captureRequestDoc = buildSecondaryTxRequest(context, authTransaction.getString("referenceNum"),
-                "PostAuth", (Double) context.get("captureAmount"));
+                "PostAuth", (BigDecimal) context.get("captureAmount"));
 
         Document captureResponseDoc = null;
         try {
@@ -128,7 +132,7 @@
         if (getMessageListMaxSev(captureResponseDoc) > 4) {
             Map result = ServiceUtil.returnSuccess();
             result.put("captureResult", new Boolean(false));
-            result.put("captureAmount", new Double(0.00));
+            result.put("captureAmount", new BigDecimal("0.00"));
             result.put("captureRefNum", getReferenceNum(captureResponseDoc));
             List messages = getMessageList(captureResponseDoc);
             if (UtilValidate.isNotEmpty(messages)) {
@@ -160,7 +164,7 @@
         if (getMessageListMaxSev(releaseResponseDoc) > 4) {
             Map result = ServiceUtil.returnSuccess();
             result.put("releaseResult", new Boolean(false));
-            result.put("releaseAmount", new Double(0.00));
+            result.put("releaseAmount", new BigDecimal("0.00"));
             result.put("releaseRefNum", getReferenceNum(releaseResponseDoc));
             List messages = getMessageList(releaseResponseDoc);
             if (UtilValidate.isNotEmpty(messages)) {
@@ -183,7 +187,7 @@
         Map result = ServiceUtil.returnSuccess();
         result.put("releaseResult", Boolean.valueOf(true));
         result.put("releaseCode", authTransaction.getString("gatewayCode"));
-        result.put("releaseAmount", authTransaction.getDouble("amount"));
+        result.put("releaseAmount", authTransaction.getBigDecimal("amount"));
         result.put("releaseRefNum", authTransaction.getString("referenceNum"));
         result.put("releaseFlag", authTransaction.getString("gatewayFlag"));
         result.put("releaseMessage", "Approved.");
@@ -202,7 +206,7 @@
         // Although refunds are applied to captured transactions, using the auth reference number is ok here
         // Related auth and capture transactions will always have the same reference number
         Document refundRequestDoc = buildSecondaryTxRequest(context, authTransaction.getString("referenceNum"),
-                "Credit", (Double) context.get("refundAmount"));
+                "Credit", (BigDecimal) context.get("refundAmount"));
 
         Document refundResponseDoc = null;
         try {
@@ -214,7 +218,7 @@
         if (getMessageListMaxSev(refundResponseDoc) > 4) {
             Map result = ServiceUtil.returnSuccess();
             result.put("refundResult", new Boolean(false));
-            result.put("refundAmount", new Double(0.00));
+            result.put("refundAmount", new BigDecimal("0.00"));
             result.put("refundRefNum", getReferenceNum(refundResponseDoc));
             List messages = getMessageList(refundResponseDoc);
             if (UtilValidate.isNotEmpty(messages)) {
@@ -235,7 +239,7 @@
         }
 
         Document reauthRequestDoc = buildSecondaryTxRequest(context, authTransaction.getString("referenceNum"),
-                "RePreAuth", (Double) context.get("reauthAmount"));
+                "RePreAuth", (BigDecimal) context.get("reauthAmount"));
 
         Document reauthResponseDoc = null;
         try {
@@ -247,7 +251,7 @@
         if (getMessageListMaxSev(reauthResponseDoc) > 4) {
             Map result = ServiceUtil.returnSuccess();
             result.put("reauthResult", new Boolean(false));
-            result.put("reauthAmount", new Double(0.00));
+            result.put("reauthAmount", new BigDecimal("0.00"));
             result.put("reauthRefNum", getReferenceNum(reauthResponseDoc));
             List messages = getMessageList(reauthResponseDoc);
             if (UtilValidate.isNotEmpty(messages)) {
@@ -372,10 +376,10 @@
             Element currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
             Element totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
             String authAmountStr = UtilXml.childElementValue(totalsElement, "Total");
-            result.put("processAmount", new Double(Double.parseDouble(authAmountStr) / 100));
+            result.put("processAmount", new BigDecimal(authAmountStr).movePointLeft(2));
         } else {
             result.put("authResult", Boolean.valueOf(false));
-            result.put("processAmount", Double.valueOf("0.00"));
+            result.put("processAmount", new BigDecimal("0.00"));
         }
 
         result.put("authRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
@@ -418,10 +422,10 @@
             Element currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
             Element totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
             String creditAmountStr = UtilXml.childElementValue(totalsElement, "Total");
-            result.put("creditAmount", new Double(Double.parseDouble(creditAmountStr) / 100));
+            result.put("creditAmount", new BigDecimal(creditAmountStr).movePointLeft(2));
         } else {
             result.put("creditResult", Boolean.valueOf(false));
-            result.put("creditAmount", Double.valueOf("0.00"));
+            result.put("creditAmount", new BigDecimal("0.00"));
         }
 
         result.put("creditRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
@@ -452,10 +456,10 @@
             Element currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
             Element totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
             String captureAmountStr = UtilXml.childElementValue(totalsElement, "Total");
-            result.put("captureAmount", new Double(Double.parseDouble(captureAmountStr) / 100));
+            result.put("captureAmount", new BigDecimal(captureAmountStr).movePointLeft(2));
         } else {
             result.put("captureResult", Boolean.valueOf(false));
-            result.put("captureAmount", Double.valueOf("0.00"));
+            result.put("captureAmount", new BigDecimal("0.00"));
         }
 
         result.put("captureRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
@@ -486,10 +490,10 @@
             Element currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
             Element totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
             String releaseAmountStr = UtilXml.childElementValue(totalsElement, "Total");
-            result.put("releaseAmount", new Double(Double.parseDouble(releaseAmountStr) / 100));
+            result.put("releaseAmount", new BigDecimal(releaseAmountStr).movePointLeft(2));
         } else {
             result.put("releaseResult", Boolean.valueOf(false));
-            result.put("releaseAmount", Double.valueOf("0.00"));
+            result.put("releaseAmount", new BigDecimal("0.00"));
         }
 
         result.put("releaseRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
@@ -520,10 +524,10 @@
             Element currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
             Element totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
             String refundAmountStr = UtilXml.childElementValue(totalsElement, "Total");
-            result.put("refundAmount", new Double(Double.parseDouble(refundAmountStr) / 100));
+            result.put("refundAmount", new BigDecimal(refundAmountStr).movePointLeft(2));
         } else {
             result.put("refundResult", Boolean.valueOf(false));
-            result.put("refundAmount", Double.valueOf("0.00"));
+            result.put("refundAmount", new BigDecimal("0.00"));
         }
 
         result.put("refundRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
@@ -554,10 +558,10 @@
             Element currentTotalsElement = UtilXml.firstChildElement(transactionElement, "CurrentTotals");
             Element totalsElement = UtilXml.firstChildElement(currentTotalsElement, "Totals");
             String reauthAmountStr = UtilXml.childElementValue(totalsElement, "Total");
-            result.put("reauthAmount", new Double(Double.parseDouble(reauthAmountStr) / 100));
+            result.put("reauthAmount", new BigDecimal(reauthAmountStr).movePointLeft(2));
         } else {
             result.put("reauthResult", Boolean.valueOf(false));
-            result.put("reauthAmount", Double.valueOf("0.00"));
+            result.put("reauthAmount", new BigDecimal("0.00"));
         }
 
         result.put("reauthRefNum", UtilXml.childElementValue(orderFormElement, "Id"));
@@ -627,7 +631,7 @@
         return referenceNum;
     }
 
-    private static Document buildPrimaryTxRequest(Map context, String type, Double amount, String refNum) {
+    private static Document buildPrimaryTxRequest(Map context, String type, BigDecimal amount, String refNum) {
 
         String paymentConfig = (String) context.get("paymentConfig");
         if (UtilValidate.isEmpty(paymentConfig)) {
@@ -707,7 +711,7 @@
         return requestDocument;
     }
 
-    private static Document buildSecondaryTxRequest(Map context, String id, String type, Double amount) {
+    private static Document buildSecondaryTxRequest(Map context, String id, String type, BigDecimal amount) {
 
         String paymentConfig = (String) context.get("paymentConfig");
         if (UtilValidate.isEmpty(paymentConfig)) {
@@ -781,7 +785,7 @@
         }
     }
 
-    private static void appendTransactionNode(Element element, String type, Double amount, String currencyCode) {
+    private static void appendTransactionNode(Element element, String type, BigDecimal amount, String currencyCode) {
 
         Document document = element.getOwnerDocument();
 
@@ -795,7 +799,7 @@
 
             // DecimalFormat("#") is used here in case the total is something like 9.9999999...
             // in that case, we want to send 999, not 999.9999999...
-            String totalString = new DecimalFormat("#").format(amount.doubleValue() * 100);
+            String totalString = amount.setScale(decimals, rounding).movePointRight(2).toPlainString();
 
             Element totalElement = UtilXml.addChildElementValue(totalsElement, "Total", totalString, document);
             totalElement.setAttribute("DataType", "Money");

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCServicesTest.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCServicesTest.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCServicesTest.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/clearcommerce/CCServicesTest.java Mon Jan  5 23:13:36 2009
@@ -27,6 +27,7 @@
 import java.util.List;
 import java.util.Map;
 import java.lang.Thread;
+import java.math.BigDecimal;
 
 import junit.framework.TestCase;
 
@@ -57,7 +58,7 @@
     protected GenericValue billingAddress = null;
     protected GenericValue shippingAddress = null;
     protected Map pbOrder = null;
-    protected Double creditAmount = null;
+    protected BigDecimal creditAmount = null;
     protected String configFile = null;
     
     public CCServicesTest(String name) {
@@ -70,7 +71,7 @@
 
         // populate test data
         configFile = new String("paymentTest.properties");
-        creditAmount = new Double(234.00);
+        creditAmount = new BigDecimal("234.00");
         emailAddr = delegator.makeValue("ContactMech", UtilMisc.toMap(
                 "infoString","[hidden email]"));
         orderId = new String("testOrder1000");
@@ -115,7 +116,7 @@
                     "shippingAddress", shippingAddress,
                     "orderId", orderId
             );
-            serviceInput.put("processAmount", new Double(200.00));
+            serviceInput.put("processAmount", new BigDecimal("200.00"));
             
             // run the service (make sure in payment
             Map result = dispatcher.runSync("clearCommerceCCAuth",serviceInput);
@@ -147,7 +148,7 @@
                     "creditAmount", creditAmount,
                     "billToEmail", emailAddr,
                     "creditCard", creditCard,
-                    "creditAmount", new Double(200.00)
+                    "creditAmount", new BigDecimal("200.00")
             );
             // run the service
             Map result = dispatcher.runSync("clearCommerceCCCredit",serviceMap);
@@ -181,7 +182,7 @@
                     "creditCard", creditCard,
                     "pbOrder", pbOrder          // if supplied, the crediting is for a subscription and credit by period is managed by ClearCommerce                
             );
-            serviceMap.put("creditAmount", new Double(200.00));
+            serviceMap.put("creditAmount", new BigDecimal("200.00"));
 
             // run the service
             Map result = dispatcher.runSync("clearCommerceCCCredit",serviceMap);

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java Mon Jan  5 23:13:36 2009
@@ -18,6 +18,7 @@
  *******************************************************************************/
 package org.ofbiz.accounting.thirdparty.cybersource;
 
+import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.util.HashMap;
 import java.util.List;
@@ -33,6 +34,7 @@
 import org.ofbiz.base.util.SSLUtil;
 import org.ofbiz.base.util.StringUtil;
 import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilNumber;
 import org.ofbiz.base.util.UtilProperties;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.string.FlexibleStringExpander;
@@ -47,6 +49,8 @@
 public class IcsPaymentServices {
 
     public static final String module = IcsPaymentServices.class.getName();
+    private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
+    private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
 
     // load the JSSE properties
     static {
@@ -520,13 +524,10 @@
                 }
 
                 // get the quantity..
-                Double quantity = item.getDouble("quantity");
+                BigDecimal quantity = item.getBigDecimal("quantity");
 
                 // test quantity if INT pass as is; if not pass as 1
-                long roundQ = Math.round(quantity);
-                Double rounded = new Double(Long.toString(roundQ));
-
-                if (rounded.doubleValue() != quantity.doubleValue()) {
+                if (quantity.scale() > 0) {
                     request.put("item_" + lineNumber + "_quantity", "1");
                 } else {
                     request.put("", Integer.toString(quantity.intValue()));
@@ -539,10 +540,8 @@
     }
 
     private static String getAmountString(Map context, String amountField) {
-        String currencyFormat = UtilProperties.getPropertyValue("general.properties", "currency.decimal.format", "##0.00");
-        DecimalFormat formatter = new DecimalFormat(currencyFormat);
-        Double processAmount = (Double) context.get(amountField);
-        return formatter.format(processAmount);
+        BigDecimal processAmount = (BigDecimal) context.get(amountField);
+        return processAmount.setScale(decimals, rounding).toPlainString();
     }
 
     private static void processAuthResult(Map reply, Map<String, Object> result) {
@@ -557,9 +556,9 @@
         }
 
         if (reply.get("ccAuthReply_amount") != null) {
-            result.put("processAmount", new Double((String) reply.get("ccAuthReply_amount")));
+            result.put("processAmount", new BigDecimal((String) reply.get("ccAuthReply_amount")));
         } else {
-            result.put("processAmount", 0.00);
+            result.put("processAmount", BigDecimal.ZERO);
         }
 
         result.put("authRefNum", reply.get("requestID"));
@@ -583,9 +582,9 @@
         }
 
         if (reply.get("ccCaptureReply_amount") != null) {
-            result.put("captureAmount", new Double((String) reply.get("ccCaptureReply_amount")));
+            result.put("captureAmount", new BigDecimal((String) reply.get("ccCaptureReply_amount")));
         } else {
-            result.put("captureAmount", 0.00);
+            result.put("captureAmount", BigDecimal.ZERO);
         }
 
         result.put("captureRefNum", reply.get("requestID"));
@@ -605,9 +604,9 @@
         }
 
         if (reply.get("ccAuthReversalReply_amount") != null) {
-            result.put("releaseAmount", new Double((String) reply.get("ccAuthReversalReply_amount")));
+            result.put("releaseAmount", new BigDecimal((String) reply.get("ccAuthReversalReply_amount")));
         } else {
-            result.put("releaseAmount", 0.00);
+            result.put("releaseAmount", BigDecimal.ZERO);
         }
 
         result.put("releaseRefNum", reply.get("requestID"));
@@ -627,9 +626,9 @@
         }
 
         if (reply.get("ccCreditReply_amount") != null) {
-            result.put("refundAmount", new Double((String) reply.get("ccCreditReply_amount")));
+            result.put("refundAmount", new BigDecimal((String) reply.get("ccCreditReply_amount")));
         } else {
-            result.put("refundAmount", 0.00);
+            result.put("refundAmount", BigDecimal.ZERO);
         }
 
         result.put("refundRefNum", reply.get("requestID"));
@@ -649,9 +648,9 @@
         }
 
         if (reply.get("ccCreditReply_amount") != null) {
-            result.put("creditAmount", new Double((String) reply.get("ccCreditReply_amount")));
+            result.put("creditAmount", new BigDecimal((String) reply.get("ccCreditReply_amount")));
         } else {
-            result.put("creditAmount", 0.00);
+            result.put("creditAmount", BigDecimal.ZERO);
         }
 
         result.put("creditRefNum", reply.get("requestID"));

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/PcChargeServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/PcChargeServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/PcChargeServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/PcChargeServices.java Mon Jan  5 23:13:36 2009
@@ -23,9 +23,11 @@
 import java.util.List;
 import java.text.DecimalFormat;
 import java.io.IOException;
+import java.math.BigDecimal;
 
 import org.ofbiz.service.DispatchContext;
 import org.ofbiz.service.ServiceUtil;
+import org.ofbiz.base.util.UtilNumber;
 import org.ofbiz.base.util.UtilProperties;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.Debug;
@@ -39,6 +41,8 @@
 public class PcChargeServices {
 
     public static final String module = PcChargeServices.class.getName();
+    private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
+    private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
 
     public static Map ccAuth(DispatchContext dctx, Map context) {
         Properties props = buildPccProperties(context);
@@ -423,10 +427,8 @@
     }
 
     private static String getAmountString(Map context, String amountField) {
-        String currencyFormat = UtilProperties.getPropertyValue("general.properties", "currency.decimal.format", "##0.00");
-        DecimalFormat formatter = new DecimalFormat(currencyFormat);
-        Double processAmount = (Double) context.get(amountField);
-        return formatter.format(processAmount);
+        BigDecimal processAmount = (BigDecimal) context.get(amountField);
+        return processAmount.setScale(decimals, rounding).toPlainString();
     }
 
 }

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/RitaServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/RitaServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/RitaServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/gosoftware/RitaServices.java Mon Jan  5 23:13:36 2009
@@ -22,6 +22,7 @@
 import java.util.Properties;
 import java.util.List;
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.sql.Timestamp;
 
@@ -33,6 +34,7 @@
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilMisc;
 import org.ofbiz.base.util.StringUtil;
+import org.ofbiz.base.util.UtilNumber;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.UtilProperties;
 import org.ofbiz.base.util.UtilDateTime;
@@ -46,6 +48,8 @@
 public class RitaServices {
 
     public static final String module = RitaServices.class.getName();
+    private static int decimals = UtilNumber.getBigDecimalScale("invoice.decimals");
+    private static int rounding = UtilNumber.getBigDecimalRoundingMode("invoice.rounding");
 
     public static Map ccAuth(DispatchContext dctx, Map context) {
         Properties props = buildPccProperties(context);
@@ -524,9 +528,7 @@
     }
 
     private static String getAmountString(Map context, String amountField) {
-        String currencyFormat = UtilProperties.getPropertyValue("general.properties", "currency.decimal.format", "##0.00");
-        DecimalFormat formatter = new DecimalFormat(currencyFormat);
-        Double processAmount = (Double) context.get(amountField);
-        return formatter.format(processAmount);
+        BigDecimal processAmount = (BigDecimal) context.get(amountField);
+        return processAmount.setScale(decimals, rounding).toPlainString();
     }
 }

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/paypal/PayPalEvents.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/paypal/PayPalEvents.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/paypal/PayPalEvents.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/paypal/PayPalEvents.java Mon Jan  5 23:13:36 2009
@@ -22,6 +22,7 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
+import java.math.BigDecimal;
 import java.net.URL;
 import java.net.URLConnection;
 import java.text.ParseException;
@@ -82,7 +83,7 @@
         }
         
         // get the order total
-        String orderTotal = UtilFormatOut.formatPrice(orderHeader.getDouble("grandTotal"));
+        String orderTotal = orderHeader.getBigDecimal("grandTotal").toPlainString();
             
         // get the product store
         GenericValue productStore = ProductStoreWorker.getProductStore(request);
@@ -445,7 +446,7 @@
             authDate = UtilDateTime.nowTimestamp();
         }
 
-        paymentPreference.set("maxAmount", new Double(paymentAmount));
+        paymentPreference.set("maxAmount", new BigDecimal(paymentAmount));
         if (paymentStatus.equals("Completed")) {
             paymentPreference.set("statusId", "PAYMENT_RECEIVED");
         } else if (paymentStatus.equals("Pending")) {
@@ -468,7 +469,7 @@
         response.set("paymentMethodId", paymentPreference.get("paymentMethodId"));
 
         // set the auth info
-        response.set("amount", new Double(paymentAmount));
+        response.set("amount", new BigDecimal(paymentAmount));
         response.set("referenceNum", transactionId);
         response.set("gatewayCode", paymentStatus);
         response.set("gatewayFlag", paymentStatus.substring(0,1));

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkApi.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkApi.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkApi.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkApi.java Mon Jan  5 23:13:36 2009
@@ -18,6 +18,7 @@
  *******************************************************************************/
 package org.ofbiz.accounting.thirdparty.valuelink;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.security.InvalidAlgorithmParameterException;
 import java.security.InvalidKeyException;
@@ -664,42 +665,27 @@
 
     /**
      * Returns a ValueLink formatted amount String
-     * @param amount Double value to format
+     * @param amount BigDecimal value to format
      * @return Formatted String
      */
-    public String getAmount(Double amount) {
+    public String getAmount(BigDecimal amount) {
         if (amount == null) {
             return "0.00";
         }
-        String currencyFormat = UtilProperties.getPropertyValue("general.properties", "currency.decimal.format", "##0.00");
-        DecimalFormat formatter = new DecimalFormat(currencyFormat);
-        String amountString = formatter.format(amount.doubleValue());
-        Double newAmount = null;
-        try {
-            newAmount = new Double(formatter.parse(amountString).doubleValue());
-        } catch (ParseException e) {
-            Debug.logError(e, "Unable to parse amount Double");
-        }
-
-        String formattedString = null;
-        if (newAmount != null) {
-            double amountDouble = newAmount.doubleValue() * 100;
-            formattedString = Integer.toString(new Double(amountDouble).intValue());
-        }
-        return formattedString;
+        return Integer.toString(amount.movePointRight(2).intValue());
     }
 
     /**
-     * Returns a Double from a ValueLink formatted amount String
+     * Returns a BigDecimal from a ValueLink formatted amount String
      * @param amount The ValueLink formatted amount String
-     * @return Double object
+     * @return BigDecimal object
      */
-    public Double getAmount(String amount) {
+    public BigDecimal getAmount(String amount) {
         if (amount == null) {
-            return new Double(0.00);
+            return new BigDecimal("0.00");
         }
-        Double doubleAmount = new Double(amount);
-        return new Double(doubleAmount.doubleValue() / 100);
+        BigDecimal amountBd = new BigDecimal(amount);
+        return amountBd.movePointLeft(2);
     }
     
     public String getCurrency(String currency) {

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java?rev=731851&r1=731850&r2=731851&view=diff
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/thirdparty/valuelink/ValueLinkServices.java Mon Jan  5 23:13:36 2009
@@ -18,6 +18,7 @@
  *******************************************************************************/
 package org.ofbiz.accounting.thirdparty.valuelink;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -199,7 +200,7 @@
         String currency = (String) context.get("currency");
         String orderId = (String) context.get("orderId");
         String partyId = (String) context.get("partyId");
-        Double amount = (Double) context.get("amount");
+        BigDecimal amount = (BigDecimal) context.get("amount");
 
         // override interface for void/rollback
         String iFace = (String) context.get("Interface");
@@ -328,7 +329,7 @@
         String pin = (String) context.get("pin");
         String orderId = (String) context.get("orderId");
         String partyId = (String) context.get("partyId");
-        Double amount = (Double) context.get("amount");
+        BigDecimal amount = (BigDecimal) context.get("amount");
 
         // get an api instance
         ValueLinkApi vl = ValueLinkApi.getInstance(delegator, props);
@@ -385,7 +386,7 @@
         String currency = (String) context.get("currency");
         String orderId = (String) context.get("orderId");
         String partyId = (String) context.get("partyId");
-        Double amount = (Double) context.get("amount");
+        BigDecimal amount = (BigDecimal) context.get("amount");
 
         // override interface for void/rollback
         String iFace = (String) context.get("Interface");
@@ -452,7 +453,7 @@
         String currency = (String) context.get("currency");
         String orderId = (String) context.get("orderId");
         String partyId = (String) context.get("partyId");
-        Double amount = (Double) context.get("amount");
+        BigDecimal amount = (BigDecimal) context.get("amount");
 
         // override interface for void/rollback
         String iFace = (String) context.get("Interface");
@@ -629,7 +630,7 @@
         String currency = (String) context.get("currency");
         String orderId = (String) context.get("orderId");
         String partyId = (String) context.get("partyId");
-        Double amount = (Double) context.get("amount");
+        BigDecimal amount = (BigDecimal) context.get("amount");
 
         // override interface for void/rollback
         String iFace = (String) context.get("Interface");
@@ -781,7 +782,7 @@
         String paymentConfig = (String) context.get("paymentConfig");
         String currency = (String) context.get("currency");
         String orderId = (String) context.get("orderId");
-        Double amount = (Double) context.get("processAmount");
+        BigDecimal amount = (BigDecimal) context.get("processAmount");
 
         // make sure we have a currency
         if (currency == null) {
@@ -812,13 +813,13 @@
             Boolean processResult = (Boolean) redeemResult.get("processResult");
             // confirm the amount redeemed; since VL does not error in insufficient funds
             if (processResult.booleanValue()) {
-                Double previous = (Double) redeemResult.get("previousAmount");
-                if (previous == null) previous = new Double(0);
-                Double current = (Double) redeemResult.get("amount");
-                if (current == null) current = new Double(0);
-                double redeemed = (((double) Math.round((previous.doubleValue() - current.doubleValue()) * 100)) / 100);
+                BigDecimal previous = (BigDecimal) redeemResult.get("previousAmount");
+                if (previous == null) previous = BigDecimal.ZERO;
+                BigDecimal current = (BigDecimal) redeemResult.get("amount");
+                if (current == null) current = BigDecimal.ZERO;
+                BigDecimal redeemed = previous.subtract(current);
                 Debug.logInfo("Redeemed (" + amount + "): " + redeemed + " / " + previous + " : " + current, module);
-                if (redeemed < amount.doubleValue()) {
+                if (redeemed.compareTo(amount) < 0) {
                     // we didn't redeem enough void the transaction and return false
                     Map voidResult = null;
                     try {
@@ -830,7 +831,7 @@
                         return voidResult;
                     }
                     processResult = Boolean.FALSE;
-                    amount = new Double(redeemed);
+                    amount = redeemed;
                     result.put("authMessage", "Gift card did not contain enough funds");
                 }
             }
@@ -854,7 +855,7 @@
         GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
         String paymentConfig = (String) context.get("paymentConfig");
         String currency = (String) context.get("currency");
-        Double amount = (Double) context.get("releaseAmount");
+        BigDecimal amount = (BigDecimal) context.get("releaseAmount");
 
         // get the orderId for tracking
         String orderId = paymentPref.getString("orderId");
@@ -915,7 +916,7 @@
         GenericValue paymentPref = (GenericValue) context.get("orderPaymentPreference");
         String paymentConfig = (String) context.get("paymentConfig");
         String currency = (String) context.get("currency");
-        Double amount = (Double) context.get("refundAmount");
+        BigDecimal amount = (BigDecimal) context.get("refundAmount");
 
         // get the orderId for tracking
         String orderId = paymentPref.getString("orderId");
@@ -1029,8 +1030,8 @@
         }
 
         // amount/quantity of the gift card(s)
-        Double amount = orderItem.getDouble("unitPrice");
-        Double quantity = orderItem.getDouble("quantity");
+        BigDecimal amount = orderItem.getBigDecimal("unitPrice");
+        BigDecimal quantity = orderItem.getBigDecimal("quantity");
 
         // the product entity needed for information
         GenericValue product = null;
@@ -1306,7 +1307,7 @@
         }
 
         // amount of the gift card reload
-        Double amount = orderItem.getDouble("unitPrice");
+        BigDecimal amount = orderItem.getBigDecimal("unitPrice");
 
         // survey information
         String surveyId = UtilProperties.getPropertyValue(paymentConfig, "payment.giftcert.reload.surveyId");