-- Disabilita i controlli delle chiavi esterne per evitare errori durante la creazione/eliminazione SET FOREIGN_KEY_CHECKS = 0; -- 1. TABELLA QUEUES (Code di smistamento) DROP TABLE IF EXISTS queues; CREATE TABLE queues ( id VARCHAR(36) PRIMARY KEY, name VARCHAR(50) NOT NULL UNIQUE, description TEXT ); INSERT INTO queues (id, name, description) VALUES ('q1', 'General', 'Richieste generiche e informazioni'), ('q2', 'Tech Support', 'Problemi tecnici hardware e software'), ('q3', 'Billing', 'Fatturazione, pagamenti e rimborsi'); -- 2. TABELLA AGENTS (Agenti, Supervisor, Superadmin) DROP TABLE IF EXISTS agents; CREATE TABLE agents ( id VARCHAR(36) PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, role ENUM('superadmin', 'supervisor', 'agent') DEFAULT 'agent', avatar TEXT, avatar_config JSON, queues JSON, -- Array di stringhe (nomi delle code) skills JSON, -- Array di stringhe created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Inserimento Superadmin Obbligatorio e Agenti Mock INSERT INTO agents (id, name, email, password, role, avatar, avatar_config, queues, skills) VALUES ('a0', 'Super Admin', 'fcarra79@gmail.com', 'Mr10921.', 'superadmin', 'https://ui-avatars.com/api/?name=Super+Admin&background=0D8ABC&color=fff', '{"x": 50, "y": 50, "scale": 1}', '["General", "Tech Support", "Billing"]', '["All"]'), ('a1', 'Mario Rossi', 'mario@omni.ai', 'admin', 'agent', 'https://picsum.photos/id/1005/200/200', '{"x": 50, "y": 50, "scale": 1}', '["Tech Support", "General"]', '["Technical", "Linux"]'), ('a2', 'Giulia Bianchi', 'giulia@omni.ai', 'admin', 'supervisor', 'https://picsum.photos/id/1011/200/200', '{"x": 50, "y": 50, "scale": 1}', '["Billing"]', '["Billing", "Refunds"]'); -- 3. TABELLA CLIENT_USERS (Utenti finali) DROP TABLE IF EXISTS client_users; CREATE TABLE client_users ( id VARCHAR(36) PRIMARY KEY, name VARCHAR(255) NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, password VARCHAR(255) NOT NULL, company VARCHAR(255), status ENUM('active', 'inactive') DEFAULT 'active', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO client_users (id, name, email, password, company, status) VALUES ('u1', 'Luca Verdi', 'luca@client.com', 'user', 'Acme Corp', 'active'), ('u2', 'Anna Neri', 'anna@client.com', 'user', 'Globex', 'active'), ('u3', 'Giorgio Gialli', 'giorgio.g@example.com', 'user', NULL, 'inactive'); -- 4. TABELLA TICKETS DROP TABLE IF EXISTS tickets; CREATE TABLE tickets ( id VARCHAR(36) PRIMARY KEY, subject VARCHAR(255) NOT NULL, description TEXT, status ENUM('APERTO', 'IN LAVORAZIONE', 'RISOLTO', 'CHIUSO') DEFAULT 'APERTO', priority ENUM('Bassa', 'Media', 'Alta', 'Critica') DEFAULT 'Media', customer_name VARCHAR(255), assigned_agent_id VARCHAR(36), queue VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, attachments JSON DEFAULT NULL, -- Array di oggetti Attachment has_been_analyzed BOOLEAN DEFAULT FALSE, -- Flag per l'agente AI FOREIGN KEY (assigned_agent_id) REFERENCES agents(id) ON DELETE SET NULL ); INSERT INTO tickets (id, subject, description, status, priority, customer_name, assigned_agent_id, queue, created_at, has_been_analyzed) VALUES ('T-1001', 'Problema connessione VPN', 'Non riesco a connettermi alla VPN aziendale da casa.', 'APERTO', 'Alta', 'Luca Verdi', NULL, 'Tech Support', '2023-12-01 09:00:00', FALSE), ('T-1002', 'Errore Fattura Dicembre', 'La fattura riporta un importo errato rispetto al contratto.', 'RISOLTO', 'Media', 'Anna Neri', 'a2', 'Billing', '2023-11-28 14:30:00', TRUE), ('T-1003', 'Come configurare 2FA', 'Vorrei attivare la doppia autenticazione ma non trovo l''opzione.', 'RISOLTO', 'Bassa', 'Giorgio Gialli', 'a1', 'Tech Support', '2023-11-25 10:00:00', TRUE); -- 5. TABELLA TICKET_MESSAGES (Messaggi della chat del ticket) DROP TABLE IF EXISTS ticket_messages; CREATE TABLE ticket_messages ( id VARCHAR(36) PRIMARY KEY, ticket_id VARCHAR(36) NOT NULL, role ENUM('user', 'assistant', 'system') NOT NULL, content TEXT, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE ); INSERT INTO ticket_messages (id, ticket_id, role, content, timestamp) VALUES ('m1', 'T-1002', 'user', 'La fattura è di 50€ invece di 30€.', '2023-11-28 14:30:00'), ('m2', 'T-1002', 'assistant', 'Ciao Anna, ho verificato. C''era un errore nel calcolo dell''IVA. Ho emesso una nota di credito.', '2023-11-28 15:00:00'), ('m3', 'T-1002', 'user', 'Grazie mille, risolto.', '2023-11-28 15:10:00'), ('m4', 'T-1003', 'user', 'Dove trovo il 2FA?', '2023-11-25 10:00:00'), ('m5', 'T-1003', 'assistant', 'Ciao Giorgio. Devi scaricare Google Authenticator. Poi vai nel tuo profilo, clicca su "Sicurezza Avanzata" e scansiona il QR code.', '2023-11-25 10:15:00'); -- 6. TABELLA KB_ARTICLES (Knowledge Base) DROP TABLE IF EXISTS kb_articles; CREATE TABLE kb_articles ( id VARCHAR(36) PRIMARY KEY, title VARCHAR(255) NOT NULL, content TEXT, -- Markdown o contenuto estratto category VARCHAR(100), type ENUM('article', 'url') DEFAULT 'article', url TEXT, source ENUM('manual', 'ai') DEFAULT 'manual', visibility ENUM('public', 'internal') DEFAULT 'public', -- Visibilità last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); INSERT INTO kb_articles (id, title, content, category, type, url, source, visibility, last_updated) VALUES ('kb1', 'Come reimpostare la password', 'Per reimpostare la password, vai su Impostazioni > Sicurezza e clicca su "Cambia Password". Ti verrà inviata una mail di conferma.', 'Account', 'article', NULL, 'manual', 'public', '2023-10-15 10:00:00'), ('kb2', 'Configurazione Email su Outlook', '1. Apri Outlook. 2. File > Aggiungi Account. 3. Inserisci la tua mail. 4. Seleziona IMAP. Server in entrata: imap.example.com porta 993.', 'Tecnico', 'article', NULL, 'manual', 'public', '2023-11-02 11:30:00'), ('kb3', 'Documentazione API Ufficiale', 'Riferimento esterno alla documentazione.', 'Sviluppo', 'url', 'https://example.com/api-docs', 'manual', 'public', '2023-09-20 09:00:00'); -- 7. TABELLA SURVEY_RESULTS (Feedback e Sondaggi) DROP TABLE IF EXISTS survey_results; CREATE TABLE survey_results ( id VARCHAR(36) PRIMARY KEY, rating INT NOT NULL, -- 1-5 comment TEXT, source ENUM('chat', 'ticket') NOT NULL, reference_id VARCHAR(36), -- Ticket ID se source è ticket timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO survey_results (id, rating, comment, source, reference_id, timestamp) VALUES ('s1', 5, 'Ottimo servizio, molto veloce!', 'ticket', 'T-1002', '2023-11-28 16:00:00'), ('s2', 4, 'Buono, ma l''attesa è stata lunghetta.', 'chat', NULL, '2023-12-02 10:30:00'), ('s3', 5, 'AI molto intelligente, ha risolto subito.', 'chat', NULL, '2023-12-03 09:15:00'), ('s4', 2, 'Non ha capito la mia domanda.', 'chat', NULL, '2023-12-01 14:20:00'); -- 8. TABELLA SETTINGS (Configurazione Globale) DROP TABLE IF EXISTS settings; CREATE TABLE settings ( id INT PRIMARY KEY DEFAULT 1, branding JSON, smtp JSON, email_templates JSON, features JSON, ai_config JSON ); INSERT INTO settings (id, branding, smtp, email_templates, features, ai_config) VALUES ( 1, '{"appName": "OmniSupport AI", "primaryColor": "#0284c7", "logoUrl": "https://via.placeholder.com/150"}', '{"host": "smtp.example.com", "port": 587, "user": "notifications@omnisupport.ai", "pass": "password", "secure": true, "fromEmail": "noreply@omnisupport.ai"}', '[{"id": "t1", "name": "Conferma Apertura Ticket", "trigger": "ticket_created", "audience": "client", "subject": "Ticket #{ticket_id} Creato", "body": "Grazie per averci contattato.", "isActive": true}]', '{"kbEnabled": true, "maxKbArticles": 50, "maxSupervisors": 2, "aiKnowledgeAgentEnabled": true, "maxAiGeneratedArticles": 10, "maxAgents": 10}', '{"provider": "gemini", "apiKey": "", "model": "gemini-3-flash-preview", "isActive": true, "agentName": "OmniSupport AI", "customPrompt": ""}' ); SET FOREIGN_KEY_CHECKS = 1;