prepare(" SELECT r.id, r.cabina_id, r.estado, r.qr_activo, r.codigo_qr FROM reservas r WHERE r.codigo_qr = :qr AND r.qr_activo = 1 AND r.estado IN ('confirmada', 'activa') LIMIT 1 "); $stmtQR->execute([':qr' => $qr]); $reserva = $stmtQR->fetch(); if (!$reserva) { // QR no válido, inactivo o reserva no existe → por defecto "entrada" // (aunque acceso.php lo denegará después) echo "entrada"; exit(); } // Paso 2: Si se proporciona cabina_id, verificar que coincide con la reserva if ($cabina_id && $reserva['cabina_id'] != $cabina_id) { // QR válido pero en cabina incorrecta → denegar (acceso.php lo manejará) echo "entrada"; exit(); } // Paso 3: Consultar el último movimiento registrado en el historial de accesos // Solo consideramos accesos concedidos (acceso_concedido = 1) $stmtHistorial = $pdo->prepare(" SELECT tipo_movimiento FROM historial_accesos WHERE codigo_qr = :qr AND cabina_id = :cabina_id AND acceso_concedido = 1 ORDER BY fecha_registro DESC LIMIT 1 "); $stmtHistorial->execute([ ':qr' => $qr, ':cabina_id' => $reserva['cabina_id'] ]); $ultimo = $stmtHistorial->fetch(); // Paso 4: Determinar el siguiente movimiento if ($ultimo && $ultimo['tipo_movimiento'] === 'entrada') { // El último movimiento fue entrada → ahora toca salida echo "salida"; } else { // No hay historial o el último fue salida → ahora toca entrada echo "entrada"; } } catch (PDOException $e) { http_response_code(500); error_log("Error en consultar_estado: " . $e->getMessage()); echo "entrada"; // Por defecto, para no bloquear al ESP32 } ?>