[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
This commit is contained in:
Levi Siuzdak (sile)
2023-11-23 16:24:13 +00:00
parent 70f7448d45
commit 4020581d56
@@ -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):