[ADD] account_lock: new module making the lock date irreversible

Was task: https://www.odoo.com/web#id=38178&view_type=form&model=project.task&action=333&active_id=967&menu_id=4720
Was PR #22094
This commit is contained in:
Laurent Smet
2018-05-31 10:06:19 +02:00
committed by qdp-odoo
parent 1ad3d1847e
commit 2eb344f23b
6 changed files with 146 additions and 1 deletions
+3
View File
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
from . import models
+16
View File
@@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name' : 'Irreversible Lock Date',
'version' : '1.0',
'category': 'Accounting',
'description': """
Make the lock date irreversible:
* You cannot define stricter conditions on advisors than on users. Then, the lock date on advisor must be set before the lock date for users.
* You cannot lock a period that is not finished yet. Then, the lock date for advisors must be set before the last day of the previous month.
* The new lock date for advisors must be set after the previous lock date.
""",
'depends' : ['account'],
'data': [],
}
+46
View File
@@ -0,0 +1,46 @@
µ# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * account_lock
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 9.0e\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-03-14 08:33+0000\n"
"PO-Revision-Date: 2018-03-14 08:33+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: account_lock
#: model:ir.model,name:account_lock.model_res_company
msgid "Companies"
msgstr ""
#. module: account_lock
#: code:addons/account_lock/models/res_company.py:51
#, python-format
msgid "The lock date for advisors is irreversible and can't be removed."
msgstr ""
#. module: account_lock
#: code:addons/account_lock/models/res_company.py:55
#, python-format
msgid "The new lock date for advisors must be set after the previous lock date."
msgstr ""
#. module: account_lock
#: code:addons/account_lock/models/res_company.py:77
#, python-format
msgid "You cannot define stricter conditions on advisors than on users. Please make sure that the lock date on advisor is set before the lock date for users."
msgstr ""
#. module: account_lock
#: code:addons/account_lock/models/res_company.py:66
#, python-format
msgid "You cannot lock a period that is not finished yet. Please make sure that the lock date for advisors is not set after the last day of the previous month."
msgstr ""
+3
View File
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
import res_company
+77
View File
@@ -0,0 +1,77 @@
# -*- coding: utf-8 -*-
import time
import calendar
from datetime import datetime
from dateutil.relativedelta import relativedelta
from openerp import fields, models, api, _
from openerp.exceptions import ValidationError
from openerp.tools.misc import DEFAULT_SERVER_DATE_FORMAT
class ResCompany(models.Model):
_inherit = 'res.company'
@api.multi
def write(self, vals):
# fiscalyear_lock_date can't be set to a prior date
if 'fiscalyear_lock_date' in vals or 'period_lock_date' in vals:
self._check_lock_dates(vals)
return super(ResCompany, self).write(vals)
@api.multi
def _check_lock_dates(self, vals):
'''Check the lock dates for the current companies. This can't be done in a api.constrains because we need
to perform some comparison between new/old values. This method forces the lock dates to be irreversible.
* You cannot define stricter conditions on advisors than on users. Then, the lock date on advisor must be set
after the lock date for users.
* You cannot lock a period that is not finished yet. Then, the lock date for advisors must be set after the
last day of the previous month.
* The new lock date for advisors must be set after the previous lock date.
:param vals: The values passed to the write method.
'''
period_lock_date = vals.get('period_lock_date') and\
time.strptime(vals['period_lock_date'], DEFAULT_SERVER_DATE_FORMAT)
fiscalyear_lock_date = vals.get('fiscalyear_lock_date') and\
time.strptime(vals['fiscalyear_lock_date'], DEFAULT_SERVER_DATE_FORMAT)
previous_month = datetime.strptime(fields.Date.today(), DEFAULT_SERVER_DATE_FORMAT) + relativedelta(months=-1)
days_previous_month = calendar.monthrange(previous_month.year, previous_month.month)
previous_month = previous_month.replace(day=days_previous_month[1]).timetuple()
for company in self:
old_fiscalyear_lock_date = company.fiscalyear_lock_date and\
time.strptime(company.fiscalyear_lock_date, DEFAULT_SERVER_DATE_FORMAT)
# The user attempts to remove the lock date for advisors
if old_fiscalyear_lock_date and not fiscalyear_lock_date and 'fiscalyear_lock_date' in vals:
raise ValidationError(_('The lock date for advisors is irreversible and can\'t be removed.'))
# The user attempts to set a lock date for advisors prior to the previous one
if old_fiscalyear_lock_date and fiscalyear_lock_date and fiscalyear_lock_date < old_fiscalyear_lock_date:
raise ValidationError(_('The new lock date for advisors must be set after the previous lock date.'))
# In case of no new fiscal year in vals, fallback to the oldest
if not fiscalyear_lock_date:
if old_fiscalyear_lock_date:
fiscalyear_lock_date = old_fiscalyear_lock_date
else:
continue
# The user attempts to set a lock date for advisors prior to the last day of previous month
if fiscalyear_lock_date > previous_month:
raise ValidationError(_('You cannot lock a period that is not finished yet. Please make sure that the lock date for advisors is not set after the last day of the previous month.'))
# In case of no new period lock date in vals, fallback to the one defined in the company
if not period_lock_date:
if company.period_lock_date:
period_lock_date = time.strptime(company.period_lock_date, DEFAULT_SERVER_DATE_FORMAT)
else:
continue
# The user attempts to set a lock date for advisors prior to the lock date for users
if period_lock_date < fiscalyear_lock_date:
raise ValidationError(_('You cannot define stricter conditions on advisors than on users. Please make sure that the lock date on advisor is set before the lock date for users.'))
+1 -1
View File
@@ -19,7 +19,7 @@ The module adds following features:
Access to download the mandatory Certificate of Conformity delivered by Odoo SA (only for Odoo Enterprise users)
""",
'depends': ['l10n_fr'],
'depends': ['l10n_fr', 'account_lock'],
'installable': True,
'auto_install': False,
'application': False,