Files
Odoo-Modules/Fusion Accounting/models/account_fiscal_year.py
2026-02-22 01:22:18 -05:00

72 lines
2.6 KiB
Python

# Fusion Accounting - Fiscal Year Management
# Defines company-specific fiscal year periods with overlap validation
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class FusionFiscalYear(models.Model):
"""Represents a fiscal year period for a company. Enforces
non-overlapping date ranges and prevents child-company assignments."""
_name = 'account.fiscal.year'
_description = 'Fiscal Year'
name = fields.Char(
string='Name',
required=True,
)
date_from = fields.Date(
string='Start Date',
required=True,
help='First day of the fiscal year (inclusive).',
)
date_to = fields.Date(
string='End Date',
required=True,
help='Last day of the fiscal year (inclusive).',
)
company_id = fields.Many2one(
comodel_name='res.company',
string='Company',
required=True,
default=lambda self: self.env.company,
)
@api.constrains('date_from', 'date_to', 'company_id')
def _validate_fiscal_year_dates(self):
"""Ensure fiscal years do not overlap for the same company and
that the date range is logically ordered. Fiscal years on child
companies are disallowed.
Overlap scenarios checked:
s1 s2 e1 e2 -> new starts inside existing
s2 s1 e2 e1 -> existing starts inside new
s1 s2 e2 e1 -> existing fully inside new
"""
for fiscal_year in self:
if fiscal_year.date_to < fiscal_year.date_from:
raise ValidationError(
_('The end date cannot be earlier than the start date.')
)
if fiscal_year.company_id.parent_id:
raise ValidationError(
_('Fiscal years cannot be defined on subsidiary companies.')
)
overlap_domain = [
('id', '!=', fiscal_year.id),
('company_id', '=', fiscal_year.company_id.id),
'|', '|',
'&', ('date_from', '<=', fiscal_year.date_from), ('date_to', '>=', fiscal_year.date_from),
'&', ('date_from', '<=', fiscal_year.date_to), ('date_to', '>=', fiscal_year.date_to),
'&', ('date_from', '<=', fiscal_year.date_from), ('date_to', '>=', fiscal_year.date_to),
]
if self.search_count(overlap_domain) > 0:
raise ValidationError(
_('Fiscal years for the same company must not overlap. '
'Please adjust the start or end dates.')
)