turnero: chequeo IP en vivo en cada carga de página
En lugar de confiar solo en la sesión (seteada al login), recepcion.php y lugar.php ahora consultan turnero_dispositivos por IP en cada request. Esto cubre sesiones preexistentes y evita que aparezca el selector cuando la IP ya tiene un lugar asignado. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
003d16b6a2
commit
9afadb9a6f
@@ -10,28 +10,31 @@ if (!isUserLoggedIn()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tablet asignada → forzar su lugar, bloquear cualquier otro
|
// Tablet asignada → forzar su lugar, bloquear cualquier otro
|
||||||
|
// Chequeo en vivo por IP (no solo sesión, para sesiones preexistentes)
|
||||||
$lugarForzado = 0;
|
$lugarForzado = 0;
|
||||||
if (!empty($_SESSION['turnero_dispositivo'])) {
|
try {
|
||||||
$_d = $_SESSION['turnero_dispositivo'];
|
$_clientIp = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'] ?? '')[0]);
|
||||||
$_forzado = (int)$_d['lugar_id'];
|
$_dispPdo = Database::getInstance()->getConnection();
|
||||||
if ($_d['tipo'] === 'recepcion') {
|
$_dispStmt = $_dispPdo->prepare(
|
||||||
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=recepcion&desk_id=' . $_forzado); exit;
|
"SELECT td.lugar_id, td.nombre, tl.tipo
|
||||||
}
|
FROM turnero_dispositivos td
|
||||||
if ((int)($_GET['lugar_id'] ?? 0) !== $_forzado) {
|
JOIN turnero_lugares tl ON tl.id = td.lugar_id
|
||||||
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=lugar&lugar_id=' . $_forzado); exit;
|
WHERE td.ip = ? AND td.activo = 1 LIMIT 1"
|
||||||
}
|
);
|
||||||
$lugarForzado = $_forzado;
|
$_dispStmt->execute([$_clientIp]);
|
||||||
}
|
$_dispRow = $_dispStmt->fetch(PDO::FETCH_ASSOC);
|
||||||
// Restricción a nivel de usuario (turnero_lugar_id en admin_users)
|
if ($_dispRow) {
|
||||||
if (!$lugarForzado) {
|
$_SESSION['turnero_dispositivo'] = $_dispRow;
|
||||||
$_userLugar = (int)($_SESSION['admin_user']['turnero_lugar_id'] ?? 0);
|
$_forzado = (int)$_dispRow['lugar_id'];
|
||||||
if ($_userLugar) {
|
if ($_dispRow['tipo'] === 'recepcion') {
|
||||||
if ((int)($_GET['lugar_id'] ?? 0) !== $_userLugar) {
|
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=recepcion&desk_id=' . $_forzado); exit;
|
||||||
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=lugar&lugar_id=' . $_userLugar); exit;
|
|
||||||
}
|
}
|
||||||
$lugarForzado = $_userLugar;
|
if ((int)($_GET['lugar_id'] ?? 0) !== $_forzado) {
|
||||||
|
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=lugar&lugar_id=' . $_forzado); exit;
|
||||||
|
}
|
||||||
|
$lugarForzado = $_forzado;
|
||||||
}
|
}
|
||||||
}
|
} catch (\Throwable $_) {}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$pdo = Database::getInstance()->getConnection();
|
$pdo = Database::getInstance()->getConnection();
|
||||||
|
|||||||
@@ -10,18 +10,31 @@ if (!isUserLoggedIn()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Tablet asignada → forzar su escritorio, bloquear cualquier otro
|
// Tablet asignada → forzar su escritorio, bloquear cualquier otro
|
||||||
|
// Chequeo en vivo por IP (no solo sesión, para sesiones preexistentes)
|
||||||
$_recepForzado = 0;
|
$_recepForzado = 0;
|
||||||
if (!empty($_SESSION['turnero_dispositivo'])) {
|
try {
|
||||||
$_d = $_SESSION['turnero_dispositivo'];
|
$_clientIp = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'] ?? '')[0]);
|
||||||
$_forzado = (int)$_d['lugar_id'];
|
$_dispPdo = Database::getInstance()->getConnection();
|
||||||
if ($_d['tipo'] !== 'recepcion') {
|
$_dispStmt = $_dispPdo->prepare(
|
||||||
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=lugar&lugar_id=' . $_forzado); exit;
|
"SELECT td.lugar_id, td.nombre, tl.tipo
|
||||||
|
FROM turnero_dispositivos td
|
||||||
|
JOIN turnero_lugares tl ON tl.id = td.lugar_id
|
||||||
|
WHERE td.ip = ? AND td.activo = 1 LIMIT 1"
|
||||||
|
);
|
||||||
|
$_dispStmt->execute([$_clientIp]);
|
||||||
|
$_dispRow = $_dispStmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if ($_dispRow) {
|
||||||
|
$_SESSION['turnero_dispositivo'] = $_dispRow; // mantener sesión actualizada
|
||||||
|
$_forzado = (int)$_dispRow['lugar_id'];
|
||||||
|
if ($_dispRow['tipo'] !== 'recepcion') {
|
||||||
|
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=lugar&lugar_id=' . $_forzado); exit;
|
||||||
|
}
|
||||||
|
if ((int)($_GET['desk_id'] ?? 0) !== $_forzado) {
|
||||||
|
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=recepcion&desk_id=' . $_forzado); exit;
|
||||||
|
}
|
||||||
|
$_recepForzado = $_forzado;
|
||||||
}
|
}
|
||||||
if ((int)($_GET['desk_id'] ?? 0) !== $_forzado) {
|
} catch (\Throwable $_) {}
|
||||||
header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=recepcion&desk_id=' . $_forzado); exit;
|
|
||||||
}
|
|
||||||
$_recepForzado = $_forzado;
|
|
||||||
}
|
|
||||||
// Restricción a nivel de usuario (turnero_lugar_id en admin_users)
|
// Restricción a nivel de usuario (turnero_lugar_id en admin_users)
|
||||||
if (!$_recepForzado) {
|
if (!$_recepForzado) {
|
||||||
$_userDesk = (int)($_SESSION['admin_user']['turnero_lugar_id'] ?? 0);
|
$_userDesk = (int)($_SESSION['admin_user']['turnero_lugar_id'] ?? 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user