From d18da0e3d1048d534af636e402434f65ccb320c4 Mon Sep 17 00:00:00 2001 From: alexis-anthonissen Date: Mon, 26 Jan 2026 16:06:28 +0100 Subject: [PATCH 1/2] [18.0][REF] product_contract: simplify contract line upsell/downsell code --- product_contract/models/sale_order_line.py | 25 ++++------------------ 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/product_contract/models/sale_order_line.py b/product_contract/models/sale_order_line.py index cd2ffa3fc4..fa3fa28e8b 100644 --- a/product_contract/models/sale_order_line.py +++ b/product_contract/models/sale_order_line.py @@ -86,30 +86,13 @@ def _prepare_contract_line_values( def create_contract_line(self, contract): contract_line_model = self.env["contract.line"] contract_line = self.env["contract.line"] - predecessor_contract_line = False for rec in self: - if rec.contract_line_id: - # If the upsell/downsell line start at the same date or before - # the contract line to replace supposed to start, we cancel - # the one to be replaced. Otherwise we stop it. - if rec.date_start <= rec.contract_line_id.date_start: - # The contract will handel the contract line integrity - # An exception will be raised if we try to cancel an - # invoiced contract line - rec.contract_line_id.cancel() - elif ( - not rec.contract_line_id.date_end - or rec.date_start <= rec.contract_line_id.date_end - ): - rec.contract_line_id.stop(rec.date_start - relativedelta(days=1)) - predecessor_contract_line = rec.contract_line_id - if predecessor_contract_line: + rec.contract_line_id.stop(rec.date_start - relativedelta(days=1)) + if rec.contract_line_id.state == "closed": new_contract_line = contract_line_model.create( - rec._prepare_contract_line_values( - contract, predecessor_contract_line.id - ) + rec._prepare_contract_line_values(contract, rec.contract_line_id.id) ) - predecessor_contract_line.successor_contract_line_id = new_contract_line + rec.contract_line_id.successor_contract_line_id = new_contract_line else: new_contract_line = contract_line_model.create( rec._prepare_contract_line_values(contract) From a69c87fb8f640047011b6c8b765442abb4bea3c6 Mon Sep 17 00:00:00 2001 From: alexis-anthonissen Date: Wed, 28 Jan 2026 11:08:42 +0100 Subject: [PATCH 2/2] [REF] product_contract - add func _check_set_successor --- product_contract/models/contract_line.py | 3 +++ product_contract/models/sale_order_line.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/product_contract/models/contract_line.py b/product_contract/models/contract_line.py index cc351aff61..4b98ea62a1 100644 --- a/product_contract/models/contract_line.py +++ b/product_contract/models/contract_line.py @@ -75,3 +75,6 @@ def _compute_recurring_invoicing_type(self): ) def _compute_recurring_interval(self): return super()._compute_recurring_interval() + + def _check_set_successor(self): + return self.state == "closed" diff --git a/product_contract/models/sale_order_line.py b/product_contract/models/sale_order_line.py index fa3fa28e8b..9cd616b8cf 100644 --- a/product_contract/models/sale_order_line.py +++ b/product_contract/models/sale_order_line.py @@ -88,7 +88,7 @@ def create_contract_line(self, contract): contract_line = self.env["contract.line"] for rec in self: rec.contract_line_id.stop(rec.date_start - relativedelta(days=1)) - if rec.contract_line_id.state == "closed": + if rec.contract_line_id._check_set_successor(): new_contract_line = contract_line_model.create( rec._prepare_contract_line_values(contract, rec.contract_line_id.id) )