|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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, |
|
|
|
|
|
|
|
|
segment TEXT DEFAULT 'standard', |
|
|
lifecycle_stage TEXT DEFAULT 'active', |
|
|
|
|
|
|
|
|
lifetime_value REAL DEFAULT 0.0, |
|
|
satisfaction_score REAL DEFAULT 0.0, |
|
|
nps_score INTEGER, |
|
|
sentiment TEXT DEFAULT 'neutral', |
|
|
|
|
|
|
|
|
first_interaction_at TIMESTAMP, |
|
|
last_interaction_at TIMESTAMP, |
|
|
total_interactions INTEGER DEFAULT 0, |
|
|
total_tickets INTEGER DEFAULT 0, |
|
|
|
|
|
|
|
|
tags TEXT, |
|
|
custom_fields TEXT, |
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS cx_tickets ( |
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
|
customer_id INTEGER NOT NULL, |
|
|
|
|
|
|
|
|
subject TEXT NOT NULL, |
|
|
description TEXT, |
|
|
status TEXT DEFAULT 'new', |
|
|
priority TEXT DEFAULT 'medium', |
|
|
category TEXT, |
|
|
|
|
|
|
|
|
assigned_to TEXT, |
|
|
assigned_team TEXT, |
|
|
|
|
|
|
|
|
sla_due_at TIMESTAMP, |
|
|
first_response_at TIMESTAMP, |
|
|
resolved_at TIMESTAMP, |
|
|
closed_at TIMESTAMP, |
|
|
|
|
|
|
|
|
response_time_minutes INTEGER, |
|
|
resolution_time_minutes INTEGER, |
|
|
reopened_count INTEGER DEFAULT 0, |
|
|
|
|
|
|
|
|
sentiment TEXT, |
|
|
ai_suggested_category TEXT, |
|
|
ai_confidence REAL, |
|
|
auto_resolved BOOLEAN DEFAULT 0, |
|
|
|
|
|
|
|
|
source TEXT DEFAULT 'manual', |
|
|
tags TEXT, |
|
|
custom_fields TEXT, |
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS cx_ticket_messages ( |
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
|
ticket_id INTEGER NOT NULL, |
|
|
|
|
|
|
|
|
sender_type TEXT NOT NULL, |
|
|
sender_id TEXT, |
|
|
sender_name TEXT, |
|
|
|
|
|
|
|
|
message TEXT NOT NULL, |
|
|
message_html TEXT, |
|
|
is_internal BOOLEAN DEFAULT 0, |
|
|
|
|
|
|
|
|
sentiment TEXT, |
|
|
intent TEXT, |
|
|
|
|
|
|
|
|
meta_data TEXT, |
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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, |
|
|
|
|
|
|
|
|
title TEXT NOT NULL, |
|
|
summary TEXT, |
|
|
content TEXT NOT NULL, |
|
|
content_html TEXT, |
|
|
|
|
|
|
|
|
status TEXT DEFAULT 'draft', |
|
|
visibility TEXT DEFAULT 'public', |
|
|
|
|
|
|
|
|
slug TEXT UNIQUE, |
|
|
meta_description TEXT, |
|
|
|
|
|
|
|
|
view_count INTEGER DEFAULT 0, |
|
|
helpful_count INTEGER DEFAULT 0, |
|
|
not_helpful_count INTEGER DEFAULT 0, |
|
|
average_rating REAL DEFAULT 0.0, |
|
|
|
|
|
|
|
|
ai_generated BOOLEAN DEFAULT 0, |
|
|
ai_confidence REAL, |
|
|
keywords TEXT, |
|
|
|
|
|
|
|
|
version INTEGER DEFAULT 1, |
|
|
|
|
|
|
|
|
tags TEXT, |
|
|
related_articles TEXT, |
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS cx_chat_sessions ( |
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
|
customer_id INTEGER, |
|
|
|
|
|
|
|
|
session_id TEXT UNIQUE NOT NULL, |
|
|
status TEXT DEFAULT 'active', |
|
|
|
|
|
|
|
|
assigned_to TEXT, |
|
|
assigned_at TIMESTAMP, |
|
|
|
|
|
|
|
|
bot_active BOOLEAN DEFAULT 1, |
|
|
bot_handed_off BOOLEAN DEFAULT 0, |
|
|
bot_handoff_reason TEXT, |
|
|
|
|
|
|
|
|
wait_time_seconds INTEGER DEFAULT 0, |
|
|
response_time_seconds INTEGER DEFAULT 0, |
|
|
message_count INTEGER DEFAULT 0, |
|
|
|
|
|
|
|
|
page_url TEXT, |
|
|
referrer TEXT, |
|
|
user_agent TEXT, |
|
|
ip_address TEXT, |
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS cx_chat_messages ( |
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
|
session_id INTEGER NOT NULL, |
|
|
|
|
|
|
|
|
sender_type TEXT NOT NULL, |
|
|
sender_id TEXT, |
|
|
sender_name TEXT, |
|
|
|
|
|
|
|
|
message TEXT NOT NULL, |
|
|
message_type TEXT DEFAULT 'text', |
|
|
|
|
|
|
|
|
is_bot_response BOOLEAN DEFAULT 0, |
|
|
bot_confidence REAL, |
|
|
intent TEXT, |
|
|
|
|
|
|
|
|
is_read BOOLEAN DEFAULT 0, |
|
|
read_at TIMESTAMP, |
|
|
|
|
|
|
|
|
meta_data TEXT, |
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_type TEXT NOT NULL, |
|
|
trigger_conditions TEXT NOT NULL, |
|
|
|
|
|
|
|
|
actions TEXT NOT NULL, |
|
|
|
|
|
|
|
|
execution_count INTEGER DEFAULT 0, |
|
|
last_executed_at TIMESTAMP, |
|
|
|
|
|
|
|
|
priority INTEGER DEFAULT 0, |
|
|
|
|
|
created_by TEXT, |
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, |
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS cx_interactions ( |
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
|
customer_id INTEGER NOT NULL, |
|
|
|
|
|
type TEXT NOT NULL, |
|
|
channel TEXT, |
|
|
|
|
|
summary TEXT, |
|
|
sentiment TEXT, |
|
|
intent TEXT, |
|
|
|
|
|
|
|
|
reference_type TEXT, |
|
|
reference_id INTEGER, |
|
|
|
|
|
|
|
|
duration_seconds INTEGER, |
|
|
satisfaction_rating INTEGER, |
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS cx_analytics_daily ( |
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
|
date DATE NOT NULL UNIQUE, |
|
|
|
|
|
|
|
|
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, |
|
|
|
|
|
|
|
|
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, |
|
|
|
|
|
|
|
|
avg_csat REAL DEFAULT 0.0, |
|
|
avg_nps INTEGER DEFAULT 0, |
|
|
|
|
|
|
|
|
kb_views INTEGER DEFAULT 0, |
|
|
kb_helpful_votes INTEGER DEFAULT 0, |
|
|
kb_searches INTEGER DEFAULT 0, |
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CREATE TABLE IF NOT EXISTS cx_canned_responses ( |
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT, |
|
|
|
|
|
name TEXT NOT NULL, |
|
|
shortcut TEXT UNIQUE, |
|
|
category TEXT, |
|
|
|
|
|
subject TEXT, |
|
|
content TEXT NOT NULL, |
|
|
|
|
|
|
|
|
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 |
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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_handled INTEGER DEFAULT 0, |
|
|
tickets_resolved INTEGER DEFAULT 0, |
|
|
avg_resolution_time_minutes REAL DEFAULT 0.0, |
|
|
|
|
|
|
|
|
chats_handled INTEGER DEFAULT 0, |
|
|
avg_chat_duration_minutes REAL DEFAULT 0.0, |
|
|
|
|
|
|
|
|
avg_csat REAL DEFAULT 0.0, |
|
|
positive_feedbacks INTEGER DEFAULT 0, |
|
|
negative_feedbacks INTEGER DEFAULT 0, |
|
|
|
|
|
|
|
|
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); |
|
|
|