From e8efcb1bc34353ad89bf027d28eee6977de8cd13 Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Fri, 9 Nov 2018 14:23:49 +0100 Subject: [FIX] sale_coupon: do not deduce reward quantity on current_order Before this commit: 1. We were checking if the rewards were in the SO even if it was 'next_order' program. 2. We were deducing the rewards quantity for 'next_order' program when checking if we had enough products to meet the program requirements. Now: 1. We don't verify if the reward is on the SO if the program is 'next_order' 2. We don't deduce reward quantity when checking if enough products to meet the program requirements if the program is 'next_order' opw-1907211 Closes #3062 --- tests/test_program_numbers.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'tests/test_program_numbers.py') diff --git a/tests/test_program_numbers.py b/tests/test_program_numbers.py index 8284cd1dad4..024781da232 100644 --- a/tests/test_program_numbers.py +++ b/tests/test_program_numbers.py @@ -489,3 +489,31 @@ class TestSaleCouponProgramNumbers(TestSaleCouponCommon): fixed_amount_program.write({'active': False}) # Check archived product will remove discount lines on recompute order.recompute_coupon_lines() self.assertEqual(len(order.order_line.ids), 1, "Archiving the program should remove the program reward line") + + def test_program_next_order(self): + order = self.empty_order + self.env['sale.coupon.program'].create({ + 'name': 'Free Keyboard if at least 1 article', + 'promo_code_usage': 'no_code_needed', + 'promo_applicability': 'on_next_order', + 'program_type': 'promotion_program', + 'reward_type': 'product', + 'reward_product_id': self.wirelessKeyboard.id, + 'rule_min_quantity': 2, + }) + sol1 = self.env['sale.order.line'].create({ + 'product_id': self.iPadMini.id, + 'name': 'iPad Mini', + 'product_uom_qty': 1.0, + 'order_id': order.id, + }) + order.recompute_coupon_lines() + self.assertEqual(len(order.order_line.ids), 1, "Nothing should be added to the cart") + self.assertEqual(len(order.generated_coupon_ids), 0, "No coupon should have been generated yet") + + sol1.product_uom_qty = 2 + 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 (2)") + self.assertEqual(len(generated_coupon), 1, "A coupon should have been generated") + self.assertEqual(generated_coupon.state, 'reserved', "The coupon should be reserved") -- cgit v1.2.3 From 5a75d1aeae77c6bfb3ee1ba86115e46777b76bbf Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Fri, 9 Nov 2018 14:44:28 +0100 Subject: [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 --- tests/test_program_numbers.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'tests/test_program_numbers.py') 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") -- cgit v1.2.3