From f160b68d4698554658c00a6acfaa8a306eb370ae Mon Sep 17 00:00:00 2001 From: sbejaoui Date: Wed, 18 Dec 2019 17:35:41 +0100 Subject: [PATCH] [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 --- contract_forecast/models/contract_line.py | 49 ++++++++++--------- .../test_contract_line_forecast_period.py | 12 ++--- 2 files changed, 32 insertions(+), 29 deletions(-) diff --git a/contract_forecast/models/contract_line.py b/contract_forecast/models/contract_line.py index fcc98852..1852ee32 100644 --- a/contract_forecast/models/contract_line.py +++ b/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 diff --git a/contract_forecast/tests/test_contract_line_forecast_period.py b/contract_forecast/tests/test_contract_line_forecast_period.py index 2f182ce2..2414c91b 100644 --- a/contract_forecast/tests/test_contract_line_forecast_period.py +++ b/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):