import uuid from datetime import datetime import enum from sqlalchemy import String, Numeric, Text, DateTime, ForeignKey, Enum as SAEnum, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.database import Base class ConfidenceLevel(str, enum.Enum): high = "high" medium = "medium" low = "low" class ReviewStatus(str, enum.Enum): pending = "pending" confirmed = "confirmed" rejected = "rejected" needs_info = "needs_info" class FraudAssessment(Base): __tablename__ = "fraud_assessments" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) case_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("cases.id"), index=True) transaction_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("transaction_records.id")) confidence_level: Mapped[ConfidenceLevel] = mapped_column(SAEnum(ConfidenceLevel)) assessed_amount: Mapped[float] = mapped_column(Numeric(14, 2), default=0) reason: Mapped[str] = mapped_column(Text, default="") exclude_reason: Mapped[str] = mapped_column(Text, default="") review_status: Mapped[ReviewStatus] = mapped_column(SAEnum(ReviewStatus), default=ReviewStatus.pending) review_note: Mapped[str] = mapped_column(Text, default="") reviewed_by: Mapped[str] = mapped_column(String(128), default="") reviewed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) case = relationship("Case", back_populates="assessments") transaction = relationship("TransactionRecord")