diff --git a/contract/models/contract.py b/contract/models/contract.py index 5eb58479f..8abbccf99 100644 --- a/contract/models/contract.py +++ b/contract/models/contract.py @@ -322,15 +322,9 @@ class ContractContract(models.Model): and (not l.display_type or l.is_recurring_note) ) ).mapped("recurring_next_date") - # we give priority to computation from date_start if modified - if ( - contract._origin - and contract._origin.date_start != contract.date_start - or not recurring_next_date - ): - super(ContractContract, contract)._compute_recurring_next_date() - else: - contract.recurring_next_date = min(recurring_next_date) + contract.recurring_next_date = ( + min(recurring_next_date) if recurring_next_date else False + ) @api.depends("contract_line_ids.create_invoice_visibility") def _compute_create_invoice_visibility(self): diff --git a/contract/models/contract_line.py b/contract/models/contract_line.py index c38f75ed3..bdfc1927b 100644 --- a/contract/models/contract_line.py +++ b/contract/models/contract_line.py @@ -669,6 +669,10 @@ class ContractLine(models.Model): ), } + def _prepare_value_for_contract_stop(self, date_end): + self.ensure_one() + return {"date_end": date_end} + def stop(self, date_end, manual_renew_needed=False, post_message=True): """ Put date_end on contract line @@ -687,6 +691,15 @@ class ContractLine(models.Model): rec.write( rec._prepare_value_for_stop(date_end, manual_renew_needed) ) + if not rec.contract_id.line_recurrence: + # FIXME: This should not happen. As recurring_next_date + # is computed on contract from lines ones, the only + # write({"date_end"}) on lines should be sufficent + # The set_recurrence_field() on date_end should be + # suppressed. + rec.contract_id.write( + rec._prepare_value_for_contract_stop(date_end) + ) if post_message: msg = _( """Contract line for {product} diff --git a/contract/tests/test_contract.py b/contract/tests/test_contract.py index 4fc1ac1d7..24a86442d 100644 --- a/contract/tests/test_contract.py +++ b/contract/tests/test_contract.py @@ -2322,6 +2322,40 @@ class TestContract(TestContractBase): self.assertFalse(self.contract.terminate_reason_id) self.assertFalse(self.contract.terminate_comment) + def test_action_terminate_contract_check_recurring_dates(self): + """ + The use case here is to use a contract with recurrence on its level. + + Create a first invoice + Then, terminate it => Lines should have a end_date + Then, create a new invoice (the last one). + The recurring next date should be False. + """ + group_can_terminate_contract = self.env.ref("contract.can_terminate_contract") + group_can_terminate_contract.users |= self.env.user + self.contract3.contract_line_ids.write({"date_start": "2018-03-01"}) + self.contract3.recurring_create_invoice() + self.assertEqual(to_date("2018-04-01"), self.contract3.recurring_next_date) + + action = self.contract3.action_terminate_contract() + wizard = ( + self.env[action["res_model"]] + .with_context(action["context"]) + .create( + { + "terminate_date": "2018-04-02", + "terminate_reason_id": self.terminate_reason.id, + "terminate_comment": "terminate_comment", + } + ) + ) + wizard.terminate_contract() + # This is the last invoice + self.contract3.recurring_create_invoice() + + # Recurring next date should be False + self.assertFalse(self.contract3.recurring_next_date) + def test_terminate_date_before_last_date_invoiced(self): self.contract.recurring_create_invoice() self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-02-14"))