[14.0][FIX] contract: Compute correctly the recurring next date at end

This commit is contained in:
Denis Roussel
2022-06-16 15:43:54 +02:00
parent 50ceb05b3b
commit c2459c481b
3 changed files with 50 additions and 9 deletions

View File

@@ -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):

View File

@@ -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 <strong>{product}</strong>

View File

@@ -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"))