35 lines
1.3 KiB
Python
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()
|