Author: jleroux
Date: Mon Feb 3 22:35:11 2014 New Revision: 1564115 URL: http://svn.apache.org/r1564115 Log: "Applied fix from trunk for revision: 1564111" ------------------------------------------------------------------------ r1564111 | jleroux | 2014-02-03 23:29:40 +0100 (lun. 03 févr. 2014) | 12 lignes A (slightly modified) patch from Ritu Raj Lakhera for "Order return is not refunding the money" https://issues.apache.org/jira/browse/OFBIZ-5528 When we placed an order with two items and generate a return towards one item then code is refunding the money correctly. But if we again do return for second item then code is not refunding the money because first return-refund process has changed the status of OrderPaymentPreference from 'PAYMENT_SETTLED' to ‘PAYMENT_REFUNDED’. I think We should create the new OrderPaymentPreference with PAYMENT_REFUNDED status against old OrderPaymentPreference of 'PAYMENT_SETTLED' status at the time of return-refund process. So second return can also refund the money. In other words we should create the new OrderPaymentPreference for each refund amount as we are doing with Payment entity(processRefundResult PaymentGatewayServices.java). jleroux: I * replaced the deprecated findByPrimaryKey by a finByOne * replaced Exception GenericServiceException in catch (as it was before) * reformatted some parts ------------------------------------------------------------------------ Modified: ofbiz/branches/release12.04/ (props changed) ofbiz/branches/release12.04/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java Propchange: ofbiz/branches/release12.04/ ------------------------------------------------------------------------------ Merged /ofbiz/trunk:r1564111 Modified: ofbiz/branches/release12.04/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java URL: http://svn.apache.org/viewvc/ofbiz/branches/release12.04/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java?rev=1564115&r1=1564114&r2=1564115&view=diff ============================================================================== --- ofbiz/branches/release12.04/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java (original) +++ ofbiz/branches/release12.04/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java Mon Feb 3 22:35:11 2014 @@ -1382,6 +1382,7 @@ public class OrderReturnServices { Map<String, Object> orderPaymentPrefDetails = pmtppit.next(); GenericValue orderPaymentPreference = (GenericValue) orderPaymentPrefDetails.get("orderPaymentPreference"); BigDecimal orderPaymentPreferenceAvailable = (BigDecimal) orderPaymentPrefDetails.get("availableTotal"); + GenericValue refundOrderPaymentPreference=null; // Refund up to the maxAmount for the paymentPref, or whatever is left to refund if that's less than the maxAmount BigDecimal amountToRefund = orderPaymentPreferenceAvailable.min(amountLeftToRefund); @@ -1393,23 +1394,33 @@ public class OrderReturnServices { // Call the refund service to refund the payment if (electronicTypes.contains(paymentMethodTypeId)) { try { - // for electronic types such as CREDIT_CARD and EFT_ACCOUNT, use refundPayment service - serviceResult = dispatcher.runSync("refundPayment", UtilMisc.<String, Object>toMap("orderPaymentPreference", orderPaymentPreference, "refundAmount", amountToRefund.setScale(decimals, rounding), "userLogin", userLogin)); + Map<String, Object> serviceContext = UtilMisc.toMap("orderId", orderId,"userLogin", context.get("userLogin")); + serviceContext.put("paymentMethodId", orderPaymentPreference.getString("paymentMethodId")); + serviceContext.put("paymentMethodTypeId", orderPaymentPreference.getString("paymentMethodTypeId")); + serviceContext.put("statusId", orderPaymentPreference.getString("statusId")); + serviceContext.put("maxAmount", amountToRefund.setScale(decimals, rounding)); + String orderPaymentPreferenceNewId = null; + Map<String, Object> result = dispatcher.runSync("createOrderPaymentPreference", serviceContext); + orderPaymentPreferenceNewId = (String) result.get("orderPaymentPreferenceId"); + refundOrderPaymentPreference = delegator.findOne("OrderPaymentPreference", false, "orderPaymentPreferenceId", orderPaymentPreferenceNewId); + serviceResult = dispatcher.runSync("refundPayment", UtilMisc.<String, Object>toMap("orderPaymentPreference", refundOrderPaymentPreference, "refundAmount", amountToRefund.setScale(decimals, rounding), "userLogin", userLogin)); if (ServiceUtil.isError(serviceResult) || ServiceUtil.isFailure(serviceResult)) { Debug.logError("Error in refund payment: " + ServiceUtil.getErrorMessage(serviceResult), module); continue; } + // for electronic types such as CREDIT_CARD and EFT_ACCOUNT, use refundPayment service paymentId = (String) serviceResult.get("paymentId"); amountRefunded = (BigDecimal) serviceResult.get("refundAmount"); } catch (GenericServiceException e) { Debug.logError(e, "Problem running the refundPayment service", module); - return ServiceUtil.returnError(UtilProperties.getMessage(resource_error, - "OrderProblemsWithTheRefundSeeLogs", locale)); + return ServiceUtil.returnError(UtilProperties.getMessage(resource_error,"OrderProblemsWithTheRefundSeeLogs", locale)); } } else if (paymentMethodTypeId.equals("EXT_BILLACT")) { try { // for Billing Account refunds - serviceResult = dispatcher.runSync("refundBillingAccountPayment", UtilMisc.<String, Object>toMap("orderPaymentPreference", orderPaymentPreference, "refundAmount", amountToRefund.setScale(decimals, rounding), "userLogin", userLogin)); + serviceResult = dispatcher.runSync("refundBillingAccountPayment", + UtilMisc.<String, Object> toMap("orderPaymentPreference", orderPaymentPreference, "refundAmount", + amountToRefund.setScale(decimals, rounding), "userLogin", userLogin)); if (ServiceUtil.isError(serviceResult) || ServiceUtil.isFailure(serviceResult)) { Debug.logError("Error in refund payment: " + ServiceUtil.getErrorMessage(serviceResult), module); continue; @@ -1446,7 +1457,11 @@ public class OrderReturnServices { // Fill out the data for the new ReturnItemResponse Map<String, Object> response = FastMap.newInstance(); - response.put("orderPaymentPreferenceId", orderPaymentPreference.getString("orderPaymentPreferenceId")); + if (UtilValidate.isNotEmpty(refundOrderPaymentPreference)) { + response.put("orderPaymentPreferenceId", refundOrderPaymentPreference.getString("orderPaymentPreferenceId")); + } else { + response.put("orderPaymentPreferenceId", orderPaymentPreference.getString("orderPaymentPreferenceId")); + } response.put("responseAmount", amountRefunded.setScale(decimals, rounding)); response.put("responseDate", now); response.put("userLogin", userLogin); |
Free forum by Nabble | Edit this page |