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 cd2ffa3fc4..9cd616b8cf 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._check_set_successor(): 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)