intra_max_chatbot/database/schema.sql

133 lines
5.3 KiB
SQL

PRAGMA journal_mode=WAL;
PRAGMA foreign_keys=ON;
CREATE TABLE IF NOT EXISTS organizations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
intradesk_id INTEGER UNIQUE, -- id из intradesk_clients (NULL = ручное создание)
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Белый список телефонов по организациям.
-- phone хранится только цифрами, напр. "79001234567"
CREATE TABLE IF NOT EXISTS org_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
org_id INTEGER NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
phone TEXT NOT NULL,
display_name TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(phone)
);
-- Реальные пользователи MAX, которые написали боту
CREATE TABLE IF NOT EXISTS bot_users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
max_user_id INTEGER NOT NULL UNIQUE,
max_chat_id INTEGER,
username TEXT,
first_name TEXT,
phone TEXT, -- заполняется после шаринга контакта
org_id INTEGER REFERENCES organizations(id),
is_authorized INTEGER NOT NULL DEFAULT 0, -- 1 = авторизован
is_blocked INTEGER NOT NULL DEFAULT 0, -- 1 = заблокирован
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS tickets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
org_id INTEGER NOT NULL REFERENCES organizations(id),
created_by INTEGER NOT NULL REFERENCES bot_users(id),
description TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'open', -- open / in_progress / closed
last_comment TEXT,
intradesk_task_id INTEGER, -- id задачи в Intradesk (NULL = не создано)
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE IF NOT EXISTS ticket_attachments (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticket_id INTEGER NOT NULL REFERENCES tickets(id) ON DELETE CASCADE,
attachment_type TEXT NOT NULL, -- image / audio / file / video
attachment_url TEXT,
filename TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Лог всех входящих и исходящих сообщений
CREATE TABLE IF NOT EXISTS message_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
direction TEXT NOT NULL, -- 'in' / 'out'
max_user_id INTEGER,
max_chat_id INTEGER,
message_id TEXT,
text TEXT,
attachment_json TEXT, -- JSON-строка списка вложений
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- ── Intradesk: синхронизируемые справочники ────────────────────────────────
-- Клиенты/организации из Intradesk (clientType 10=компания, 20=физлицо)
CREATE TABLE IF NOT EXISTS intradesk_clients (
id INTEGER PRIMARY KEY, -- id из Intradesk
name TEXT NOT NULL,
client_type INTEGER, -- 10 / 20
email TEXT,
address TEXT,
description TEXT,
updated_at TEXT,
synced_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Пользователи (контактные лица) клиентов из Intradesk
CREATE TABLE IF NOT EXISTS intradesk_users (
id INTEGER PRIMARY KEY, -- id (contactPersonId) из Intradesk
name TEXT,
first_name TEXT,
last_name TEXT,
middle_name TEXT,
email TEXT,
phone TEXT,
client_id INTEGER, -- userGroup.id из Intradesk
is_archived INTEGER NOT NULL DEFAULT 0,
synced_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Заявки из Intradesk
CREATE TABLE IF NOT EXISTS intradesk_tasks (
id INTEGER PRIMARY KEY, -- id из Intradesk
task_number INTEGER,
name TEXT,
description TEXT,
status_id INTEGER,
status_name TEXT,
priority_id INTEGER,
priority_name TEXT,
client_id INTEGER, -- clientid из Intradesk
initiator_id INTEGER,
initiator_name TEXT,
executor_id INTEGER,
executor_name TEXT,
executor_group INTEGER,
service_name TEXT,
service_full_name TEXT,
created_at TEXT,
updated_at TEXT,
closed_at TEXT,
created_by TEXT,
updated_by TEXT,
synced_at TEXT NOT NULL DEFAULT (datetime('now'))
);
-- Лог запусков синхронизации
CREATE TABLE IF NOT EXISTS intradesk_sync_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
sync_type TEXT NOT NULL, -- clients / users / tasks / all
started_at TEXT NOT NULL DEFAULT (datetime('now')),
finished_at TEXT,
status TEXT NOT NULL DEFAULT 'running', -- running / success / error
records_synced INTEGER NOT NULL DEFAULT 0,
error_message TEXT
);