false, 'message' => 'Método no permitido']); exit(); } $input = json_decode(file_get_contents('php://input'), true); $reserva_id = isset($input['id']) ? (int)$input['id'] : 0; $operador = isset($input['operador']) ? trim($input['operador']) : 'Administrador'; if ($reserva_id <= 0) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'ID de reserva inválido']); exit(); } $pdo->beginTransaction(); // Verificar que la reserva existe y está pendiente de aprobación $stmt = $pdo->prepare("SELECT * FROM reservas WHERE id = :id AND estado = 'pagada_pendiente_aprobacion' LIMIT 1"); $stmt->execute([':id' => $reserva_id]); $reserva = $stmt->fetch(); if (!$reserva) { $pdo->rollBack(); http_response_code(400); echo json_encode(['success' => false, 'message' => 'Reserva no encontrada o no está en estado de aprobación']); exit(); } // 1. Activar reserva: cambiar estado a 'confirmada' y activar QR $stmt = $pdo->prepare("UPDATE reservas SET estado = 'confirmada', qr_activo = 1, operador_aprobacion = :operador, fecha_aprobacion = NOW() WHERE id = :id"); $stmt->execute([ ':operador' => $operador, ':id' => $reserva_id ]); // 2. Marcar la cabina/jaula como ocupada if (!empty($reserva['cabina_id'])) { $stmt = $pdo->prepare("UPDATE cabinas SET estado = 'ocupada' WHERE id = :cabina_id"); $stmt->execute([':cabina_id' => $reserva['cabina_id']]); } $pdo->commit(); echo json_encode([ 'success' => true, 'message' => 'Reserva aprobada correctamente', 'codigo_qr' => $reserva['codigo_qr'] ?? null, 'cliente_email' => $reserva['cliente_email'] ?? null ]); } catch (PDOException $e) { if ($pdo->inTransaction()) $pdo->rollBack(); http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Error en el servidor', 'error' => $e->getMessage() ]); } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); http_response_code(500); echo json_encode([ 'success' => false, 'message' => 'Error inesperado', 'error' => $e->getMessage() ]); } ?>