Implement sales CRM workflow foundation

This commit is contained in:
Admin
2026-05-10 20:54:01 +05:00
parent dad4ab115a
commit 8577d97356
22 changed files with 5625 additions and 242 deletions
@@ -0,0 +1,7 @@
ALTER TABLE sales_automation_tasks ADD COLUMN IF NOT EXISTS locked_at TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN IF NOT EXISTS locked_by TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN IF NOT EXISTS completed_at TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN IF NOT EXISTS failed_at TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN IF NOT EXISTS max_retries INTEGER NOT NULL DEFAULT 3;
CREATE INDEX IF NOT EXISTS idx_sales_tasks_lock ON sales_automation_tasks(status, locked_at, locked_by);
@@ -0,0 +1,7 @@
ALTER TABLE sales_automation_tasks ADD COLUMN locked_at TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN locked_by TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN completed_at TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN failed_at TEXT;
ALTER TABLE sales_automation_tasks ADD COLUMN max_retries INTEGER NOT NULL DEFAULT 3;
CREATE INDEX IF NOT EXISTS idx_sales_tasks_lock ON sales_automation_tasks(status, locked_at, locked_by);
@@ -0,0 +1,31 @@
CREATE TABLE IF NOT EXISTS sales_payment_webhook_events (
id SERIAL PRIMARY KEY,
tenant_id TEXT NOT NULL,
payment_provider TEXT NOT NULL,
provider_account_id TEXT,
external_event_id TEXT,
external_payment_id TEXT,
event_type TEXT NOT NULL,
event_status TEXT NOT NULL DEFAULT 'received',
signature_status TEXT NOT NULL DEFAULT 'unchecked',
raw_payload_hash TEXT NOT NULL,
normalized_payload_json TEXT NOT NULL DEFAULT '{}',
headers_json TEXT NOT NULL DEFAULT '{}',
received_at TEXT NOT NULL,
processed_at TEXT,
error_message TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_sales_payment_webhook_events_received
ON sales_payment_webhook_events(tenant_id, received_at);
CREATE INDEX IF NOT EXISTS idx_sales_payment_webhook_events_payment
ON sales_payment_webhook_events(tenant_id, payment_provider, external_payment_id);
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;
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;
@@ -0,0 +1,31 @@
CREATE TABLE IF NOT EXISTS sales_payment_webhook_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tenant_id TEXT NOT NULL,
payment_provider TEXT NOT NULL,
provider_account_id TEXT,
external_event_id TEXT,
external_payment_id TEXT,
event_type TEXT NOT NULL,
event_status TEXT NOT NULL DEFAULT 'received',
signature_status TEXT NOT NULL DEFAULT 'unchecked',
raw_payload_hash TEXT NOT NULL,
normalized_payload_json TEXT NOT NULL DEFAULT '{}',
headers_json TEXT NOT NULL DEFAULT '{}',
received_at TEXT NOT NULL,
processed_at TEXT,
error_message TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS idx_sales_payment_webhook_events_received
ON sales_payment_webhook_events(tenant_id, received_at);
CREATE INDEX IF NOT EXISTS idx_sales_payment_webhook_events_payment
ON sales_payment_webhook_events(tenant_id, payment_provider, external_payment_id);
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;
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;
@@ -0,0 +1,44 @@
ALTER TABLE sales_communication_sessions ADD COLUMN IF NOT EXISTS channel_provider TEXT;
CREATE INDEX IF NOT EXISTS idx_sales_comm_channel_provider ON sales_communication_sessions(channel_provider);
ALTER TABLE sales_notes ADD COLUMN IF NOT EXISTS source_type TEXT;
ALTER TABLE sales_notes ADD COLUMN IF NOT EXISTS source_id TEXT;
ALTER TABLE sales_notes ADD COLUMN IF NOT EXISTS updated_at TEXT;
ALTER TABLE sales_notes ADD COLUMN IF NOT EXISTS archived_at TEXT;
UPDATE sales_notes
SET updated_at = created_at
WHERE updated_at IS NULL OR TRIM(updated_at) = '';
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS assigned_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS started_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS canceled_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS resolution_code TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS resolution_summary TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS sla_due_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS source_channel TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS source_communication_session_id TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS source_automation_task_id TEXT;
ALTER TABLE sales_escalations ADD COLUMN IF NOT EXISTS updated_at TEXT;
UPDATE sales_escalations
SET updated_at = COALESCE(updated_at, resolved_at, created_at)
WHERE updated_at IS NULL OR TRIM(updated_at) = '';
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS communication_session_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS previous_communication_session_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS new_communication_session_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS reason_code TEXT DEFAULT 'human_decision';
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS reason_text TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS initiated_by_type TEXT DEFAULT 'human';
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS initiated_by_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS source_type TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS source_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS recommended_by_task_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN IF NOT EXISTS created_at 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) = '';
@@ -0,0 +1,44 @@
ALTER TABLE sales_communication_sessions ADD COLUMN channel_provider TEXT;
CREATE INDEX IF NOT EXISTS idx_sales_comm_channel_provider ON sales_communication_sessions(channel_provider);
ALTER TABLE sales_notes ADD COLUMN source_type TEXT;
ALTER TABLE sales_notes ADD COLUMN source_id TEXT;
ALTER TABLE sales_notes ADD COLUMN updated_at TEXT;
ALTER TABLE sales_notes ADD COLUMN archived_at TEXT;
UPDATE sales_notes
SET updated_at = created_at
WHERE updated_at IS NULL OR TRIM(updated_at) = '';
ALTER TABLE sales_escalations ADD COLUMN assigned_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN started_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN canceled_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN resolution_code TEXT;
ALTER TABLE sales_escalations ADD COLUMN resolution_summary TEXT;
ALTER TABLE sales_escalations ADD COLUMN sla_due_at TEXT;
ALTER TABLE sales_escalations ADD COLUMN source_channel TEXT;
ALTER TABLE sales_escalations ADD COLUMN source_communication_session_id TEXT;
ALTER TABLE sales_escalations ADD COLUMN source_automation_task_id TEXT;
ALTER TABLE sales_escalations ADD COLUMN updated_at TEXT;
UPDATE sales_escalations
SET updated_at = COALESCE(updated_at, resolved_at, created_at)
WHERE updated_at IS NULL OR TRIM(updated_at) = '';
ALTER TABLE sales_channel_switches ADD COLUMN communication_session_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN previous_communication_session_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN new_communication_session_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN reason_code TEXT DEFAULT 'human_decision';
ALTER TABLE sales_channel_switches ADD COLUMN reason_text TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN initiated_by_type TEXT DEFAULT 'human';
ALTER TABLE sales_channel_switches ADD COLUMN initiated_by_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN source_type TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN source_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN recommended_by_task_id TEXT;
ALTER TABLE sales_channel_switches ADD COLUMN created_at 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) = '';