Files
ctms/backend/app/crud/finance.py
T
2026-01-09 11:19:04 +08:00

35 lines
1.3 KiB
Python

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()