first commit
This commit is contained in:
47
backend/app/api/export.py
Normal file
47
backend/app/api/export.py
Normal file
@@ -0,0 +1,47 @@
|
||||
"""Export API: Excel and PDF report download."""
|
||||
|
||||
from io import BytesIO
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from fastapi.responses import StreamingResponse
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models.database import get_db
|
||||
from app.models import Case, Transaction
|
||||
from app.schemas import TransactionResponse
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/{case_id}/export/excel")
|
||||
async def export_excel(case_id: int, db: AsyncSession = Depends(get_db)):
|
||||
from app.services.report import build_excel_report
|
||||
r = await db.execute(select(Case).where(Case.id == case_id))
|
||||
case = r.scalar_one_or_none()
|
||||
if not case:
|
||||
raise HTTPException(status_code=404, detail="Case not found")
|
||||
r = await db.execute(select(Transaction).where(Transaction.case_id == case_id).order_by(Transaction.transaction_time))
|
||||
txns = [TransactionResponse.model_validate(t) for t in r.scalars().all()]
|
||||
data = await build_excel_report(case, txns)
|
||||
return StreamingResponse(
|
||||
BytesIO(data),
|
||||
media_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
headers={"Content-Disposition": f"attachment; filename=case_{case_id}_report.xlsx"},
|
||||
)
|
||||
|
||||
|
||||
@router.get("/{case_id}/export/pdf")
|
||||
async def export_pdf(case_id: int, db: AsyncSession = Depends(get_db)):
|
||||
from app.services.report import build_pdf_report
|
||||
r = await db.execute(select(Case).where(Case.id == case_id))
|
||||
case = r.scalar_one_or_none()
|
||||
if not case:
|
||||
raise HTTPException(status_code=404, detail="Case not found")
|
||||
r = await db.execute(select(Transaction).where(Transaction.case_id == case_id).order_by(Transaction.transaction_time))
|
||||
txns = [TransactionResponse.model_validate(t) for t in r.scalars().all()]
|
||||
data = await build_pdf_report(case, txns)
|
||||
return StreamingResponse(
|
||||
BytesIO(data),
|
||||
media_type="application/pdf",
|
||||
headers={"Content-Disposition": f"attachment; filename=case_{case_id}_report.pdf"},
|
||||
)
|
||||
Reference in New Issue
Block a user