From 5a75d1aeae77c6bfb3ee1ba86115e46777b76bbf Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Fri, 9 Nov 2018 14:44:28 +0100 Subject: [PATCH] [FIX] sale_coupon: unvalid next_order programs if needed Before this commit: We would never unvalid a `next_order` program (and thus it's generated coupon) Now: We also retrieve applied `next_order` programs as we need to check if they are still valid too Step to reproduce: - Create a program on `next_order` that require $300 - Add $300 worth of product on a SO - Apply program, it will generate a coupon - Make the SO total go below $300 - The generated coupon is still Valid and the client will receive that coupon even if it is not supposed to anymore Closes #3062 --- models/sale_order.py | 6 +++++- tests/test_program_numbers.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/models/sale_order.py b/models/sale_order.py index 3324dce2d2a..c814ce5be24 100644 --- a/models/sale_order.py +++ b/models/sale_order.py @@ -347,7 +347,7 @@ class SaleOrder(models.Model): order = self applicable_programs = order._get_applicable_no_code_promo_program() + order._get_applicable_programs() + order._get_applied_coupon_program_coming_from_another_so() - applied_programs = order._get_applied_programs_with_rewards_on_current_order() + applied_programs = order._get_applied_programs_with_rewards_on_current_order() + order._get_applied_programs_with_rewards_on_next_order() programs_to_remove = applied_programs - applicable_programs products_to_remove = programs_to_remove.mapped('discount_line_product_id') @@ -370,6 +370,10 @@ class SaleOrder(models.Model): self.applied_coupon_ids.mapped('program_id') + \ self.code_promo_program_id.filtered(lambda p: p.promo_applicability == 'on_current_order') + def _get_applied_programs_with_rewards_on_next_order(self): + return self.no_code_promo_program_ids.filtered(lambda p: p.promo_applicability == 'on_next_order') + \ + self.code_promo_program_id.filtered(lambda p: p.promo_applicability == 'on_next_order') + class SaleOrderLine(models.Model): _inherit = "sale.order.line" diff --git a/tests/test_program_numbers.py b/tests/test_program_numbers.py index 024781da232..7869c3b80a6 100644 --- a/tests/test_program_numbers.py +++ b/tests/test_program_numbers.py @@ -517,3 +517,16 @@ class TestSaleCouponProgramNumbers(TestSaleCouponCommon): self.assertEqual(len(order.order_line.ids), 1, "Nothing should be added to the cart (2)") self.assertEqual(len(generated_coupon), 1, "A coupon should have been generated") self.assertEqual(generated_coupon.state, 'reserved', "The coupon should be reserved") + + sol1.product_uom_qty = 1 + order.recompute_coupon_lines() + generated_coupon = order.generated_coupon_ids + self.assertEqual(len(order.order_line.ids), 1, "Nothing should be added to the cart (3)") + self.assertEqual(len(generated_coupon), 1, "No more coupon should have been generated and the existing one should not have been deleted") + self.assertEqual(generated_coupon.state, 'expired', "The coupon should have been set as expired as it is no more valid since we don't have the required quantity") + + sol1.product_uom_qty = 2 + order.recompute_coupon_lines() + generated_coupon = order.generated_coupon_ids + self.assertEqual(len(generated_coupon), 1, "We should still have only 1 coupon as we now benefit again from the program but no need to create a new one (see next assert)") + self.assertEqual(generated_coupon.state, 'reserved', "The coupon should be set back to reserved as we had already an expired one, no need to create a new one")