Author: jacopoc
Date: Wed Dec 16 10:04:25 2015 New Revision: 1720312 URL: http://svn.apache.org/viewvc?rev=1720312&view=rev Log: OFBIZ-6772 and OFBIZ-6773: * added ability to specify comparison operators for promotions with conditions on quantity * added ability to specify categories/products to filter the order sub-total amount eligible for a discount Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCart.java ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCart.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCart.java?rev=1720312&r1=1720311&r2=1720312&view=diff ============================================================================== --- ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCart.java (original) +++ ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/ShoppingCart.java Wed Dec 16 10:04:25 2015 @@ -2759,6 +2759,18 @@ public class ShoppingCart implements Ite } return itemsTotal.add(this.getOrderOtherAdjustmentTotal()); } + public BigDecimal getSubTotalForPromotions(Set<String> productIds) { + BigDecimal itemsTotal = BigDecimal.ZERO; + for (ShoppingCartItem cartItem : this.cartLines) { + GenericValue product = cartItem.getProduct(); + if (product == null || "N".equals(product.getString("includeInPromotions")) || !productIds.contains(cartItem.getProductId())) { + // don't include in total if this is the case... + continue; + } + itemsTotal = itemsTotal.add(cartItem.getItemSubTotal()); + } + return itemsTotal; + } /** * Get the total payment amount by payment type. Specify null to get amount 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=1720312&r1=1720311&r2=1720312&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 Wed Dec 16 10:04:25 2015 @@ -986,9 +986,10 @@ public class ProductPromoWorker { compareBase = Integer.valueOf(amountAvailable.compareTo(amountNeeded)); } } else if ("PPIP_PRODUCT_QUANT".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"; - + if (operatorEnumId == null) { + // if the operator is not specified in the condition, then assume as default PPC_EQ (for backward compatibility) + operatorEnumId = "PPC_EQ"; + } BigDecimal quantityNeeded = BigDecimal.ONE; if (UtilValidate.isNotEmpty(condValue)) { quantityNeeded = new BigDecimal(condValue); @@ -1008,7 +1009,7 @@ public class ProductPromoWorker { (productIds.contains(cartItem.getProductId()) || (parentProductId != null && productIds.contains(parentProductId))) && (product == null || !"N".equals(product.getString("includeInPromotions")))) { // reduce quantity still needed to qualify for promo (quantityNeeded) - quantityNeeded = quantityNeeded.subtract(cartItem.addPromoQuantityCandidateUse(quantityNeeded, productPromoCond, false)); + quantityNeeded = quantityNeeded.subtract(cartItem.addPromoQuantityCandidateUse(quantityNeeded, productPromoCond, !"PPC_EQ".equals(operatorEnumId))); } } @@ -1743,7 +1744,13 @@ public class ProductPromoWorker { } } else if ("PROMO_ORDER_PERCENT".equals(productPromoActionEnumId)) { BigDecimal percentage = (productPromoAction.get("amount") == null ? BigDecimal.ZERO : (productPromoAction.getBigDecimal("amount").movePointLeft(2))).negate(); - BigDecimal amount = cart.getSubTotalForPromotions().multiply(percentage); + Set<String> productIds = ProductPromoWorker.getPromoRuleActionProductIds(productPromoAction, delegator, nowTimestamp); + BigDecimal amount; + if (productIds.isEmpty()) { + amount = cart.getSubTotalForPromotions().multiply(percentage); + } else { + amount = cart.getSubTotalForPromotions(productIds).multiply(percentage); + } if (amount.compareTo(BigDecimal.ZERO) != 0) { doOrderPromoAction(productPromoAction, cart, amount, "amount", delegator); actionResultInfo.ranAction = true; @@ -1969,7 +1976,6 @@ public class ProductPromoWorker { List<GenericValue> productPromoCategoriesAll = EntityQuery.use(delegator).from("ProductPromoCategory").where("productPromoId", productPromoCond.get("productPromoId")).cache(true).queryList(); List<GenericValue> productPromoCategories = EntityUtil.filterByAnd(productPromoCategoriesAll, UtilMisc.toMap("productPromoRuleId", "_NA_", "productPromoCondSeqId", "_NA_")); productPromoCategories.addAll(EntityUtil.filterByAnd(productPromoCategoriesAll, UtilMisc.toMap("productPromoRuleId", productPromoCond.get("productPromoRuleId"), "productPromoCondSeqId", productPromoCond.get("productPromoCondSeqId")))); - List<GenericValue> productPromoProductsAll = EntityQuery.use(delegator).from("ProductPromoProduct").where("productPromoId", productPromoCond.get("productPromoId")).cache(true).queryList(); List<GenericValue> productPromoProducts = EntityUtil.filterByAnd(productPromoProductsAll, UtilMisc.toMap("productPromoRuleId", "_NA_", "productPromoCondSeqId", "_NA_")); productPromoProducts.addAll(EntityUtil.filterByAnd(productPromoProductsAll, UtilMisc.toMap("productPromoRuleId", productPromoCond.get("productPromoRuleId"), "productPromoCondSeqId", productPromoCond.get("productPromoCondSeqId")))); |
Free forum by Nabble | Edit this page |