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:
54
app/modules/prospecting/models/interaction.py
Normal file
54
app/modules/prospecting/models/interaction.py
Normal file
@@ -0,0 +1,54 @@
|
||||
# app/modules/prospecting/models/interaction.py
|
||||
"""
|
||||
Interaction tracking for prospect follow-ups.
|
||||
|
||||
Logs all touchpoints: calls, emails, meetings, visits, notes.
|
||||
"""
|
||||
|
||||
import enum
|
||||
|
||||
from sqlalchemy import Column, Date, Enum, ForeignKey, Integer, String, Text
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from app.core.database import Base
|
||||
from models.database.base import TimestampMixin
|
||||
|
||||
|
||||
class InteractionType(str, enum.Enum):
|
||||
NOTE = "note"
|
||||
CALL = "call"
|
||||
EMAIL_SENT = "email_sent"
|
||||
EMAIL_RECEIVED = "email_received"
|
||||
MEETING = "meeting"
|
||||
VISIT = "visit"
|
||||
SMS = "sms"
|
||||
PROPOSAL_SENT = "proposal_sent"
|
||||
|
||||
|
||||
class InteractionOutcome(str, enum.Enum):
|
||||
POSITIVE = "positive"
|
||||
NEUTRAL = "neutral"
|
||||
NEGATIVE = "negative"
|
||||
NO_ANSWER = "no_answer"
|
||||
|
||||
|
||||
class ProspectInteraction(Base, TimestampMixin):
|
||||
"""A logged interaction with a prospect."""
|
||||
|
||||
__tablename__ = "prospect_interactions"
|
||||
|
||||
id = Column(Integer, primary_key=True, index=True)
|
||||
prospect_id = Column(Integer, ForeignKey("prospects.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
|
||||
interaction_type = Column(Enum(InteractionType), nullable=False)
|
||||
subject = Column(String(255), nullable=True)
|
||||
notes = Column(Text, nullable=True)
|
||||
outcome = Column(Enum(InteractionOutcome), nullable=True)
|
||||
|
||||
next_action = Column(String(255), nullable=True)
|
||||
next_action_date = Column(Date, nullable=True)
|
||||
|
||||
created_by_user_id = Column(Integer, nullable=False)
|
||||
|
||||
# Relationships
|
||||
prospect = relationship("Prospect", back_populates="interactions")
|
||||
Reference in New Issue
Block a user