""" API Router for Trial Balance (Balanță de Verificare) Refactored to use service layer with caching """ from fastapi import APIRouter, Depends, HTTPException, Query from typing import Optional from datetime import date # import sys # Removed - no longer needed import os from shared.auth.dependencies import get_current_user from shared.auth.models import CurrentUser from ..models.trial_balance import TrialBalanceResponse from ..services.trial_balance_service import TrialBalanceService import logging logger = logging.getLogger(__name__) router = APIRouter() @router.get("/", response_model=TrialBalanceResponse) async def get_trial_balance( company: str = Query(description="Codul firmei (ID)"), luna: Optional[int] = Query(None, ge=1, le=12, description="Luna (1-12), default: luna curentă"), an: Optional[int] = Query(None, ge=2000, le=2100, description="An, default: anul curent"), cont_filter: Optional[str] = Query(None, description="Filtru număr cont (ex: '512', '4111')"), denumire_filter: Optional[str] = Query(None, description="Filtru denumire cont (partial match, case-insensitive)"), sort_by: str = Query("CONT", description="Coloană pentru sortare"), sort_order: str = Query("asc", description="Ordinea sortării (asc | desc)"), page: int = Query(1, ge=1, description="Pagina"), page_size: int = Query(50, ge=1, le=1000000, description="Mărimea paginii"), current_user: CurrentUser = Depends(get_current_user) ): """ Obține balanța de verificare sintetică pentru o firmă - Necesită autentificare JWT - Utilizatorul trebuie să aibă acces la firma specificată - Suportă filtrare după cont și denumire - Suportă paginare și sortare - **CACHED 10 min** - folosește sistem cache two-tier (L1 Memory + L2 SQLite) """ try: # Verifică dacă utilizatorul are acces la firma specificată if company not in current_user.companies: raise HTTPException( status_code=403, detail=f"Nu aveți acces la firma {company}" ) # Setează valorile implicite pentru lună și an (luna și anul curent) current_date = date.today() if luna is None: luna = current_date.month if an is None: an = current_date.year # Convert company to int company_id = int(company) # Call service (with caching) - all business logic moved to service data = await TrialBalanceService.get_trial_balance( company_id=company_id, luna=luna, an=an, cont_filter=cont_filter, denumire_filter=denumire_filter, sort_by=sort_by, sort_order=sort_order, page=page, page_size=page_size, username=current_user.username ) return TrialBalanceResponse( success=True, data=data ) except ValueError as e: # Schema not found or validation error logger.error(f"Validation error in trial balance: {str(e)}") raise HTTPException(status_code=400, detail=str(e)) except Exception as e: # Log unexpected errors logger.error(f"Error fetching trial balance: {str(e)}", exc_info=True) raise HTTPException( status_code=500, detail=f"Eroare la obținerea balanței de verificare: {str(e)}" )