-- ============================================================ -- Migración: Sistema de Roles y Módulos -- Fecha: 2026-03-04 -- Descripción: Crea tablas roles y role_modules; vincula admin_users -- ============================================================ -- ── 1. Tabla de roles ──────────────────────────────────────── CREATE TABLE IF NOT EXISTS `roles` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL COMMENT 'Nombre legible del rol', `slug` VARCHAR(50) NOT NULL COMMENT 'Clave interna (enfermero, admin, …)', `description` TEXT DEFAULT NULL, `color` VARCHAR(20) DEFAULT '#6c757d' COMMENT 'Color HEX para la UI', `is_system` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '1 = no se puede eliminar', `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_slug` (`slug`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ── 2. Tabla de módulos asignados por rol ──────────────────── -- Cada fila «activa» el módulo para ese rol. CREATE TABLE IF NOT EXISTS `role_modules` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `role_id` INT(11) NOT NULL, `module_slug` VARCHAR(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_role_module` (`role_id`, `module_slug`), CONSTRAINT `fk_rm_role` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ── 3. Vincular admin_users con roles ──────────────────────── -- (Se ignora si la columna ya existe - compatible MySQL y MariaDB) ALTER TABLE `admin_users` ADD COLUMN `role_id` INT(11) NULL DEFAULT NULL COMMENT 'FK a roles.id'; ALTER TABLE `admin_users` ADD INDEX `idx_role_id` (`role_id`); -- ── 4. Roles del sistema (no borrables) ───────────────────── INSERT IGNORE INTO `roles` (`id`, `name`, `slug`, `description`, `color`, `is_system`) VALUES (1, 'Administrador', 'admin', 'Acceso completo a todos los módulos', '#0d6efd', 1), (2, 'Enfermero', 'enfermero', 'Solo portal de domicilios asignados y formularios','#6f42c1', 1); -- ── 5. Módulos para el rol Administrador (todos) ───────────── INSERT IGNORE INTO `role_modules` (`role_id`, `module_slug`) VALUES (1, 'whatsapp'), (1, 'lab_dashboard'), (1, 'lab_ordenes'), (1, 'lab_pacientes'), (1, 'lab_domicilios'), (1, 'lab_enfermeras'), (1, 'lab_formularios'), (1, 'lab_reportes'), (1, 'lab_configuracion'), (1, 'usuarios'); -- ── 6. Módulos para el rol Enfermero ──────────────────────── INSERT IGNORE INTO `role_modules` (`role_id`, `module_slug`) VALUES (2, 'enfermero_portal'), (2, 'lab_formularios'); -- ── 7. Vincular usuarios existentes con su role_id ─────────── UPDATE `admin_users` SET `role_id` = 1 WHERE `role` = 'admin' AND `role_id` IS NULL; UPDATE `admin_users` SET `role_id` = 2 WHERE `role` = 'enfermero' AND `role_id` IS NULL; -- Si algún usuario no tiene rol asignado, asignarle admin por defecto UPDATE `admin_users` SET `role_id` = 1 WHERE `role_id` IS NULL; -- ── 8. FK suave (solo si FK no existe aún) ────────────────── -- (MariaDB/MySQL no tiene ADD CONSTRAINT IF NOT EXISTS, usamos el IGNORE del INSERT) -- La FK se omite intencionalmente para no bloquear si ya existe; -- conéctala manualmente si el motor lo permite: -- ALTER TABLE admin_users ADD CONSTRAINT fk_au_role FOREIGN KEY (role_id) REFERENCES roles(id);