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>
55 lines
1.5 KiB
Python
55 lines
1.5 KiB
Python
# 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")
|