Files
fund-tracer/backend/app/models/assessment.py
2026-03-11 16:28:04 +08:00

43 lines
1.7 KiB
Python

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