-- Base de datos para sistema de WhatsApp Bot -- Fecha: 13 de noviembre de 2025 -- Tabla de usuarios CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, phone_number VARCHAR(20) UNIQUE NOT NULL, name VARCHAR(100), email VARCHAR(100), status ENUM('active', 'inactive', 'blocked') DEFAULT 'active', current_menu_id INT NULL, current_step INT DEFAULT 0, session_data JSON, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, INDEX idx_phone (phone_number), INDEX idx_status (status) ); -- Tabla de conversaciones CREATE TABLE conversations ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, message_id VARCHAR(100), direction ENUM('incoming', 'outgoing') NOT NULL, message_type ENUM('text', 'image', 'audio', 'video', 'document', 'template') DEFAULT 'text', content TEXT, media_url VARCHAR(500), status ENUM('sent', 'delivered', 'read', 'failed', 'received') DEFAULT 'sent', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, INDEX idx_user (user_id), INDEX idx_created (created_at), INDEX idx_direction (direction) ); -- Tabla de menús (sistema parametrizable) CREATE TABLE menus ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, title VARCHAR(200) NOT NULL, description TEXT, parent_id INT NULL, is_root BOOLEAN DEFAULT FALSE, is_active BOOLEAN DEFAULT TRUE, order_position INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (parent_id) REFERENCES menus(id) ON DELETE CASCADE, INDEX idx_parent (parent_id), INDEX idx_active (is_active), INDEX idx_root (is_root) ); -- Tabla de opciones de menú CREATE TABLE menu_options ( id INT AUTO_INCREMENT PRIMARY KEY, menu_id INT NOT NULL, option_number INT NOT NULL, text VARCHAR(200) NOT NULL, action_type ENUM('menu', 'message', 'api_call', 'end') NOT NULL, action_value VARCHAR(500), is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (menu_id) REFERENCES menus(id) ON DELETE CASCADE, INDEX idx_menu (menu_id), INDEX idx_option (option_number), UNIQUE KEY unique_menu_option (menu_id, option_number) ); -- Tabla de respuestas automáticas CREATE TABLE autoresponses ( id INT AUTO_INCREMENT PRIMARY KEY, trigger_type ENUM('keyword', 'menu_selection', 'welcome') NOT NULL, trigger_value VARCHAR(200), response_text TEXT NOT NULL, response_type ENUM('text', 'template') DEFAULT 'text', is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_trigger (trigger_type), INDEX idx_active (is_active) ); -- Tabla de configuración del sistema CREATE TABLE system_config ( id INT AUTO_INCREMENT PRIMARY KEY, config_key VARCHAR(100) UNIQUE NOT NULL, config_value TEXT, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); -- Tabla de webhooks logs CREATE TABLE webhook_logs ( id INT AUTO_INCREMENT PRIMARY KEY, request_body TEXT, response_body TEXT, status_code INT, ip_address VARCHAR(45), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_created (created_at) ); -- Tabla de plantillas de mensajes CREATE TABLE message_templates ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) UNIQUE NOT NULL, template_name VARCHAR(100) NOT NULL, -- Nombre en WhatsApp Business API language_code VARCHAR(10) DEFAULT 'es', category ENUM('marketing', 'utility', 'authentication') DEFAULT 'utility', status ENUM('pending', 'approved', 'rejected') DEFAULT 'pending', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_status (status) ); -- Insertar configuraciones iniciales INSERT INTO system_config (config_key, config_value, description) VALUES ('whatsapp_token', 'EAAWTKu1iZAGABP46c7GZAFvHremu9uvTLOlgZCAa4eKUlaCqszzsQjjLcgnqORzo2EBhB7LZAcAqJ7clpGvNCk3oXKnqo8Fl0K2o7eHYoeaqZBesqjBPRfsd4ZBOdY4kN1YBJnmRznegTD9wtJZByVrRcMXF8YXaAJjLCuIFZCK7QFUpId7i4eVkFvbqUYnUKA91rgPvaeGRNZCLHa5ZC1ZB2Skn0gFNgPTBx7bedAMULYZD', 'Token de acceso de WhatsApp Business API'), ('whatsapp_phone_number_id', '938177732702718', 'ID del número de teléfono de WhatsApp'), ('webhook_verify_token', 'mi_token_secreto_123', 'Token de verificación para webhook'), ('welcome_message', '¡Hola! 👋 Bienvenido a nuestro servicio automatizado. Escribe *menu* para ver las opciones disponibles.', 'Mensaje de bienvenida para nuevos usuarios'), ('business_name', 'Mi Empresa', 'Nombre de la empresa'); -- Insertar menús de ejemplo INSERT INTO menus (name, title, description, is_root, order_position) VALUES ('main_menu', '🏠 Menú Principal', 'Menú principal del sistema', TRUE, 1), ('services_menu', '💼 Servicios', 'Menú de servicios disponibles', FALSE, 2), ('payments_menu', '💳 Pagos', 'Opciones de pago', FALSE, 3), ('support_menu', '🆘 Soporte', 'Menú de soporte técnico', FALSE, 4); -- Obtener IDs de menús para las opciones SET @main_menu_id = (SELECT id FROM menus WHERE name = 'main_menu'); SET @services_menu_id = (SELECT id FROM menus WHERE name = 'services_menu'); SET @payments_menu_id = (SELECT id FROM menus WHERE name = 'payments_menu'); SET @support_menu_id = (SELECT id FROM menus WHERE name = 'support_menu'); -- Actualizar parent_id para menús secundarios UPDATE menus SET parent_id = @main_menu_id WHERE name IN ('services_menu', 'payments_menu', 'support_menu'); -- Insertar opciones del menú principal INSERT INTO menu_options (menu_id, option_number, text, action_type, action_value) VALUES (@main_menu_id, 1, '💼 Ver servicios disponibles', 'menu', 'services_menu'), (@main_menu_id, 2, '💳 Realizar pago', 'menu', 'payments_menu'), (@main_menu_id, 3, '🆘 Contactar soporte', 'menu', 'support_menu'), (@main_menu_id, 0, '❌ Salir', 'end', 'Gracias por usar nuestro servicio. ¡Hasta pronto!'); -- Insertar opciones del menú de servicios INSERT INTO menu_options (menu_id, option_number, text, action_type, action_value) VALUES (@services_menu_id, 1, '📋 Consulta de información', 'message', 'Un representante se contactará contigo para brindarte información detallada. Por favor, indica qué información necesitas.'), (@services_menu_id, 2, '📞 Agendar cita', 'message', 'Para agendar una cita, por favor proporciona tu nombre completo y tu disponibilidad horaria.'), (@services_menu_id, 3, '💰 Cotizar servicio', 'message', 'Para realizar una cotización, describe detalladamente el servicio que necesitas.'), (@services_menu_id, 0, '🔙 Volver al menú principal', 'menu', 'main_menu'); -- Insertar opciones del menú de pagos INSERT INTO menu_options (menu_id, option_number, text, action_type, action_value) VALUES (@payments_menu_id, 1, '🧾 Consultar factura', 'message', 'Por favor, proporciona tu número de factura o documento de identidad para consultar tu factura pendiente.'), (@payments_menu_id, 2, '💸 Pagar factura', 'message', 'Para procesar tu pago, necesitamos el número de factura y el método de pago preferido (transferencia, tarjeta, etc).'), (@payments_menu_id, 3, '📄 Solicitar factura', 'message', 'Indica el período o servicio para el cual necesitas la factura.'), (@payments_menu_id, 0, '🔙 Volver al menú principal', 'menu', 'main_menu'); -- Insertar opciones del menú de soporte INSERT INTO menu_options (menu_id, option_number, text, action_type, action_value) VALUES (@support_menu_id, 1, '🔧 Reporte técnico', 'message', 'Describe detalladamente el problema técnico que estás experimentando. Un técnico se contactará contigo pronto.'), (@support_menu_id, 2, '❓ Preguntas frecuentes', 'message', 'Puedes consultar nuestras preguntas frecuentes en: www.miempresa.com/faq o describe tu pregunta específica.'), (@support_menu_id, 3, '👤 Hablar con agente', 'message', 'Te estamos conectando con un agente humano. Por favor, espera un momento...'), (@support_menu_id, 0, '🔙 Volver al menú principal', 'menu', 'main_menu'); -- Insertar respuestas automáticas INSERT INTO autoresponses (trigger_type, trigger_value, response_text) VALUES ('keyword', 'menu', 'Aquí tienes nuestro menú principal:'), ('keyword', 'hola', '¡Hola! 👋 Escribe *menu* para ver nuestras opciones.'), ('keyword', 'ayuda', 'Estoy aquí para ayudarte. Escribe *menu* para ver las opciones disponibles.'), ('welcome', '', '¡Bienvenido! 👋 Soy tu asistente virtual. Escribe *menu* para comenzar.'); -- Insertar plantillas de mensaje INSERT INTO message_templates (name, template_name, language_code, category, status) VALUES ('saludo_inicial', 'hello_world', 'es', 'utility', 'approved'), ('confirmacion_pago', 'payment_confirmation', 'es', 'utility', 'pending');