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, 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 );