""" Calendar service for fetching available accounting periods """ # import sys # Removed - no longer needed import os from typing import Optional from shared.database.oracle_pool import oracle_pool from ..models.calendar import CalendarPeriod, CalendarPeriodsResponse from ..cache.decorators import cached import logging logger = logging.getLogger(__name__) class CalendarService: """Service for calendar/accounting period operations""" # Romanian month names for display MONTH_NAMES_RO = [ "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie" ] @staticmethod @cached(cache_type='schema', key_params=['company_id', 'server_id']) async def _get_schema(company_id: int, server_id: Optional[str] = None) -> str: """Get schema for company (CACHED 24h)""" async with oracle_pool.get_connection(server_id) as connection: with connection.cursor() as cursor: cursor.execute(""" SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id """, {'company_id': company_id}) result = cursor.fetchone() return result[0] if result else None @staticmethod @cached(cache_type='calendar_periods', key_params=['company_id', 'server_id']) async def get_available_periods(company_id: int, server_id: Optional[str] = None) -> CalendarPeriodsResponse: """ Get all available accounting periods for a company (CACHED 1h) Returns periods ordered by year DESC, month DESC with Romanian month names. """ schema = await CalendarService._get_schema(company_id, server_id) if not schema: logger.warning(f"Schema not found for company {company_id}") return CalendarPeriodsResponse(periods=[], current_period=None, total_count=0) async with oracle_pool.get_connection(server_id) as connection: with connection.cursor() as cursor: cursor.execute(f""" SELECT anul, luna FROM {schema}.calendar ORDER BY anul DESC, luna DESC """) rows = cursor.fetchall() periods = [] for row in rows: an, luna = row[0], row[1] month_name = CalendarService.MONTH_NAMES_RO[luna - 1] periods.append(CalendarPeriod( an=an, luna=luna, display_name=f"{month_name} {an}" )) current_period = periods[0] if periods else None logger.info(f"Loaded {len(periods)} accounting periods for company {company_id}") return CalendarPeriodsResponse( periods=periods, current_period=current_period, total_count=len(periods) )