Files
orion/app/modules/prospecting/models/scan_job.py
Samir Boulahtit 6d6eba75bf
Some checks failed
CI / pytest (push) Failing after 48m31s
CI / docs (push) Has been skipped
CI / deploy (push) Has been skipped
CI / ruff (push) Successful in 11s
CI / validate (push) Successful in 23s
CI / dependency-scanning (push) Successful in 28s
feat(prospecting): add complete prospecting module for lead discovery and scoring
Migrates scanning pipeline from marketing-.lu-domains app into Orion module.
Supports digital (domain scan) and offline (manual capture) lead channels
with enrichment, scoring, campaign management, and interaction tracking.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 00:59:47 +01:00

62 lines
1.8 KiB
Python

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