summaryrefslogtreecommitdiff
path: root/odoo/tools/date_utils.py
diff options
context:
space:
mode:
authorLaurent Smet <las@odoo.com>2018-12-11 10:27:34 +0000
committerLaurent Smet <las@odoo.com>2019-01-03 08:30:31 +0000
commit67d3d30cf2992e3193ec6d20025da5ad2261871a (patch)
tree899993a4101aa751b92118a9a9a4ea316c39386b /odoo/tools/date_utils.py
parent5807c3bd95b64df77366d3c214c54ad9638e64a6 (diff)
[FIX] tools/date_utils: Fix get_fiscal_year with leap years
Suppose calling get_fiscal_year(date, day=29, month=2) with date(year=2017, month=2, day=28) The computation steps are: date_from = date(year=2017, month=2, day=28) - 1 year = date(year=2016, month=2, day=28) date_from = date_from + 1 day = date(year=2016, month=2, day=29) It's incorrect because the value of date_from must be date(year=2016, month=3, day=1) closes odoo/odoo#29416
Diffstat (limited to 'odoo/tools/date_utils.py')
-rw-r--r--odoo/tools/date_utils.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/odoo/tools/date_utils.py b/odoo/tools/date_utils.py
index 55220ced033..26bfdabd835 100644
--- a/odoo/tools/date_utils.py
+++ b/odoo/tools/date_utils.py
@@ -55,8 +55,19 @@ def get_fiscal_year(date, day=31, month=12):
'''
max_day = calendar.monthrange(date.year, month)[1]
date_to = type(date)(date.year, month, min(day, max_day))
+
+ # Force at 29 February instead of 28 in case of leap year.
+ if date_to.month == 2 and date_to.day == 28 and max_day == 29:
+ date_to = type(date)(date.year, 2, 29)
+
if date <= date_to:
date_from = date_to - relativedelta(years=1)
+ max_day = calendar.monthrange(date_from.year, date_from.month)[1]
+
+ # Force at 29 February instead of 28 in case of leap year.
+ if date_from.month == 2 and date_from.day == 28 and max_day == 29:
+ date_from = type(date)(date_from.year, 2, 29)
+
date_from += relativedelta(days=1)
else:
date_from = date_to + relativedelta(days=1)