Author: lektran
Date: Mon Dec 17 02:02:48 2007 New Revision: 604811 URL: http://svn.apache.org/viewvc?rev=604811&view=rev Log: A few improvements to return refunds (mainly focused on handling offline payment types): 1. When calculating payments received for an order, now looking at Payment instead of PaymentGatewayResponse. 2. When pulling the PaymentPreferences to refund against, now considering the received status as well as settled. 3. If the PaymentPreference is not electronic or a billing account, now creating a payment with the correct details set instead of creating a "filler" payment (whatever that was) Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java?rev=604811&r1=604810&r2=604811&view=diff ============================================================================== --- ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java (original) +++ ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReadHelper.java Mon Dec 17 02:02:48 2007 @@ -212,19 +212,22 @@ Iterator ppit = paymentPrefs.iterator(); while (ppit.hasNext()) { GenericValue paymentPref = (GenericValue) ppit.next(); - List paymentGatewayResponses = new ArrayList(); + List payments = FastList.newInstance(); try { - paymentGatewayResponses = paymentPref.getRelatedByAnd("PaymentGatewayResponse", UtilMisc.toMap("paymentServiceTypeEnumId","PRDS_PAY_CAPTURE")); + List exprs = UtilMisc.toList(new EntityExpr("statusId", EntityOperator.EQUALS, "PMNT_RECEIVED"), + new EntityExpr("statusId", EntityOperator.EQUALS, "PMNT_CONFIRMED")); + payments = paymentPref.getRelated("Payment"); + payments = EntityUtil.filterByOr(payments, exprs); } catch (GenericEntityException e) { Debug.logError(e, module); } BigDecimal chargedToPaymentPref = ZERO; - Iterator pgrit = paymentGatewayResponses.iterator(); - while(pgrit.hasNext()) { - GenericValue paymentGatewayResponse = (GenericValue) pgrit.next(); - if (paymentGatewayResponse.get("amount") != null) { - chargedToPaymentPref = chargedToPaymentPref.add(paymentGatewayResponse.getBigDecimal("amount")).setScale(scale+1, rounding); + Iterator payit = payments.iterator(); + while(payit.hasNext()) { + GenericValue payment = (GenericValue) payit.next(); + if (payment.get("amount") != null) { + chargedToPaymentPref = chargedToPaymentPref.add(payment.getBigDecimal("amount")).setScale(scale+1, rounding); } } Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java?rev=604811&r1=604810&r2=604811&view=diff ============================================================================== --- ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java (original) +++ ofbiz/trunk/applications/order/src/org/ofbiz/order/order/OrderReturnServices.java Mon Dec 17 02:02:48 2007 @@ -904,7 +904,9 @@ try { orderHeader = delegator.findByPrimaryKey("OrderHeader", UtilMisc.toMap("orderId", orderId)); // sort these desending by maxAmount - orderPayPrefs = orderHeader.getRelated("OrderPaymentPreference", UtilMisc.toMap("statusId", "PAYMENT_SETTLED"), UtilMisc.toList("-maxAmount")); + orderPayPrefs = orderHeader.getRelated("OrderPaymentPreference", UtilMisc.toList("-maxAmount")); + List exprs = UtilMisc.toList(new EntityExpr("statusId", EntityOperator.EQUALS, "PAYMENT_SETTLED"), new EntityExpr("statusId", EntityOperator.EQUALS, "PAYMENT_RECEIVED")); + orderPayPrefs = EntityUtil.filterByOr(orderPayPrefs, exprs); } catch (GenericEntityException e) { Debug.logError(e, "Cannot get Order details for #" + orderId, module); continue; @@ -1050,7 +1052,26 @@ return ServiceUtil.returnError(UtilProperties.getMessage(resource_error,"OrderProblemsWithTheRefundSeeLogs", locale)); } } else { - // TODO: handle manual refunds (accounts payable) + // handle manual refunds + try { + Map input = UtilMisc.toMap("userLogin", userLogin, "amount", new Double(amountLeftToRefund.doubleValue()), "statusId", "PMNT_NOT_PAID"); + input.put("partyIdTo", returnHeader.get("fromPartyId")); + input.put("partyIdFrom", returnHeader.get("toPartyId")); + input.put("paymentTypeId", "CUSTOMER_REFUND"); + input.put("paymentMethodId", orderPaymentPreference.get("paymentMethodId")); + input.put("paymentMethodTypeId", orderPaymentPreference.get("paymentMethodTypeId")); + input.put("paymentPreferenceId", orderPaymentPreference.get("orderPaymentPreferenceId")); + + serviceResult = dispatcher.runSync("createPayment", input); + + if (ServiceUtil.isError(serviceResult) || ServiceUtil.isFailure(serviceResult)) { + Debug.logError("Error in refund payment: " + ServiceUtil.getErrorMessage(serviceResult), module); + continue; + } + paymentId = (String) serviceResult.get("paymentId"); + } catch (GenericServiceException e) { + return ServiceUtil.returnError(e.getMessage()); + } } // Fill out the data for the new ReturnItemResponse @@ -1059,10 +1080,7 @@ response.put("responseAmount", new Double(amountToRefund.setScale(decimals, rounding).doubleValue())); response.put("responseDate", now); response.put("userLogin", userLogin); - if (paymentId != null) { - // A null payment ID means no electronic refund was available; manual refund needed - response.put("paymentId", paymentId); - } + response.put("paymentId", paymentId); if (paymentMethodTypeId.equals("EXT_BILLACT")) { response.put("billingAccountId", orderReadHelper.getBillingAccount().getString("billingAccountId")); } @@ -1122,31 +1140,6 @@ } } } - - // OFBIZ-459: Create a "filler" payment and return item response by hand for the remaining amount, note that this won't be applied to the invoice - if (amountLeftToRefund.compareTo(ZERO) == 1) { - try { - Map input = UtilMisc.toMap("userLogin", userLogin, "amount", new Double(amountLeftToRefund.doubleValue()), "statusId", "PMNT_NOT_PAID"); - input.put("partyIdTo", returnHeader.get("fromPartyId")); - input.put("partyIdFrom", returnHeader.get("toPartyId")); - input.put("paymentTypeId", "CUSTOMER_REFUND"); - if (UtilValidate.isNotEmpty(refundPaymentMethod)) { - input.put("paymentMethodId", refundPaymentMethod.get("paymentMethodId")); - input.put("paymentMethodTypeId", refundPaymentMethod.get("paymentMethodTypeId")); - } else { - Debug.logInfo("refundPaymentMethodId not configured in PartyAcctgPreference, not setting for remaining refund amount", module); - } - - Map results = dispatcher.runSync("createPayment", input); - if (ServiceUtil.isError(results)) return results; - - input = UtilMisc.toMap("userLogin", userLogin, "paymentId", results.get("paymentId"), "responseAmount", new Double(amountLeftToRefund.doubleValue())); - results = dispatcher.runSync("createReturnItemResponse", input); - if (ServiceUtil.isError(results)) return results; - } catch (GenericServiceException e) { - return ServiceUtil.returnError(e.getMessage()); - } - } } } @@ -1989,7 +1982,7 @@ Debug.logError("Order [" + orderId + "] refund amount[ " + returnAmount + "] less than zero", module); return ServiceUtil.returnError(UtilProperties.getMessage(resource_error, "OrderReturnTotalCannotLessThanZero", locale)); } - OrderReadHelper helper = new OrderReadHelper(OrderReadHelper.getOrderHeader(delegator, orderId)); + OrderReadHelper helper = new OrderReadHelper(delegator, orderId); BigDecimal grandTotal = helper.getOrderGrandTotal(); if (returnAmount == null) { Debug.logInfo("No returnAmount found for order:" + orderId, module); |
Free forum by Nabble | Edit this page |