From 4020581d56887bf8a511685099f80799f71398ab Mon Sep 17 00:00:00 2001 From: "Levi Siuzdak (sile)" Date: Tue, 14 Nov 2023 16:47:07 +0100 Subject: [PATCH] [FIX] website_sale_loyalty: match correct coupon code on checkout Versions: --------- - saas-16.3+ Steps to Reproduce: ------------------- 1. go to Sales / Products / Discount & Loyalty; 2. go to 10% Discount Coupons; 3. click on Generate Coupons; 4. generate for Selected Customers (yourself); 5. repeat to get a second coupon; 6. go to webshop and try to buy something; 7. at checkout, try to apply the first coupon. Issue: ------ Clicking the coupon's "Use" button doesn't seem to do anything. Cause: ------ The `claim_reward` method iterates over all potential coupons, always selecting the last, most recent one, only to reject it if the code doesn't match the coupon selected by the user. Solution: --------- Return as soon as a matching coupon is found. opw-3562615 X-original-commit: 17d3862b27a5d388f37566d77a1790ef1b319589 Part-of: odoo/odoo#143256 --- .../website_sale_loyalty/controllers/main.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/addons/website_sale_loyalty/controllers/main.py b/addons/website_sale_loyalty/controllers/main.py index 30a66c0a3d5..dc7eecec978 100644 --- a/addons/website_sale_loyalty/controllers/main.py +++ b/addons/website_sale_loyalty/controllers/main.py @@ -85,22 +85,19 @@ class WebsiteSale(main.WebsiteSale): if not reward_sudo or reward_sudo.multi_product: return request.redirect(redirect) + program_sudo = reward_sudo.program_id claimable_rewards = order_sudo._get_claimable_and_showable_rewards() coupon = request.env['loyalty.card'] for coupon_, rewards in claimable_rewards.items(): if reward_sudo in rewards: coupon = coupon_ - - if not coupon: - return request.redirect(redirect) - program_sudo = reward_sudo.program_id - if code == coupon.code and ( - program_sudo.trigger == 'with_code' - or (program_sudo.trigger == 'auto' and program_sudo.applies_on == 'future') - ): - return self.pricelist(code) - - self._apply_reward(order_sudo, reward_sudo, coupon) + if code == coupon.code and ( + program_sudo.trigger == 'with_code' + or (program_sudo.trigger == 'auto' and program_sudo.applies_on == 'future') + ): + return self.pricelist(code) + if coupon: + self._apply_reward(order_sudo, reward_sudo, coupon) return request.redirect(redirect) def _apply_reward(self, order, reward, coupon):