Author: jonesde
Date: Sun Sep 10 22:16:31 2006 New Revision: 442104 URL: http://svn.apache.org/viewvc?view=rev&rev=442104 Log: Implemented try other cards on account functionality for auto-orders 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?view=diff&rev=442104&r1=442103&r2=442104 ============================================================================== --- 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 Sun Sep 10 22:16:31 2006 @@ -88,7 +88,9 @@ * 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 - * amount processed. TODO: it might be nice to return the paymentGatewayResponseId + * amount processed. + * + * TODO: it might be nice to return the paymentGatewayResponseId */ public static Map authOrderPaymentPreference(DispatchContext dctx, Map context) { GenericDelegator delegator = dctx.getDelegator(); @@ -149,51 +151,133 @@ transAmount = orderPaymentPreference.getDouble("maxAmount"); } - // prepare the return map (always return success, default finished=false, default errors=false - Map results = UtilMisc.toMap(ModelService.RESPONSE_MESSAGE, ModelService.RESPOND_SUCCESS, "finished", Boolean.FALSE, "errors", Boolean.FALSE); // if our transaction amount exists and is zero, there's nothing to process, so return if ((transAmount != null) && (transAmount.doubleValue() <= 0)) { + // prepare the return map (always return success, default finished=false, default errors=false + Map results = ServiceUtil.returnSuccess(); + results.put("finished", Boolean.FALSE); + results.put("errors", Boolean.FALSE); return results; } try { // call the authPayment method - Map processorResult = authPayment(dispatcher, userLogin, orh, orderPaymentPreference, totalRemaining, reAuth, overrideAmount); + Map authPaymentResult = authPayment(dispatcher, userLogin, orh, orderPaymentPreference, totalRemaining, reAuth, overrideAmount); // handle the response - if (processorResult != null) { - + if (authPaymentResult != null) { // get the customer messages - if (processorResult.get("customerRespMsgs") != null) { - results.put("messages", processorResult.get("customerRespMsgs")); + if (authPaymentResult.get("customerRespMsgs") != null) { + // NOTE DEJ20060911: hmmm... was something supposed to be done here? } // not null result means either an approval or decline; null would mean error - Double thisAmount = (Double) processorResult.get("processAmount"); + Double thisAmount = (Double) authPaymentResult.get("processAmount"); // process the auth results try { - boolean processResult = processResult(dctx, processorResult, userLogin, orderPaymentPreference); + boolean processResult = processResult(dctx, authPaymentResult, userLogin, orderPaymentPreference); if (processResult) { + Map results = ServiceUtil.returnSuccess(); + results.put("messages", authPaymentResult.get("customerRespMsgs")); results.put("processAmount", thisAmount); results.put("finished", Boolean.TRUE); + results.put("errors", Boolean.FALSE); + return results; } else { - // if we are doing an NSF retry then also - //boolean needsNsfRetry = needsNsfRetry(orderPaymentPreference, processorResult, delegator); - // TODO: what do we do with this? we need to fail the auth but still allow the order through so it can be fixed later - // NOTE: this is called through a different path for auto re-orders, so it should be good to go... will leave this comment here just in case... + boolean needsNsfRetry = needsNsfRetry(orderPaymentPreference, authPaymentResult, delegator); + + // if we are doing an NSF retry then also... + if (needsNsfRetry) { + // TODO: what do we do with this? we need to fail the auth but still allow the order through so it can be fixed later + // NOTE: this is called through a different path for auto re-orders, so it should be good to go... will leave this comment here just in case... + } + + // if we have a failure at this point and no NSF retry is needed, then try other credit cards on file, if the user has any + if (!needsNsfRetry) { + // is this an auto-order? + if (UtilValidate.isNotEmpty(orderHeader.getString("autoOrderShoppingListId"))) { + GenericValue productStore = orderHeader.getRelatedOne("ProductStore"); + // according to the store should we try other cards? + if ("Y".equals(productStore.getString("autoOrderCcTryOtherCards"))) { + // get other credit cards for the bill to party + List otherPaymentMethodAndCreditCardList = null; + String billToPartyId = null; + GenericValue billToParty = orh.getBillToParty(); + if (billToParty != null) { + billToPartyId = billToParty.getString("partyId"); + } else { + // TODO optional: any other ways to find the bill to party? perhaps look at info from OrderPaymentPreference, ie search back from other PaymentMethod... + } + + if (UtilValidate.isNotEmpty(billToPartyId)) { + otherPaymentMethodAndCreditCardList = delegator.findByAnd("PaymentMethodAndCreditCard", + UtilMisc.toMap("partyId", billToPartyId, "paymentMethodTypeId", "CREDIT_CARD")); + otherPaymentMethodAndCreditCardList = EntityUtil.filterByDate(otherPaymentMethodAndCreditCardList, true); + } + + if (otherPaymentMethodAndCreditCardList != null && otherPaymentMethodAndCreditCardList.size() > 0) { + Iterator otherPaymentMethodAndCreditCardIter = otherPaymentMethodAndCreditCardList.iterator(); + while (otherPaymentMethodAndCreditCardIter.hasNext()) { + GenericValue otherPaymentMethodAndCreditCard = (GenericValue) otherPaymentMethodAndCreditCardIter.next(); + + // change OrderPaymentPreference in memory only and call auth service + orderPaymentPreference.set("paymentMethodId", otherPaymentMethodAndCreditCard.getString("paymentMethodId")); + Map authRetryResult = authPayment(dispatcher, userLogin, orh, orderPaymentPreference, totalRemaining, reAuth, overrideAmount); + try { + boolean processRetryResult = processResult(dctx, authPaymentResult, userLogin, orderPaymentPreference); + + if (processRetryResult) { + // wow, we got here that means the other card was successful... + // on success save the OrderPaymentPreference, and then return finished (which will break from loop) + orderPaymentPreference.store(); + + Map results = ServiceUtil.returnSuccess(); + results.put("messages", authRetryResult.get("customerRespMsgs")); + results.put("processAmount", thisAmount); + results.put("finished", Boolean.TRUE); + results.put("errors", Boolean.FALSE); + return results; + } + } catch (GeneralException e) { + String errMsg = "Error saving and processing payment authorization results: " + e.toString(); + Debug.logError(e, errMsg + "; authRetryResult: " + authRetryResult, module); + Map results = ServiceUtil.returnSuccess(); + results.put(ModelService.ERROR_MESSAGE, errMsg); + results.put("finished", Boolean.FALSE); + results.put("errors", Boolean.TRUE); + return results; + } + + // if no sucess, fall through to return not finished + } + } + } + } + } + + Map results = ServiceUtil.returnSuccess(); + results.put("messages", authPaymentResult.get("customerRespMsgs")); + results.put("finished", Boolean.FALSE); + results.put("errors", Boolean.FALSE); + return results; } } catch (GeneralException e) { String errMsg = "Error saving and processing payment authorization results: " + e.toString(); - Debug.logError(e, errMsg + "; processorResult: " + processorResult, module); + Debug.logError(e, errMsg + "; authPaymentResult: " + authPaymentResult, module); + Map results = ServiceUtil.returnSuccess(); results.put(ModelService.ERROR_MESSAGE, errMsg); + results.put("finished", Boolean.FALSE); results.put("errors", Boolean.TRUE); + return results; } } else { // error with payment processor; will try later String errMsg = "Invalid Order Payment Preference: maxAmount is 0"; Debug.logInfo(errMsg, module); + Map results = ServiceUtil.returnSuccess(); + results.put("finished", Boolean.FALSE); results.put("errors", Boolean.TRUE); results.put(ModelService.ERROR_MESSAGE, errMsg); @@ -203,8 +287,8 @@ } catch (GenericEntityException e) { Debug.logError(e, "ERROR: Problem setting OrderPaymentPreference status to CANCELLED", module); } + return results; } - return results; } catch (GeneralException e) { String errMsg = "Error processing payment authorization: " + e.toString(); Debug.logError(e, errMsg, module); |
Free forum by Nabble | Edit this page |