You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jo...@apache.org on 2007/01/30 21:27:14 UTC

svn commit: r501542 - /ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java

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",