From dc17c6a46966c2f9549c6496d5527a6dd6d1adce Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:47:11 -0500 Subject: [PATCH] =?UTF-8?q?Permitir=20atender=20Pediatr=C3=ADa=20y=20Ginec?= =?UTF-8?q?olog=C3=ADa=20desde=20equipos=20con=20estaci=C3=B3n=20fija?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Un equipo registrado por IP o token queda atado a su estación: si pedía otra, lugar.php lo devolvía a la suya sin mostrar nada, y parecía que el enlace estaba roto. La restricción tiene sentido para las Tomas de Muestras, pero Pediatría y Ginecología se atienden desde cualquier puesto. Se agrega la marca acceso_libre en turnero_lugares en vez de codificar los nombres, para que mañana se habilite otra estación sin tocar código. Las marcadas así no redirigen y aparecen en el menú del equipo junto a la suya. El bloqueo se mantiene en todo lo demás: el equipo sigue atado a su estación, el botón de cambiar sigue oculto y no puede saltar a una Toma de Muestras ajena. Co-Authored-By: Claude Opus 5 --- migrations/20260811_lugares_acceso_libre.sql | 11 +++++++++++ modules/turnero/module.php | 20 ++++++++++---------- modules/turnero/views/lugar.php | 19 ++++++++++++++++++- 3 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 migrations/20260811_lugares_acceso_libre.sql diff --git a/migrations/20260811_lugares_acceso_libre.sql b/migrations/20260811_lugares_acceso_libre.sql new file mode 100644 index 0000000..75f394a --- /dev/null +++ b/migrations/20260811_lugares_acceso_libre.sql @@ -0,0 +1,11 @@ +-- Estaciones accesibles desde equipos asignados a otra estación. +-- Pediatría y Ginecología se atienden desde cualquier puesto, pero el bloqueo +-- por IP o token devolvía al equipo a su estación sin avisar. +-- Idempotente: puede correrse más de una vez. + +ALTER TABLE turnero_lugares + ADD COLUMN IF NOT EXISTS acceso_libre TINYINT(1) NOT NULL DEFAULT 0 + COMMENT 'Accesible desde equipos asignados a otra estación'; + +UPDATE turnero_lugares SET acceso_libre = 1 + WHERE nombre IN ('Pediatria', 'Ginecologia') AND acceso_libre = 0; diff --git a/modules/turnero/module.php b/modules/turnero/module.php index 958c9ed..35064ab 100644 --- a/modules/turnero/module.php +++ b/modules/turnero/module.php @@ -19,7 +19,7 @@ try { )->fetchAll(PDO::FETCH_ASSOC); $_trMuestras = $_trPdo->query( - "SELECT id, nombre FROM turnero_lugares WHERE activo=1 AND tipo='muestras' ORDER BY sort_order" + "SELECT id, nombre, acceso_libre FROM turnero_lugares WHERE activo=1 AND tipo='muestras' ORDER BY sort_order" )->fetchAll(PDO::FETCH_ASSOC); } catch (\Throwable $_) { $_trDesks = []; @@ -108,16 +108,16 @@ if ($_trIsRecep) { $_trLinks[] = ['name' => 'Bandeja del día', 'icon' => 'fas fa-layer-group', 'route' => '/erp.php?m=turnero&v=bandeja']; if ($_trIpLugar) { - // IP registrada: solo ese lugar en el sidebar + // IP registrada: su estación, más las marcadas como de acceso libre + // (Pediatría, Ginecología), que se atienden desde cualquier puesto. foreach ($_trMuestras as $_m) { - if ((int)$_m['id'] === (int)$_trIpLugar) { - $_trLinks[] = [ - 'name' => $_m['nombre'], - 'icon' => 'fas fa-flask', - 'route' => '/erp.php?m=turnero&v=lugar&lugar_id=' . (int)$_m['id'], - ]; - break; - } + $_esSuyo = (int)$_m['id'] === (int)$_trIpLugar; + if (!$_esSuyo && empty($_m['acceso_libre'])) continue; + $_trLinks[] = [ + 'name' => $_m['nombre'], + 'icon' => $_esSuyo ? 'fas fa-flask' : 'fas fa-share-square', + 'route' => '/erp.php?m=turnero&v=lugar&lugar_id=' . (int)$_m['id'], + ]; } } else { // IP no registrada: TV + todos los lugares muestras diff --git a/modules/turnero/views/lugar.php b/modules/turnero/views/lugar.php index b28b232..57d822b 100644 --- a/modules/turnero/views/lugar.php +++ b/modules/turnero/views/lugar.php @@ -44,9 +44,26 @@ try { if ($_dispRow['tipo'] === 'recepcion') { header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=recepcion&desk_id=' . $_forzado); exit; } - if ((int)($_GET['lugar_id'] ?? 0) !== $_forzado) { + $_pedido = (int)($_GET['lugar_id'] ?? 0); + + // Un equipo fijo queda atado a su estación, pero algunas —Pediatría, + // Ginecología— se atienden desde cualquier puesto: se marcan como de + // acceso libre y no se redirige. + $_libre = false; + if ($_pedido && $_pedido !== $_forzado) { + $_sl = $_dispPdo->prepare( + "SELECT acceso_libre FROM turnero_lugares WHERE id = ? AND activo = 1 LIMIT 1" + ); + $_sl->execute([$_pedido]); + $_libre = (bool)$_sl->fetchColumn(); + } + + if ($_pedido !== $_forzado && !$_libre) { header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=lugar&lugar_id=' . $_forzado); exit; } + // El equipo sigue atado a su estación aunque esté atendiendo una de + // acceso libre: la vista muestra la pedida (sale de lugar_id), pero el + // botón de cambiar sigue oculto y no puede saltar a cualquier otra. $lugarForzado = $_forzado; } } catch (\Throwable $_) {}