diff --git a/addons/sale_coupon/models/coupon_program.py b/addons/sale_coupon/models/coupon_program.py index 35fa15cb72efb93fe759e34ca0d2192cc326abb3..ae348eae340452d025f6f9d025de6004b1fadf18 100644 --- a/addons/sale_coupon/models/coupon_program.py +++ b/addons/sale_coupon/models/coupon_program.py @@ -75,7 +75,8 @@ class CouponProgram(models.Model): lines = order.order_line.filtered(lambda line: program.reward_type == 'discount' and (line.product_id == program.discount_line_product_id or - line.product_id == program.reward_id.discount_line_product_id + line.product_id == program.reward_id.discount_line_product_id or + (program.program_type == 'promotion_program' and line.is_reward_line) )) untaxed_amount = order_amount['amount_untaxed'] - sum([line.price_subtotal for line in lines]) tax_amount = order_amount['amount_tax'] - sum([line.price_tax for line in lines]) diff --git a/addons/sale_coupon/tests/test_program_numbers.py b/addons/sale_coupon/tests/test_program_numbers.py index f29b45430790ffcef0ac801407ca517411189129..2adf58064e494710100c21c65f53f3707db467af 100644 --- a/addons/sale_coupon/tests/test_program_numbers.py +++ b/addons/sale_coupon/tests/test_program_numbers.py @@ -772,3 +772,84 @@ class TestSaleCouponProgramNumbers(TestSaleCouponCommon): sol1.write({'product_uom_qty': 2.0}) order.recompute_coupon_lines() self.assertEqual(len(order.order_line.ids), 1, "The promotion lines should have been removed") + + def test_program_step_percentages(self): + # test step-like percentages increase over amount + testprod = self.env['product.product'].create({ + 'name': 'testprod', + 'lst_price': 118.0, + }) + + test10 = self.env['coupon.program'].create({ + 'name': '10% discount', + 'promo_code_usage': 'no_code_needed', + 'program_type': 'promotion_program', + 'discount_type': 'percentage', + 'discount_percentage': 10.0, + 'rule_minimum_amount': 1500.0, + 'rule_minimum_amount_tax_inclusion': 'tax_included', + }) + test15 = self.env['coupon.program'].create({ + 'name': '15% discount', + 'promo_code_usage': 'no_code_needed', + 'program_type': 'promotion_program', + 'discount_type': 'percentage', + 'discount_percentage': 15.0, + 'rule_minimum_amount': 1750.0, + 'rule_minimum_amount_tax_inclusion': 'tax_included', + }) + test20 = self.env['coupon.program'].create({ + 'name': '20% discount', + 'promo_code_usage': 'no_code_needed', + 'program_type': 'promotion_program', + 'discount_type': 'percentage', + 'discount_percentage': 20.0, + 'rule_minimum_amount': 2000.0, + 'rule_minimum_amount_tax_inclusion': 'tax_included', + }) + test25 = self.env['coupon.program'].create({ + 'name': '25% discount', + 'promo_code_usage': 'no_code_needed', + 'program_type': 'promotion_program', + 'discount_type': 'percentage', + 'discount_percentage': 25.0, + 'rule_minimum_amount': 2500.0, + 'rule_minimum_amount_tax_inclusion': 'tax_included', + }) + + #apply 10% + order = self.empty_order + order_line = self.env['sale.order.line'].create({ + 'product_id': testprod.id, + 'name': 'testprod', + 'product_uom_qty': 14.0, + 'price_unit': 118.0, + 'order_id': order.id, + 'tax_id': False, + }) + order.recompute_coupon_lines() + self.assertEqual(order.amount_total, 1486.80, "10% discount should be applied") + self.assertEqual(len(order.order_line.ids), 2, "discount should be applied") + + #switch to 15% + order_line.write({'product_uom_qty': 15}) + self.assertEqual(order.amount_total, 1604.8, "Discount improperly applied") + self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should") + + #switch to 20% + order_line.write({'product_uom_qty': 17}) + order.recompute_coupon_lines() + self.assertEqual(order.amount_total, 1604.8, "Discount improperly applied") + self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should") + + #still 20% + order_line.write({'product_uom_qty': 20}) + order.recompute_coupon_lines() + self.assertEqual(order.amount_total, 1888.0, "Discount improperly applied") + self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should") + + #back to 10% + order_line.write({'product_uom_qty': 14}) + order.recompute_coupon_lines() + self.assertEqual(order.amount_total, 1486.80, "Discount improperly applied") + self.assertEqual(len(order.order_line.ids), 2, "No discount applied while it should")