false, 'message' => 'Falta el parámetro id']); exit(); } $reserva_id = (int)$_GET['id']; // Usamos LEFT JOIN para que no falle si falta la mascota, usuario o cabina $sql = "SELECT r.id, r.codigo, r.fecha, r.hora_inicio, r.hora_fin_prevista, r.hora_fin_real, r.hora_entrada_real, r.hora_salida_real, r.duracion_bloques, r.importe, r.estado, r.referencia_bizum, r.codigo_qr, r.qr_activo, r.operador_aprobacion, r.fecha_aprobacion, u.id AS usuario_id, u.nombre AS cliente_nombre, u.apellidos AS cliente_apellidos, u.email AS cliente_email, u.telefono AS cliente_telefono, u.dni AS cliente_dni, m.id AS mascota_id, m.nombre AS mascota_nombre, m.especie AS mascota_especie, m.raza AS mascota_raza, m.peso AS mascota_peso, c.id AS cabina_id, c.codigo AS cabina_codigo, c.bloque, c.tamanio FROM reservas r LEFT JOIN usuarios u ON r.usuario_id = u.id LEFT JOIN mascotas m ON r.mascota_id = m.id LEFT JOIN cabinas c ON r.cabina_id = c.id WHERE r.id = :id LIMIT 1"; $stmt = $pdo->prepare($sql); $stmt->execute([':id' => $reserva_id]); $reserva = $stmt->fetch(); if (!$reserva) { http_response_code(404); echo json_encode(['success' => false, 'message' => 'Reserva no encontrada']); exit(); } // Calcular duración real si hay hora de entrada y salida $duracion_real = null; if (!empty($reserva['hora_entrada_real']) && !empty($reserva['hora_salida_real'])) { try { $entrada = new DateTime($reserva['hora_entrada_real']); $salida = new DateTime($reserva['hora_salida_real']); $diff = $entrada->diff($salida); $duracion_real = ($diff->h * 60) + $diff->i; } catch (Exception $e) { $duracion_real = null; } } echo json_encode([ 'success' => true, 'message' => 'Detalle de reserva obtenido', 'data' => $reserva, 'duracion_real_minutos' => $duracion_real ], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); } catch (PDOException $e) { http_response_code(500); // Esto nos dirá EXACTAMENTE qué columna o tabla está fallando echo json_encode([ 'success' => false, 'message' => 'Error de Base de Datos', 'error_sql' => $e->getMessage(), 'hint' => 'Revisa que todas las columnas del SELECT existan en tu BD' ]); } catch (Exception $e) { http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Error inesperado', 'error' => $e->getMessage() ]); } ?>