diff --git a/addons/account/account.py b/addons/account/account.py index d420bb828e1..ab0aa51c592 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -495,6 +495,8 @@ class account_fiscalyear(osv.osv): _columns = { 'name': fields.char('Fiscal Year', size=64, required=True), 'code': fields.char('Code', size=6, required=True), + 'company_id': fields.many2one('res.company', 'Company', + help="Keep empty if the fiscal year belongs to several companies."), 'date_start': fields.date('Start date', required=True), 'date_stop': fields.date('End date', required=True), 'period_ids': fields.one2many('account.period', 'fiscalyear_id', 'Periods'), @@ -557,6 +559,8 @@ class account_period(osv.osv): _columns = { 'name': fields.char('Period Name', size=64, required=True), 'code': fields.char('Code', size=12), + 'special': fields.boolean('Special Period', size=12, + help="Special periods are periods that can overlap, like the 13rd period in fiscal years for closing entries."), 'date_start': fields.date('Start of period', required=True, states={'done':[('readonly',True)]}), 'date_stop': fields.date('End of period', required=True, states={'done':[('readonly',True)]}), 'fiscalyear_id': fields.many2one('account.fiscalyear', 'Fiscal Year', required=True, states={'done':[('readonly',True)]}, select=True), @@ -567,21 +571,28 @@ class account_period(osv.osv): } _order = "date_start" - def _check_duration(self,cr,uid,ids): + def _check_duration(self,cr,uid,ids,context={}): obj_period=self.browse(cr,uid,ids[0]) if obj_period.date_stop < obj_period.date_start: return False return True - def _check_year_limit(self,cr,uid,ids): - obj_period=self.browse(cr,uid,ids[0]) - if obj_period.fiscalyear_id.date_stop < obj_period.date_stop or obj_period.fiscalyear_id.date_stop < obj_period.date_start or obj_period.fiscalyear_id.date_start > obj_period.date_start or obj_period.fiscalyear_id.date_start > obj_period.date_stop: - return False + def _check_year_limit(self,cr,uid,ids,context={}): + for obj_period in self.browse(cr,uid,ids): + if obj_period.special: + continue + if obj_period.fiscalyear_id.date_stop < obj_period.date_stop or obj_period.fiscalyear_id.date_stop < obj_period.date_start or obj_period.fiscalyear_id.date_start > obj_period.date_start or obj_period.fiscalyear_id.date_start > obj_period.date_stop: + return False + + pids = self.search(cr, uid, [('date_stop','>=',obj_period.date_start),('date_stop','<=',obj_period.date_start),('special','=',False),('id','<>',obj_period.id)]) + for period in self.browse(cr, uid, pids): + if period.fiscalyear_id.company_id.id==obj_period.fiscalyear_id.company_id.id: + return False return True _constraints = [ (_check_duration, 'Error ! The date duration of the Period(s) is invalid. ', ['date_stop']), - (_check_year_limit, 'Error ! The date duration of the Period(s) should be within the limit of the Fiscal year. ', ['date_stop']) + (_check_year_limit, 'Invalid period ! Some periods overlap or the date duration is not in the limit of the fiscal year. ', ['date_stop']) ] def next(self, cr, uid, period, step, context={}): diff --git a/addons/account/account_demo.xml b/addons/account/account_demo.xml index 5b6f996b92e..c2bc9bdc1f4 100644 --- a/addons/account/account_demo.xml +++ b/addons/account/account_demo.xml @@ -19,30 +19,35 @@ + + + + + @@ -50,41 +55,48 @@ + + + + + + +