from uuid import UUID from decimal import Decimal from sqlalchemy import select, func from sqlalchemy.ext.asyncio import AsyncSession from app.models.case import Case from app.models.assessment import FraudAssessment, ReviewStatus async def recalculate_case_total(case_id: UUID, db: AsyncSession) -> float: """Recalculate and persist the recognized fraud amount for a case. The case-level amount shown in case list/workspace represents the current recognized amount after analysis, so it should include pending/confirmed/ needs_info items and only exclude explicitly rejected records. """ result = await db.execute( select(func.coalesce(func.sum(FraudAssessment.assessed_amount), 0)) .where(FraudAssessment.case_id == case_id) .where(FraudAssessment.assessed_amount > 0) .where(FraudAssessment.review_status != ReviewStatus.rejected) ) total = float(result.scalar() or 0) case = await db.get(Case, case_id) if case: case.total_amount = total await db.flush() return total