David,

I've created a new action based on the existing one; of course I have considered to contribute it back but, right now, it is very hacky and not sure it is a good fit for the project.
By the way, I've attached it in this email.

Thanks again,

Jacopo


David E. Jones wrote:

Great, glad it worked out. So did you end up creating a new action, or changing the way the candidate counting works?

I guess I'm mostly wondering if there is an enhancement that could go in to make this easier for others in the future.

-David


On Mar 7, 2007, at 2:07 AM, Jacopo Cappellato wrote:

David,

this message is just to let you know that your hints about how to implement a new action to handle this kind of promo turned out to be of great help.

Thanks,

Jacopo


David E. Jones wrote:
The general idea with these sorts of promotions is that each quantity of each item can be used either as a qualifier or a benefactor of the promotion. My guess is that addPromoQuantityCandidateUse is returning 0 because the two items are already use up as qualifiers, and therefore can't be benefactors. So, this is a case where you would have to write a special promo action to handle the scenario so that the items are both qualifiers and benefactors. There are some others that are like that.
-David
On Mar 1, 2007, at 11:42 AM, Jacopo Cappellato wrote:
David,

thanks for your answer, please see my comments inline:

David E. Jones wrote:
So, what you want is a promotion for buy A and B get 20% off both.
I don't think we have a promotion implemented like that. You can see in the actions what your options are, like buy X of certain products get 50% (or 100%) off of one of them, or the Gift With Purchase where it adds a product with a certain discount to the cart, etc. What happens with the rule you setup? I guess it may do nothing, I'm not sure if it is designed to handle that, but you can always walk through the code and see what it is/isn't doing (ie see if the conditions evaluate to true, and see what the action tries to do).

Yes, your guess is right, it doesn't do anything.
The two conditions are both true, but the actions is not run because the ShoppingCartItem.addPromoQuantityCandidateUse(...) returns a 0.0 value

I still cannot figure out why...

Jacopo


-David
On Mar 1, 2007, at 7:08 AM, Jacopo Cappellato wrote:
Hi all,

I'm having hard time to set up the following promotion:

"If product A and product B are to the cart, then apply a 20% discount to product A and a 20% discount to product B"

Example:
product A: unit price $100
product B: unit price $200

if they are both added to the cart:
product A: unit price $100, adjustment $20, line amount = $80
product B: unit price $200, adjustment $40, line amount = $160


I tried to implement it with one promo with two conditions:

cond 1: "X Quantity of Product", "Is", quantity=1 for "Rule Product"=A cond 2: "X Quantity of Product", "Is", quantity=1 for "Rule Product"=B

and one action:

action: "X Product For Y% Discount", quantity=1, amount=20 for "Action Product"=A,B

The problem is that:

a) the above promotion is never applied
b) if I use one condition (instead of the two above) the 20% discount is applied to one of the product only and the amount is then splitted and assigned to the two items in the cart!!!

Here is an example of it:
https://demo.hotwaxmedia.com/catalog/control/EditProductPromo?productPromoId=10000

You can test it by creating an order and adding product "A" and "B" to the cart.

I've also tried to setup two different actions or to setup two different promotions with the same rules but one action each (one for A, and one for B), but without success.

Any hints?

Thanks,

Jacopo







+        } else if ("PROMO_PROD_DISC2".equals(productPromoActionEnumId)) {
+            double quantityDesired = productPromoAction.get("quantity") == 
null ? 1.0 : productPromoAction.getDouble("quantity").doubleValue();
+            double startingQuantity = quantityDesired;
+            double discountAmountTotal = 0;
+            Set productIds = 
ProductPromoWorker.getPromoRuleActionProductIds(productPromoAction, delegator, 
nowTimestamp);
+            List lineOrderedByBasePriceList = 
cart.getLineListOrderedByBasePrice(false);
+            Iterator lineOrderedByBasePriceIter = 
lineOrderedByBasePriceList.iterator();
+            while (quantityDesired > 0 && 
lineOrderedByBasePriceIter.hasNext()) {
+                ShoppingCartItem cartItem = (ShoppingCartItem) 
lineOrderedByBasePriceIter.next();
+                // only include if it is in the productId Set for this check 
and if it is not a Promo (GWP) item
+                GenericValue product = cartItem.getProduct();
+                String parentProductId = cartItem.getParentProductId();
+                if (!cartItem.getIsPromo() && 
+                        (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)
+                    cartItem.clearPromoRuleUseInfo();
+                    //double quantityUsed = 
cartItem.addPromoQuantityCandidateUse(quantityDesired, productPromoAction, 
false);
+                    double quantityUsed = 
cartItem.addPromoQuantityCandidateUse(1, productPromoAction, false);
+                    if (quantityUsed > 0) {
+                        quantityDesired -= quantityUsed;
+
+                        // create an adjustment and add it to the cartItem 
that implements the promotion action
+                        double percentModifier = 
productPromoAction.get("amount") == null ? 0.0 : 
(productPromoAction.getDouble("amount").doubleValue()/100.0);
+                        double lineAmount = quantityUsed * 
cartItem.getBasePrice();
+                        double discountAmount = -(lineAmount * 
percentModifier);
+                        discountAmountTotal += discountAmount;
+                        
+                        // not doing this any more, now distributing among 
conditions and actions (see call below): 
doOrderItemPromoAction(productPromoAction, cartItem, discountAmount, "amount", 
delegator);
+                    }
+                }
+            }
+
+            if (quantityDesired == startingQuantity) {
+                // couldn't find any cart items to give a discount to, don't 
consider action run
+                actionResultInfo.ranAction = false;
+            } else {
+                double totalAmount = getCartItemsUsedTotalAmount(cart, 
productPromoAction);
+
+                if (Debug.verboseOn()) Debug.logVerbose("Applying promo [" + 
productPromoAction.getPrimaryKey() + "]\n totalAmount=" + totalAmount + ", 
discountAmountTotal=" + discountAmountTotal, module);
+                distributeDiscountAmount(discountAmountTotal, totalAmount, 
getCartItemsUsed(cart, productPromoAction), productPromoAction, delegator);
+                actionResultInfo.ranAction = true;
+                actionResultInfo.totalDiscountAmount = discountAmountTotal;
+                actionResultInfo.quantityLeftInAction = quantityDesired;
+            }

Reply via email to