You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by si...@apache.org on 2006/08/21 19:20:40 UTC
svn commit: r433293 -
/incubator/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java
Author: sichen
Date: Mon Aug 21 10:20:40 2006
New Revision: 433293
URL: http://svn.apache.org/viewvc?rev=433293&view=rev
Log:
Fix problems of capture amount for billing accounts and gift cards
Modified:
incubator/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java
Modified: incubator/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java?rev=433293&r1=433292&r2=433293&view=diff
==============================================================================
--- incubator/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java (original)
+++ incubator/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/payment/PaymentGatewayServices.java Mon Aug 21 10:20:40 2006
@@ -846,6 +846,7 @@
String invoiceId = (String) context.get("invoiceId");
String billingAccountId = (String) context.get("billingAccountId");
Double captureAmount = (Double) context.get("captureAmount");
+ BigDecimal captureAmountBd = new BigDecimal(captureAmount.doubleValue());
Map result = new HashMap();
@@ -872,9 +873,9 @@
return ServiceUtil.returnError("Could not find OrderHeader with orderId: " + orderId + "; not processing payments.");
}
+ OrderReadHelper orh = new OrderReadHelper(orderHeader);
+
// See if there is a billing account first. If so, just charge the captureAmount to the billing account via PaymentApplication
- // or at least charge up the full amount of the billing account's net balance and then try other payment methods
- // Note that this needs to run here first because orders charged to billing account alone will have no OrderPaymentPreference
GenericValue billingAccount = null;
BigDecimal billingAccountAvail = null;
BigDecimal billingAccountCaptureAmount = ZERO;
@@ -896,33 +897,35 @@
// if a billing account is used to pay for an order, then charge as much as we can to it before proceeding to other payment methods.
if (billingAccount != null && billingAccountAvail != null) {
try {
- // the amount to be "charged" to the billing account, which is the minimum of billing account available amount and amount to capture
- BigDecimal captureAmountBd = new BigDecimal(captureAmount.doubleValue());
- billingAccountCaptureAmount = captureAmountBd.min(billingAccountAvail);
- Debug.logInfo("billing account avail = [" + billingAccountAvail + "] capture amount = [" + billingAccountCaptureAmount + "]", module);
-
- // capturing to a billing account is a matter of a creating a payment and then applying it to the invoice
- Map tmpResult = dispatcher.runSync("captureBillingAccountPayment", UtilMisc.toMap("invoiceId", invoiceId, "billingAccountId", billingAccountId,
- "captureAmount", new Double(billingAccountCaptureAmount.doubleValue()), "userLogin", userLogin));
- if (ServiceUtil.isError(tmpResult)) {
- return tmpResult;
- }
-
- // now, if the full amount had not been captured, then capture
- // it from other methods, otherwise return
- if (billingAccountCaptureAmount.compareTo(captureAmountBd) == -1) {
- BigDecimal outstandingAmount = captureAmountBd.subtract(billingAccountCaptureAmount).setScale(decimals, rounding);
- captureAmount = new Double(outstandingAmount.doubleValue());
- } else {
- Debug.logInfo("Amount to capture [" + captureAmount + "] was fully captured in Payment [" + tmpResult.get("paymentId") + "].", module);
- result = ServiceUtil.returnSuccess();
- result.put("processResult", "COMPLETE");
- return result;
- }
+ // the amount to be "charged" to the billing account, which is the minimum of the amount the order wants to charge to the billing account
+ // or the amount still available for capturing from the billing account or the total amount to be captured on the order
+ BigDecimal billingAccountMaxAmount = new BigDecimal(orh.getBillingAccountMaxAmount());
+ billingAccountCaptureAmount = billingAccountMaxAmount.min(billingAccountAvail).min(captureAmountBd);
+ Debug.logInfo("billing account avail = [" + billingAccountAvail + "] capture amount = [" + billingAccountCaptureAmount + "] maxAmount = ["+billingAccountMaxAmount+"]", module);
+ // capturing to a billing account if amount is greater than zero
+ if (billingAccountCaptureAmount.compareTo(ZERO) == 1) {
+ Map tmpResult = dispatcher.runSync("captureBillingAccountPayment", UtilMisc.toMap("invoiceId", invoiceId, "billingAccountId", billingAccountId,
+ "captureAmount", new Double(billingAccountCaptureAmount.doubleValue()), "userLogin", userLogin));
+ if (ServiceUtil.isError(tmpResult)) {
+ return tmpResult;
+ }
+
+ // now, if the full amount had not been captured, then capture
+ // it from other methods, otherwise return
+ if (billingAccountCaptureAmount.compareTo(captureAmountBd) == -1) {
+ BigDecimal outstandingAmount = captureAmountBd.subtract(billingAccountCaptureAmount).setScale(decimals, rounding);
+ captureAmount = new Double(outstandingAmount.doubleValue());
+ } else {
+ Debug.logInfo("Amount to capture [" + captureAmount + "] was fully captured in Payment [" + tmpResult.get("paymentId") + "].", module);
+ result = ServiceUtil.returnSuccess();
+ result.put("processResult", "COMPLETE");
+ return result;
+ }
+ }
} catch (GenericServiceException ex) {
return ServiceUtil.returnError(ex.getMessage());
}
- }
+ }
// return complete if no payment prefs were found
if (paymentPrefs == null || paymentPrefs.size() == 0) {
@@ -932,8 +935,6 @@
return result;
}
- OrderReadHelper orh = new OrderReadHelper(orderHeader);
-
BigDecimal orderGrandTotal = orh.getOrderGrandTotalBd();
orderGrandTotal = orderGrandTotal.setScale(2, BigDecimal.ROUND_HALF_UP);
double orderTotal = orderGrandTotal.doubleValue();
@@ -1015,19 +1016,23 @@
Debug.logError("The amount to capture was more then what was authorized; we only captured the authorized amount : " + paymentPref, module);
amountThisCapture = authAmount.doubleValue();
}
-
+
+ Debug.logInfo("Payment preference = [" + paymentPref + "] amount to capture = [" + amountToCapture +"] amount of this capture = [" + amountThisCapture +"] actual auth amount =[" + authAmount + "] amountToBillAccount = [" + amountToBillAccount + "]", module);
Map captureResult = capturePayment(dctx, userLogin, orh, paymentPref, amountThisCapture);
if (captureResult != null) {
+ // credit card processors return captureAmount, but gift certificate processors return processAmount
Double amountCaptured = (Double) captureResult.get("captureAmount");
+ if (amountCaptured == null) {
+ amountCaptured = (Double) captureResult.get("processAmount");
+ }
+ // decrease amount of next payment preference to capture
if (amountCaptured != null) amountToCapture -= amountCaptured.doubleValue();
finished.add(captureResult);
// add the invoiceId to the result for processing
captureResult.put("invoiceId", invoiceId);
- //Debug.log("Capture result : " + captureResult, module);
-
- // process the capture's results
+ // process the capture's results
try {
processResult(dctx, captureResult, userLogin, paymentPref);
} catch (GeneralException e) {
@@ -1036,10 +1041,7 @@
}
// create any splits which are needed
- // we need to add up the amount that has been captured from both credit card and the billing account
- // otherwise, if part of invoice was captured to billing account, the system will authorize that amount again on the credit card
BigDecimal totalAmountCaptured = new BigDecimal(amountThisCapture);
- totalAmountCaptured = totalAmountCaptured.add(billingAccountCaptureAmount).setScale(decimals, rounding);
if (authAmount.doubleValue() > totalAmountCaptured.doubleValue()) {
// create a new payment preference and authorize it
double newAmount = authAmount.doubleValue() - totalAmountCaptured.doubleValue(); // TODO: use BigDecimal arithmetic here (and everywhere else for that matter)