You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2007/04/26 00:20:50 UTC

svn commit: r532506 - in /ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount: FinAccountPaymentServices.java FinAccountServices.java

Author: jaz
Date: Wed Apr 25 15:20:49 2007
New Revision: 532506

URL: http://svn.apache.org/viewvc?view=rev&rev=532506
Log:
fist pass (not fully tested) of refund financial account; also fixed replenish code to use the defined paymentMethod instead of picking one off the user's account

Modified:
    ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountPaymentServices.java
    ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountServices.java

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountPaymentServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountPaymentServices.java?view=diff&rev=532506&r1=532505&r2=532506
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountPaymentServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountPaymentServices.java Wed Apr 25 15:20:49 2007
@@ -693,19 +693,23 @@
             return ServiceUtil.returnSuccess();
         }
 
-        // determine the payment method to use to replenish
-        List paymentMethods;
+        // get the payment method to use to replenish
+        String paymentMethodId = finAccount.getString("replenishPaymentId");
+        if (paymentMethodId == null) {
+            Debug.logWarning("No payment method attached to financial account [" + finAccountId + "] cannot auto-replenish", module);
+            return ServiceUtil.returnSuccess();
+        }
+
+        GenericValue paymentMethod;
         try {
-            paymentMethods = delegator.findByAnd("PaymentMethod", UtilMisc.toMap("partyId", ownerPartyId), UtilMisc.toList("-fromDate"));
+            paymentMethod = delegator.findByPrimaryKey("PaymentMethod", UtilMisc.toMap("paymentMethodId", paymentMethodId));
         } catch (GenericEntityException e) {
             Debug.logError(e, module);
             return ServiceUtil.returnError(e.getMessage());
         }
-        paymentMethods = EntityUtil.filterByDate(paymentMethods);
-        GenericValue paymentMethod = EntityUtil.getFirst(paymentMethods);
         if (paymentMethod == null) {
             // no payment methods on file; cannot replenish
-            Debug.logWarning("No payment methods attached to party [" + ownerPartyId + "] cannot auto-replenish", module);
+            Debug.logWarning("No payment method found for ID [" + paymentMethodId + "] for party [" + ownerPartyId + "] cannot auto-replenish", module);
             return ServiceUtil.returnSuccess();
         }
 

Modified: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountServices.java?view=diff&rev=532506&r1=532505&r2=532506
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountServices.java (original)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountServices.java Wed Apr 25 15:20:49 2007
@@ -21,12 +21,17 @@
 
 import java.sql.Timestamp;
 import java.util.Map;
+import java.util.List;
 import java.math.BigDecimal;
 
 import org.ofbiz.base.util.*;
 import org.ofbiz.entity.GenericDelegator;
 import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.condition.EntityExpr;
+import org.ofbiz.entity.condition.EntityOperator;
+import org.ofbiz.entity.condition.EntityCondition;
+import org.ofbiz.entity.util.EntityListIterator;
 import org.ofbiz.service.DispatchContext;
 import org.ofbiz.service.GenericServiceException;
 import org.ofbiz.service.LocalDispatcher;
@@ -35,6 +40,7 @@
 
 import org.ofbiz.order.finaccount.FinAccountHelper;
 import org.ofbiz.product.store.ProductStoreWorker;
+import javolution.util.FastMap;
 
 public class FinAccountServices {
     
@@ -186,5 +192,158 @@
         }
 
         return ServiceUtil.returnSuccess();
-    }        
+    }
+
+    public static Map refundFinAccount(DispatchContext dctx, Map context) {
+        LocalDispatcher dispatcher = dctx.getDispatcher();
+        GenericDelegator delegator = dctx.getDelegator();
+
+        GenericValue userLogin = (GenericValue) context.get("userLogin");
+        String finAccountId = (String) context.get("finAccountId");
+        Map result = null;
+
+        GenericValue finAccount;
+        try {
+            finAccount = delegator.findByPrimaryKey("FinAccount", UtilMisc.toMap("finAccountId", finAccountId));
+        } catch (GenericEntityException e) {
+            return ServiceUtil.returnError(e.getMessage());
+        }
+
+        if (finAccount != null) {
+            // get the actual and available balance
+            BigDecimal availableBalance = finAccount.getBigDecimal("availableBalance");
+            BigDecimal actualBalance = finAccount.getBigDecimal("actualBalance");
+
+            // if they do not match, then there are outstanding authorizations which need to be settled first
+            if (!actualBalance.equals(availableBalance)) {
+                return ServiceUtil.returnError("Available balance does not match the actual balance; pending authorizations; cannot refund FinAccount at this time.");
+            }
+
+            // now we make sure there is something to refund
+            if (actualBalance.doubleValue() > 0) {
+                BigDecimal remainingBalance = new BigDecimal(actualBalance.toString());
+                BigDecimal refundAmount = new BigDecimal(0);
+
+                EntityCondition condition = new EntityExpr("finAccountTransTypeId", EntityOperator.EQUALS, "DEPOSIT");
+                EntityListIterator eli = null;
+                try {
+                    eli = delegator.findListIteratorByCondition("FinAccountTrans", condition, null, UtilMisc.toList("-transactionDate"));
+
+                    GenericValue trans;
+                    while (remainingBalance.compareTo(FinAccountHelper.ZERO) == 1 && (trans = (GenericValue) eli.next()) != null) {
+                        String orderId = trans.getString("orderId");
+                        String orderItemSeqId = trans.getString("orderItemSeqId");
+
+                        // make sure there is an order available to refund
+                        if (orderId != null && orderItemSeqId != null) {
+                            GenericValue orderItem = delegator.findByPrimaryKey("OrderItem", UtilMisc.toMap("orderId", orderId, "orderItemSeqId", orderItemSeqId));
+                            if (!"ITEM_CANCELLED".equals(orderItem.getString("statusId"))) {
+                                
+                                // make sure the item hasn't already been returned
+                                List returnItems = orderItem.getRelated("ReturnItem");
+                                if (returnItems == null || returnItems.size() == 0) {
+                                    BigDecimal txAmt = trans.getBigDecimal("amount");
+                                    BigDecimal refAmt = txAmt;
+                                    if (remainingBalance.compareTo(txAmt) == -1) {
+                                        refAmt = remainingBalance;
+                                    }
+                                    remainingBalance = remainingBalance.subtract(refAmt);
+                                    refundAmount = refundAmount.add(refAmt);
+
+                                    // create the return header
+                                    Map rhCtx = UtilMisc.toMap("returnHeaderTypeId", "CUSTOMER_RETURN", "userLogin", userLogin);
+                                    Map rhResp = dispatcher.runSync("createReturnHeader", rhCtx);
+                                    if (ServiceUtil.isError(rhResp)) {
+                                        throw new GeneralException(ServiceUtil.getErrorMessage(rhResp));
+                                    }
+                                    String returnId = (String) rhResp.get("returnId");
+
+                                    // create the return item
+                                    Map returnItemCtx = FastMap.newInstance();
+                                    returnItemCtx.put("returnId", returnId);
+                                    returnItemCtx.put("orderId", orderId);
+                                    returnItemCtx.put("description", orderItem.getString("itemDescription"));
+                                    returnItemCtx.put("orderItemSeqId", orderItemSeqId);
+                                    returnItemCtx.put("returnQuantity", new Double(1));
+                                    returnItemCtx.put("receivedQuantity", new Double(1));
+                                    returnItemCtx.put("returnPrice", new Double(refAmt.doubleValue()));
+                                    returnItemCtx.put("returnReasonId", "RTN_NOT_WANT");
+                                    returnItemCtx.put("returnTypeId", "RTN_REFUND"); // refund return
+                                    returnItemCtx.put("returnItemTypeId", "RET_NPROD_ITEM");
+                                    returnItemCtx.put("userLogin", userLogin);
+
+                                    Map retItResp = dispatcher.runSync("createReturnItem", returnItemCtx);
+                                    if (ServiceUtil.isError(retItResp)) {
+                                        throw new GeneralException(ServiceUtil.getErrorMessage(retItResp));
+                                    }
+                                    String returnItemSeqId = (String) retItResp.get("returnItemSeqId");
+
+                                    // approve the return
+                                    Map appRet = UtilMisc.toMap("statusId", "RETURN_ACCEPTED", "returnId", returnId, "userLogin", userLogin);
+                                    Map appResp = dispatcher.runSync("updateReturnHeader", appRet);
+                                    if (ServiceUtil.isError(appResp)) {
+                                        throw new GeneralException(ServiceUtil.getErrorMessage(appResp));
+                                    }
+
+                                    // "receive" the return - should trigger the refund
+                                    Map recRet = UtilMisc.toMap("statusId", "RETURN_RECEIVED", "returnId", returnId, "userLogin", userLogin);
+                                    Map recResp = dispatcher.runSync("updateReturnHeader", recRet);
+                                    if (ServiceUtil.isError(recResp)) {
+                                        throw new GeneralException(ServiceUtil.getErrorMessage(recResp));
+                                    }
+
+                                    // get the return item
+                                    GenericValue returnItem = delegator.findByPrimaryKey("ReturnItem",
+                                            UtilMisc.toMap("returnId", returnId, "returnItemSeqId", returnItemSeqId));
+                                    GenericValue response = returnItem.getRelatedOne("ReturnItemResponse");
+                                    if (response == null) {
+                                        throw new GeneralException("No return response found for: " + returnItem.getPrimaryKey());
+                                    }
+                                    String paymentId = response.getString("paymentId");
+
+                                    // create the adjustment transaction
+                                    Map txCtx = FastMap.newInstance();
+                                    txCtx.put("finAccountTransTypeId", "ADJUSTMENT");
+                                    txCtx.put("finAccountId", finAccountId);
+                                    txCtx.put("orderId", orderId);
+                                    txCtx.put("orderItemSeqId", orderItemSeqId);
+                                    txCtx.put("paymentId", paymentId);
+                                    txCtx.put("amount", new Double(refAmt.doubleValue() * -1));
+                                    txCtx.put("partyId", finAccount.getString("ownerPartyId"));
+                                    txCtx.put("userLogin", userLogin);
+
+                                    Map txResp = dispatcher.runSync("createFinAccountTrans", txCtx);
+                                    if (ServiceUtil.isError(txResp)) {
+                                        throw new GeneralException(ServiceUtil.getErrorMessage(txResp));
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } catch (GeneralException e) {
+                    Debug.logError(e, module);
+                    return ServiceUtil.returnError(e.getMessage());
+                } finally {
+                    if (eli != null) {
+                        try {
+                            eli.close();
+                        } catch (GenericEntityException e) {
+                            Debug.logWarning(e, module);
+                        }
+                    }
+                }
+
+                // check to make sure we balanced out
+                if (remainingBalance.compareTo(FinAccountHelper.ZERO) == 1) {
+                    result = ServiceUtil.returnSuccess("FinAccount partially refunded; not enough replenish deposits to refund!");
+                }
+            }
+        }
+
+        if (result == null) {
+            result = ServiceUtil.returnSuccess();
+        }
+
+        return result;
+    }
 }