MukeshKapoor25's picture
reporting framework implementation
7af851c
"""Analytics reports API router."""
from fastapi import APIRouter, Depends, status
from app.core.logging import get_logger
from app.dependencies.auth import get_current_user, TokenUser
from app.reports.schemas.schema import ReportCreate, ReportResponse, ReportListRequest, StatusResponse
from app.reports.services.service import ReportService
from app.reports.sales.router import router as sales_router
from app.reports.purchases.router import router as purchases_router
from app.reports.inventory.router import router as inventory_router
from app.reports.customers.router import router as customers_router
from app.reports.employees.router import router as employees_router
from app.reports.spa_bookings.router import router as spa_bookings_router
from app.reports.financial.router import router as financial_router
logger = get_logger(__name__)
router = APIRouter(prefix="/reports", tags=["reports"])
@router.post("", response_model=StatusResponse, status_code=status.HTTP_201_CREATED, summary="Create a report")
async def create_report(
payload: ReportCreate,
current_user: TokenUser = Depends(get_current_user),
):
report_id = await ReportService.create_report(payload, created_by=current_user.user_id)
return StatusResponse(success=True, message="Report created", report_id=report_id)
@router.get("/{report_id}", response_model=ReportResponse, summary="Get report by ID")
async def get_report(
report_id: str,
current_user: TokenUser = Depends(get_current_user),
):
return await ReportService.get_report(report_id)
@router.post("/list", summary="List reports with filters and optional projection")
async def list_reports(
payload: ReportListRequest,
current_user: TokenUser = Depends(get_current_user),
):
results = await ReportService.list_reports(
filters=payload.filters,
skip=payload.skip,
limit=payload.limit,
projection_list=payload.projection_list,
)
total = await ReportService.count_reports(payload.filters)
return {"success": True, "total": total, "skip": payload.skip, "limit": payload.limit, "data": results}
router.include_router(sales_router)
router.include_router(purchases_router)
router.include_router(inventory_router)
router.include_router(customers_router)
router.include_router(employees_router)
router.include_router(spa_bookings_router)
router.include_router(financial_router)