feat(prospecting): add complete prospecting module for lead discovery and scoring
Some checks failed
Some checks failed
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>
This commit is contained in:
61
app/modules/prospecting/models/scan_job.py
Normal file
61
app/modules/prospecting/models/scan_job.py
Normal file
@@ -0,0 +1,61 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user