diff --git a/CHANGELOG b/CHANGELOG
index e113e8e7dd..95cb34e811 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+* Add wizard for testing subscription recurrence rule
* Always fill invoice date
Version 6.0.0 - 2021-05-03
diff --git a/__init__.py b/__init__.py
index e0bd2096e8..b566be0393 100644
--- a/__init__.py
+++ b/__init__.py
@@ -17,6 +17,8 @@ def register():
configuration.ConfigurationSequence,
recurrence.RecurrenceRuleSet,
recurrence.RecurrenceRule,
+ recurrence.TestRecurrenceRuleSetView,
+ recurrence.TestRecurrenceRuleSetViewResult,
service.Service,
subscription.Subscription,
subscription.Line,
@@ -29,6 +31,7 @@ def register():
Pool.register(
subscription.CreateLineConsumption,
subscription.CreateSubscriptionInvoice,
+ recurrence.TestRecurrenceRuleSet,
party.Replace,
party.Erase,
module='sale_subscription', type_='wizard')
diff --git a/recurrence.py b/recurrence.py
index a167083205..9200680f04 100644
--- a/recurrence.py
+++ b/recurrence.py
@@ -1,5 +1,6 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
+import datetime as dt
from dateutil.rrule import MO, TU, WE, TH, FR, SA, SU
from dateutil.rrule import YEARLY, MONTHLY, WEEKLY, DAILY
from dateutil.rrule import rrule, rruleset
@@ -8,6 +9,7 @@ from trytond.i18n import gettext
from trytond.model import ModelSQL, ModelView, fields
from trytond.pool import Pool
from trytond.transaction import Transaction
+from trytond.wizard import Wizard, StateView, Button
from .exceptions import RecurrenceRuleValidationError
@@ -229,3 +231,58 @@ class RecurrenceRule(ModelSQL, ModelView):
recurrence_rule=self.rec_name,
exception=exception,
**self.__names__(name))) from exception
+
+
+class TestRecurrenceRuleSet(Wizard):
+ "Test Subscription Recurrence Rule Set"
+ __name__ = 'sale.subscription.recurrence.rule.set.test'
+ start_state = 'test'
+ test = StateView(
+ 'sale.subscription.recurrence.rule.set.test',
+ 'sale_subscription.recurrence_rule_set_test_view_form',
+ [Button("Close", 'end', 'tryton-close', default=True)])
+
+ def default_test(self, fields):
+ default = {}
+ if(self.model and self.model.__name__
+ == 'sale.subscription.recurrence.rule.set'):
+ if self.record:
+ default['recurrence'] = self.record.id
+ return default
+
+
+class TestRecurrenceRuleSetView(ModelView):
+ "Test Subscription Recurrence Rule Set"
+ __name__ = 'sale.subscription.recurrence.rule.set.test'
+ recurrence = fields.Many2One(
+ 'sale.subscription.recurrence.rule.set',
+ "Subscription Recurrence", required=True)
+ start_date = fields.Date("Start Date", required=True)
+ count = fields.Integer("Count", required=True,
+ help="Used to determine how many occurences to compute.")
+ result = fields.One2Many(
+ 'sale.subscription.recurrence.rule.set.test.result',
+ None, "Result", readonly=True)
+
+ @classmethod
+ def default_start_date(cls):
+ return Pool().get('ir.date').today()
+
+ @fields.depends('recurrence', 'start_date', 'count', 'result')
+ def on_change_with_result(self):
+ pool = Pool()
+ Result = pool.get('sale.subscription.recurrence.rule.set.test.result')
+ result = []
+ if self.recurrence and self.start_date and self.count:
+ rruleset = self.recurrence.rruleset(self.start_date)
+ datetime = dt.datetime.combine(self.start_date, dt.time())
+ for date in rruleset.xafter(datetime, self.count, inc=True):
+ result.append(Result(date=date.date()))
+ self.result = result
+ return self._changed_values.get('result', [])
+
+
+class TestRecurrenceRuleSetViewResult(ModelView):
+ "Test Subscription Recurrence Rule Set Result"
+ __name__ = 'sale.subscription.recurrence.rule.set.test.result'
+ date = fields.Date("Date", readonly=True)
diff --git a/recurrence.xml b/recurrence.xml
index c220c8efdc..dcff5cb3c7 100644
--- a/recurrence.xml
+++ b/recurrence.xml
@@ -64,5 +64,32 @@ this repository contains the full copyright notices and license terms. -->