# app/modules/prospecting/models/scan_job.py """ Scan job tracking for batch enrichment operations. """ import enum from sqlalchemy import Column, DateTime, Enum, Integer, String, Text from app.core.database import Base from models.database.base import TimestampMixin class JobType(str, enum.Enum): IMPORT = "import" HTTP_CHECK = "http_check" TECH_SCAN = "tech_scan" PERFORMANCE_SCAN = "performance_scan" CONTACT_SCRAPE = "contact_scrape" SCORE_COMPUTE = "score_compute" FULL_ENRICHMENT = "full_enrichment" SECURITY_AUDIT = "security_audit" class JobStatus(str, enum.Enum): PENDING = "pending" RUNNING = "running" COMPLETED = "completed" FAILED = "failed" CANCELLED = "cancelled" class ProspectScanJob(Base, TimestampMixin): """Tracks batch scanning operations.""" __tablename__ = "prospect_scan_jobs" id = Column(Integer, primary_key=True, index=True) job_type = Column(Enum(JobType), nullable=False) status = Column(Enum(JobStatus), nullable=False, default=JobStatus.PENDING) total_items = Column(Integer, nullable=False, default=0) processed_items = Column(Integer, nullable=False, default=0) failed_items = Column(Integer, nullable=False, default=0) skipped_items = Column(Integer, nullable=False, default=0) started_at = Column(DateTime, nullable=True) completed_at = Column(DateTime, nullable=True) config = Column(Text, nullable=True) # JSON string result_summary = Column(Text, nullable=True) # JSON string error_log = Column(Text, nullable=True) source_file = Column(String(500), nullable=True) celery_task_id = Column(String(255), nullable=True) @property def progress_percent(self) -> float: if self.total_items == 0: return 0.0 return round(self.processed_items / self.total_items * 100, 1)