svn commit: r932108 - in /ofbiz/trunk/applications: order/servicedef/ order/src/org/ofbiz/order/shoppingcart/product/ product/data/ product/entitydef/ product/webapp/catalog/promo/

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

svn commit: r932108 - in /ofbiz/trunk/applications: order/servicedef/ order/src/org/ofbiz/order/shoppingcart/product/ product/data/ product/entitydef/ product/webapp/catalog/promo/

doogie-3
Author: doogie
Date: Thu Apr  8 20:47:56 2010
New Revision: 932108

URL: http://svn.apache.org/viewvc?rev=932108&view=rev
Log:
Add new features, the ability to have promo conditions and actions both
as services, so that installations can do whatever kind of checking and
promotions that they want, without any modifications to ofbiz.

Modified:
    ofbiz/trunk/applications/order/servicedef/services_cart.xml
    ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java
    ofbiz/trunk/applications/product/data/ProductTypeData.xml
    ofbiz/trunk/applications/product/entitydef/entitymodel.xml
    ofbiz/trunk/applications/product/webapp/catalog/promo/EditProductPromoRules.ftl

Modified: ofbiz/trunk/applications/order/servicedef/services_cart.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/servicedef/services_cart.xml?rev=932108&r1=932107&r2=932108&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/servicedef/services_cart.xml (original)
+++ ofbiz/trunk/applications/order/servicedef/services_cart.xml Thu Apr  8 20:47:56 2010
@@ -24,6 +24,21 @@ under the License.
     <vendor>OFBiz</vendor>
     <version>1.0</version>
 
+    <service name="interfaceProductPromoCond" engine="interface" location="" invoke="">
+        <attribute name="productPromoCond" type="org.ofbiz.entity.GenericValue" mode="IN"/>
+        <attribute name="shoppingCart" type="org.ofbiz.order.shoppingcart.ShoppingCart" mode="IN"/>
+        <attribute name="nowTimestamp" type="Timestamp" mode="IN"/>
+        <attribute name="directResult" type="Boolean" mode="OUT" optional="true"/>
+        <attribute name="compareBase" type="Integer" mode="OUT" optional="true"/>
+        <attribute name="operatorEnumId" type="String" mode="OUT" optional="true"/>
+    </service>
+    <service name="interfaceProductPromoAction" engine="interface" location="" invoke="">
+        <attribute name="productPromoAction" type="org.ofbiz.entity.GenericValue" mode="IN"/>
+        <attribute name="shoppingCart" type="org.ofbiz.order.shoppingcart.ShoppingCart" mode="IN"/>
+        <attribute name="nowTimestamp" type="Timestamp" mode="IN"/>
+        <attribute name="actionResultInfo" type="org.ofbiz.order.shoppingcart.product.ProductPromoWorker.ActionResultInfo" mode="IN"/>
+        <attribute name="cartItemModifyException" type="org.ofbiz.order.shoppingcart.CartItemModifyException" mode="OUT" optional="false"/>
+    </service>
     <service name="assignItemShipGroup" engine="java" auth="false"
             location="org.ofbiz.order.shoppingcart.ShoppingCartServices" invoke="assignItemShipGroup">
         <description>Assign a ShoppingCartItem -> Quantity to a ship group</description>

Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java?rev=932108&r1=932107&r2=932108&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java (original)
+++ ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java Thu Apr  8 20:47:56 2010
@@ -789,7 +789,28 @@ public class ProductPromoWorker {
         if (Debug.verboseOn()) Debug.logVerbose("Checking promotion condition: " + productPromoCond, module);
         Integer compareBase = null;
 
-        if ("PPIP_PRODUCT_AMOUNT".equals(inputParamEnumId)) {
+        if ("PPIP_SERVICE".equals(inputParamEnumId)) {
+            Map<String, Object> serviceCtx = UtilMisc.<String, Object>toMap("productPromoCond", productPromoCond, "shoppingCart", cart, "nowTimestamp", nowTimestamp);
+            Map<String, Object> condResult;
+            try {
+                condResult = dispatcher.runSync(condValue, serviceCtx);
+            } catch (GenericServiceException e) {
+                Debug.logError(e, "Fatal error calling promo condition check service [" + condValue + "]", module);
+                return false;
+            }
+            if (ServiceUtil.isError(condResult)) {
+                Debug.logError("Error calling calling promo condition check service [" + condValue + "]", module);
+                return false;
+            }
+            Boolean directResult = (Boolean) condResult.get("directResult");
+            if (directResult != null) {
+                return directResult.booleanValue();
+            }
+            compareBase = (Integer) condResult.get("compareBase");
+            if (condResult.containsKey("operatorEnumId")) {
+                operatorEnumId = (String) condResult.get("operatorEnumId");
+            }
+        } else if ("PPIP_PRODUCT_AMOUNT".equals(inputParamEnumId)) {
             // for this type of promo force the operatorEnumId = PPC_EQ, effectively ignore that setting because the comparison is implied in the code
             operatorEnumId = "PPC_EQ";
 
@@ -1208,7 +1229,25 @@ public class ProductPromoWorker {
 
         String productPromoActionEnumId = productPromoAction.getString("productPromoActionEnumId");
 
-        if ("PROMO_GWP".equals(productPromoActionEnumId)) {
+        if ("PROMO_SERVICE".equals(productPromoActionEnumId)) {
+            Map<String, Object> serviceCtx = UtilMisc.<String, Object>toMap("productPromoAction", productPromoAction, "shoppingCart", cart, "nowTimestamp", nowTimestamp, "actionResultInfo", actionResultInfo);
+            String serviceName = productPromoAction.getString("serviceName");
+            Map<String, Object> actionResult;
+            try {
+                actionResult = dispatcher.runSync(serviceName, serviceCtx);
+            } catch (GenericServiceException e) {
+                Debug.logError("Error calling promo action service [" + serviceName + "]", module);
+                throw new CartItemModifyException("Error calling promo action service [" + serviceName + "]");
+            }
+            if (ServiceUtil.isError(actionResult)) {
+                Debug.logError("Error calling promo action service [" + serviceName + "], result is: " + actionResult, module);
+                throw new CartItemModifyException((String) actionResult.get(ModelService.ERROR_MESSAGE));
+            }
+            CartItemModifyException cartItemModifyException = (CartItemModifyException) actionResult.get("cartItemModifyException");
+            if (cartItemModifyException != null) {
+                throw cartItemModifyException;
+            }
+        } else if ("PROMO_GWP".equals(productPromoActionEnumId)) {
             String productStoreId = cart.getProductStoreId();
 
             // the code was in there for this, so even though I don't think we want to restrict this, just adding this flag to make it easy to change; could make option dynamic, but now implied by the use limit

Modified: ofbiz/trunk/applications/product/data/ProductTypeData.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/data/ProductTypeData.xml?rev=932108&r1=932107&r2=932108&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/data/ProductTypeData.xml (original)
+++ ofbiz/trunk/applications/product/data/ProductTypeData.xml Thu Apr  8 20:47:56 2010
@@ -371,6 +371,7 @@ under the License.
     <Enumeration description="Order sub-total X since beginning of current year" enumCode="ORST_YEAR" enumId="PPIP_ORST_YEAR" sequenceId="12" enumTypeId="PROD_PROMO_IN_PARAM"/>
     <Enumeration description="Order sub-total X last year" enumCode="ORST_LAST_YEAR" enumId="PPIP_ORST_LAST_YEAR" sequenceId="13" enumTypeId="PROD_PROMO_IN_PARAM"/>
     <Enumeration description="Shipping Total" enumCode="ORDER_SHIP_TOTAL" enumId="PPIP_ORDER_SHIPTOTAL" sequenceId="14" enumTypeId="PROD_PROMO_IN_PARAM"/>
+    <Enumeration description="Call Service" enumCode="SERVICE" enumId="PPIP_SERVICE" sequenceId="15" enumTypeId="PROD_PROMO_IN_PARAM"/>
 
     <EnumerationType description="Product Promotion Condition" enumTypeId="PROD_PROMO_COND" hasTable="N" parentTypeId="PROD_PROMO"/>
     <!-- old style very technical ...
@@ -403,6 +404,7 @@ under the License.
     <Enumeration description="Order Amount Flat" enumCode="ORDER_AMOUNT" enumId="PROMO_ORDER_AMOUNT" sequenceId="07" enumTypeId="PROD_PROMO_ACTION"/>
     <Enumeration description="Product for [Special Promo] Price" enumCode="PROD_SPPRC" enumId="PROMO_PROD_SPPRC" sequenceId="08" enumTypeId="PROD_PROMO_ACTION"/>
     <Enumeration description="Shipping X% discount" enumCode="SHIP_CHARGE" enumId="PROMO_SHIP_CHARGE" sequenceId="09" enumTypeId="PROD_PROMO_ACTION"/>
+    <Enumeration description="Call Service" enumCode="SERVICE" enumId="PROMO_SERVICE" sequenceId="10" enumTypeId="PROD_PROMO_ACTION"/>
 
     <EnumerationType description="Product Rating Field Type" enumTypeId="PROD_RATING_TYPE" hasTable="N" parentTypeId=""/>
     <Enumeration description="Min Rating" enumCode="MIN" enumId="PRDR_MIN" sequenceId="01" enumTypeId="PROD_RATING_TYPE"/>

Modified: ofbiz/trunk/applications/product/entitydef/entitymodel.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/entitydef/entitymodel.xml?rev=932108&r1=932107&r2=932108&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/entitydef/entitymodel.xml (original)
+++ ofbiz/trunk/applications/product/entitydef/entitymodel.xml Thu Apr  8 20:47:56 2010
@@ -3385,6 +3385,7 @@ under the License.
       <field name="productPromoActionSeqId" type="id-ne"></field>
       <field name="productPromoActionEnumId" type="id-ne"></field>
       <field name="orderAdjustmentTypeId" type="id"></field>
+      <field name="serviceName" type="long-varchar"></field>
       <field name="quantity" type="fixed-point"></field>
       <field name="amount" type="fixed-point"></field>
       <field name="productId" type="id"></field>

Modified: ofbiz/trunk/applications/product/webapp/catalog/promo/EditProductPromoRules.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/promo/EditProductPromoRules.ftl?rev=932108&r1=932107&r2=932108&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/promo/EditProductPromoRules.ftl (original)
+++ ofbiz/trunk/applications/product/webapp/catalog/promo/EditProductPromoRules.ftl Thu Apr  8 20:47:56 2010
@@ -279,6 +279,7 @@ under the License.
                                         ${uiLabelMap.ProductAmount}:&nbsp;<input type="text" size="5" name="amount" value="${(productPromoAction.amount)?if_exists}" />
                                         ${uiLabelMap.ProductItemId}:&nbsp;<input type="text" size="15" name="productId" value="${(productPromoAction.productId)?if_exists}" />
                                         ${uiLabelMap.PartyParty}:&nbsp;<input type="text" size="10" name="partyId" value="${(productPromoAction.partyId)?if_exists}" />
+                                        ${uiLabelMap.ServiceName}:&nbsp;<input type="text" size="20" name="serviceName" value="${(productPromoAction.serviceName)?if_exists}" />
                                         <input type="submit" value="${uiLabelMap.CommonUpdate}" />
                                     </form>
                                     </div>
@@ -392,6 +393,7 @@ under the License.
                                         ${uiLabelMap.ProductAmount}:&nbsp;<input type="text" size="5" name="amount" />
                                         ${uiLabelMap.ProductItemId}:&nbsp;<input type="text" size="15" name="productId" />
                                         ${uiLabelMap.PartyParty}:&nbsp;<input type="text" size="10" name="partyId" />
+                                        ${uiLabelMap.ServiceName}:&nbsp;<input type="text" size="20" name="serviceName" />
                                         <input type="submit" value="${uiLabelMap.CommonCreate}" />
                                     </form>
                                     </div>