[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#63067

X-original-commit: 58d82943c58ed50e2cae27b8eb085fc4e54eebaf
Signed-off-by: agr-odoo <agr-odoo@users.noreply.github.com>
This commit is contained in:
Andrea Grazioso (agr-odoo)
2020-12-09 09:08:41 +00:00
parent fd5fc76677
commit f345458d75
2 changed files with 61 additions and 0 deletions
+2
View File
@@ -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):
@@ -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)