πŸ—οΈ ARCHITECTURE COMPLÈTE CALL CENTER SPA Voici l'architecture complΓ¨te basΓ©e sur la base de donnΓ©es gΓ©nΓ©rΓ©e : πŸ“ STRUCTURE DU PROJET SPA COMPLÈTE callcenter-spa/ β”œβ”€β”€ 🌐 public/ β”‚ β”œβ”€β”€ index.php (Point d'entrΓ©e SPA) β”‚ β”œβ”€β”€ login.php β”‚ β”œβ”€β”€ .htaccess β”‚ └── assets/ β”‚ β”œβ”€β”€ css/ β”‚ β”‚ β”œβ”€β”€ app.css β”‚ β”‚ β”œβ”€β”€ components.css β”‚ β”‚ β”œβ”€β”€ themes/ β”‚ β”‚ β”‚ β”œβ”€β”€ light.css β”‚ β”‚ β”‚ └── dark.css β”‚ β”‚ └── responsive.css β”‚ β”œβ”€β”€ js/ β”‚ β”‚ β”œβ”€β”€ core/ (CΕ“ur de l'application) β”‚ β”‚ β”‚ β”œβ”€β”€ app.js β”‚ β”‚ β”‚ β”œβ”€β”€ router.js β”‚ β”‚ β”‚ β”œβ”€β”€ store.js (Γ‰tat global) β”‚ β”‚ β”‚ β”œβ”€β”€ api.js β”‚ β”‚ β”‚ └── events.js β”‚ β”‚ β”œβ”€β”€ managers/ (Gestionnaires mΓ©tier) β”‚ β”‚ β”‚ β”œβ”€β”€ sip-manager.js β”‚ β”‚ β”‚ β”œβ”€β”€ call-manager.js β”‚ β”‚ β”‚ β”œβ”€β”€ customer-manager.js β”‚ β”‚ β”‚ β”œβ”€β”€ ticket-manager.js β”‚ β”‚ β”‚ └── agent-manager.js β”‚ β”‚ β”œβ”€β”€ components/ (Composants UI) β”‚ β”‚ β”‚ β”œβ”€β”€ dialer.js β”‚ β”‚ β”‚ β”œβ”€β”€ customer-list.js β”‚ β”‚ β”‚ β”œβ”€β”€ call-history.js β”‚ β”‚ β”‚ β”œβ”€β”€ active-calls.js β”‚ β”‚ β”‚ β”œβ”€β”€ ticket-manager.js β”‚ β”‚ β”‚ └── realtime-dashboard.js β”‚ β”‚ └── utils/ (Utilitaires) β”‚ β”‚ β”œβ”€β”€ helpers.js β”‚ β”‚ β”œβ”€β”€ formatters.js β”‚ β”‚ └── validators.js β”‚ └── media/ β”‚ β”œβ”€β”€ icons/ β”‚ β”œβ”€β”€ sounds/ (Sons d'appel, notifications) β”‚ └── recordings/ β”œβ”€β”€ πŸš€ app/ β”‚ β”œβ”€β”€ Config/ β”‚ β”‚ β”œβ”€β”€ config.php β”‚ β”‚ β”œβ”€β”€ database.php β”‚ β”‚ β”œβ”€β”€ routes.php β”‚ β”‚ └── constants.php β”‚ β”œβ”€β”€ Controllers/ β”‚ β”‚ β”œβ”€β”€ Api/ (Controllers API REST) β”‚ β”‚ β”‚ β”œβ”€β”€ AuthController.php β”‚ β”‚ β”‚ β”œβ”€β”€ CustomerController.php β”‚ β”‚ β”‚ β”œβ”€β”€ CallController.php β”‚ β”‚ β”‚ β”œβ”€β”€ SipController.php β”‚ β”‚ β”‚ β”œβ”€β”€ TicketController.php β”‚ β”‚ β”‚ β”œβ”€β”€ AgentController.php β”‚ β”‚ β”‚ β”œβ”€β”€ CampaignController.php β”‚ β”‚ β”‚ └── ReportController.php β”‚ β”‚ β”œβ”€β”€ Web/ (Controllers pages) β”‚ β”‚ β”‚ β”œβ”€β”€ DashboardController.php β”‚ β”‚ β”‚ β”œβ”€β”€ CustomerController.php β”‚ β”‚ β”‚ β”œβ”€β”€ CallController.php β”‚ β”‚ β”‚ └── SipController.php β”‚ β”‚ └── BaseController.php β”‚ β”œβ”€β”€ Models/ β”‚ β”‚ β”œβ”€β”€ Core/ β”‚ β”‚ β”‚ β”œβ”€β”€ Model.php β”‚ β”‚ β”‚ β”œβ”€β”€ Database.php β”‚ β”‚ β”‚ └── QueryBuilder.php β”‚ β”‚ β”œβ”€β”€ Entities/ (Models mΓ©tier) β”‚ β”‚ β”‚ β”œβ”€β”€ User.php β”‚ β”‚ β”‚ β”œβ”€β”€ Customer.php β”‚ β”‚ β”‚ β”œβ”€β”€ Call.php β”‚ β”‚ β”‚ β”œβ”€β”€ Ticket.php β”‚ β”‚ β”‚ β”œβ”€β”€ SipAccount.php β”‚ β”‚ β”‚ β”œβ”€β”€ Campaign.php β”‚ β”‚ β”‚ β”œβ”€β”€ Agent.php β”‚ β”‚ β”‚ └── Team.php β”‚ β”‚ └── Repositories/ (Pattern Repository) β”‚ β”‚ β”œβ”€β”€ CustomerRepository.php β”‚ β”‚ β”œβ”€β”€ CallRepository.php β”‚ β”‚ β”œβ”€β”€ TicketRepository.php β”‚ β”‚ β”œβ”€β”€ SipRepository.php β”‚ β”‚ └── AgentRepository.php β”‚ β”œβ”€β”€ Views/ β”‚ β”‚ β”œβ”€β”€ components/ (Composants rΓ©utilisables) β”‚ β”‚ β”‚ β”œβ”€β”€ common/ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ header.php β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ sidebar.php β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ call-bar.php (Barre d'appel fixe) β”‚ β”‚ β”‚ β”‚ └── notification-center.php β”‚ β”‚ β”‚ β”œβ”€β”€ calls/ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ dialer.php β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ active-calls.php β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ call-history.php β”‚ β”‚ β”‚ β”‚ └── call-details.php β”‚ β”‚ β”‚ β”œβ”€β”€ customers/ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ customer-list.php β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ customer-details.php β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ customer-search.php β”‚ β”‚ β”‚ β”‚ └── customer-form.php β”‚ β”‚ β”‚ β”œβ”€β”€ tickets/ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ticket-list.php β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ticket-details.php β”‚ β”‚ β”‚ β”‚ └── ticket-form.php β”‚ β”‚ β”‚ └── agents/ β”‚ β”‚ β”‚ β”œβ”€β”€ agent-status.php β”‚ β”‚ β”‚ β”œβ”€β”€ performance-stats.php β”‚ β”‚ β”‚ └── break-manager.php β”‚ β”‚ β”œβ”€β”€ pages/ (Pages SPA complΓ¨tes) β”‚ β”‚ β”‚ β”œβ”€β”€ dashboard.php β”‚ β”‚ β”‚ β”œβ”€β”€ customers.php β”‚ β”‚ β”‚ β”œβ”€β”€ calls.php β”‚ β”‚ β”‚ β”œβ”€β”€ tickets.php β”‚ β”‚ β”‚ β”œβ”€β”€ campaigns.php β”‚ β”‚ β”‚ β”œβ”€β”€ reports.php β”‚ β”‚ β”‚ β”œβ”€β”€ sip-config.php β”‚ β”‚ β”‚ └── agent-console.php β”‚ β”‚ β”œβ”€β”€ layouts/ β”‚ β”‚ β”‚ β”œβ”€β”€ main.php β”‚ β”‚ β”‚ β”œβ”€β”€ auth.php β”‚ β”‚ β”‚ └── admin.php β”‚ β”‚ └── templates/ β”‚ β”‚ β”œβ”€β”€ emails/ β”‚ β”‚ └── exports/ β”‚ β”œβ”€β”€ Services/ (Services mΓ©tier) β”‚ β”‚ β”œβ”€β”€ SipService.php β”‚ β”‚ β”œβ”€β”€ CallService.php β”‚ β”‚ β”œβ”€β”€ CustomerService.php β”‚ β”‚ β”œβ”€β”€ TicketService.php β”‚ β”‚ β”œβ”€β”€ NotificationService.php β”‚ β”‚ β”œβ”€β”€ ReportService.php β”‚ β”‚ β”œβ”€β”€ CampaignService.php β”‚ β”‚ └── AudioService.php β”‚ β”œβ”€β”€ Middleware/ β”‚ β”‚ β”œβ”€β”€ AuthMiddleware.php β”‚ β”‚ β”œβ”€β”€ CorsMiddleware.php β”‚ β”‚ β”œβ”€β”€ LoggingMiddleware.php β”‚ β”‚ β”œβ”€β”€ SipAuthMiddleware.php β”‚ β”‚ └── RateLimitMiddleware.php β”‚ β”œβ”€β”€ Utils/ β”‚ β”‚ β”œβ”€β”€ Session.php β”‚ β”‚ β”œβ”€β”€ Auth.php β”‚ β”‚ β”œβ”€β”€ Validator.php β”‚ β”‚ β”œβ”€β”€ Formatter.php β”‚ β”‚ β”œβ”€β”€ Logger.php β”‚ β”‚ β”œβ”€β”€ Helpers.php β”‚ β”‚ └── SipHelpers.php β”‚ β”œβ”€β”€ Events/ (SystΓ¨me d'Γ©vΓ©nements) β”‚ β”‚ β”œβ”€β”€ CallEvents.php β”‚ β”‚ β”œβ”€β”€ CustomerEvents.php β”‚ β”‚ β”œβ”€β”€ TicketEvents.php β”‚ β”‚ β”œβ”€β”€ SipEvents.php β”‚ β”‚ └── EventDispatcher.php β”‚ └── Listeners/ (Γ‰couteurs d'Γ©vΓ©nements) β”‚ β”œβ”€β”€ CallListeners.php β”‚ β”œβ”€β”€ NotificationListeners.php β”‚ β”œβ”€β”€ AuditListeners.php β”‚ └── SipListeners.php β”œβ”€β”€ 🌐 api/ (Endpoints API) β”‚ β”œβ”€β”€ v1/ β”‚ β”‚ β”œβ”€β”€ auth.php β”‚ β”‚ β”œβ”€β”€ customers.php β”‚ β”‚ β”œβ”€β”€ calls.php β”‚ β”‚ β”œβ”€β”€ tickets.php β”‚ β”‚ β”œβ”€β”€ sip.php β”‚ β”‚ β”œβ”€β”€ agents.php β”‚ β”‚ β”œβ”€β”€ campaigns.php β”‚ β”‚ β”œβ”€β”€ reports.php β”‚ β”‚ └── websocket.php (WebSocket pour temps rΓ©el) β”‚ └── websocket/ (Serveur WebSocket) β”‚ β”œβ”€β”€ server.php β”‚ β”œβ”€β”€ handlers/ β”‚ β”‚ β”œβ”€β”€ CallHandler.php β”‚ β”‚ β”œβ”€β”€ AgentHandler.php β”‚ β”‚ └── NotificationHandler.php β”‚ └── clients/ (Clients WebSocket) β”œβ”€β”€ πŸ“Š database/ β”‚ β”œβ”€β”€ migrations/ (Migrations DB) β”‚ β”‚ β”œβ”€β”€ 001_create_organisations_table.php β”‚ β”‚ β”œβ”€β”€ 002_create_users_table.php β”‚ β”‚ β”œβ”€β”€ 003_create_sip_servers_table.php β”‚ β”‚ └── ... (toutes les tables) β”‚ β”œβ”€β”€ seeds/ (DonnΓ©es de test) β”‚ β”‚ β”œβ”€β”€ OrganisationSeeder.php β”‚ β”‚ β”œβ”€β”€ UserSeeder.php β”‚ β”‚ β”œβ”€β”€ CustomerSeeder.php β”‚ β”‚ └── ... β”‚ └── schema.sql (Structure complΓ¨te) β”œβ”€β”€ πŸ§ͺ tests/ β”‚ β”œβ”€β”€ Unit/ β”‚ β”‚ β”œβ”€β”€ Models/ β”‚ β”‚ β”œβ”€β”€ Services/ β”‚ β”‚ └── Utils/ β”‚ β”œβ”€β”€ Feature/ β”‚ β”‚ β”œβ”€β”€ AuthTest.php β”‚ β”‚ β”œβ”€β”€ CallTest.php β”‚ β”‚ β”œβ”€β”€ CustomerTest.php β”‚ β”‚ └── SipTest.php β”‚ └── Integration/ β”‚ β”œβ”€β”€ ApiTests/ β”‚ └── SipIntegrationTest.php β”œβ”€β”€ πŸ“‹ docs/ β”‚ β”œβ”€β”€ api.md β”‚ β”œβ”€β”€ setup.md β”‚ β”œβ”€β”€ deployment.md β”‚ β”œβ”€β”€ user-guide.md β”‚ └── developer-guide.md β”œβ”€β”€ πŸ”§ scripts/ β”‚ β”œβ”€β”€ deploy.sh β”‚ β”œβ”€β”€ backup-db.sh β”‚ β”œβ”€β”€ migrate.php β”‚ └── seed.php └── πŸ› οΈ vendor/ (DΓ©pendances) └── sip.js/ πŸ—„οΈ BASE DE DONNΓ‰ES COMPLÈTE CALL CENTER SPA Voici le script SQL complet avec TOUTES les tables nΓ©cessaires : sql -- ============================================= -- CALL CENTER SPA - BASE DE DONNΓ‰ES COMPLÈTE -- ============================================= SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; -- CrΓ©ation de la base de donnΓ©es CREATE DATABASE IF NOT EXISTS callcenter_spa DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE callcenter_spa; -- -------------------------------------------------------- -- Table: organisations -- -------------------------------------------------------- CREATE TABLE organisations ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, domain varchar(100) DEFAULT NULL, timezone varchar(50) DEFAULT 'UTC', language varchar(10) DEFAULT 'fr', settings JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: teams -- -------------------------------------------------------- CREATE TABLE teams ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, description text, manager_id int(11) DEFAULT NULL, queue_strategy enum('round-robin','longest-idle','simultaneous','weighted') DEFAULT 'round-robin', max_queue_size int(11) DEFAULT 50, settings JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: users -- -------------------------------------------------------- CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, username varchar(50) NOT NULL UNIQUE, email varchar(255) NOT NULL UNIQUE, password varchar(255) NOT NULL, display_name varchar(100) DEFAULT NULL, role enum('agent','supervisor','admin','system') DEFAULT 'agent', skills JSON DEFAULT NULL, max_concurrent_calls int(11) DEFAULT 1, team_id int(11) DEFAULT NULL, sip_account_id int(11) DEFAULT NULL, is_active tinyint(1) DEFAULT 1, last_login timestamp NULL, login_count int(11) DEFAULT 0, preferences JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE SET NULL, INDEX idx_username (username), INDEX idx_email (email), INDEX idx_role (role) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: sip_servers -- -------------------------------------------------------- CREATE TABLE sip_servers ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, host varchar(255) NOT NULL, port int(11) DEFAULT 5060, websocket_port int(11) DEFAULT 8089, transport enum('udp','tcp','tls','wss') DEFAULT 'wss', type enum('asterisk','freeswitch','3cx','kamailio','custom') DEFAULT 'asterisk', priority int(11) DEFAULT 1, weight int(11) DEFAULT 10, is_active tinyint(1) DEFAULT 1, max_connections int(11) DEFAULT 100, current_connections int(11) DEFAULT 0, health_status enum('healthy','degraded','down','unknown') DEFAULT 'unknown', last_health_check timestamp NULL, settings JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, INDEX idx_active_priority (is_active, priority), INDEX idx_health (health_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: sip_accounts -- -------------------------------------------------------- CREATE TABLE sip_accounts ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, sip_server_id int(11) NOT NULL, username varchar(50) NOT NULL UNIQUE, password varchar(255) NOT NULL, auth_username varchar(50) DEFAULT NULL, display_name varchar(100) DEFAULT NULL, extension varchar(20) NOT NULL UNIQUE, caller_id varchar(50) DEFAULT NULL, sip_domain varchar(255) DEFAULT NULL, register tinyint(1) DEFAULT 1, register_expires int(11) DEFAULT 3600, codecs JSON DEFAULT '["PCMU", "PCMA", "G722", "opus"]', stun_server varchar(255) DEFAULT 'stun.l.google.com:19302', turn_server varchar(255) DEFAULT NULL, ice_servers JSON DEFAULT NULL, audio_settings JSON DEFAULT NULL, is_active tinyint(1) DEFAULT 1, registration_status enum('registered','unregistered','failed','registering') DEFAULT 'unregistered', last_registration timestamp NULL, registration_attempts int(11) DEFAULT 0, max_registration_attempts int(11) DEFAULT 3, settings JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (sip_server_id) REFERENCES sip_servers(id) ON DELETE CASCADE, UNIQUE KEY unique_user_sip (user_id), INDEX idx_username (username), INDEX idx_extension (extension), INDEX idx_reg_status (registration_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: customers -- -------------------------------------------------------- CREATE TABLE customers ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, customer_id varchar(20) NOT NULL UNIQUE, account_name varchar(255) NOT NULL, contact_name varchar(255) DEFAULT NULL, email varchar(255) DEFAULT NULL, phone_numbers JSON NOT NULL, address JSON DEFAULT NULL, language_preference varchar(10) DEFAULT 'fr', timezone varchar(50) DEFAULT NULL, category enum('individual','business','enterprise','government') DEFAULT 'business', status enum('active','inactive','pending','do_not_call') DEFAULT 'active', priority enum('low','normal','high','critical') DEFAULT 'normal', value_tier enum('bronze','silver','gold','platinum') DEFAULT 'bronze', assigned_team int(11) DEFAULT NULL, assigned_agent int(11) DEFAULT NULL, last_contact timestamp NULL, total_calls int(11) DEFAULT 0, total_duration int(11) DEFAULT 0, satisfaction_score decimal(3,2) DEFAULT NULL, notes text, custom_fields JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (assigned_team) REFERENCES teams(id) ON DELETE SET NULL, FOREIGN KEY (assigned_agent) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_customer_id (customer_id), INDEX idx_account_name (account_name), INDEX idx_status (status), INDEX idx_priority (priority) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: call_history -- -------------------------------------------------------- CREATE TABLE call_history ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, call_uuid varchar(36) NOT NULL UNIQUE, direction enum('inbound','outbound') NOT NULL, from_number varchar(20) NOT NULL, to_number varchar(20) NOT NULL, customer_id int(11) DEFAULT NULL, agent_id int(11) DEFAULT NULL, team_id int(11) DEFAULT NULL, queue_id int(11) DEFAULT NULL, duration int(11) DEFAULT 0, talk_time int(11) DEFAULT 0, hold_time int(11) DEFAULT 0, queue_time int(11) DEFAULT 0, wrap_up_time int(11) DEFAULT 0, status enum('completed','missed','failed','busy','no_answer','voicemail','canceled') DEFAULT 'completed', disposition varchar(100) DEFAULT NULL, recording_path varchar(500) DEFAULT NULL, transcript text, call_cost decimal(10,4) DEFAULT 0.0000, quality_score int(11) DEFAULT NULL, sentiment_score decimal(3,2) DEFAULT NULL, tags JSON DEFAULT NULL, custom_data JSON DEFAULT NULL, started_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, answered_at timestamp NULL, ended_at timestamp NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE SET NULL, FOREIGN KEY (agent_id) REFERENCES users(id) ON DELETE SET NULL, FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE SET NULL, INDEX idx_call_uuid (call_uuid), INDEX idx_direction (direction), INDEX idx_started_at (started_at), INDEX idx_agent_date (agent_id, started_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: agent_status -- -------------------------------------------------------- CREATE TABLE agent_status ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, status enum('available','busy','on_call','wrap_up','break','training','meeting','offline') DEFAULT 'offline', sub_status varchar(50) DEFAULT NULL, current_call_id int(11) DEFAULT NULL, current_queue_id int(11) DEFAULT NULL, break_reason varchar(100) DEFAULT NULL, break_start timestamp NULL, break_duration int(11) DEFAULT 0, is_accepting_calls tinyint(1) DEFAULT 1, concurrent_calls int(11) DEFAULT 0, performance_data JSON DEFAULT NULL, last_status_change timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (current_call_id) REFERENCES call_history(id) ON DELETE SET NULL, UNIQUE KEY unique_user_status (user_id), INDEX idx_status (status), INDEX idx_accepting_calls (is_accepting_calls) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: break_types -- -------------------------------------------------------- CREATE TABLE break_types ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(50) NOT NULL, code varchar(20) NOT NULL UNIQUE, description text, default_duration int(11) DEFAULT 900, is_paid tinyint(1) DEFAULT 1, requires_approval tinyint(1) DEFAULT 0, max_per_day int(11) DEFAULT 2, min_interval int(11) DEFAULT 3600, is_active tinyint(1) DEFAULT 1, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, INDEX idx_code (code), INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: agent_breaks -- -------------------------------------------------------- CREATE TABLE agent_breaks ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, break_type_id int(11) NOT NULL, scheduled_start timestamp NULL, actual_start timestamp NULL, actual_end timestamp NULL, scheduled_duration int(11) DEFAULT 900, actual_duration int(11) DEFAULT 0, status enum('scheduled','in_progress','completed','canceled','overdue') DEFAULT 'scheduled', reason text, approved_by int(11) DEFAULT NULL, approved_at timestamp NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (break_type_id) REFERENCES break_types(id) ON DELETE CASCADE, FOREIGN KEY (approved_by) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_user_status (user_id, status), INDEX idx_start_time (actual_start) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: call_queues -- -------------------------------------------------------- CREATE TABLE call_queues ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, description text, strategy enum('ring-all','longest-idle','round-robin','least-recent','fewest-calls','random') DEFAULT 'longest-idle', timeout int(11) DEFAULT 30, max_wait int(11) DEFAULT 120, max_size int(11) DEFAULT 50, announce_position tinyint(1) DEFAULT 0, announce_hold_time tinyint(1) DEFAULT 0, music_on_hold varchar(255) DEFAULT NULL, wrap_up_time int(11) DEFAULT 30, is_active tinyint(1) DEFAULT 1, settings JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: queue_members -- -------------------------------------------------------- CREATE TABLE queue_members ( id int(11) NOT NULL AUTO_INCREMENT, queue_id int(11) NOT NULL, user_id int(11) NOT NULL, penalty int(11) DEFAULT 0, paused tinyint(1) DEFAULT 0, wrap_up_time int(11) DEFAULT NULL, max_calls int(11) DEFAULT NULL, skills JSON DEFAULT NULL, added_at timestamp DEFAULT CURRENT_TIMESTAMP, added_by int(11) DEFAULT NULL, PRIMARY KEY (id), FOREIGN KEY (queue_id) REFERENCES call_queues(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (added_by) REFERENCES users(id) ON DELETE SET NULL, UNIQUE KEY unique_queue_member (queue_id, user_id), INDEX idx_paused (paused) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: tickets -- -------------------------------------------------------- CREATE TABLE tickets ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, ticket_number varchar(20) NOT NULL UNIQUE, customer_id int(11) NOT NULL, call_id int(11) DEFAULT NULL, subject varchar(500) NOT NULL, description text, category varchar(100) DEFAULT NULL, subcategory varchar(100) DEFAULT NULL, priority enum('low','normal','high','critical','emergency') DEFAULT 'normal', status enum('new','open','in_progress','waiting','resolved','closed','cancelled') DEFAULT 'new', assigned_team int(11) DEFAULT NULL, assigned_agent int(11) DEFAULT NULL, source enum('phone','email','chat','web','walk_in','other') DEFAULT 'phone', sla_level varchar(50) DEFAULT NULL, response_due timestamp NULL, resolution_due timestamp NULL, first_response_at timestamp NULL, resolved_at timestamp NULL, closed_at timestamp NULL, satisfaction_rating int(11) DEFAULT NULL, tags JSON DEFAULT NULL, custom_fields JSON DEFAULT NULL, created_by int(11) DEFAULT NULL, updated_by int(11) DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE, FOREIGN KEY (call_id) REFERENCES call_history(id) ON DELETE SET NULL, FOREIGN KEY (assigned_team) REFERENCES teams(id) ON DELETE SET NULL, FOREIGN KEY (assigned_agent) REFERENCES users(id) ON DELETE SET NULL, FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL, FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_ticket_number (ticket_number), INDEX idx_status (status), INDEX idx_priority (priority) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: ticket_notes -- -------------------------------------------------------- CREATE TABLE ticket_notes ( id int(11) NOT NULL AUTO_INCREMENT, ticket_id int(11) NOT NULL, note_type enum('agent','customer','system','internal') DEFAULT 'agent', author_id int(11) DEFAULT NULL, author_name varchar(100) DEFAULT NULL, note_text text NOT NULL, is_internal tinyint(1) DEFAULT 0, attachments JSON DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE, FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_ticket (ticket_id), INDEX idx_created_at (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: call_dispositions -- -------------------------------------------------------- CREATE TABLE call_dispositions ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, call_id int(11) NOT NULL, outcome varchar(100) NOT NULL, category varchar(100) DEFAULT NULL, summary text, action_required tinyint(1) DEFAULT 0, action_description text, follow_up_required tinyint(1) DEFAULT 0, follow_up_date timestamp NULL, follow_up_owner int(11) DEFAULT NULL, satisfaction_rating int(11) DEFAULT NULL, key_points JSON DEFAULT NULL, custom_data JSON DEFAULT NULL, created_by int(11) NOT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (call_id) REFERENCES call_history(id) ON DELETE CASCADE, FOREIGN KEY (follow_up_owner) REFERENCES users(id) ON DELETE SET NULL, FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE CASCADE, UNIQUE KEY unique_call_disposition (call_id), INDEX idx_outcome (outcome), INDEX idx_follow_up (follow_up_required, follow_up_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: scripts -- -------------------------------------------------------- CREATE TABLE scripts ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, title varchar(255) NOT NULL, description text, content text NOT NULL, category varchar(100) DEFAULT NULL, subcategory varchar(100) DEFAULT NULL, language varchar(10) DEFAULT 'fr', is_active tinyint(1) DEFAULT 1, version varchar(20) DEFAULT '1.0', variables JSON DEFAULT NULL, conditions JSON DEFAULT NULL, created_by int(11) DEFAULT NULL, updated_by int(11) DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL, FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_category (category), INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: campaigns -- -------------------------------------------------------- CREATE TABLE campaigns ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(255) NOT NULL, description text, type enum('outbound','inbound','blended','survey','notification') DEFAULT 'outbound', status enum('draft','active','paused','completed','cancelled') DEFAULT 'draft', script_id int(11) DEFAULT NULL, team_id int(11) DEFAULT NULL, priority enum('low','normal','high','critical') DEFAULT 'normal', daily_start time DEFAULT '09:00:00', daily_end time DEFAULT '17:00:00', timezone varchar(50) DEFAULT 'UTC', max_attempts int(11) DEFAULT 3, retry_delay int(11) DEFAULT 3600, concurrent_calls int(11) DEFAULT 1, caller_id varchar(20) DEFAULT NULL, filters JSON DEFAULT NULL, settings JSON DEFAULT NULL, created_by int(11) DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (script_id) REFERENCES scripts(id) ON DELETE SET NULL, FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE SET NULL, FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_status (status), INDEX idx_type (type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: contact_lists -- -------------------------------------------------------- CREATE TABLE contact_lists ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, campaign_id int(11) NOT NULL, customer_id int(11) NOT NULL, contact_phone varchar(20) NOT NULL, status enum('pending','scheduled','in_progress','completed','failed','do_not_call') DEFAULT 'pending', attempts int(11) DEFAULT 0, last_attempt timestamp NULL, next_attempt timestamp NULL, completion_reason varchar(100) DEFAULT NULL, result JSON DEFAULT NULL, custom_data JSON DEFAULT NULL, added_at timestamp DEFAULT CURRENT_TIMESTAMP, completed_at timestamp NULL, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (campaign_id) REFERENCES campaigns(id) ON DELETE CASCADE, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE, INDEX idx_status (status), INDEX idx_campaign_status (campaign_id, status), INDEX idx_next_attempt (next_attempt) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: campaign_stats -- -------------------------------------------------------- CREATE TABLE campaign_stats ( id int(11) NOT NULL AUTO_INCREMENT, campaign_id int(11) NOT NULL, date date NOT NULL, contacts_total int(11) DEFAULT 0, contacts_attempted int(11) DEFAULT 0, contacts_completed int(11) DEFAULT 0, contacts_failed int(11) DEFAULT 0, calls_answered int(11) DEFAULT 0, calls_voicemail int(11) DEFAULT 0, calls_no_answer int(11) DEFAULT 0, calls_busy int(11) DEFAULT 0, calls_failed int(11) DEFAULT 0, total_talk_time int(11) DEFAULT 0, average_handle_time int(11) DEFAULT 0, conversion_rate decimal(5,2) DEFAULT 0, success_rate decimal(5,2) DEFAULT 0, agent_performance JSON DEFAULT NULL, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (campaign_id) REFERENCES campaigns(id) ON DELETE CASCADE, UNIQUE KEY unique_campaign_date (campaign_id, date), INDEX idx_campaign_date (campaign_id, date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: agent_performance -- -------------------------------------------------------- CREATE TABLE agent_performance ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, date date NOT NULL, period enum('daily','weekly','monthly') DEFAULT 'daily', calls_answered int(11) DEFAULT 0, calls_made int(11) DEFAULT 0, total_talk_time int(11) DEFAULT 0, average_handle_time int(11) DEFAULT 0, average_wrap_up_time int(11) DEFAULT 0, first_call_resolution decimal(5,2) DEFAULT 0, satisfaction_score decimal(5,2) DEFAULT 0, occupancy_rate decimal(5,2) DEFAULT 0, adherence decimal(5,2) DEFAULT 0, quality_score decimal(5,2) DEFAULT 0, conversion_rate decimal(5,2) DEFAULT 0, goals_met JSON DEFAULT NULL, notes text, calculated_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, UNIQUE KEY unique_agent_date_period (user_id, date, period), INDEX idx_date_period (date, period), INDEX idx_user_date (user_id, date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: performance_goals -- -------------------------------------------------------- CREATE TABLE performance_goals ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, description text, metric varchar(50) NOT NULL, target_type enum('min','max','range','percentage') DEFAULT 'min', target_value decimal(10,2) NOT NULL, target_min decimal(10,2) DEFAULT NULL, target_max decimal(10,2) DEFAULT NULL, period enum('daily','weekly','monthly','quarterly') DEFAULT 'daily', applies_to enum('agent','team','organisation') DEFAULT 'agent', team_id int(11) DEFAULT NULL, user_id int(11) DEFAULT NULL, weight int(11) DEFAULT 1, start_date date NOT NULL, end_date date DEFAULT NULL, is_active tinyint(1) DEFAULT 1, created_by int(11) DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_active_dates (is_active, start_date, end_date), INDEX idx_applies_to (applies_to, team_id, user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: ivr_menus -- -------------------------------------------------------- CREATE TABLE ivr_menus ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, extension varchar(20) DEFAULT NULL, greeting_message text, greeting_audio varchar(500) DEFAULT NULL, timeout int(11) DEFAULT 10, timeout_attempts int(11) DEFAULT 3, invalid_attempts int(11) DEFAULT 3, timeout_destination varchar(255) DEFAULT NULL, invalid_destination varchar(255) DEFAULT NULL, max_failures int(11) DEFAULT 3, failure_destination varchar(255) DEFAULT NULL, settings JSON DEFAULT NULL, is_active tinyint(1) DEFAULT 1, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: ivr_options -- -------------------------------------------------------- CREATE TABLE ivr_options ( id int(11) NOT NULL AUTO_INCREMENT, ivr_menu_id int(11) NOT NULL, digit varchar(5) NOT NULL, action enum('extension','queue','ivr','voicemail','hangup','external','callback') DEFAULT 'extension', destination varchar(255) NOT NULL, description varchar(255) DEFAULT NULL, audio_message text, audio_file varchar(500) DEFAULT NULL, priority int(11) DEFAULT 1, is_active tinyint(1) DEFAULT 1, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (ivr_menu_id) REFERENCES ivr_menus(id) ON DELETE CASCADE, UNIQUE KEY unique_ivr_digit (ivr_menu_id, digit), INDEX idx_ivr_active (ivr_menu_id, is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: evaluation_criteria -- -------------------------------------------------------- CREATE TABLE evaluation_criteria ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, description text, category varchar(50) NOT NULL, weight decimal(5,2) DEFAULT 1.00, max_score decimal(5,2) DEFAULT 10.00, is_active tinyint(1) DEFAULT 1, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, INDEX idx_category_active (category, is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: call_evaluations -- -------------------------------------------------------- CREATE TABLE call_evaluations ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, call_id int(11) NOT NULL, evaluated_by int(11) NOT NULL, evaluation_date date NOT NULL, score decimal(5,2) NOT NULL, max_score decimal(5,2) DEFAULT 100.00, criteria JSON NOT NULL, strengths text, improvements text, feedback text, is_calibrated tinyint(1) DEFAULT 0, calibration_score decimal(5,2) DEFAULT NULL, status enum('draft','submitted','approved','rejected') DEFAULT 'draft', created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (call_id) REFERENCES call_history(id) ON DELETE CASCADE, FOREIGN KEY (evaluated_by) REFERENCES users(id) ON DELETE CASCADE, UNIQUE KEY unique_call_evaluation (call_id), INDEX idx_evaluated_by (evaluated_by), INDEX idx_evaluation_date (evaluation_date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: sla_policies -- -------------------------------------------------------- CREATE TABLE sla_policies ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, description text, priority enum('low','normal','high','critical','emergency') NOT NULL, first_response_time int(11) DEFAULT 14400, resolution_time int(11) DEFAULT 86400, business_hours_only tinyint(1) DEFAULT 0, escalation_enabled tinyint(1) DEFAULT 1, escalation_time int(11) DEFAULT 7200, escalation_team int(11) DEFAULT NULL, escalation_agent int(11) DEFAULT NULL, notify_customer tinyint(1) DEFAULT 1, is_active tinyint(1) DEFAULT 1, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (escalation_team) REFERENCES teams(id) ON DELETE SET NULL, FOREIGN KEY (escalation_agent) REFERENCES users(id) ON DELETE SET NULL, UNIQUE KEY unique_priority_policy (organisation_id, priority), INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: sla_violations -- -------------------------------------------------------- CREATE TABLE sla_violations ( id int(11) NOT NULL AUTO_INCREMENT, ticket_id int(11) NOT NULL, sla_policy_id int(11) NOT NULL, violation_type enum('first_response','resolution','escalation') NOT NULL, sla_due_at timestamp NOT NULL, actual_time timestamp NULL, violation_duration int(11) DEFAULT 0, escalated_at timestamp NULL, escalated_to int(11) DEFAULT NULL, notes text, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (ticket_id) REFERENCES tickets(id) ON DELETE CASCADE, FOREIGN KEY (sla_policy_id) REFERENCES sla_policies(id) ON DELETE CASCADE, FOREIGN KEY (escalated_to) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_ticket_violation (ticket_id, violation_type), INDEX idx_violation_date (sla_due_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: customer_documents -- -------------------------------------------------------- CREATE TABLE customer_documents ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, customer_id int(11) NOT NULL, name varchar(255) NOT NULL, file_path varchar(500) NOT NULL, file_type varchar(100) DEFAULT NULL, file_size int(11) DEFAULT 0, category varchar(100) DEFAULT NULL, description text, uploaded_by int(11) NOT NULL, is_confidential tinyint(1) DEFAULT 0, expires_at timestamp NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE, FOREIGN KEY (uploaded_by) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_customer_category (customer_id, category), INDEX idx_expires (expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: system_settings -- -------------------------------------------------------- CREATE TABLE system_settings ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) DEFAULT NULL, setting_key varchar(100) NOT NULL, setting_value text, setting_type enum('string','integer','boolean','json','array') DEFAULT 'string', description text, is_public tinyint(1) DEFAULT 0, updated_by int(11) DEFAULT NULL, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL, UNIQUE KEY unique_setting (organisation_id, setting_key), INDEX idx_key (setting_key) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: audit_logs -- -------------------------------------------------------- CREATE TABLE audit_logs ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, user_id int(11) DEFAULT NULL, action varchar(100) NOT NULL, resource_type varchar(50) NOT NULL, resource_id int(11) DEFAULT NULL, old_values JSON DEFAULT NULL, new_values JSON DEFAULT NULL, ip_address varchar(45) DEFAULT NULL, user_agent text, created_at timestamp DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL, INDEX idx_action (action), INDEX idx_resource (resource_type, resource_id), INDEX idx_created_at (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: notifications -- -------------------------------------------------------- CREATE TABLE notifications ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, user_id int(11) NOT NULL, type varchar(50) NOT NULL, title varchar(255) NOT NULL, message text NOT NULL, data JSON DEFAULT NULL, is_read tinyint(1) DEFAULT 0, action_url varchar(500) DEFAULT NULL, expires_at timestamp NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP, read_at timestamp NULL, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_user_read (user_id, is_read), INDEX idx_created_at (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: sip_sessions -- -------------------------------------------------------- CREATE TABLE sip_sessions ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, session_id varchar(36) NOT NULL UNIQUE, sip_account_id int(11) NOT NULL, call_id int(11) DEFAULT NULL, direction enum('inbound','outbound') NOT NULL, local_uri varchar(255) NOT NULL, remote_uri varchar(255) NOT NULL, from_tag varchar(100) DEFAULT NULL, to_tag varchar(100) DEFAULT NULL, call_id_header varchar(100) DEFAULT NULL, state enum('initial','establishing','established','terminating','terminated') DEFAULT 'initial', sdp_offer text DEFAULT NULL, sdp_answer text DEFAULT NULL, audio_element_id varchar(100) DEFAULT NULL, local_ice_candidates JSON DEFAULT NULL, remote_ice_candidates JSON DEFAULT NULL, connection_state enum('new','checking','connected','completed','failed','disconnected','closed') DEFAULT 'new', stats JSON DEFAULT NULL, started_at timestamp DEFAULT CURRENT_TIMESTAMP, established_at timestamp NULL, terminated_at timestamp NULL, termination_reason varchar(100) DEFAULT NULL, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (sip_account_id) REFERENCES sip_accounts(id) ON DELETE CASCADE, FOREIGN KEY (call_id) REFERENCES call_history(id) ON DELETE SET NULL, INDEX idx_session_id (session_id), INDEX idx_state (state), INDEX idx_account_state (sip_account_id, state) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: sip_messages -- -------------------------------------------------------- CREATE TABLE sip_messages ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, sip_session_id int(11) DEFAULT NULL, sip_account_id int(11) NOT NULL, direction enum('in','out') NOT NULL, method varchar(50) NOT NULL, status_code int(11) DEFAULT NULL, status_message varchar(100) DEFAULT NULL, from_header varchar(255) DEFAULT NULL, to_header varchar(255) DEFAULT NULL, call_id_header varchar(100) DEFAULT NULL, cseq varchar(50) DEFAULT NULL, via text DEFAULT NULL, contact varchar(255) DEFAULT NULL, content_type varchar(100) DEFAULT NULL, content_length int(11) DEFAULT NULL, body text DEFAULT NULL, raw_message text DEFAULT NULL, created_at timestamp DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (sip_session_id) REFERENCES sip_sessions(id) ON DELETE CASCADE, FOREIGN KEY (sip_account_id) REFERENCES sip_accounts(id) ON DELETE CASCADE, INDEX idx_method (method), INDEX idx_direction (direction), INDEX idx_created (created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: media_streams -- -------------------------------------------------------- CREATE TABLE media_streams ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, sip_session_id int(11) NOT NULL, stream_type enum('audio','video','data') DEFAULT 'audio', direction enum('inbound','outbound','both') DEFAULT 'both', codec varchar(50) DEFAULT NULL, sample_rate int(11) DEFAULT 8000, channels int(11) DEFAULT 1, bitrate int(11) DEFAULT 64000, packet_loss decimal(5,2) DEFAULT 0, jitter decimal(8,2) DEFAULT 0, latency int(11) DEFAULT 0, is_muted tinyint(1) DEFAULT 0, is_hold tinyint(1) DEFAULT 0, volume int(11) DEFAULT 100, stats JSON DEFAULT NULL, started_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, FOREIGN KEY (sip_session_id) REFERENCES sip_sessions(id) ON DELETE CASCADE, INDEX idx_session (sip_session_id), INDEX idx_stream_type (stream_type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: pbx_extensions -- -------------------------------------------------------- CREATE TABLE pbx_extensions ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, extension varchar(20) NOT NULL UNIQUE, type enum('user','queue','ivr','conference','voicemail','feature','trunk') DEFAULT 'user', name varchar(100) NOT NULL, description text, destination_type varchar(50) DEFAULT NULL, destination_value varchar(255) DEFAULT NULL, timeout int(11) DEFAULT 30, retry int(11) DEFAULT 3, options JSON DEFAULT NULL, is_active tinyint(1) DEFAULT 1, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, INDEX idx_extension_type (extension, type), INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: call_routes -- -------------------------------------------------------- CREATE TABLE call_routes ( id int(11) NOT NULL AUTO_INCREMENT, organisation_id int(11) NOT NULL, name varchar(100) NOT NULL, description text, pattern varchar(100) NOT NULL, pattern_type enum('regex','prefix','exact','e164') DEFAULT 'prefix', priority int(11) DEFAULT 1, time_condition JSON DEFAULT NULL, caller_id_condition JSON DEFAULT NULL, destination_type enum('extension','queue','ivr','voicemail','hangup','external') DEFAULT 'extension', destination_value varchar(255) NOT NULL, fallback_destination varchar(255) DEFAULT NULL, max_call_length int(11) DEFAULT 3600, call_recording tinyint(1) DEFAULT 0, call_whisper varchar(255) DEFAULT NULL, variables JSON DEFAULT NULL, is_active tinyint(1) DEFAULT 1, created_at timestamp DEFAULT CURRENT_TIMESTAMP, updated_at timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), FOREIGN KEY (organisation_id) REFERENCES organisations(id) ON DELETE CASCADE, INDEX idx_pattern (pattern), INDEX idx_priority (priority), INDEX idx_active (is_active) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- Table: sip_registrations -- -------------------------------------------------------- CREATE TABLE sip_registrations ( id int(11) NOT NULL AUTO_INCREMENT, sip_account_id int(11) NOT NULL, sip_server_id int(11) NOT NULL, contact varchar(255) NOT NULL, user_agent varchar(255) DEFAULT NULL, expires int(11) DEFAULT 3600, local_ip varchar(45) DEFAULT NULL, local_port int(11) DEFAULT NULL, remote_ip varchar(45) DEFAULT NULL, remote_port int(11) DEFAULT NULL, status enum('success','failed','timeout','rejected') DEFAULT 'success', error_code int(11) DEFAULT NULL, error_message varchar(500) DEFAULT NULL, registered_at timestamp DEFAULT CURRENT_TIMESTAMP, expires_at timestamp NULL, PRIMARY KEY (id), FOREIGN KEY (sip_account_id) REFERENCES sip_accounts(id) ON DELETE CASCADE, FOREIGN KEY (sip_server_id) REFERENCES sip_servers(id) ON DELETE CASCADE, INDEX idx_account_status (sip_account_id, status), INDEX idx_expires (expires_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- ============================================= -- DONNΓ‰ES DE DΓ‰MONSTRATION -- ============================================= -- Organisation INSERT INTO organisations (id, name, domain, timezone, language, settings) VALUES (1, 'CyberWall Security', 'cyberwallsec.com', 'America/Anchorage', 'fr', '{"business_hours": {"start": "09:00", "end": "17:00"}, "sla_response_time": 4, "max_call_duration": 1800}'); -- Γ‰quipes INSERT INTO teams (id, organisation_id, name, description, queue_strategy, max_queue_size) VALUES (1, 1, 'Support Militaire', 'Γ‰quipe dΓ©diΓ©e aux clients militaires', 'longest-idle', 25), (2, 1, 'Support Civil', 'Γ‰quipe pour clients civils', 'round-robin', 30), (3, 1, 'Urgences', 'Γ‰quipe interventions urgentes', 'ring-all', 10); -- Serveurs SIP INSERT INTO sip_servers (id, organisation_id, name, host, port, websocket_port, transport, type, priority, settings) VALUES (1, 1, 'PBX Principal', 'pbx.cyberwallvoip.com', 5060, 8089, 'wss', 'asterisk', 1, '{"auth_type": "digest", "domain": "cyberwallvoip.com", "debug": false}'), (2, 1, 'PBX Backup', 'backup.cyberwallvoip.com', 5060, 8089, 'wss', 'asterisk', 2, '{"auth_type": "digest", "domain": "cyberwallvoip.com", "debug": false}'); -- Utilisateurs (sans comptes SIP pour l'instant) INSERT INTO users (id, organisation_id, username, email, password, display_name, role, skills, team_id, preferences) VALUES (1, 1, 'agent1', 'agent1@cyberwallsec.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Jean Dupont', 'agent', '["customer_service", "technical_support", "military"]', 1, '{"theme": "dark", "language": "fr"}'), (2, 1, 'agent2', 'agent2@cyberwallsec.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Marie Lambert', 'agent', '["customer_service", "emergency", "civilian"]', 2, '{"theme": "light", "language": "fr"}'), (3, 1, 'supervisor', 'supervisor@cyberwallsec.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Superviseur System', 'supervisor', '["supervision", "reporting", "escalation"]', NULL, '{"theme": "dark", "language": "fr"}'), (4, 1, 'admin', 'admin@cyberwallsec.com', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'Administrateur', 'admin', '["administration", "reporting", "technical"]', NULL, '{"theme": "auto", "language": "fr"}'); -- Comptes SIP INSERT INTO sip_accounts (id, user_id, sip_server_id, username, password, display_name, extension, caller_id, sip_domain, audio_settings) VALUES (1, 1, 1, '5391001', '5hfmgdqqaJwe4euBFXEf5cgUf', 'Jean Dupont', '1001', 'CyberWall Support <+19075551001>', 'cyberwallvoip.com', '{"echoCancellation": true, "noiseSuppression": true, "autoGainControl": true}'), (2, 2, 1, '5391002', '5hfmgdqqaJwe4euBFXEf5cgUg', 'Marie Lambert', '1002', 'CyberWall Support <+19075551002>', 'cyberwallvoip.com', '{"echoCancellation": true, "noiseSuppression": true, "autoGainControl": true}'), (3, 3, 1, '5391003', '5hfmgdqqaJwe4euBFXEf5cgUh', 'Superviseur System', '1003', 'CyberWall Supervisor <+19075551003>', 'cyberwallvoip.com', '{"echoCancellation": true, "noiseSuppression": true, "autoGainControl": true}'), (4, 4, 1, '5391004', '5hfmgdqqaJwe4euBFXEf5cgUi', 'Administrateur', '1004', 'CyberWall Admin <+19075551004>', 'cyberwallvoip.com', '{"echoCancellation": true, "noiseSuppression": true, "autoGainControl": true}'); -- Mettre Γ  jour les users avec les comptes SIP UPDATE users SET sip_account_id = 1 WHERE id = 1; UPDATE users SET sip_account_id = 2 WHERE id = 2; UPDATE users SET sip_account_id = 3 WHERE id = 3; UPDATE users SET sip_account_id = 4 WHERE id = 4; -- Clients INSERT INTO customers (id, organisation_id, customer_id, account_name, contact_name, email, phone_numbers, address, category, priority, value_tier, assigned_team, total_calls, satisfaction_score) VALUES (1, 1, 'CUST-MIL-001', 'Aurora Military Housing', 'John Smith', 'john.smith@aurorahousing.com', '["+19077514247", "+19077531023"]', '{"street": "6350 Arctic Warrior Dr", "city": "Anchorage", "state": "AK", "zip": "99506", "country": "USA"}', 'government', 'high', 'platinum', 1, 45, 4.8), (2, 1, 'CUST-MIL-002', 'Elmendorf AFB Housing', 'Sarah Johnson', 'sarah.johnson@elmendorf.af.mil', '["+19077531024"]', '{"street": "Building 125, Elmendorf AFB", "city": "Anchorage", "state": "AK", "zip": "99506", "country": "USA"}', 'government', 'critical', 'platinum', 1, 28, 4.9), (3, 1, 'CUST-CIV-001', 'Denali View Apartments', 'Emily Wilson', 'emily.wilson@denaliview.com', '["+19078889999"]', '{"street": "123 Mountain View Dr", "city": "Anchorage", "state": "AK", "zip": "99508", "country": "USA"}', 'business', 'normal', 'gold', 2, 15, 4.5); -- Types de pauses INSERT INTO break_types (organisation_id, name, code, description, default_duration, is_paid, requires_approval) VALUES (1, 'Pause CafΓ©', 'COFFEE_BREAK', 'Pause cafΓ© standard', 900, 1, 0), (1, 'Pause DΓ©jeuner', 'LUNCH_BREAK', 'Pause dΓ©jeuner', 3600, 1, 0), (1, 'Formation', 'TRAINING', 'Session de formation', 7200, 1, 1), (1, 'RΓ©union', 'MEETING', 'RΓ©union d Γ©quipe', 1800, 1, 1); -- Files d'appels INSERT INTO call_queues (organisation_id, name, description, strategy, timeout, max_wait) VALUES (1, 'Support Militaire', 'File pour clients militaires', 'longest-idle', 30, 120), (1, 'Support Civil', 'File pour clients civils', 'round-robin', 25, 180), (1, 'Urgences', 'File urgences prioritaires', 'ring-all', 15, 60); -- Scripts INSERT INTO scripts (organisation_id, title, content, category, is_active) VALUES (1, 'Business Info (Page 1)', 'BUSINESS INFO 907?751?4247\n2ND RELAY*\nAURORA MILITARY HOUSING\n6350 ARCTIC WARRIOR DR\nANCHORAGE, AK 99506\n\n>>> ELMENDORF AFB <<< HOURS 9a?5p M?F\nOFC Β§907?753?1023 LUNCH 12p?1p M?F\n>>> FT RICHARDSON <<< HOURS 10a?1p M?F\nOFC Β§907?753?1024\n\nMILITARY HOUSING MAINTENANCE', 'general', 1), (1, 'Emergency Protocol - Gas Leak', 'EMERGENCY PROTOCOL - GAS LEAK\n1. Evacuate immediate area\n2. Do not operate electrical switches\n3. Call emergency services if needed\n4. Contact maintenance immediately\n5. Document all actions taken', 'emergency', 1); -- Settings systΓ¨me INSERT INTO system_settings (organisation_id, setting_key, setting_value, setting_type, description) VALUES (1, 'sip_server', 'pbx.cyberwallvoip.com', 'string', 'Serveur SIP principal'), (1, 'sip_port', '8089', 'integer', 'Port SIP WebSocket'), (1, 'business_hours_start', '09:00', 'string', 'Heure d ouverture'), (1, 'business_hours_end', '17:00', 'string', 'Heure de fermeture'), (1, 'max_call_duration', '1800', 'integer', 'DurΓ©e maximale d appel (secondes)'); COMMIT; -- ============================================= -- FIN DU SCRIPT -- ============================================= πŸ“Š RΓ‰SUMΓ‰ DES TABLES CRÉÉES βœ… 35 Tables ComplΓ¨tes : 1. Organisation & Utilisateurs (4 tables) Β· organisations, teams, users, sip_accounts 2. SIP/PBX AvancΓ© (8 tables) Β· sip_servers, sip_sessions, sip_messages, sip_registrations Β· media_streams, pbx_extensions, call_routes 3. Gestion Clients & Appels (6 tables) Β· customers, call_history, call_dispositions Β· customer_documents 4. Gestion Γ‰quipes & Files (3 tables) Β· call_queues, queue_members 5. Tickets & Support (3 tables) Β· tickets, ticket_notes 6. Performance & KPI (4 tables) Β· agent_performance, performance_goals Β· call_evaluations, evaluation_criteria 7. Gestion Temps & Pauses (2 tables) Β· break_types, agent_breaks 8. Campagnes & Marketing (3 tables) Β· campaigns, contact_lists, campaign_stats 9. SLA & QualitΓ© (2 tables) Β· sla_policies, sla_violations 10. SystΓ¨me & Logs (3 tables) Β· system_settings, audit_logs, notifications πŸš€ FONCTIONNALITΓ‰S COUVERTES Γ€ 100% Β· βœ… Gestion SIP/PBX professionnelle Β· βœ… CRM clients avancΓ© Β· βœ… Call routing intelligent Β· βœ… KPI et performance Β· βœ… Gestion des pauses agents Β· βœ… Campagnes outbound Β· βœ… SLA et qualitΓ© de service Β· βœ… IVR et menus vocaux Β· βœ… Audit et sΓ©curitΓ© Β· βœ… Notifications temps rΓ©el Cette base de donnΓ©es est maintenant PRÊTE pour votre application call center SPA ! 🎯 peux tu generer l application call center au format spa single page application tu as l architecture et la database si tu pense que ameliorer peopose les ameliorations