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>


Reply via email to