Author: jonesde
Date: Tue Jan 30 12:27:13 2007
New Revision: 501542

URL: http://svn.apache.org/viewvc?view=rev&rev=501542
Log:
Changed the checking of conditions for a virtual product if the main product is 
a variant to be done when it is a category condition, and added a note to 
continue not doing it for feature conditions; also added a note that in the 
future we might want to parameterize this, but for now this seems to address 
the most common behavior you'd want for virtual and variant products with price 
rules

Modified:
    
ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java

Modified: 
ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java?view=diff&rev=501542&r1=501541&r2=501542
==============================================================================
--- 
ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java 
(original)
+++ 
ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java 
Tue Jan 30 12:27:13 2007
@@ -536,19 +536,8 @@
                             if 
("PRIP_QUANTITY".equals(productPriceCond.getString("inputParamEnumId"))) {
                                 foundQuantityInputParam = true;
                             } else {
-                                if (!checkPriceCondition(productPriceCond, 
productId, prodCatalogId, productStoreGroupId, webSiteId, partyId, new 
Double(quantity), listPriceDbl.doubleValue(), currencyUomId, delegator, 
nowTimestamp)) {
-                                    // if there is a virtualProductId, try 
that given that this one has failed
-                                    if (virtualProductId != null) {
-                                        /* DEJ20061223 I don't know why we 
were trying conditions with the virtualProductId as well; this breaks various 
things you might want to do with price rules, so unless a need comes up for 
this in the future, removing it for now...
-                                        if 
(!checkPriceCondition(productPriceCond, virtualProductId, prodCatalogId, 
productStoreGroupId, webSiteId, partyId, new Double(quantity), 
listPriceDbl.doubleValue(), currencyUomId, delegator, nowTimestamp)) {
-                                            allExceptQuantTrue = false;
-                                        }
-                                        // otherwise, okay, this one made it 
so carry on checking
-                                         */
-                                        allExceptQuantTrue = false;
-                                    } else {
-                                        allExceptQuantTrue = false;
-                                    }
+                                if (!checkPriceCondition(productPriceCond, 
productId, virtualProductId, prodCatalogId, productStoreGroupId, webSiteId, 
partyId, new Double(quantity), listPriceDbl.doubleValue(), currencyUomId, 
delegator, nowTimestamp)) {
+                                    allExceptQuantTrue = false;
                                 }
                             }
                         }
@@ -888,22 +877,9 @@
 
                 totalConds++;
 
-                if (!checkPriceCondition(productPriceCond, productId, 
prodCatalogId, productStoreGroupId, webSiteId, partyId, quantity, listPrice, 
currencyUomId, delegator, nowTimestamp)) {
-                    // if there is a virtualProductId, try that given that 
this one has failed
-                    if (virtualProductId != null) {
-                        /* DEJ20061223 I don't know why we were trying 
conditions with the virtualProductId as well; this breaks various things you 
might want to do with price rules, so unless a need comes up for this in the 
future, removing it for now...
-                        if (!checkPriceCondition(productPriceCond, 
virtualProductId, prodCatalogId, productStoreGroupId, webSiteId, partyId, 
quantity, listPrice, currencyUomId, delegator, nowTimestamp)) {
-                            allTrue = false;
-                            break;
-                        }
-                        // otherwise, okay, this one made it so carry on 
checking
-                         */
-                        allTrue = false;
-                        break;
-                    } else {
-                        allTrue = false;
-                        break;
-                    }
+                if (!checkPriceCondition(productPriceCond, productId, 
virtualProductId, prodCatalogId, productStoreGroupId, webSiteId, partyId, 
quantity, listPrice, currencyUomId, delegator, nowTimestamp)) {
+                    allTrue = false;
+                    break;
                 }
 
                 // add condsDescription string entry
@@ -1105,7 +1081,7 @@
         return calcResults;
     }
 
-    public static boolean checkPriceCondition(GenericValue productPriceCond, 
String productId, String prodCatalogId,
+    public static boolean checkPriceCondition(GenericValue productPriceCond, 
String productId, String virtualProductId, String prodCatalogId,
             String productStoreGroupId, String webSiteId, String partyId, 
Double quantity, double listPrice,
             String currencyUomId, GenericDelegator delegator, Timestamp 
nowTimestamp) throws GenericEntityException {
         if (Debug.verboseOn()) Debug.logVerbose("Checking price condition: " + 
productPriceCond, module);
@@ -1126,7 +1102,23 @@
             } else {
                 compare = 1;
             }
+
+            // if there is a virtualProductId, try that given that this one 
has failed
+            // NOTE: this is important becuase of the common scenario where a 
virtual product is a member of a category but the variants will typically NOT be
+            // NOTE: we may want to parameterize this in the future, ie with 
an indicator on the ProductPriceCond entity
+            if (compare == 1 && UtilValidate.isNotEmpty(virtualProductId)) {
+                List virtualProductCategoryMembers = 
delegator.findByAndCache("ProductCategoryMember",
+                        UtilMisc.toMap("productId", virtualProductId, 
"productCategoryId", productCategoryId));
+                // and from/thru date within range
+                virtualProductCategoryMembers = 
EntityUtil.filterByDate(virtualProductCategoryMembers, nowTimestamp, null, 
null, true);
+                if (virtualProductCategoryMembers != null && 
virtualProductCategoryMembers.size() > 0) {
+                    // we found a member record? great, then this condition is 
satisfied
+                    compare = 0;
+                }
+            }
         } else if 
("PRIP_PROD_FEAT_ID".equals(productPriceCond.getString("inputParamEnumId"))) {
+            // NOTE: DEJ20070130 don't retry this condition with the 
virtualProductId as well; this breaks various things you might want to do with 
price rules, like have different pricing for a variant products with a certain 
distinguishing feature
+            
             // if a ProductFeatureAppl exists for this productId and the 
specified productFeatureId
             String productFeatureId = productPriceCond.getString("condValue");
             List productFeatureAppls = 
delegator.findByAndCache("ProductFeatureAppl",


Reply via email to