From a38a0caa0e308611bc79c1c93d89a44cb8fdc9e8 Mon Sep 17 00:00:00 2001 From: anhe-odoo Date: Mon, 22 Nov 2021 14:34:18 +0000 Subject: [PATCH] [FIX] sale_coupon: fix the unexpired_promotions filter Expected behaviour When having multiple promotions with, for example, a promotion of X% for the first order and a promotion of Y% (Y Signed-off-by: Hendrickx Anthony (anhe) --- addons/sale_coupon/models/coupon_program.py | 2 +- .../sale_coupon/tests/test_program_numbers.py | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/addons/sale_coupon/models/coupon_program.py b/addons/sale_coupon/models/coupon_program.py index 2df040cc9ed..1ab2349a5b1 100644 --- a/addons/sale_coupon/models/coupon_program.py +++ b/addons/sale_coupon/models/coupon_program.py @@ -102,7 +102,7 @@ class CouponProgram(models.Model): return self.filtered(lambda program: program.promo_code_usage == 'code_needed' and program.promo_code != order.promo_code) def _filter_unexpired_programs(self, order): - return self.filtered(lambda program: program.maximum_use_number == 0 or program.total_order_count <= program.maximum_use_number) + return self.filtered(lambda program: program.maximum_use_number == 0 or program.total_order_count < program.maximum_use_number) def _filter_programs_on_partners(self, order): return self.filtered(lambda program: program._is_valid_partner(order.partner_id)) diff --git a/addons/sale_coupon/tests/test_program_numbers.py b/addons/sale_coupon/tests/test_program_numbers.py index 5323a03a58b..d1dbc6fa976 100644 --- a/addons/sale_coupon/tests/test_program_numbers.py +++ b/addons/sale_coupon/tests/test_program_numbers.py @@ -1167,3 +1167,36 @@ class TestSaleCouponProgramNumbers(TestSaleCouponCommon): self.assertEqual(len(order.order_line), 2, 'The order must contain 2 order lines: 1x Product F and 1x 5$ discount') self.assertEqual(order.amount_total, 190.0, 'The price must be 190.0 since there is now 2x 5$ discount and 2x Product F') self.assertEqual(order.order_line.filtered(lambda x: x.is_reward_line).price_unit, -5, 'The discount unit price should still be -5 after the quantity was manually changed') + + def test_program_maximum_use_number_with_other_promo(self): + self.env['coupon.program'].create({ + 'name': '20% discount on first order', + 'promo_code_usage': 'no_code_needed', + 'program_type': 'promotion_program', + 'discount_type': 'percentage', + 'discount_percentage': 20.0, + 'maximum_use_number': 1, + }) + self.p1.promo_code_usage = 'no_code_needed' + + #check that 20% is applied at first order + order = self.empty_order + self.env['sale.order.line'].create({ + 'product_id': self.drawerBlack.id, + 'product_uom_qty': 1.0, + 'order_id': order.id, + }) + order.recompute_coupon_lines() + self.assertEqual(order.amount_total, 20.0, "20% discount should be applied") + self.assertEqual(len(order.order_line.ids), 2, "discount should be applied") + + #check that 10% is applied at second order + order2 = self.env['sale.order'].create({'partner_id': self.steve.id}) + self.env['sale.order.line'].create({ + 'product_id': self.drawerBlack.id, + 'product_uom_qty': 1.0, + 'order_id': order2.id, + }) + order2.recompute_coupon_lines() + self.assertEqual(order2.amount_total, 22.5, "10% discount should be applied") + self.assertEqual(len(order2.order_line.ids), 2, "discount should be applied")