76 lines
3.9 KiB
SQL
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);
|