Implement sales CRM workflow foundation
This commit is contained in:
@@ -601,6 +601,145 @@ def _apply_runtime_schema_compatibility() -> None:
|
||||
)
|
||||
)
|
||||
|
||||
if "sales_automation_tasks" in table_names:
|
||||
columns = _table_columns(inspector, "sales_automation_tasks")
|
||||
_add_column_if_missing(conn, columns, "sales_automation_tasks", "max_retries", "INTEGER DEFAULT 3")
|
||||
_add_column_if_missing(conn, columns, "sales_automation_tasks", "locked_at", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_automation_tasks", "locked_by", "VARCHAR(128)")
|
||||
_add_column_if_missing(conn, columns, "sales_automation_tasks", "completed_at", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_automation_tasks", "failed_at", "VARCHAR(64)")
|
||||
conn.execute(
|
||||
text(
|
||||
"""
|
||||
UPDATE sales_automation_tasks
|
||||
SET max_retries = 3
|
||||
WHERE max_retries IS NULL
|
||||
"""
|
||||
)
|
||||
)
|
||||
indexes = _table_indexes(inspector, "sales_automation_tasks")
|
||||
if "idx_sales_tasks_lock" not in indexes:
|
||||
conn.execute(
|
||||
text(
|
||||
"CREATE INDEX IF NOT EXISTS idx_sales_tasks_lock "
|
||||
"ON sales_automation_tasks(status, locked_at, locked_by)"
|
||||
)
|
||||
)
|
||||
|
||||
if "sales_communication_sessions" in table_names:
|
||||
columns = _table_columns(inspector, "sales_communication_sessions")
|
||||
_add_column_if_missing(conn, columns, "sales_communication_sessions", "channel_provider", "VARCHAR(32)")
|
||||
indexes = _table_indexes(inspector, "sales_communication_sessions")
|
||||
if "idx_sales_comm_channel_provider" not in indexes:
|
||||
conn.execute(
|
||||
text(
|
||||
"CREATE INDEX IF NOT EXISTS idx_sales_comm_channel_provider "
|
||||
"ON sales_communication_sessions(channel_provider)"
|
||||
)
|
||||
)
|
||||
|
||||
if "sales_notes" in table_names:
|
||||
columns = _table_columns(inspector, "sales_notes")
|
||||
_add_column_if_missing(conn, columns, "sales_notes", "source_type", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_notes", "source_id", "VARCHAR(128)")
|
||||
_add_column_if_missing(conn, columns, "sales_notes", "updated_at", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_notes", "archived_at", "VARCHAR(64)")
|
||||
conn.execute(
|
||||
text(
|
||||
"""
|
||||
UPDATE sales_notes
|
||||
SET updated_at = created_at
|
||||
WHERE updated_at IS NULL OR TRIM(updated_at) = ''
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
if "sales_escalations" in table_names:
|
||||
columns = _table_columns(inspector, "sales_escalations")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "assigned_at", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "started_at", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "canceled_at", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "resolution_code", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "resolution_summary", "TEXT")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "sla_due_at", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "source_channel", "VARCHAR(32)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "source_communication_session_id", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "source_automation_task_id", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_escalations", "updated_at", "VARCHAR(64)")
|
||||
conn.execute(
|
||||
text(
|
||||
"""
|
||||
UPDATE sales_escalations
|
||||
SET updated_at = COALESCE(updated_at, resolved_at, created_at)
|
||||
WHERE updated_at IS NULL OR TRIM(updated_at) = ''
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
if "sales_channel_switches" in table_names:
|
||||
columns = _table_columns(inspector, "sales_channel_switches")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "communication_session_id", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "previous_communication_session_id", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "new_communication_session_id", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "reason_code", "VARCHAR(64) DEFAULT 'human_decision'")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "reason_text", "TEXT")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "initiated_by_type", "VARCHAR(32) DEFAULT 'human'")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "initiated_by_id", "VARCHAR(128)")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "source_type", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "source_id", "VARCHAR(128)")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "recommended_by_task_id", "VARCHAR(64)")
|
||||
_add_column_if_missing(conn, columns, "sales_channel_switches", "created_at", "VARCHAR(64)")
|
||||
conn.execute(
|
||||
text(
|
||||
"""
|
||||
UPDATE sales_channel_switches
|
||||
SET communication_session_id = COALESCE(communication_session_id, communication_id),
|
||||
previous_communication_session_id = COALESCE(previous_communication_session_id, communication_id),
|
||||
reason_code = COALESCE(reason_code, 'human_decision'),
|
||||
reason_text = COALESCE(reason_text, reason_for_channel_switch),
|
||||
initiated_by_type = COALESCE(initiated_by_type, 'human'),
|
||||
created_at = COALESCE(created_at, switched_at)
|
||||
WHERE created_at IS NULL OR TRIM(created_at) = ''
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
if "sales_payment_webhook_events" in table_names:
|
||||
indexes = _table_indexes(inspector, "sales_payment_webhook_events")
|
||||
if "idx_sales_payment_webhook_events_received" not in indexes:
|
||||
conn.execute(
|
||||
text(
|
||||
"CREATE INDEX IF NOT EXISTS idx_sales_payment_webhook_events_received "
|
||||
"ON sales_payment_webhook_events(tenant_id, received_at)"
|
||||
)
|
||||
)
|
||||
if "idx_sales_payment_webhook_events_payment" not in indexes:
|
||||
conn.execute(
|
||||
text(
|
||||
"CREATE INDEX IF NOT EXISTS idx_sales_payment_webhook_events_payment "
|
||||
"ON sales_payment_webhook_events(tenant_id, payment_provider, external_payment_id)"
|
||||
)
|
||||
)
|
||||
if "idx_sales_payment_webhook_events_external_event_unique" not in indexes:
|
||||
conn.execute(
|
||||
text(
|
||||
"CREATE UNIQUE INDEX IF NOT EXISTS idx_sales_payment_webhook_events_external_event_unique "
|
||||
"ON sales_payment_webhook_events(tenant_id, payment_provider, external_event_id) "
|
||||
"WHERE external_event_id IS NOT NULL"
|
||||
)
|
||||
)
|
||||
|
||||
if "sales_payments" in table_names:
|
||||
indexes = _table_indexes(inspector, "sales_payments")
|
||||
if "idx_sales_payments_tenant_external_payment_unique" not in indexes:
|
||||
conn.execute(
|
||||
text(
|
||||
"CREATE UNIQUE INDEX IF NOT EXISTS idx_sales_payments_tenant_external_payment_unique "
|
||||
"ON sales_payments(tenant_id, payment_provider, external_payment_id) "
|
||||
"WHERE external_payment_id IS NOT NULL"
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def init_sql_schema() -> None:
|
||||
global _BASE_SCHEMA_INITIALIZED
|
||||
|
||||
Reference in New Issue
Block a user