cx_ai_agent_v1 / database /schema_extended.sql
muzakkirhussain011's picture
Add application files (text files only)
8bab08d
-- CX Platform - Extended Database Schema
-- Adds tickets, knowledge base, chat, and customer interaction tracking
-- =============================================================================
-- CUSTOMERS (Enhanced from contacts)
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_customers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
email TEXT UNIQUE NOT NULL,
first_name TEXT,
last_name TEXT,
company TEXT,
phone TEXT,
-- Segmentation
segment TEXT DEFAULT 'standard', -- vip, standard, at_risk, churned
lifecycle_stage TEXT DEFAULT 'active', -- new, active, at_risk, churned
-- Metrics
lifetime_value REAL DEFAULT 0.0,
satisfaction_score REAL DEFAULT 0.0, -- CSAT average
nps_score INTEGER, -- Net Promoter Score
sentiment TEXT DEFAULT 'neutral', -- positive, neutral, negative
-- Tracking
first_interaction_at TIMESTAMP,
last_interaction_at TIMESTAMP,
total_interactions INTEGER DEFAULT 0,
total_tickets INTEGER DEFAULT 0,
-- Metadata
tags TEXT, -- JSON array
custom_fields TEXT, -- JSON object
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_cx_customers_email ON cx_customers(email);
CREATE INDEX idx_cx_customers_segment ON cx_customers(segment);
CREATE INDEX idx_cx_customers_sentiment ON cx_customers(sentiment);
-- =============================================================================
-- TICKETS
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_tickets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
-- Core fields
subject TEXT NOT NULL,
description TEXT,
status TEXT DEFAULT 'new', -- new, open, pending, resolved, closed
priority TEXT DEFAULT 'medium', -- low, medium, high, urgent
category TEXT, -- technical, billing, feature_request, etc.
-- Assignment
assigned_to TEXT, -- agent name/id
assigned_team TEXT,
-- SLA
sla_due_at TIMESTAMP,
first_response_at TIMESTAMP,
resolved_at TIMESTAMP,
closed_at TIMESTAMP,
-- Metrics
response_time_minutes INTEGER,
resolution_time_minutes INTEGER,
reopened_count INTEGER DEFAULT 0,
-- AI fields
sentiment TEXT, -- detected from description
ai_suggested_category TEXT,
ai_confidence REAL,
auto_resolved BOOLEAN DEFAULT 0,
-- Metadata
source TEXT DEFAULT 'manual', -- manual, email, chat, api, web_form
tags TEXT, -- JSON array
custom_fields TEXT, -- JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES cx_customers(id) ON DELETE CASCADE
);
CREATE INDEX idx_cx_tickets_customer ON cx_tickets(customer_id);
CREATE INDEX idx_cx_tickets_status ON cx_tickets(status);
CREATE INDEX idx_cx_tickets_priority ON cx_tickets(priority);
CREATE INDEX idx_cx_tickets_assigned_to ON cx_tickets(assigned_to);
CREATE INDEX idx_cx_tickets_sla_due ON cx_tickets(sla_due_at);
-- =============================================================================
-- TICKET MESSAGES
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_ticket_messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticket_id INTEGER NOT NULL,
-- Sender
sender_type TEXT NOT NULL, -- customer, agent, system, ai_bot
sender_id TEXT, -- customer_id, agent_id, or 'system'
sender_name TEXT,
-- Message
message TEXT NOT NULL,
message_html TEXT,
is_internal BOOLEAN DEFAULT 0, -- internal note vs customer-visible
-- AI fields
sentiment TEXT,
intent TEXT, -- question, complaint, praise, feedback
-- Metadata
meta_data TEXT, -- JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (ticket_id) REFERENCES cx_tickets(id) ON DELETE CASCADE
);
CREATE INDEX idx_cx_ticket_messages_ticket ON cx_ticket_messages(ticket_id);
CREATE INDEX idx_cx_ticket_messages_created ON cx_ticket_messages(created_at);
-- =============================================================================
-- TICKET ATTACHMENTS
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_ticket_attachments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticket_id INTEGER NOT NULL,
message_id INTEGER,
filename TEXT NOT NULL,
file_path TEXT NOT NULL,
file_size INTEGER,
mime_type TEXT,
uploaded_by TEXT,
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (ticket_id) REFERENCES cx_tickets(id) ON DELETE CASCADE,
FOREIGN KEY (message_id) REFERENCES cx_ticket_messages(id) ON DELETE SET NULL
);
-- =============================================================================
-- KNOWLEDGE BASE
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_kb_categories (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
description TEXT,
parent_id INTEGER,
display_order INTEGER DEFAULT 0,
icon TEXT,
is_active BOOLEAN DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (parent_id) REFERENCES cx_kb_categories(id) ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS cx_kb_articles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
category_id INTEGER,
-- Content
title TEXT NOT NULL,
summary TEXT,
content TEXT NOT NULL,
content_html TEXT,
-- Status
status TEXT DEFAULT 'draft', -- draft, published, archived
visibility TEXT DEFAULT 'public', -- public, internal, private
-- SEO
slug TEXT UNIQUE,
meta_description TEXT,
-- Metrics
view_count INTEGER DEFAULT 0,
helpful_count INTEGER DEFAULT 0,
not_helpful_count INTEGER DEFAULT 0,
average_rating REAL DEFAULT 0.0,
-- AI fields
ai_generated BOOLEAN DEFAULT 0,
ai_confidence REAL,
keywords TEXT, -- JSON array for semantic search
-- Versioning
version INTEGER DEFAULT 1,
-- Metadata
tags TEXT, -- JSON array
related_articles TEXT, -- JSON array of article IDs
-- Authoring
author TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
published_at TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES cx_kb_categories(id) ON DELETE SET NULL
);
CREATE INDEX idx_cx_kb_articles_category ON cx_kb_articles(category_id);
CREATE INDEX idx_cx_kb_articles_status ON cx_kb_articles(status);
CREATE INDEX idx_cx_kb_articles_slug ON cx_kb_articles(slug);
-- =============================================================================
-- KB ARTICLE VERSIONS
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_kb_article_versions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
article_id INTEGER NOT NULL,
version INTEGER NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL,
changed_by TEXT,
change_note TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (article_id) REFERENCES cx_kb_articles(id) ON DELETE CASCADE,
UNIQUE(article_id, version)
);
-- =============================================================================
-- LIVE CHAT SESSIONS
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_chat_sessions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER,
-- Session info
session_id TEXT UNIQUE NOT NULL,
status TEXT DEFAULT 'active', -- active, waiting, assigned, closed
-- Routing
assigned_to TEXT, -- agent name/id
assigned_at TIMESTAMP,
-- AI bot
bot_active BOOLEAN DEFAULT 1,
bot_handed_off BOOLEAN DEFAULT 0,
bot_handoff_reason TEXT,
-- Metrics
wait_time_seconds INTEGER DEFAULT 0,
response_time_seconds INTEGER DEFAULT 0,
message_count INTEGER DEFAULT 0,
-- Metadata
page_url TEXT,
referrer TEXT,
user_agent TEXT,
ip_address TEXT,
-- Satisfaction
rated BOOLEAN DEFAULT 0,
rating INTEGER,
feedback TEXT,
started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
ended_at TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES cx_customers(id) ON DELETE SET NULL
);
CREATE INDEX idx_cx_chat_sessions_customer ON cx_chat_sessions(customer_id);
CREATE INDEX idx_cx_chat_sessions_status ON cx_chat_sessions(status);
CREATE INDEX idx_cx_chat_sessions_assigned_to ON cx_chat_sessions(assigned_to);
-- =============================================================================
-- CHAT MESSAGES
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_chat_messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
session_id INTEGER NOT NULL,
-- Sender
sender_type TEXT NOT NULL, -- customer, agent, bot, system
sender_id TEXT,
sender_name TEXT,
-- Message
message TEXT NOT NULL,
message_type TEXT DEFAULT 'text', -- text, image, file, system_message
-- AI fields
is_bot_response BOOLEAN DEFAULT 0,
bot_confidence REAL,
intent TEXT,
-- Status
is_read BOOLEAN DEFAULT 0,
read_at TIMESTAMP,
-- Metadata
meta_data TEXT, -- JSON
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (session_id) REFERENCES cx_chat_sessions(id) ON DELETE CASCADE
);
CREATE INDEX idx_cx_chat_messages_session ON cx_chat_messages(session_id);
CREATE INDEX idx_cx_chat_messages_created ON cx_chat_messages(created_at);
-- =============================================================================
-- AUTOMATION RULES
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_automation_rules (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
description TEXT,
is_active BOOLEAN DEFAULT 1,
-- Trigger
trigger_type TEXT NOT NULL, -- ticket_created, ticket_updated, time_based, etc.
trigger_conditions TEXT NOT NULL, -- JSON
-- Actions
actions TEXT NOT NULL, -- JSON array of actions
-- Execution
execution_count INTEGER DEFAULT 0,
last_executed_at TIMESTAMP,
-- Priority
priority INTEGER DEFAULT 0,
created_by TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- =============================================================================
-- CUSTOMER INTERACTIONS
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_interactions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
customer_id INTEGER NOT NULL,
type TEXT NOT NULL, -- ticket, chat, email, call, meeting
channel TEXT, -- web, email, phone, chat, api
summary TEXT,
sentiment TEXT,
intent TEXT,
-- References
reference_type TEXT, -- ticket, chat_session, email, etc.
reference_id INTEGER,
-- Metrics
duration_seconds INTEGER,
satisfaction_rating INTEGER,
-- Agent
handled_by TEXT,
occurred_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES cx_customers(id) ON DELETE CASCADE
);
CREATE INDEX idx_cx_interactions_customer ON cx_interactions(customer_id);
CREATE INDEX idx_cx_interactions_type ON cx_interactions(type);
CREATE INDEX idx_cx_interactions_occurred ON cx_interactions(occurred_at);
-- =============================================================================
-- ANALYTICS SNAPSHOTS (Enhanced)
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_analytics_daily (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date DATE NOT NULL UNIQUE,
-- Ticket metrics
tickets_created INTEGER DEFAULT 0,
tickets_resolved INTEGER DEFAULT 0,
tickets_reopened INTEGER DEFAULT 0,
avg_resolution_time_minutes REAL DEFAULT 0.0,
avg_first_response_minutes REAL DEFAULT 0.0,
-- Chat metrics
chats_started INTEGER DEFAULT 0,
chats_completed INTEGER DEFAULT 0,
avg_wait_time_seconds REAL DEFAULT 0.0,
bot_resolution_rate REAL DEFAULT 0.0,
-- Satisfaction
avg_csat REAL DEFAULT 0.0,
avg_nps INTEGER DEFAULT 0,
-- KB metrics
kb_views INTEGER DEFAULT 0,
kb_helpful_votes INTEGER DEFAULT 0,
kb_searches INTEGER DEFAULT 0,
-- Sentiment
positive_interactions INTEGER DEFAULT 0,
neutral_interactions INTEGER DEFAULT 0,
negative_interactions INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_cx_analytics_daily_date ON cx_analytics_daily(date);
-- =============================================================================
-- CANNED RESPONSES (Templates)
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_canned_responses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
shortcut TEXT UNIQUE, -- e.g., "/greeting"
category TEXT,
subject TEXT,
content TEXT NOT NULL,
-- Usage
use_count INTEGER DEFAULT 0,
last_used_at TIMESTAMP,
is_active BOOLEAN DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- =============================================================================
-- AGENT PERFORMANCE
-- =============================================================================
CREATE TABLE IF NOT EXISTS cx_agent_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
agent_id TEXT NOT NULL,
agent_name TEXT NOT NULL,
date DATE NOT NULL,
-- Tickets
tickets_handled INTEGER DEFAULT 0,
tickets_resolved INTEGER DEFAULT 0,
avg_resolution_time_minutes REAL DEFAULT 0.0,
-- Chats
chats_handled INTEGER DEFAULT 0,
avg_chat_duration_minutes REAL DEFAULT 0.0,
-- Quality
avg_csat REAL DEFAULT 0.0,
positive_feedbacks INTEGER DEFAULT 0,
negative_feedbacks INTEGER DEFAULT 0,
-- Efficiency
avg_response_time_minutes REAL DEFAULT 0.0,
first_contact_resolutions INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(agent_id, date)
);
CREATE INDEX idx_cx_agent_stats_agent ON cx_agent_stats(agent_id);
CREATE INDEX idx_cx_agent_stats_date ON cx_agent_stats(date);