$createResponse = \Illuminate\Support\Facades\Http::withToken($token) ->accept('application/json') ->post($baseUrlGo . $endpoint, $payload); } // [AUTO-CORRECCIÓN] Si hay error de duplicado, intentar con Serie NV02 como último recurso if (!$createResponse->successful() && strpos($createResponse->body(), '23000') !== false) { \Illuminate\Support\Facades\Log::warning("⚠️ [Ticket/Generar] Duplicado persistente. Cambiando a Serie NV02..."); $payload['serie'] = 'NV02'; $payload['correlativo'] = 1; $payload['numero'] = 1; $createResponse = \Illuminate\Support\Facades\Http::withToken($token) ->accept('application/json') ->post($baseUrlGo . $endpoint, $payload); } if ($createResponse->successful()) { $invoiceId = $createResponse->json('data.id'); // Guardar en cache por 30 minutos para evitar duplicados al cambiar formato \Illuminate\Support\Facades\Cache::put($cacheKey, $invoiceId, 1800); $downloadUrl = $baseUrlGo . $endpoint . '/' . $invoiceId . '/download-pdf'; if ($request->has('format')) { $formatParam = $request->query('format'); if (in_array(strtolower($formatParam), ['a4', 'a5'])) { $formatParam = strtoupper($formatParam); } $downloadUrl .= '?format=' . $formatParam; } $pdfResponse = \Illuminate\Support\Facades\Http::withToken($token)->get($downloadUrl); if ($pdfResponse->successful()) { return response($pdfResponse->body(), 200) ->header('Content-Type', 'application/pdf') ->header('Content-Disposition', 'attachment; filename="ticket-' . $ordenId . '.pdf"'); } return response()->json([ 'success' => false, 'message' => 'Error al descargar PDF de API-GO (Paso 2)', 'details' => $pdfResponse->body(), 'url_intento' => $downloadUrl ], 502); } return response()->json([ 'success' => false, 'message' => 'Error al crear borrador en API-GO (Paso 1)',