import uuid from datetime import datetime from sqlalchemy import String, Numeric, Integer, DateTime, Enum as SAEnum, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.core.database import Base import enum class CaseStatus(str, enum.Enum): pending = "pending" uploading = "uploading" analyzing = "analyzing" reviewing = "reviewing" completed = "completed" class Case(Base): __tablename__ = "cases" id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) case_no: Mapped[str] = mapped_column(String(64), unique=True, index=True) title: Mapped[str] = mapped_column(String(256)) victim_name: Mapped[str] = mapped_column(String(128)) handler: Mapped[str] = mapped_column(String(128), default="") status: Mapped[CaseStatus] = mapped_column(SAEnum(CaseStatus), default=CaseStatus.pending) image_count: Mapped[int] = mapped_column(Integer, default=0) total_amount: Mapped[float] = mapped_column(Numeric(14, 2), default=0) created_by: Mapped[str] = mapped_column(String(128), default="") created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now()) updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) deleted_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) images = relationship("EvidenceImage", back_populates="case", lazy="selectin") transactions = relationship("TransactionRecord", back_populates="case", lazy="selectin") assessments = relationship("FraudAssessment", back_populates="case", lazy="selectin") reports = relationship("ExportReport", back_populates="case", lazy="selectin")