Permitir atender Pediatría y Ginecología desde equipos con estación fija
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 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
813b712df0
commit
dc17c6a469
@@ -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;
|
||||||
+10
-10
@@ -19,7 +19,7 @@ try {
|
|||||||
)->fetchAll(PDO::FETCH_ASSOC);
|
)->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
$_trMuestras = $_trPdo->query(
|
$_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);
|
)->fetchAll(PDO::FETCH_ASSOC);
|
||||||
} catch (\Throwable $_) {
|
} catch (\Throwable $_) {
|
||||||
$_trDesks = [];
|
$_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'];
|
$_trLinks[] = ['name' => 'Bandeja del día', 'icon' => 'fas fa-layer-group', 'route' => '/erp.php?m=turnero&v=bandeja'];
|
||||||
|
|
||||||
if ($_trIpLugar) {
|
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) {
|
foreach ($_trMuestras as $_m) {
|
||||||
if ((int)$_m['id'] === (int)$_trIpLugar) {
|
$_esSuyo = (int)$_m['id'] === (int)$_trIpLugar;
|
||||||
$_trLinks[] = [
|
if (!$_esSuyo && empty($_m['acceso_libre'])) continue;
|
||||||
'name' => $_m['nombre'],
|
$_trLinks[] = [
|
||||||
'icon' => 'fas fa-flask',
|
'name' => $_m['nombre'],
|
||||||
'route' => '/erp.php?m=turnero&v=lugar&lugar_id=' . (int)$_m['id'],
|
'icon' => $_esSuyo ? 'fas fa-flask' : 'fas fa-share-square',
|
||||||
];
|
'route' => '/erp.php?m=turnero&v=lugar&lugar_id=' . (int)$_m['id'],
|
||||||
break;
|
];
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// IP no registrada: TV + todos los lugares muestras
|
// IP no registrada: TV + todos los lugares muestras
|
||||||
|
|||||||
@@ -44,9 +44,26 @@ try {
|
|||||||
if ($_dispRow['tipo'] === 'recepcion') {
|
if ($_dispRow['tipo'] === 'recepcion') {
|
||||||
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=recepcion&desk_id=' . $_forzado); exit;
|
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;
|
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;
|
$lugarForzado = $_forzado;
|
||||||
}
|
}
|
||||||
} catch (\Throwable $_) {}
|
} catch (\Throwable $_) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user