from sqlalchemy import Column, Integer, String, Text, DateTime, Float from sqlalchemy.sql import func from app.db.base import Base class ScreeningResult(Base): __tablename__ = "screening_results" id = Column(Integer, primary_key=True, index=True) transaction_id = Column(String, index=True, nullable=False) rule_id = Column(Integer, index=True, nullable=False) rule_name = Column(String, nullable=False) rule_version = Column(Integer, default=1) status = Column(String, nullable=False) # flagged, clean, error risk_score = Column(Float, default=0.0) details = Column(Text, nullable=True) # JSON string with detailed results aggregated_data = Column(Text, nullable=True) # JSON string with computed aggregations screening_type = Column(String, default="real_time") # real_time, batch created_at = Column(DateTime(timezone=True), server_default=func.now()) class ScreeningBatch(Base): __tablename__ = "screening_batches" id = Column(Integer, primary_key=True, index=True) batch_id = Column(String, unique=True, index=True, nullable=False) name = Column(String, nullable=True) description = Column(Text, nullable=True) status = Column(String, default="pending") # pending, processing, completed, failed total_transactions = Column(Integer, default=0) processed_transactions = Column(Integer, default=0) flagged_transactions = Column(Integer, default=0) rules_applied = Column(Text, nullable=True) # JSON array of rule IDs started_at = Column(DateTime(timezone=True), nullable=True) completed_at = Column(DateTime(timezone=True), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) class AggregateCache(Base): __tablename__ = "aggregate_cache" id = Column(Integer, primary_key=True, index=True) cache_key = Column(String, unique=True, index=True, nullable=False) cache_value = Column(Text, nullable=False) # JSON string expires_at = Column(DateTime(timezone=True), nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now())