import uuid from datetime import date from sqlalchemy import case, func, select from sqlalchemy.ext.asyncio import AsyncSession from app.models.finance import FinanceItem async def summary( db: AsyncSession, study_id: uuid.UUID, *, date_from: date | None = None, date_to: date | None = None, ): stmt = select( func.coalesce(func.sum(FinanceItem.amount), 0).label("total_amount"), func.coalesce(func.sum(case((FinanceItem.status == "PAID", FinanceItem.amount), else_=0)), 0).label( "paid_amount" ), func.coalesce(func.sum(case((FinanceItem.status == "APPROVED", FinanceItem.amount), else_=0)), 0).label( "approved_amount" ), func.coalesce(func.sum(case((FinanceItem.status == "SUBMITTED", FinanceItem.amount), else_=0)), 0).label( "submitted_amount" ), func.count().label("count_total"), func.coalesce(func.sum(case((FinanceItem.status == "PAID", 1), else_=0)), 0).label("count_paid"), ).where(FinanceItem.study_id == study_id) if date_from: stmt = stmt.where(FinanceItem.occur_date >= date_from) if date_to: stmt = stmt.where(FinanceItem.occur_date <= date_to) result = await db.execute(stmt) return result.one()