$cmp->id)->first(); if ($brn) { $tipoRef = ($tipoDocSolicitado === 'invoice') ? '01' : (($tipoDocSolicitado === 'boleta') ? '03' : '17'); // 17 = Nota de Venta (API-GO) $corr = $piterFact->table('correlatives') ->where('branch_id', $brn->id) ->where('tipo_documento', $tipoRef) ->first(); if ($corr) { $payload['serie'] = $corr->serie; $payload['correlativo'] = (int) $corr->correlativo_actual + 1; } } } } } catch (\Exception $e) { // Silencioso, ya tiene defaults } } // [FIX] Adaptar payload para esquema de Nota de Venta de API-GO si aplica if ($isNotaVenta) { $payload['detalles'] = array_map(function ($item) { $item['precio_unitario'] = $item['mto_precio_unitario']; unset($item['mto_precio_unitario']); return $item; }, $payload['detalles']); } \Illuminate\Support\Facades\Log::info("📡 [Ticket/Generar] Enviando Payload a API-GO ({$endpoint}):", $payload); // [NUEVO] Intentar recuperar borrador existente de la memoria (Cache) para evitar duplicar números $cacheKey = "billing_draft_{$ordenId}_{$tipoDocSolicitado}"; $invoiceId = \Illuminate\Support\Facades\Cache::get($cacheKey); if ($invoiceId) { \Illuminate\Support\Facades\Log::info("♻️ [Ticket/Generar] Reutilizando borrador de cache: " . $invoiceId); $createResponse = new \Illuminate\Http\Client\Response(new \GuzzleHttp\Psr7\Response(200, [], json_encode(['data' => ['id' => $invoiceId]]))); } else { // [FIX] Para Notas de Venta, algunos sistemas usan 'numero' en lugar de 'correlativo' if ($isNotaVenta) { $payload['numero'] = $payload['correlativo']; } // Crear el borrador $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;