# -*- coding: utf-8 -*- from odoo.exceptions import ValidationError from odoo import api, fields, models, _ from datetime import datetime class AccountFiscalYear(models.Model): _name = 'account.fiscal.year' _description = 'Fiscal Year' name = fields.Char(string='Name', required=True) date_from = fields.Date(string='Start Date', required=True, help='Start Date, included in the fiscal year.') date_to = fields.Date(string='End Date', required=True, help='Ending Date, included in the fiscal year.') company_id = fields.Many2one('res.company', string='Company', required=True, default=lambda self: self.env.company) @api.constrains('date_from', 'date_to', 'company_id') def _check_dates(self): ''' Check interleaving between fiscal years. There are 3 cases to consider: s1 s2 e1 e2 ( [----)----] s2 s1 e2 e1 [----(----] ) s1 s2 e2 e1 ( [----] ) ''' for fy in self: # Starting date must be prior to the ending date date_from = fy.date_from date_to = fy.date_to if date_to < date_from: raise ValidationError(_('The ending date must not be prior to the starting date.')) domain = [ ('id', '!=', fy.id), ('company_id', '=', fy.company_id.id), '|', '|', '&', ('date_from', '<=', fy.date_from), ('date_to', '>=', fy.date_from), '&', ('date_from', '<=', fy.date_to), ('date_to', '>=', fy.date_to), '&', ('date_from', '<=', fy.date_from), ('date_to', '>=', fy.date_to), ] if self.search_count(domain) > 0: raise ValidationError(_('You can not have an overlap between two fiscal years, please correct the start and/or end dates of your fiscal years.'))