Sin turno activo
Pulse "Llamar siguiente" o seleccione un turno de la colagetConnection(); $_dispRow = null; // 1. Chequeo por token de navegador (cookie) $_devToken = trim($_COOKIE['turnero_token'] ?? ''); if ($_devToken) { $_s = $_dispPdo->prepare( "SELECT td.lugar_id, td.nombre, tl.tipo FROM turnero_dispositivos td JOIN turnero_lugares tl ON tl.id = td.lugar_id WHERE td.token = ? AND td.activo = 1 LIMIT 1" ); $_s->execute([$_devToken]); $_dispRow = $_s->fetch(PDO::FETCH_ASSOC) ?: null; } // 2. Fallback por IP if (!$_dispRow) { $_clientIp = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['HTTP_X_REAL_IP'] ?? $_SERVER['REMOTE_ADDR'] ?? '')[0]); $_s = $_dispPdo->prepare( "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.token IS NULL AND td.activo = 1 LIMIT 1" ); $_s->execute([$_clientIp]); $_dispRow = $_s->fetch(PDO::FETCH_ASSOC) ?: null; } if ($_dispRow) { $_SESSION['turnero_dispositivo'] = $_dispRow; $_forzado = (int)$_dispRow['lugar_id']; if ($_dispRow['tipo'] === 'recepcion') { header('Location: ' . BASE_URL . 'erp.php?m=turnero&v=recepcion&desk_id=' . $_forzado); exit; } $_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 $_) {} try { $pdo = Database::getInstance()->getConnection(); $lugares = $pdo->query( "SELECT id, nombre, descripcion, formulario_modo, tipo FROM turnero_lugares WHERE activo = 1 ORDER BY sort_order ASC" )->fetchAll(PDO::FETCH_ASSOC); } catch (\Throwable) { $lugares = []; } $lugarIdParam = isset($_GET['lugar_id']) ? (int)$_GET['lugar_id'] : 0; $lugarNombre = 'Estación de Servicio'; $lugarFormModo = 'link'; $lugarTipo = 'muestras'; foreach ($lugares as $l) { if ((int)$l['id'] === $lugarIdParam) { $lugarNombre = $l['nombre']; $lugarFormModo = $l['formulario_modo'] ?? 'link'; $lugarTipo = $l['tipo'] ?? 'muestras'; break; } } $adminNombre = $_SESSION['admin_user']['full_name'] ?? $_SESSION['admin_user']['username'] ?? 'Operador'; $adminFirmaSvg = null; try { $stmt = Database::getInstance()->getConnection() ->prepare("SELECT firma_svg FROM admin_users WHERE id = ? LIMIT 1"); $stmt->execute([(int)($_SESSION['admin_user']['id'] ?? 0)]); $adminFirmaSvg = $stmt->fetchColumn() ?: null; } catch (\Throwable $_) {} // Especialidades (Ginecología, Pediatría) — excluir el lugar actual $especialidades = []; foreach ($lugares as $_el) { $_en = mb_strtolower($_el['nombre']); if ((str_contains($_en, 'ginecol') || str_contains($_en, 'pediatr')) && (int)$_el['id'] !== $lugarIdParam) { $especialidades[] = $_el; } } $formulariosList = []; try { $formulariosList = Database::getInstance()->getConnection() ->query("SELECT id, nombre FROM lab_formularios WHERE is_active = 1 ORDER BY nombre ASC") ->fetchAll(PDO::FETCH_ASSOC); } catch (\Throwable $_) {} ?>
Sin turno activo
Pulse "Llamar siguiente" o seleccione un turno de la cola