diff --git a/CHANGELOG b/CHANGELOG
index 871362ef6b..ebfe91f2f4 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,5 @@
+* Change days into timedelta overdue
+
Version 4.0.0 - 2016-05-02
* Bug fixes (see mercurial logs for details)
* Add Python3 support
diff --git a/dunning.py b/dunning.py
index b52a2cd968..f4b910751d 100644
--- a/dunning.py
+++ b/dunning.py
@@ -1,12 +1,14 @@
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
from collections import defaultdict
+import datetime
from sql import Null
from sql.conditionals import Case
from trytond.model import Model, ModelView, ModelSQL, fields, Unique
from trytond.pyson import If, Eval
+from trytond import backend
from trytond.transaction import Transaction
from trytond.wizard import Wizard, StateView, StateAction, StateTransition, \
Button
@@ -31,7 +33,28 @@ class Level(ModelSQL, ModelView):
sequence = fields.Integer('Sequence')
procedure = fields.Many2One('account.dunning.procedure', 'Procedure',
required=True, select=True)
- days = fields.Integer('Number of Overdue Days')
+ overdue = fields.TimeDelta('Overdue')
+
+ @classmethod
+ def __register__(cls, module_name):
+ TableHandler = backend.get('TableHandler')
+ cursor = Transaction().connection.cursor()
+ table = TableHandler(cls, module_name)
+ sql_table = cls.__table__()
+
+ super(Level, cls).__register__(module_name)
+
+ # Migration from 4.0: change days into timedelta overdue
+ if table.column_exist('days'):
+ cursor.execute(*sql_table.select(sql_table.id, sql_table.days,
+ where=sql_table.days != Null))
+ for id_, days in cursor:
+ overdue = datetime.timedelta(days)
+ cursor.execute(*sql_table.update(
+ [sql_table.days_duration],
+ [overdue],
+ where=sql_table.id == id_))
+ table.drop_column('days')
@classmethod
def __setup__(cls):
@@ -48,8 +71,8 @@ class Level(ModelSQL, ModelView):
self.procedure.rec_name)
def test(self, line, date):
- if self.days is not None:
- return (date - line.maturity_date).days >= self.days
+ if self.overdue is not None:
+ return (date - line.maturity_date) >= self.overdue
_STATES = {
'readonly': Eval('state') != 'draft',
diff --git a/tests/scenario_account_dunning.rst b/tests/scenario_account_dunning.rst
index 747e0fe23f..f229e8e6f4 100644
--- a/tests/scenario_account_dunning.rst
+++ b/tests/scenario_account_dunning.rst
@@ -78,13 +78,13 @@ Create dunning procedure::
>>> procedure = Procedure(name='Procedure')
>>> level = procedure.levels.new()
>>> level.sequence = 1
- >>> level.days = 5
+ >>> level.overdue = datetime.timedelta(5)
>>> level = procedure.levels.new()
>>> level.sequence = 2
- >>> level.days = 20
+ >>> level.overdue = datetime.timedelta(20)
>>> level = procedure.levels.new()
>>> level.sequence = 3
- >>> level.days = 40
+ >>> level.overdue = datetime.timedelta(40)
>>> procedure.save()
Create parties::
diff --git a/view/dunning_level_form.xml b/view/dunning_level_form.xml
index e0b2c0e89d..a50b97ccaf 100644
--- a/view/dunning_level_form.xml
+++ b/view/dunning_level_form.xml
@@ -7,6 +7,6 @@ this repository contains the full copyright notices and license terms. -->
-
-
+
+
diff --git a/view/dunning_level_list.xml b/view/dunning_level_list.xml
index 4d123e301e..684ecdfdf0 100644
--- a/view/dunning_level_list.xml
+++ b/view/dunning_level_list.xml
@@ -3,5 +3,5 @@
this repository contains the full copyright notices and license terms. -->
-
+
diff --git a/view/dunning_level_list_sequence.xml b/view/dunning_level_list_sequence.xml
index 244f84211a..1297730874 100644
--- a/view/dunning_level_list_sequence.xml
+++ b/view/dunning_level_list_sequence.xml
@@ -3,5 +3,5 @@
this repository contains the full copyright notices and license terms. -->
-
+