From 445095311380b46bd43b8f5d317b83a3d9bcc6e8 Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Thu, 30 Jan 2020 13:24:25 +0100 Subject: [PATCH] [IMP] - can't upsell or downsell a resiliated contract --- product_contract/models/sale_order.py | 12 ++++++++++++ product_contract/models/sale_order_line.py | 11 +++++++++++ product_contract/tests/test_sale_order.py | 15 +++++++++++++++ product_contract/views/sale_order.xml | 1 + 4 files changed, 39 insertions(+) diff --git a/product_contract/models/sale_order.py b/product_contract/models/sale_order.py index 70c65ae8c..cf2e45923 100644 --- a/product_contract/models/sale_order.py +++ b/product_contract/models/sale_order.py @@ -17,6 +17,18 @@ class SaleOrder(models.Model): compute='_compute_need_contract_creation' ) + @api.constrains('state') + def check_contact_is_not_resiliated(self): + for rec in self: + if rec.state not in ( + 'sale', + 'done', + 'cancel', + ) and rec.order_line.filtered('contract_id.is_resiliated'): + raise ValidationError( + _("You can't upsell or downsell a resiliated contract") + ) + @api.depends('order_line.contract_id', 'state') def _compute_need_contract_creation(self): for rec in self: diff --git a/product_contract/models/sale_order_line.py b/product_contract/models/sale_order_line.py index 02d0c91b2..c14ee0e7c 100644 --- a/product_contract/models/sale_order_line.py +++ b/product_contract/models/sale_order_line.py @@ -67,6 +67,17 @@ class SaleOrderLine(models.Model): help="Specify Interval for automatic renewal.", ) + @api.constrains('contract_id') + def check_contact_is_not_resiliated(self): + for rec in self: + if ( + rec.order_id.state not in ('sale', 'done', 'cancel') + and rec.contract_id.is_resiliated + ): + raise ValidationError( + _("You can't upsell or downsell a resiliated contract") + ) + @api.multi @api.depends('product_id') def _compute_contract_template_id(self): diff --git a/product_contract/tests/test_sale_order.py b/product_contract/tests/test_sale_order.py index 36705af7c..3dbb49513 100644 --- a/product_contract/tests/test_sale_order.py +++ b/product_contract/tests/test_sale_order.py @@ -342,3 +342,18 @@ class TestSaleOrder(TransactionCase): self.env['contract.contract'].search(action['domain']), self.sale.order_line.mapped('contract_id'), ) + + def test_check_contact_is_not_resiliated(self): + self.contract.is_resiliated = True + with self.assertRaises(ValidationError): + self.order_line1.contract_id = self.contract + + def test_check_contact_is_not_resiliated(self): + self.order_line1.contract_id = self.contract + self.sale.action_confirm() + self.contract.is_resiliated = True + self.sale.action_cancel() + with self.assertRaises(ValidationError): + self.sale.action_draft() + self.contract.is_resiliated = False + self.sale.action_draft() diff --git a/product_contract/views/sale_order.xml b/product_contract/views/sale_order.xml index 24ab4d1c7..6d4300216 100644 --- a/product_contract/views/sale_order.xml +++ b/product_contract/views/sale_order.xml @@ -41,6 +41,7 @@ domain="['|',('contract_template_id','=',contract_template_id), ('contract_template_id','=',False), ('partner_id','=',parent.partner_id), + ('is_resiliated','=',False), ]"/>