sales fix
This commit is contained in:
@@ -0,0 +1,445 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from sqlalchemy import Boolean, Float, Index, Integer, String, Text
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from services.shared.sql_models import Base
|
||||
|
||||
|
||||
class SalesLeadRow(Base):
|
||||
__tablename__ = "sales_leads"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_leads_tenant_status_score", "tenant_id", "status", "lead_score"),
|
||||
Index("idx_sales_leads_phone_email", "phone", "email"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
lead_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
source_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
source_channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
source_campaign_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
full_name: Mapped[str] = mapped_column(String(256), index=True)
|
||||
company_name: Mapped[str | None] = mapped_column(String(256), nullable=True, index=True)
|
||||
phone: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
email: Mapped[str | None] = mapped_column(String(256), nullable=True, index=True)
|
||||
messenger_handles_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
lead_temperature: Mapped[str] = mapped_column(String(16), index=True)
|
||||
lead_score: Mapped[float] = mapped_column(Float, default=50.0, index=True)
|
||||
customer_type: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
segment_type: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
initial_need_summary: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
preferred_channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
assigned_agent_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True)
|
||||
crm_customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesDealRow(Base):
|
||||
__tablename__ = "sales_deals"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_deals_tenant_stage_status", "tenant_id", "stage_id", "status"),
|
||||
Index("idx_sales_deals_customer_channel", "customer_id", "current_channel"),
|
||||
Index("idx_sales_deals_next_action", "next_action_at", "status"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
lead_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
pipeline_id: Mapped[str] = mapped_column(String(64), default="sales_default", index=True)
|
||||
stage_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
scenario_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
priority: Mapped[int] = mapped_column(Integer, default=3, index=True)
|
||||
title: Mapped[str] = mapped_column(String(512))
|
||||
need_summary: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
product_context_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
estimated_amount: Mapped[float | None] = mapped_column(Float, nullable=True)
|
||||
final_amount: Mapped[float | None] = mapped_column(Float, nullable=True)
|
||||
currency: Mapped[str] = mapped_column(String(16), default="KZT")
|
||||
payment_model: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
document_required: Mapped[bool] = mapped_column(Boolean, default=True)
|
||||
payment_required: Mapped[bool] = mapped_column(Boolean, default=True)
|
||||
assigned_human_user_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
assigned_ai_orchestrator_id: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
preferred_channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
current_channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="active")
|
||||
won_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
lost_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
close_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
next_action_type: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
next_action_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
last_contact_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
closed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesCommunicationSessionRow(Base):
|
||||
__tablename__ = "sales_communication_sessions"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_comm_deal_started", "deal_id", "started_at"),
|
||||
Index("idx_sales_comm_channel_status", "channel_type", "status"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
communication_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
lead_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
channel_type: Mapped[str] = mapped_column(String(16), index=True)
|
||||
direction: Mapped[str] = mapped_column(String(16), index=True)
|
||||
agent_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
started_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
ended_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
duration_sec: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
subject: Mapped[str | None] = mapped_column(String(512), nullable=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="active")
|
||||
summary: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
transcript_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
next_action_type: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
next_action_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
sentiment: Mapped[str | None] = mapped_column(String(32), nullable=True)
|
||||
result_code: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
metadata_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesMessageRow(Base):
|
||||
__tablename__ = "sales_messages"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_messages_deal_sent", "deal_id", "sent_at"),
|
||||
Index("idx_sales_messages_ext_id", "channel_provider", "external_message_id"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
message_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
communication_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
sender_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
sender_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
channel_provider: Mapped[str] = mapped_column(String(32), index=True)
|
||||
external_message_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
body: Mapped[str] = mapped_column(Text)
|
||||
attachments_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
delivery_status: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
read_status: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
message_metadata_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
sent_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesCallRow(Base):
|
||||
__tablename__ = "sales_calls"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_calls_deal_started", "deal_id", "started_at"),
|
||||
Index("idx_sales_calls_ext_provider", "provider", "external_call_id"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
call_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
communication_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
phone_number: Mapped[str] = mapped_column(String(64), index=True)
|
||||
direction: Mapped[str] = mapped_column(String(16), index=True)
|
||||
provider: Mapped[str] = mapped_column(String(64), index=True)
|
||||
external_call_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
recording_url: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
transcript_status: Mapped[str] = mapped_column(String(32), index=True, default="pending")
|
||||
transcript_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
call_status: Mapped[str] = mapped_column(String(32), index=True, default="started")
|
||||
summary: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
started_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
ended_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
duration_sec: Mapped[int | None] = mapped_column(Integer, nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesTranscriptRow(Base):
|
||||
__tablename__ = "sales_transcripts"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
transcript_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
call_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
language: Mapped[str] = mapped_column(String(16), index=True, default="ru")
|
||||
transcript_text: Mapped[str] = mapped_column(Text)
|
||||
diarization_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
extracted_entities_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesNoteRow(Base):
|
||||
__tablename__ = "sales_notes"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
note_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
author_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
author_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
note_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
content: Mapped[str] = mapped_column(Text)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesOfferRow(Base):
|
||||
__tablename__ = "sales_offers"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_offers_deal_status", "deal_id", "status"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
offer_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
offer_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
title: Mapped[str] = mapped_column(String(256))
|
||||
description: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
line_items_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
pricing_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
total_amount: Mapped[float] = mapped_column(Float, default=0)
|
||||
currency: Mapped[str] = mapped_column(String(16), default="KZT")
|
||||
validity_until: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="draft")
|
||||
rendered_document_url: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
created_by_type: Mapped[str] = mapped_column(String(32), default="text_ai")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesConditionRow(Base):
|
||||
__tablename__ = "sales_conditions"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
condition_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
product_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
service_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
quantity: Mapped[float | None] = mapped_column(Float, nullable=True)
|
||||
unit: Mapped[str | None] = mapped_column(String(32), nullable=True)
|
||||
delivery_mode: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
execution_date: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
start_date: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
end_date: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
payment_terms: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
custom_terms_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
agreed_price: Mapped[float | None] = mapped_column(Float, nullable=True)
|
||||
currency: Mapped[str] = mapped_column(String(16), default="KZT")
|
||||
confirmed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesCounterpartyRow(Base):
|
||||
__tablename__ = "sales_counterparties"
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
counterparty_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
company_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
full_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
bin_iin: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
address: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
bank_details_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
signer_name: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
signer_role: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
signer_basis: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
email_for_docs: Mapped[str | None] = mapped_column(String(256), nullable=True)
|
||||
phone_for_docs: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
completeness_status: Mapped[str] = mapped_column(String(32), index=True, default="draft")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesDocumentRow(Base):
|
||||
__tablename__ = "sales_documents"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_documents_deal_status", "deal_id", "status"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
document_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
document_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
template_id: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
version: Mapped[int] = mapped_column(Integer, default=1)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="draft")
|
||||
file_url: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
rendered_payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
external_sign_provider_id: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
signed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesInvoiceRow(Base):
|
||||
__tablename__ = "sales_invoices"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_invoices_deal_status_due", "deal_id", "status", "due_date"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
invoice_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
invoice_number: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
basis_document_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
amount: Mapped[float] = mapped_column(Float, default=0)
|
||||
currency: Mapped[str] = mapped_column(String(16), default="KZT")
|
||||
due_date: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="draft")
|
||||
payment_link: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
line_items_json: Mapped[str] = mapped_column(Text, default="[]")
|
||||
metadata_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
issued_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
paid_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesPaymentRow(Base):
|
||||
__tablename__ = "sales_payments"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_payments_deal_status", "deal_id", "status"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
payment_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
invoice_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
payment_provider: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
external_payment_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
amount: Mapped[float] = mapped_column(Float, default=0)
|
||||
currency: Mapped[str] = mapped_column(String(16), default="KZT")
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="pending")
|
||||
paid_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
payment_method: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
failure_reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
metadata_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesStageHistoryRow(Base):
|
||||
__tablename__ = "sales_stage_history"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_stage_history_deal_changed", "deal_id", "changed_at"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
history_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
from_stage_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
to_stage_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
changed_by_type: Mapped[str] = mapped_column(String(32), index=True)
|
||||
changed_by_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
reason: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
changed_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesEscalationRow(Base):
|
||||
__tablename__ = "sales_escalations"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_escalations_deal_status", "deal_id", "status"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
escalation_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
escalation_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
reason: Mapped[str] = mapped_column(Text)
|
||||
severity: Mapped[str] = mapped_column(String(16), index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="open")
|
||||
assigned_to_user_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
resolved_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
|
||||
|
||||
class SalesAutomationTaskRow(Base):
|
||||
__tablename__ = "sales_automation_tasks"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_tasks_run_status", "run_at", "status"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
task_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
task_type: Mapped[str] = mapped_column(String(64), index=True)
|
||||
payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
run_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
status: Mapped[str] = mapped_column(String(32), index=True, default="pending")
|
||||
retry_count: Mapped[int] = mapped_column(Integer, default=0)
|
||||
last_error: Mapped[str | None] = mapped_column(Text, nullable=True)
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesChannelSwitchRow(Base):
|
||||
__tablename__ = "sales_channel_switches"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_channel_switches_deal_switched", "deal_id", "switched_at"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
switch_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
communication_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
from_channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
to_channel: Mapped[str] = mapped_column(String(32), index=True)
|
||||
reason_for_channel_switch: Mapped[str] = mapped_column(Text)
|
||||
switched_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
|
||||
|
||||
class SalesExternalLinkRow(Base):
|
||||
__tablename__ = "sales_external_links"
|
||||
__table_args__ = (
|
||||
Index("idx_sales_external_links_deal_sync", "deal_id", "last_sync_at"),
|
||||
Index("idx_sales_external_links_thread", "external_thread_id"),
|
||||
Index("idx_sales_external_links_voice_session", "voice_session_id"),
|
||||
Index("idx_sales_external_links_external_call", "external_call_id"),
|
||||
Index("idx_sales_external_links_interaction", "interaction_id"),
|
||||
Index("idx_sales_external_links_customer_phone", "customer_id", "phone_number"),
|
||||
)
|
||||
|
||||
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
||||
link_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
||||
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
deal_id: Mapped[str] = mapped_column(String(64), index=True)
|
||||
communication_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
sales_call_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
||||
channel_provider: Mapped[str] = mapped_column(String(32), index=True)
|
||||
external_thread_id: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
external_chat_id: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
external_call_id: Mapped[str | None] = mapped_column(String(128), nullable=True)
|
||||
voice_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
ai_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
interaction_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
customer_id: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
phone_number: Mapped[str | None] = mapped_column(String(64), nullable=True)
|
||||
external_status: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
||||
link_metadata_json: Mapped[str] = mapped_column(Text, default="{}")
|
||||
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
last_sync_at: Mapped[str] = mapped_column(String(64), index=True)
|
||||
Reference in New Issue
Block a user