feat(prospecting): add complete prospecting module for lead discovery and scoring
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

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:
2026-02-28 00:59:47 +01:00
parent a709adaee8
commit 6d6eba75bf
79 changed files with 7551 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
# app/modules/prospecting/models/tech_profile.py
"""
Technology profile for a prospect's website.
Stores CMS, server, framework, analytics, and other
technology detection results from website scanning.
"""
from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text
from sqlalchemy.orm import relationship
from app.core.database import Base
from models.database.base import TimestampMixin
class ProspectTechProfile(Base, TimestampMixin):
"""Technology profile detected from a prospect's website."""
__tablename__ = "prospect_tech_profiles"
id = Column(Integer, primary_key=True, index=True)
prospect_id = Column(Integer, ForeignKey("prospects.id", ondelete="CASCADE"), nullable=False, unique=True)
# CMS Detection
cms = Column(String(100), nullable=True)
cms_version = Column(String(50), nullable=True)
# Server
server = Column(String(100), nullable=True)
server_version = Column(String(50), nullable=True)
hosting_provider = Column(String(100), nullable=True)
cdn = Column(String(100), nullable=True)
# SSL
has_valid_cert = Column(Boolean, nullable=True)
cert_issuer = Column(String(200), nullable=True)
cert_expires_at = Column(DateTime, nullable=True)
# Frontend
js_framework = Column(String(100), nullable=True)
analytics = Column(String(200), nullable=True)
tag_manager = Column(String(100), nullable=True)
ecommerce_platform = Column(String(100), nullable=True)
# Raw data
tech_stack_json = Column(Text, nullable=True) # JSON string
scan_source = Column(String(50), nullable=True)
scan_error = Column(Text, nullable=True)
# Relationships
prospect = relationship("Prospect", back_populates="tech_profile")