From 3a7b267f65d9d05161800f0dca1930a92adc7e3c Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:50:24 -0500 Subject: [PATCH] =?UTF-8?q?Rol=20de=20Calidad,=20y=20restricci=C3=B3n=20po?= =?UTF-8?q?r=20rol=20dentro=20del=20turnero?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rol nuevo para consultar turnos y tiempos de atención, de solo lectura y con acceso únicamente a dashboard e historial. Se le permite exportar el historial, que es la forma de analizar tiempos fuera del sistema. Al crearlo salió que las vistas del turnero no verificaban nada por su cuenta: el control del ERP es por módulo, así que cualquiera con acceso al turnero podía abrir Configuración —lugares, dispositivos, plantillas— escribiendo la URL, aunque el menú no se la mostrara. Aplicaba a todos los roles, no solo al nuevo. Se agrega _acceso.php con una verificación de rol que usan las tres pantallas que operan sobre la atención o cambian configuración. Verificado que cada rol conserva lo que ya usaba: recepcionista entra a recepción, bacteriólogo a las estaciones, supervisor y administradores a todo. Co-Authored-By: Claude Opus 5 --- migrations/20260811_rol_calidad.sql | 18 ++++++++++++++ modules/turnero/_acceso.php | 32 +++++++++++++++++++++++++ modules/turnero/module.php | 8 ++++++- modules/turnero/views/configuracion.php | 3 +++ modules/turnero/views/lugar.php | 3 +++ modules/turnero/views/recepcion.php | 3 +++ 6 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 migrations/20260811_rol_calidad.sql create mode 100644 modules/turnero/_acceso.php diff --git a/migrations/20260811_rol_calidad.sql b/migrations/20260811_rol_calidad.sql new file mode 100644 index 0000000..8a69754 --- /dev/null +++ b/migrations/20260811_rol_calidad.sql @@ -0,0 +1,18 @@ +-- Rol de Calidad: consulta de turnos y tiempos de atención. +-- Solo lectura, y dentro del turnero solo dashboard e historial. +-- Idempotente: puede correrse más de una vez. + +INSERT INTO roles (name, slug, description, color, home_page, is_system) +SELECT 'Calidad', 'calidad', + 'Consulta de turnos y tiempos de atención. Solo lectura: dashboard e historial.', + '#7c3aed', '/erp.php?m=turnero&v=dashboard', 0 + WHERE NOT EXISTS (SELECT 1 FROM roles WHERE slug = 'calidad'); + +INSERT INTO role_modules (role_id, module_slug, permission, can_view, can_create, can_edit, can_delete, can_export) +SELECT r.id, m.slug, 'read', 1, 0, 0, 0, IF(m.slug = 'turnero', 1, 0) + FROM roles r + JOIN (SELECT 'turnero' AS slug UNION ALL SELECT 'soporte') m + WHERE r.slug = 'calidad' + AND NOT EXISTS ( + SELECT 1 FROM role_modules rm WHERE rm.role_id = r.id AND rm.module_slug = m.slug + ); diff --git a/modules/turnero/_acceso.php b/modules/turnero/_acceso.php new file mode 100644 index 0000000..5fcc6cb --- /dev/null +++ b/modules/turnero/_acceso.php @@ -0,0 +1,32 @@ + 'Dashboard', 'icon' => 'fas fa-tachometer-alt', 'route' => '/erp.php?m=turnero&v=dashboard']; + $_trLinks[] = ['name' => 'Historial', 'icon' => 'fas fa-history', 'route' => '/erp.php?m=turnero&v=historial']; + // ── Recepcionista: pantallas comunes + desks según IP ───────── -if ($_trIsRecep) { +} elseif ($_trIsRecep) { $_trLinks[] = ['name' => 'Chat Turnero', 'icon' => 'fab fa-whatsapp', 'route' => '/erp.php?m=turnero&v=chat']; $_trLinks[] = ['name' => 'Verificar Paciente', 'icon' => 'fas fa-id-card', 'route' => '/erp.php?m=turnero&v=verificar_paciente']; $_trLinks[] = ['name' => 'Pantalla TV', 'icon' => 'fas fa-tv', 'route' => '/erp.php?m=turnero&v=display_global']; diff --git a/modules/turnero/views/configuracion.php b/modules/turnero/views/configuracion.php index c12b01c..95e7b3d 100644 --- a/modules/turnero/views/configuracion.php +++ b/modules/turnero/views/configuracion.php @@ -12,6 +12,9 @@ require_once __DIR__ . '/../../../config/config.php'; if (!isUserLoggedIn()) { header('Location: ' . BASE_URL . 'login.php'); exit; } +require_once __DIR__ . '/../_acceso.php'; +turneroExigirRol(['supervisor']); + $db = Database::getInstance(); $pdo = $db->getConnection(); diff --git a/modules/turnero/views/lugar.php b/modules/turnero/views/lugar.php index 57d822b..b65e7b7 100644 --- a/modules/turnero/views/lugar.php +++ b/modules/turnero/views/lugar.php @@ -9,6 +9,9 @@ if (!isUserLoggedIn()) { exit; } +require_once __DIR__ . '/../_acceso.php'; +turneroExigirRol(['bacteriologo', 'supervisor']); + // Tablet asignada → forzar su lugar por token de navegador (o IP como fallback) $lugarForzado = 0; try { diff --git a/modules/turnero/views/recepcion.php b/modules/turnero/views/recepcion.php index 6e07880..de911c3 100644 --- a/modules/turnero/views/recepcion.php +++ b/modules/turnero/views/recepcion.php @@ -9,6 +9,9 @@ if (!isUserLoggedIn()) { exit; } +require_once __DIR__ . '/../_acceso.php'; +turneroExigirRol(['recepcionista', 'lab_recepcion', 'supervisor']); + // Tablet asignada → forzar su escritorio por token de navegador (o IP como fallback) $_recepForzado = 0; try {