diff options
| author | Andrea Grazioso (agr-odoo) <agr@odoo.com> | 2020-12-02 16:49:16 +0000 |
|---|---|---|
| committer | Andrea Grazioso (agr-odoo) <agr@odoo.com> | 2020-12-08 10:14:48 +0000 |
| commit | 58d82943c58ed50e2cae27b8eb085fc4e54eebaf (patch) | |
| tree | 766274e15d3df65db4ae2d8a716eae7d482025cb /addons/sale_coupon | |
| parent | 6a4f2ba16e638c01a7b554bbf65b1d2e75a9e700 (diff) | |
[FIX] sale_coupon: avoid double consuming of coupon
Create a coupon code
use it in a quote A
cancel the quote A
use it in a quote B
confirm B
go back to quote A
set to quotation
confirm
Result: you used the coupon code twice
opw-2410684
closes odoo/odoo#62916
Signed-off-by: agr-odoo <agr-odoo@users.noreply.github.com>
Diffstat (limited to 'addons/sale_coupon')
| -rw-r--r-- | addons/sale_coupon/models/sale_order.py | 2 | ||||
| -rw-r--r-- | addons/sale_coupon/tests/test_program_with_code_operations.py | 59 |
2 files changed, 61 insertions, 0 deletions
diff --git a/addons/sale_coupon/models/sale_order.py b/addons/sale_coupon/models/sale_order.py index d5711874e2e..73021c9b949 100644 --- a/addons/sale_coupon/models/sale_order.py +++ b/addons/sale_coupon/models/sale_order.py @@ -52,6 +52,8 @@ class SaleOrder(models.Model): res = super(SaleOrder, self).action_cancel() self.generated_coupon_ids.write({'state': 'expired'}) self.applied_coupon_ids.write({'state': 'new'}) + self.applied_coupon_ids.sales_order_id = False + self.recompute_coupon_lines() return res def action_draft(self): diff --git a/addons/sale_coupon/tests/test_program_with_code_operations.py b/addons/sale_coupon/tests/test_program_with_code_operations.py index 466eb9eabd2..14240b41f74 100644 --- a/addons/sale_coupon/tests/test_program_with_code_operations.py +++ b/addons/sale_coupon/tests/test_program_with_code_operations.py @@ -66,6 +66,65 @@ class TestProgramWithCodeOperations(TestSaleCouponCommon): self.assertEqual(len(order.order_line.ids), 0) self.assertEqual(coupon.state, 'new') + def test_program_coupon_double_consuming(self): + # Test case: + # - Generate a coupon + # - add to a sale order A, cancel the sale order + # - add to a sale order B, confirm the order + # - go back to A, reset to draft and confirm + + self.code_promotion_program.reward_type = 'discount' + + self.env['coupon.generate.wizard'].with_context(active_id=self.code_promotion_program.id).create({ + 'generation_type': 'nbr_coupon', + 'nbr_coupons': 1, + }).generate_coupon() + coupon = self.code_promotion_program.coupon_ids + + sale_order_a = self.empty_order.copy() + sale_order_b = self.empty_order.copy() + + sale_order_a.write({'order_line': [ + (0, False, { + 'product_id': self.product_A.id, + 'name': '1 Product A', + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 1.0, + }) + ]}) + self.env['sale.coupon.apply.code'].with_context(active_id=sale_order_a.id).create({ + 'coupon_code': coupon.code + }).process_coupon() + sale_order_a.recompute_coupon_lines() + self.assertEqual(len(sale_order_a.order_line.ids), 2) + self.assertEqual(coupon.state, 'used') + self.assertEqual(coupon.sales_order_id, sale_order_a) + + sale_order_a.action_cancel() + + sale_order_b.write({'order_line': [ + (0, False, { + 'product_id': self.product_A.id, + 'name': '1 Product A', + 'product_uom': self.uom_unit.id, + 'product_uom_qty': 1.0, + }) + ]}) + self.env['sale.coupon.apply.code'].with_context(active_id=sale_order_b.id).create({ + 'coupon_code': coupon.code + }).process_coupon() + sale_order_b.recompute_coupon_lines() + self.assertEqual(len(sale_order_b.order_line.ids), 2) + self.assertEqual(coupon.state, 'used') + self.assertEqual(coupon.sales_order_id, sale_order_b) + + sale_order_b.action_confirm() + + sale_order_a.action_draft() + sale_order_a.action_confirm() + # reward line removed automatically + self.assertEqual(len(sale_order_a.order_line.ids), 1) + def test_coupon_code_with_pricelist(self): # Test case: Generate a coupon (10% discount) and apply it on an order with a specific pricelist (10% discount) |
