svn commit: r522742 - /ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r522742 - /ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java

jaz-3
Author: jaz
Date: Mon Mar 26 21:38:07 2007
New Revision: 522742

URL: http://svn.apache.org/viewvc?view=rev&rev=522742
Log:
generic financial account creation from a product purchase (fulfillment services)

Added:
    ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java   (with props)

Added: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java?view=auto&rev=522742
==============================================================================
--- ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java (added)
+++ ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java Mon Mar 26 21:38:07 2007
@@ -0,0 +1,203 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+package org.ofbiz.accounting.finaccount;
+
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.service.ServiceUtil;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.entity.GenericDelegator;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.GenericEntityException;
+import org.ofbiz.entity.util.EntityUtil;
+import org.ofbiz.base.util.*;
+import org.ofbiz.order.order.OrderReadHelper;
+import org.ofbiz.order.finaccount.FinAccountHelper;
+
+import java.util.*;
+import java.math.BigDecimal;
+
+import javolution.util.FastMap;
+
+/**
+ * FinAccountProductServices - Financial Accounts created from product purchases (i.e. gift certificates)
+ */
+public class FinAccountProductServices {
+
+    public static final String module = FinAccountProductServices.class.getName();
+
+    public static Map createPartyFinAccountFromPurchase(DispatchContext dctx, Map context) {
+        // this service should always be called via FULFILLMENT_EXTASYNC
+        LocalDispatcher dispatcher = dctx.getDispatcher();
+        GenericDelegator delegator = dctx.getDelegator();
+
+        GenericValue orderItem = (GenericValue) context.get("orderItem");
+        GenericValue userLogin = (GenericValue) context.get("userLogin");
+
+        // order ID for tracking
+        String orderId = orderItem.getString("orderId");
+
+        // the order header for store info
+        GenericValue orderHeader;
+        try {
+            orderHeader = orderItem.getRelatedOne("OrderHeader");
+        } catch (GenericEntityException e) {
+            Debug.logError(e, "Unable to get OrderHeader from OrderItem",module);
+            return ServiceUtil.returnError("Unable to get OrderHeader from OrderItem");
+        }
+
+        String productId = orderItem.getString("productId");
+        GenericValue featureAndAppl;
+        try {
+            List featureAndAppls = delegator.findByAnd("ProductFeatureAndAppl", UtilMisc.toMap("productId", productId,
+                    "productFeatureTypeId", "TYPE", "productFeatureApplTypeId", "STANDARD_FEATURE"));
+            featureAndAppls = EntityUtil.filterByDate(featureAndAppls);
+            featureAndAppl = EntityUtil.getFirst(featureAndAppls);
+        } catch (GenericEntityException e) {
+            Debug.logError(e, module);
+            return ServiceUtil.returnError(e.getMessage());
+        }
+
+        // financial account data; pulled from the TYPE feature of the product
+        String finAccountTypeId = "BALANCE_ACCOUNT"; // default
+        String finAccountName = "Customer Financial Account";
+        if (featureAndAppl != null) {
+            if (UtilValidate.isNotEmpty(featureAndAppl.getString("idCode"))) {
+                finAccountTypeId = featureAndAppl.getString("idCode");
+            }
+            if (UtilValidate.isNotEmpty(featureAndAppl.getString("description"))) {
+                finAccountName = featureAndAppl.getString("description");
+            }
+        }
+
+        // locate the financial account type
+        GenericValue finAccountType;
+        try {
+            finAccountType = delegator.findByPrimaryKey("FinAccountType", UtilMisc.toMap("finAccountTypeId", finAccountTypeId));
+        } catch (GenericEntityException e) {
+            Debug.logError(e, module);
+            return ServiceUtil.returnError(e.getMessage());
+        }
+        String replenishEnumId = finAccountType.getString("replenishEnumId");
+
+        // get the order read helper
+        OrderReadHelper orh = new OrderReadHelper(orderHeader);
+
+        // get the currency
+        String currency = orh.getCurrency();
+
+        // make sure we have a currency
+        if (currency == null) {
+            currency = UtilProperties.getPropertyValue("general.properties", "currency.uom.id.default", "USD");
+        }
+
+        // get the product store
+        String productStoreId = null;
+        if (orderHeader != null) {
+            productStoreId = orh.getProductStoreId();
+        }
+        if (productStoreId == null) {
+            return ServiceUtil.returnError("Unable to create financial account; no productStoreId on OrderHeader : " + orderId);
+        }
+
+        // party ID (owner)
+        GenericValue billToParty = orh.getBillToParty();
+        String partyId = null;
+        if (billToParty != null) {
+            partyId = billToParty.getString("partyId");
+        }
+
+        // price/amount/quantity to create initial deposit amount
+        BigDecimal quantity = orderItem.getBigDecimal("quantity");        
+        BigDecimal price = orderItem.getBigDecimal("unitPrice");
+        BigDecimal deposit = price.multiply(quantity).setScale(FinAccountHelper.decimals, FinAccountHelper.rounding);        
+
+        // create the financial account
+        Map createCtx = FastMap.newInstance();
+        String finAccountId;
+
+        createCtx.put("finAccountTypeId", finAccountTypeId);
+        createCtx.put("finAccountName", finAccountName);
+        createCtx.put("productStoreId", productStoreId);
+        createCtx.put("ownerPartyId", partyId);
+        createCtx.put("currencyUomId", currency);
+        createCtx.put("userLogin", userLogin);
+
+        // if we auto-replenish this type; set the level to the initial deposit
+        if (replenishEnumId != null && "FARP_AUTOMATIC".equals(replenishEnumId)) {
+            createCtx.put("replenishLevel", deposit);
+        }
+
+        Map createResp;
+        try {
+            createResp = dispatcher.runSync("createFinAccountForStore", createCtx);
+        } catch (GenericServiceException e) {
+            Debug.logError(e, module);
+            return ServiceUtil.returnError(e.getMessage());
+        }
+        if (ServiceUtil.isError(createResp)) {
+            return createResp;
+        } else {
+            finAccountId = (String) createResp.get("finAccountId");
+        }
+
+        // create the owner role
+        Map roleCtx = FastMap.newInstance();
+        roleCtx.put("partyId", partyId);
+        roleCtx.put("roleTypeId", "OWNER");
+        roleCtx.put("finAccountId", finAccountId);
+        roleCtx.put("userLogin", userLogin);
+        roleCtx.put("fromDate", UtilDateTime.nowTimestamp());
+        Map roleResp;
+        try {
+            roleResp = dispatcher.runSync("createFinAccountRole", roleCtx);
+        } catch (GenericServiceException e) {
+            Debug.logError(e, module);
+            return ServiceUtil.returnError(e.getMessage());
+        }
+        if (ServiceUtil.isError(roleResp)) {
+            return roleResp;
+        }
+
+        // create the initial deposit
+        Map depositCtx = FastMap.newInstance();
+        depositCtx.put("finAccountId", finAccountId);
+        depositCtx.put("productStoreId", productStoreId);
+        depositCtx.put("currency", currency);
+        depositCtx.put("partyId", partyId);
+        depositCtx.put("amount", new Double(deposit.doubleValue()));
+        depositCtx.put("userLogin", userLogin);
+
+        Map depositResp;
+        try {
+            depositResp = dispatcher.runSync("finAccountDeposit", depositCtx);
+        } catch (GenericServiceException e) {
+            Debug.logError(e, module);
+            return ServiceUtil.returnError(e.getMessage());
+        }
+        if (ServiceUtil.isError(depositResp)) {
+            return depositResp;
+        }
+
+        Map result = ServiceUtil.returnSuccess();
+        result.put("finAccountId", finAccountId);
+        return result;
+    }
+}

Propchange: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java
------------------------------------------------------------------------------
    svn:keywords = "Date Rev Author URL Id"

Propchange: ofbiz/trunk/applications/accounting/src/org/ofbiz/accounting/finaccount/FinAccountProductServices.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain