Files
whatsapp/migrations/20260304_roles_and_modules.sql
T
2026-03-10 18:42:51 -05:00

76 lines
3.9 KiB
SQL

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