from typing import Dict, Any from fastapi import APIRouter, Depends, Request from sqlalchemy.orm import Session from adapters.db.session import get_db from app.core.auth_dependency import get_current_user, AuthContext from app.core.permissions import require_business_access from app.core.responses import success_response, ApiError, format_datetime_fields from adapters.db.repositories.fiscal_year_repo import FiscalYearRepository router = APIRouter(prefix="/business", tags=["fiscal-years"]) @router.get("/{business_id}/fiscal-years") @require_business_access("business_id") def list_fiscal_years( request: Request, business_id: int, ctx: AuthContext = Depends(get_current_user), db: Session = Depends(get_db), ) -> Dict[str, Any]: repo = FiscalYearRepository(db) # اطمینان از دسترسی کاربر به کسب و کار if not ctx.can_access_business(business_id): raise ApiError("FORBIDDEN", f"No access to business {business_id}", http_status=403) items = repo.list_by_business(business_id) data = [ { "id": fy.id, "title": fy.title, "start_date": fy.start_date, "end_date": fy.end_date, "is_current": fy.is_last, } for fy in items ] return success_response(data=format_datetime_fields({"items": data}, request), request=request, message="FISCAL_YEARS_LIST_FETCHED") @router.get("/{business_id}/fiscal-years/current") @require_business_access("business_id") def get_current_fiscal_year( request: Request, business_id: int, ctx: AuthContext = Depends(get_current_user), db: Session = Depends(get_db), ) -> Dict[str, Any]: repo = FiscalYearRepository(db) if not ctx.can_access_business(business_id): raise ApiError("FORBIDDEN", f"No access to business {business_id}", http_status=403) fy = repo.get_current_for_business(business_id) if not fy: return success_response(data=None, request=request, message="NO_CURRENT_FISCAL_YEAR") data = { "id": fy.id, "title": fy.title, "start_date": fy.start_date, "end_date": fy.end_date, "is_current": fy.is_last, } return success_response(data=format_datetime_fields(data, request), request=request, message="FISCAL_YEAR_CURRENT_FETCHED")