Rol de Calidad, y restricción por rol dentro del turnero
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 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
dc17c6a469
commit
3a7b267f65
@@ -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
|
||||||
|
);
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* modules/turnero/_acceso.php
|
||||||
|
* Restricción por rol dentro del módulo Turnero.
|
||||||
|
*
|
||||||
|
* El control de acceso del ERP es por módulo: quien tiene `turnero` puede abrir
|
||||||
|
* cualquiera de sus vistas escribiendo la URL, aunque el menú no se la muestre.
|
||||||
|
* Para las pantallas que operan sobre la atención o cambian configuración eso no
|
||||||
|
* alcanza, así que exigen además un rol.
|
||||||
|
*
|
||||||
|
* Uso, al inicio de la vista:
|
||||||
|
* require_once __DIR__ . '/../_acceso.php';
|
||||||
|
* turneroExigirRol(['admin', 'superadmin', 'supervisor']);
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!function_exists('turneroExigirRol')) {
|
||||||
|
/**
|
||||||
|
* Corta la ejecución si el rol de la sesión no está entre los permitidos.
|
||||||
|
* Los administradores pasan siempre.
|
||||||
|
*/
|
||||||
|
function turneroExigirRol(array $permitidos): void
|
||||||
|
{
|
||||||
|
$rol = $_SESSION['admin_user']['role'] ?? '';
|
||||||
|
if (in_array($rol, ['admin', 'superadmin'], true)) return;
|
||||||
|
if (in_array($rol, $permitidos, true)) return;
|
||||||
|
|
||||||
|
// Devolver a una pantalla que sí pueda ver, en vez de un error seco
|
||||||
|
$destino = defined('BASE_URL') ? BASE_URL : '/';
|
||||||
|
header('Location: ' . $destino . 'erp.php?m=turnero&v=dashboard&sin_acceso=1');
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,6 +9,7 @@ $_trAdminRoles = ['superadmin', 'admin', 'supervisor'];
|
|||||||
$_trIsAdmin = in_array($_trRole, $_trAdminRoles, true);
|
$_trIsAdmin = in_array($_trRole, $_trAdminRoles, true);
|
||||||
$_trIsRecep = in_array($_trRole, ['recepcionista', 'lab_recepcion'], true);
|
$_trIsRecep = in_array($_trRole, ['recepcionista', 'lab_recepcion'], true);
|
||||||
$_trIsBacte = $_trRole === 'bacteriologo';
|
$_trIsBacte = $_trRole === 'bacteriologo';
|
||||||
|
$_trIsCalidad = $_trRole === 'calidad';
|
||||||
$_trClientIp = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'] ?? '')[0]);
|
$_trClientIp = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'] ?? '')[0]);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -28,8 +29,13 @@ try {
|
|||||||
|
|
||||||
$_trLinks = [];
|
$_trLinks = [];
|
||||||
|
|
||||||
|
// ── Calidad: solo consulta de turnos y tiempos ────────────────
|
||||||
|
if ($_trIsCalidad) {
|
||||||
|
$_trLinks[] = ['name' => '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 ─────────
|
// ── 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' => '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' => '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'];
|
$_trLinks[] = ['name' => 'Pantalla TV', 'icon' => 'fas fa-tv', 'route' => '/erp.php?m=turnero&v=display_global'];
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ require_once __DIR__ . '/../../../config/config.php';
|
|||||||
|
|
||||||
if (!isUserLoggedIn()) { header('Location: ' . BASE_URL . 'login.php'); exit; }
|
if (!isUserLoggedIn()) { header('Location: ' . BASE_URL . 'login.php'); exit; }
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../_acceso.php';
|
||||||
|
turneroExigirRol(['supervisor']);
|
||||||
|
|
||||||
$db = Database::getInstance();
|
$db = Database::getInstance();
|
||||||
$pdo = $db->getConnection();
|
$pdo = $db->getConnection();
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ if (!isUserLoggedIn()) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../_acceso.php';
|
||||||
|
turneroExigirRol(['bacteriologo', 'supervisor']);
|
||||||
|
|
||||||
// Tablet asignada → forzar su lugar por token de navegador (o IP como fallback)
|
// Tablet asignada → forzar su lugar por token de navegador (o IP como fallback)
|
||||||
$lugarForzado = 0;
|
$lugarForzado = 0;
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ if (!isUserLoggedIn()) {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../_acceso.php';
|
||||||
|
turneroExigirRol(['recepcionista', 'lab_recepcion', 'supervisor']);
|
||||||
|
|
||||||
// Tablet asignada → forzar su escritorio por token de navegador (o IP como fallback)
|
// Tablet asignada → forzar su escritorio por token de navegador (o IP como fallback)
|
||||||
$_recepForzado = 0;
|
$_recepForzado = 0;
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user