Author: jonesde
Date: Fri Nov  3 21:08:26 2006
New Revision: 471118

URL: http://svn.apache.org/viewvc?view=rev&rev=471118
Log:
Fixed issue with the all quantity price calculation stuff; should now only 
calculate all quantity breaks iff the other conditions on the rule are true

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

Modified: 
incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java
URL: 
http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java?view=diff&rev=471118&r1=471117&r2=471118
==============================================================================
--- 
incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java
 (original)
+++ 
incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java
 Fri Nov  3 21:08:26 2006
@@ -508,7 +508,7 @@
             result.put("orderItemPriceInfos", FastList.newInstance());
 
             Map errorResult = addGeneralResults(result, competitivePriceValue, 
specialPromoPriceValue, productStore, 
-                   checkIncludeVat, currencyUomId, productId, quantity, 
partyId, dispatcher);
+                    checkIncludeVat, currencyUomId, productId, quantity, 
partyId, dispatcher);
             if (errorResult != null) return errorResult;
         } else {
             try {
@@ -526,23 +526,35 @@
                         List productPriceCondList = 
delegator.findByAndCache("ProductPriceCond", 
UtilMisc.toMap("productPriceRuleId", 
productPriceRule.get("productPriceRuleId")));
                         
                         boolean foundQuantityInputParam = false;
+                        // only consider a rule if all conditions except the 
quantity condition are true
+                        boolean allExceptQuantTrue = true;
                         Iterator productPriceCondIter = 
productPriceCondList.iterator();
                         while (productPriceCondIter.hasNext()) {
                             GenericValue productPriceCond = (GenericValue) 
productPriceCondIter.next();
                             if 
("PRIP_QUANTITY".equals(productPriceCond.getString("inputParamEnumId"))) {
-                               foundQuantityInputParam = true;
-                               break;
+                                foundQuantityInputParam = true;
+                            } else {
+                                if (!checkPriceCondition(productPriceCond, 
productId, prodCatalogId, productStoreGroupId, webSiteId, partyId, new 
Double(quantity), listPriceDbl.doubleValue(), currencyUomId, delegator)) {
+                                    // if there is a virtualProductId, try 
that given that this one has failed
+                                    if (virtualProductId != null) {
+                                        if 
(!checkPriceCondition(productPriceCond, virtualProductId, prodCatalogId, 
productStoreGroupId, webSiteId, partyId, new Double(quantity), 
listPriceDbl.doubleValue(), currencyUomId, delegator)) {
+                                            allExceptQuantTrue = false;
+                                        }
+                                        // otherwise, okay, this one made it 
so carry on checking
+                                    } else {
+                                        allExceptQuantTrue = false;
+                                    }
+                                }
                             }
                         }
                         
-                        if (foundQuantityInputParam) {
+                        if (foundQuantityInputParam && allExceptQuantTrue) {
                             quantityProductPriceRules.add(productPriceRule);
                         } else {
                             nonQuantityProductPriceRules.add(productPriceRule);
                         }
                     }                    
                 }
-                
 
                 if (findAllQuantityPrices) {
                     List allQuantityPrices = FastList.newInstance();
@@ -551,18 +563,18 @@
                     // foreach create an entry in the out list and eval that 
rule and all nonQuantityProductPriceRules rather than a single rule
                     Iterator quantityProductPriceRuleIter = 
quantityProductPriceRules.iterator();
                     while (quantityProductPriceRuleIter.hasNext()) {
-                       GenericValue quantityProductPriceRule = (GenericValue) 
quantityProductPriceRuleIter.next();
-                       
-                       List ruleListToUse = FastList.newInstance();
-                       ruleListToUse.add(quantityProductPriceRule);
-                       ruleListToUse.addAll(nonQuantityProductPriceRules);
-                       
+                        GenericValue quantityProductPriceRule = (GenericValue) 
quantityProductPriceRuleIter.next();
+                    
+                        List ruleListToUse = FastList.newInstance();
+                        ruleListToUse.add(quantityProductPriceRule);
+                        ruleListToUse.addAll(nonQuantityProductPriceRules);
+                    
                         Map quantCalcResults = 
calcPriceResultFromRules(ruleListToUse, listPriceDbl.doubleValue(), 
defaultPrice, promoPrice, 
-                                   wholesalePrice, maximumPriceValue, 
minimumPriceValue, validPriceFound, 
-                           averageCostValue, productId, virtualProductId, 
prodCatalogId, productStoreGroupId, 
-                           webSiteId, partyId, null, currencyUomId, delegator, 
nowTimestamp);
+                            wholesalePrice, maximumPriceValue, 
minimumPriceValue, validPriceFound, 
+                            averageCostValue, productId, virtualProductId, 
prodCatalogId, productStoreGroupId, 
+                            webSiteId, partyId, null, currencyUomId, 
delegator, nowTimestamp);
                         Map quantErrorResult = 
addGeneralResults(quantCalcResults, competitivePriceValue, 
specialPromoPriceValue, productStore, 
-                                   checkIncludeVat, currencyUomId, productId, 
quantity, partyId, dispatcher);
+                            checkIncludeVat, currencyUomId, productId, 
quantity, partyId, dispatcher);
                         if (quantErrorResult != null) return quantErrorResult;
                         
                         // also add the quantityProductPriceRule to the Map so 
it can be used for quantity break information
@@ -574,21 +586,21 @@
 
                     // use a quantity 1 to get the main price, then fill in 
the quantity break prices
                     Map calcResults = 
calcPriceResultFromRules(allProductPriceRules, listPriceDbl.doubleValue(), 
defaultPrice, promoPrice, 
-                           wholesalePrice, maximumPriceValue, 
minimumPriceValue, validPriceFound, 
-                           averageCostValue, productId, virtualProductId, 
prodCatalogId, productStoreGroupId, 
-                           webSiteId, partyId, new Double(1.0), currencyUomId, 
delegator, nowTimestamp);
+                        wholesalePrice, maximumPriceValue, minimumPriceValue, 
validPriceFound, 
+                        averageCostValue, productId, virtualProductId, 
prodCatalogId, productStoreGroupId, 
+                        webSiteId, partyId, new Double(1.0), currencyUomId, 
delegator, nowTimestamp);
                     result.putAll(calcResults);
                     Map errorResult = addGeneralResults(result, 
competitivePriceValue, specialPromoPriceValue, productStore, 
-                           checkIncludeVat, currencyUomId, productId, 
quantity, partyId, dispatcher);
+                            checkIncludeVat, currencyUomId, productId, 
quantity, partyId, dispatcher);
                     if (errorResult != null) return errorResult;
                 } else {
                     Map calcResults = 
calcPriceResultFromRules(allProductPriceRules, listPriceDbl.doubleValue(), 
defaultPrice, promoPrice, 
-                           wholesalePrice, maximumPriceValue, 
minimumPriceValue, validPriceFound, 
-                           averageCostValue, productId, virtualProductId, 
prodCatalogId, productStoreGroupId, 
-                           webSiteId, partyId, new Double(quantity), 
currencyUomId, delegator, nowTimestamp);
+                        wholesalePrice, maximumPriceValue, minimumPriceValue, 
validPriceFound, 
+                        averageCostValue, productId, virtualProductId, 
prodCatalogId, productStoreGroupId, 
+                        webSiteId, partyId, new Double(quantity), 
currencyUomId, delegator, nowTimestamp);
                     result.putAll(calcResults);
                     Map errorResult = addGeneralResults(result, 
competitivePriceValue, specialPromoPriceValue, productStore, 
-                           checkIncludeVat, currencyUomId, productId, 
quantity, partyId, dispatcher);
+                        checkIncludeVat, currencyUomId, productId, quantity, 
partyId, dispatcher);
                     if (errorResult != null) return errorResult;
                 }
             } catch (GenericEntityException e) {
@@ -602,7 +614,7 @@
     }
     
     public static Map addGeneralResults(Map result, GenericValue 
competitivePriceValue, GenericValue specialPromoPriceValue, GenericValue 
productStore, 
-           String checkIncludeVat, String currencyUomId, String productId, 
double quantity, String partyId, LocalDispatcher dispatcher) {
+        String checkIncludeVat, String currencyUomId, String productId, double 
quantity, String partyId, LocalDispatcher dispatcher) {
         result.put("competitivePrice", competitivePriceValue != null ? 
competitivePriceValue.getDouble("price") : null);
         result.put("specialPromoPrice", specialPromoPriceValue != null ? 
specialPromoPriceValue.getDouble("price") : null);
         result.put("currencyUsed", currencyUomId);
@@ -810,15 +822,15 @@
     }
     
     public static Map calcPriceResultFromRules(List productPriceRules, double 
listPrice, double defaultPrice, double promoPrice, 
-           double wholesalePrice, GenericValue maximumPriceValue, GenericValue 
minimumPriceValue, boolean validPriceFound, 
-           GenericValue averageCostValue, String productId, String 
virtualProductId, String prodCatalogId, String productStoreGroupId, 
-           String webSiteId, String partyId, Double quantity, String 
currencyUomId, GenericDelegator delegator, Timestamp nowTimestamp) throws 
GenericEntityException{
-       
-       Map calcResults = FastMap.newInstance();
+        double wholesalePrice, GenericValue maximumPriceValue, GenericValue 
minimumPriceValue, boolean validPriceFound, 
+        GenericValue averageCostValue, String productId, String 
virtualProductId, String prodCatalogId, String productStoreGroupId, 
+        String webSiteId, String partyId, Double quantity, String 
currencyUomId, GenericDelegator delegator, Timestamp nowTimestamp) throws 
GenericEntityException {
+    
+        Map calcResults = FastMap.newInstance();
 
-       List orderItemPriceInfos = FastList.newInstance();
+        List orderItemPriceInfos = FastList.newInstance();
         boolean isSale = false;
-       
+    
         // ========= go through each price rule by id and eval all conditions 
=========
         // utilTimer.timerString("Before eval rules", module);
         int totalConds = 0;


Reply via email to