You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Jacopo Cappellato <ja...@hotwaxmedia.com> on 2010/04/09 08:37:59 UTC
Re: svn commit: r932108 - in /ofbiz/trunk/applications: order/servicedef/ order/src/org/ofbiz/order/shoppingcart/product/ product/data/ product/entitydef/ product/webapp/catalog/promo/
Maybe here the usage of the "CustomMethod" pattern could fit well... not a big deal by the way.
The idea is that you enter the customMethodId in place of the service name in the condValue field: condValue --> CustomMethod --> serviceName
The nice thing with this approach is that you can define a new CustomMethodType for "product promo cond services" (and one for actions) and then use drop down to show the available list of services.
This pattern is used in a few other screens.
Jacopo
On Apr 8, 2010, at 10:47 PM, doogie@apache.org wrote:
> 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}: <input type="text" size="5" name="amount" value="${(productPromoAction.amount)?if_exists}" />
> ${uiLabelMap.ProductItemId}: <input type="text" size="15" name="productId" value="${(productPromoAction.productId)?if_exists}" />
> ${uiLabelMap.PartyParty}: <input type="text" size="10" name="partyId" value="${(productPromoAction.partyId)?if_exists}" />
> + ${uiLabelMap.ServiceName}: <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}: <input type="text" size="5" name="amount" />
> ${uiLabelMap.ProductItemId}: <input type="text" size="15" name="productId" />
> ${uiLabelMap.PartyParty}: <input type="text" size="10" name="partyId" />
> + ${uiLabelMap.ServiceName}: <input type="text" size="20" name="serviceName" />
> <input type="submit" value="${uiLabelMap.CommonCreate}" />
> </form>
> </div>
>
>
Re: svn commit: r932108 - in /ofbiz/trunk/applications: order/servicedef/
order/src/org/ofbiz/order/shoppingcart/product/ product/data/ product/entitydef/
product/webapp/catalog/promo/
Posted by Adam Heath <do...@brainfood.com>.
Jacopo Cappellato wrote:
> On Apr 9, 2010, at 5:33 PM, Adam Heath wrote:
>
>> Jacopo Cappellato wrote:
>>> Maybe here the usage of the "CustomMethod" pattern could fit well... not a big deal by the way.
>>> The idea is that you enter the customMethodId in place of the service name in the condValue field: condValue --> CustomMethod --> serviceName
>>> The nice thing with this approach is that you can define a new CustomMethodType for "product promo cond services" (and one for actions) and then use drop down to show the available list of services.
>>> This pattern is used in a few other screens.
>> Which would mean condValue is text for some variants, and a drop-down
>> for others. Is that possible with ofbiz?
>
> Well, it is rather easy to do.
>
>> My full plan is to complete rip apart checkCondition and runAction, so
>> that their big if/else blocks go away completely. At that point,
>> there type drop-down would be completely variable.
>
> Agreed.
>
>> It's possible we could change enumeration type PROD_PROMO_IN_PARAM, to
>> have it's own sub-table, then define the service that implements that
>> enumeration.
>
> I don't get you but don't worry, I am just probably reading too fast because I am busy.
> BTW, I hope you got what I was saying about CustomMethod.
Yeah, I got what you were saying. I just had a different suggestion/idea.
Enumeration is to Party, as ProdPromoInputEnumeration is to Person.
enumTypeId(PROD_PROMO_IN_PARAM).hasTable=Y would be similiar to
partyTypeId(PERSON).hasTable=Y.
Re: svn commit: r932108 - in /ofbiz/trunk/applications: order/servicedef/ order/src/org/ofbiz/order/shoppingcart/product/ product/data/ product/entitydef/ product/webapp/catalog/promo/
Posted by Jacopo Cappellato <ja...@gmail.com>.
On Apr 9, 2010, at 5:33 PM, Adam Heath wrote:
> Jacopo Cappellato wrote:
>> Maybe here the usage of the "CustomMethod" pattern could fit well... not a big deal by the way.
>> The idea is that you enter the customMethodId in place of the service name in the condValue field: condValue --> CustomMethod --> serviceName
>> The nice thing with this approach is that you can define a new CustomMethodType for "product promo cond services" (and one for actions) and then use drop down to show the available list of services.
>> This pattern is used in a few other screens.
>
> Which would mean condValue is text for some variants, and a drop-down
> for others. Is that possible with ofbiz?
Well, it is rather easy to do.
>
> My full plan is to complete rip apart checkCondition and runAction, so
> that their big if/else blocks go away completely. At that point,
> there type drop-down would be completely variable.
Agreed.
>
> It's possible we could change enumeration type PROD_PROMO_IN_PARAM, to
> have it's own sub-table, then define the service that implements that
> enumeration.
I don't get you but don't worry, I am just probably reading too fast because I am busy.
BTW, I hope you got what I was saying about CustomMethod.
Jacopo
>
>>
>> Jacopo
>>
>> On Apr 8, 2010, at 10:47 PM, doogie@apache.org wrote:
>>
>>> 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}: <input type="text" size="5" name="amount" value="${(productPromoAction.amount)?if_exists}" />
>>> ${uiLabelMap.ProductItemId}: <input type="text" size="15" name="productId" value="${(productPromoAction.productId)?if_exists}" />
>>> ${uiLabelMap.PartyParty}: <input type="text" size="10" name="partyId" value="${(productPromoAction.partyId)?if_exists}" />
>>> + ${uiLabelMap.ServiceName}: <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}: <input type="text" size="5" name="amount" />
>>> ${uiLabelMap.ProductItemId}: <input type="text" size="15" name="productId" />
>>> ${uiLabelMap.PartyParty}: <input type="text" size="10" name="partyId" />
>>> + ${uiLabelMap.ServiceName}: <input type="text" size="20" name="serviceName" />
>>> <input type="submit" value="${uiLabelMap.CommonCreate}" />
>>> </form>
>>> </div>
>>>
>>>
>>
>
Re: svn commit: r932108 - in /ofbiz/trunk/applications: order/servicedef/
order/src/org/ofbiz/order/shoppingcart/product/ product/data/ product/entitydef/
product/webapp/catalog/promo/
Posted by Adam Heath <do...@brainfood.com>.
Jacopo Cappellato wrote:
> Maybe here the usage of the "CustomMethod" pattern could fit well... not a big deal by the way.
> The idea is that you enter the customMethodId in place of the service name in the condValue field: condValue --> CustomMethod --> serviceName
> The nice thing with this approach is that you can define a new CustomMethodType for "product promo cond services" (and one for actions) and then use drop down to show the available list of services.
> This pattern is used in a few other screens.
Which would mean condValue is text for some variants, and a drop-down
for others. Is that possible with ofbiz?
My full plan is to complete rip apart checkCondition and runAction, so
that their big if/else blocks go away completely. At that point,
there type drop-down would be completely variable.
It's possible we could change enumeration type PROD_PROMO_IN_PARAM, to
have it's own sub-table, then define the service that implements that
enumeration.
>
> Jacopo
>
> On Apr 8, 2010, at 10:47 PM, doogie@apache.org wrote:
>
>> 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}: <input type="text" size="5" name="amount" value="${(productPromoAction.amount)?if_exists}" />
>> ${uiLabelMap.ProductItemId}: <input type="text" size="15" name="productId" value="${(productPromoAction.productId)?if_exists}" />
>> ${uiLabelMap.PartyParty}: <input type="text" size="10" name="partyId" value="${(productPromoAction.partyId)?if_exists}" />
>> + ${uiLabelMap.ServiceName}: <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}: <input type="text" size="5" name="amount" />
>> ${uiLabelMap.ProductItemId}: <input type="text" size="15" name="productId" />
>> ${uiLabelMap.PartyParty}: <input type="text" size="10" name="partyId" />
>> + ${uiLabelMap.ServiceName}: <input type="text" size="20" name="serviceName" />
>> <input type="submit" value="${uiLabelMap.CommonCreate}" />
>> </form>
>> </div>
>>
>>
>