Browse Source

[FIX] - use the next_period dates to compute forecast dates

use the new methods for next period calculation result of the refactoring in #434
to consider the recurring_invoicing_type for monthlylastday mode and clean code
pull/439/head
sbejaoui 5 years ago
parent
commit
f160b68d46
  1. 49
      contract_forecast/models/contract_line.py
  2. 12
      contract_forecast/tests/test_contract_line_forecast_period.py

49
contract_forecast/models/contract_line.py

@ -69,38 +69,41 @@ class ContractLine(models.Model):
for rec in self:
rec.forecast_period_ids.unlink()
if rec.recurring_next_date:
last_date_invoiced = (
period_date_end = (
rec.last_date_invoiced
if rec.last_date_invoiced
else rec.date_start - relativedelta(days=1)
)
period_date_end = last_date_invoiced
recurring_next_date = rec.recurring_next_date
while rec._get_generate_forecast_periods_criteria(
while (
period_date_end
):
period_dates = rec._get_period_to_invoice(
last_date_invoiced,
recurring_next_date,
stop_at_date_end=not rec.is_auto_renew,
and rec._get_generate_forecast_periods_criteria(
period_date_end
)
period_date_start, period_date_end, recurring_next_date = (
period_dates
):
period_date_start = period_date_end + relativedelta(days=1)
period_date_end = self.get_next_period_date_end(
period_date_start,
rec.recurring_rule_type,
rec.recurring_interval,
max_date_end=rec.date_end,
)
values.append(
rec._prepare_contract_line_forecast_period(
period_date_start,
period_date_end,
recurring_next_date,
)
recurring_next_date = rec.get_next_invoice_date(
period_date_start,
rec.recurring_invoicing_type,
rec.recurring_invoicing_offset,
rec.recurring_rule_type,
rec.recurring_interval,
rec.date_end,
)
last_date_invoiced = period_date_end
recurring_next_date = (
recurring_next_date
+ self.get_relative_delta(
rec.recurring_rule_type, rec.recurring_interval
if period_date_end and recurring_next_date:
values.append(
rec._prepare_contract_line_forecast_period(
period_date_start,
period_date_end,
recurring_next_date,
)
)
)
return self.env["contract.line.forecast.period"].create(values)
@api.model

12
contract_forecast/tests/test_contract_line_forecast_period.py

@ -1,9 +1,9 @@
# Copyright 2019 ACSONE SA/NV
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from datetime import date
from dateutil.relativedelta import relativedelta
from odoo.fields import Date
from odoo.addons.contract.tests.test_contract import TestContractBase
from odoo.tools import mute_logger
@ -15,9 +15,9 @@ class TestContractLineForecastPeriod(TestContractBase):
context=dict(self.env.context, test_queue_job_no_delay=True)
)
super(TestContractLineForecastPeriod, self).setUp()
self.this_year = date.today().year
self.line_vals["date_start"] = date.today()
self.line_vals["recurring_next_date"] = date.today()
self.this_year = Date.today().year
self.line_vals["date_start"] = Date.today()
self.line_vals["recurring_next_date"] = Date.today()
self.acct_line = self.env["contract.line"].create(self.line_vals)
@mute_logger("odoo.addons.queue_job.models.base")
@ -132,7 +132,7 @@ class TestContractLineForecastPeriod(TestContractBase):
def test_forecast_period_on_contract_line_update_7(self):
self.acct_line.write(
{
'date_end': date.today() + relativedelta(months=3),
'date_end': Date.today() + relativedelta(months=3),
'recurring_rule_type': "monthlylastday",
'recurring_invoicing_type': 'pre-paid',
'is_auto_renew': True,
@ -140,7 +140,7 @@ class TestContractLineForecastPeriod(TestContractBase):
)
self.acct_line._onchange_date_start()
self.assertTrue(self.acct_line.forecast_period_ids)
self.assertEqual(len(self.acct_line.forecast_period_ids), 13)
self.assertEqual(len(self.acct_line.forecast_period_ids), 4)
@mute_logger("odoo.addons.queue_job.models.base")
def test_forecast_period_on_contract_line_update_8(self):

Loading…
Cancel
Save