607 lines
36 KiB
Python
607 lines
36 KiB
Python
from __future__ import annotations
|
|
|
|
from sqlalchemy import Boolean, Float, Index, Integer, String, Text, UniqueConstraint, text
|
|
from sqlalchemy.orm import Mapped, mapped_column
|
|
|
|
from services.shared.sql_models import Base
|
|
|
|
|
|
class TenantSalesSettingsRow(Base):
|
|
__tablename__ = "tenant_sales_settings"
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
tenant_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
|
default_pipeline_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
default_language: Mapped[str] = mapped_column(String(16), default="ru", index=True)
|
|
default_currency: Mapped[str] = mapped_column(String(16), default="KZT", index=True)
|
|
enabled_text_channels_json: Mapped[str] = mapped_column(Text, default="[]")
|
|
enabled_voice_channels_json: Mapped[str] = mapped_column(Text, default="[]")
|
|
payment_provider_settings_json: Mapped[str] = mapped_column(Text, default="{}")
|
|
document_settings_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 TenantIntegrationRow(Base):
|
|
__tablename__ = "tenant_integrations"
|
|
__table_args__ = (
|
|
Index("idx_tenant_integrations_provider_account", "provider_type", "provider_name", "provider_account_id"),
|
|
Index("idx_tenant_integrations_external_identifier", "provider_type", "provider_name", "external_identifier"),
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
integration_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
|
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
|
provider_type: Mapped[str] = mapped_column(String(64), index=True)
|
|
provider_name: Mapped[str] = mapped_column(String(64), index=True)
|
|
provider_account_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
external_identifier: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
settings_json: Mapped[str] = mapped_column(Text, default="{}")
|
|
is_active: Mapped[bool] = mapped_column(Boolean, default=True, index=True)
|
|
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
|
|
|
|
class SalesPipelineRow(Base):
|
|
__tablename__ = "sales_pipelines"
|
|
__table_args__ = (
|
|
UniqueConstraint("tenant_id", "code", name="uq_sales_pipelines_tenant_code"),
|
|
Index("idx_sales_pipelines_tenant_default", "tenant_id", "is_default", "is_active"),
|
|
Index(
|
|
"uq_sales_pipelines_one_default_per_tenant",
|
|
"tenant_id",
|
|
unique=True,
|
|
sqlite_where=text("is_default = 1"),
|
|
postgresql_where=text("is_default IS TRUE"),
|
|
),
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
pipeline_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
|
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
|
code: Mapped[str] = mapped_column(String(64), index=True)
|
|
name: Mapped[str] = mapped_column(String(256))
|
|
description: Mapped[str | None] = mapped_column(Text, nullable=True)
|
|
is_default: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
|
|
is_active: Mapped[bool] = mapped_column(Boolean, default=True, index=True)
|
|
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
|
|
|
|
class SalesPipelineStageRow(Base):
|
|
__tablename__ = "sales_pipeline_stages"
|
|
__table_args__ = (
|
|
UniqueConstraint("tenant_id", "pipeline_id", "code", name="uq_sales_pipeline_stages_tenant_pipeline_code"),
|
|
Index("idx_sales_pipeline_stages_pipeline_order", "tenant_id", "pipeline_id", "sort_order"),
|
|
Index("idx_sales_pipeline_stages_tenant_active", "tenant_id", "is_active"),
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
stage_id: Mapped[str] = mapped_column(String(64), unique=True, index=True)
|
|
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
|
pipeline_id: Mapped[str] = mapped_column(String(64), index=True)
|
|
code: Mapped[str] = mapped_column(String(64), index=True)
|
|
name: Mapped[str] = mapped_column(String(256))
|
|
category: Mapped[str] = mapped_column(String(64), index=True)
|
|
sort_order: Mapped[int] = mapped_column(Integer, default=0, index=True)
|
|
is_terminal: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
|
|
is_system: Mapped[bool] = mapped_column(Boolean, default=False, index=True)
|
|
is_active: Mapped[bool] = mapped_column(Boolean, default=True, index=True)
|
|
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
updated_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
|
|
|
|
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="", 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)
|
|
channel_provider: Mapped[str | None] = mapped_column(String(32), nullable=True, 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)
|
|
source_type: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
source_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
created_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
updated_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
archived_at: Mapped[str | None] = mapped_column(String(64), nullable=True, 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"),
|
|
Index(
|
|
"idx_sales_payments_tenant_external_payment_unique",
|
|
"tenant_id",
|
|
"payment_provider",
|
|
"external_payment_id",
|
|
unique=True,
|
|
sqlite_where=text("external_payment_id IS NOT NULL"),
|
|
postgresql_where=text("external_payment_id IS NOT NULL"),
|
|
),
|
|
)
|
|
|
|
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 SalesPaymentWebhookEventRow(Base):
|
|
__tablename__ = "sales_payment_webhook_events"
|
|
__table_args__ = (
|
|
Index("idx_sales_payment_webhook_events_received", "tenant_id", "received_at"),
|
|
Index("idx_sales_payment_webhook_events_payment", "tenant_id", "payment_provider", "external_payment_id"),
|
|
Index(
|
|
"idx_sales_payment_webhook_events_external_event_unique",
|
|
"tenant_id",
|
|
"payment_provider",
|
|
"external_event_id",
|
|
unique=True,
|
|
sqlite_where=text("external_event_id IS NOT NULL"),
|
|
postgresql_where=text("external_event_id IS NOT NULL"),
|
|
),
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
|
|
tenant_id: Mapped[str] = mapped_column(String(64), index=True)
|
|
payment_provider: Mapped[str] = mapped_column(String(64), index=True)
|
|
provider_account_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
external_event_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
external_payment_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
event_type: Mapped[str] = mapped_column(String(128), index=True)
|
|
event_status: Mapped[str] = mapped_column(String(32), index=True, default="received")
|
|
signature_status: Mapped[str] = mapped_column(String(32), index=True, default="unchecked")
|
|
raw_payload_hash: Mapped[str] = mapped_column(String(64), index=True)
|
|
normalized_payload_json: Mapped[str] = mapped_column(Text, default="{}")
|
|
headers_json: Mapped[str] = mapped_column(Text, default="{}")
|
|
received_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
processed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
error_message: 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 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)
|
|
assigned_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
started_at: Mapped[str | None] = mapped_column(String(64), 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)
|
|
canceled_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
resolution_code: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
resolution_summary: Mapped[str | None] = mapped_column(Text, nullable=True)
|
|
sla_due_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
source_channel: Mapped[str | None] = mapped_column(String(32), nullable=True, index=True)
|
|
source_communication_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
source_automation_task_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
updated_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"),
|
|
Index("idx_sales_tasks_lock", "status", "locked_at", "locked_by"),
|
|
)
|
|
|
|
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)
|
|
max_retries: Mapped[int] = mapped_column(Integer, default=3)
|
|
locked_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
locked_by: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
completed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
failed_at: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
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)
|
|
communication_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
previous_communication_session_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
new_communication_session_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_code: Mapped[str] = mapped_column(String(64), default="human_decision", index=True)
|
|
reason_text: Mapped[str | None] = mapped_column(Text, nullable=True)
|
|
reason_for_channel_switch: Mapped[str] = mapped_column(Text)
|
|
initiated_by_type: Mapped[str] = mapped_column(String(32), default="human", index=True)
|
|
initiated_by_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
source_type: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
source_id: Mapped[str | None] = mapped_column(String(128), nullable=True, index=True)
|
|
recommended_by_task_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True)
|
|
switched_at: Mapped[str] = mapped_column(String(64), index=True)
|
|
created_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)
|