s[$key] = [ 'codigo' => 'PROD', 'descripcion' => $det->producto_nombre ?? 'Producto', 'unidad' => 'NIU', 'cantidad' => 0, 'mto_precio_unitario' => (float) ($det->precio_aplicado ?? 0.0), 'porcentaje_igv' => 18.0, 'tip_afe_igv' => '10', 'notas' => [] ]; } $detallesAgrupados[$key]['cantidad'] += (float) ($det->cantidad ?? 1); if (!empty($det->notas_especiales)) { $detallesAgrupados[$key]['notas'][] = $det->notas_especiales; } } // Convertir notas a string y re-indexar array $mappedDetalles = array_values(array_map(function ($det) { if (!empty($det['notas'])) { $det['descripcion'] .= ' (' . implode(', ', array_unique($det['notas'])) . ')'; } unset($det['notas']); return $det; }, $detallesAgrupados)); // Obtener company_id y branch_id reales para API-GO $companyId = 1; $branchId = 1; try { $sucursalObj = \Illuminate\Support\Facades\DB::table('Nucleo_Sucursales as s') ->join('Nucleo_Empresas as e', 's.empresa_id', '=', 'e.id_empresa') ->where('s.id_sucursal', $ordenBase->sucursal_id) ->select('e.ruc_nit as ruc') ->first(); if ($sucursalObj) { // Solo intentar conexión si no estamos en modo "fallback ciego" $piterFact = \Illuminate\Support\Facades\DB::connection('piter_facturacion'); $compObj = $piterFact->table('companies')->where('ruc', $sucursalObj->ruc)->first(); if ($compObj) { $companyId = $compObj->id; $branchObj = $piterFact->table('branches')->where('company_id', $companyId)->first(); if ($branchObj) { $branchId = $branchObj->id; } } } } catch (\Exception $e) { \Illuminate\Support\Facades\Log::warning("⚠️ [Ticket/Generar] Error buscando company/branch (usando defaults 1/1): " . $e->getMessage()); } $pagosDB = \Illuminate\Support\Facades\DB::table('Ventas_Pagos') ->where('pedido_id', $ordenId) ->get(); $medios_pago = []; foreach ($pagosDB as $p) { $tipoMetodo = 'EFEC'; if ($p->metodo_pago === 'TARJETA_POS') $tipoMetodo = 'POS'; else if ($p->metodo_pago === 'YAPE_POS') $tipoMetodo = 'YAPE'; else if ($p->metodo_pago === 'PLIN_POS') $tipoMet