. $e->getMessage()); } } // 2. Obtener Items/Detalles de la orden (o de la mesa solo si es pre-cuenta explícita) $esPreCuenta = ($request->query('tipo') === 'pre-cuenta'); if ($esPreCuenta && $ordenBase->recurso_id) { $items = \Illuminate\Support\Facades\DB::table('Ventas_Detalle_Orden as d') ->join('Ventas_Ordenes as o', 'd.orden_id', '=', 'o.id_ordenes') ->leftJoin('Ventas_Productos as p', 'd.producto_id', '=', 'p.id_producto') ->where('o.recurso_id', $ordenBase->recurso_id) ->whereIn('o.estado', ['PENDIENTE', 'POR_CONFIRMAR', 'POR_REVISAR', 'EN_PREPARACION', 'LISTO', 'ENTREGADO']) ->select('d.*', 'p.nombre as producto_nombre') ->get(); } else { $items = \Illuminate\Support\Facades\DB::table('Ventas_Detalle_Orden as d') ->leftJoin('Ventas_Productos as p', 'd.producto_id', '=', 'p.id_producto') ->where('d.orden_id', $ordenId) ->select('d.*', 'p.nombre as producto_nombre') ->get(); } if ($items->isEmpty()) { return response()->json(['success' => false, 'message' => 'El pedido no tiene productos registrados.'], 404); } // 3. Agrupar ítems y Mapear Payload para API-GO (Borrador) $detallesAgrupados = []; foreach ($items as $det) { $key = $det->producto_id; if (!isset($detallesAgrupados[$key])) { $detallesAgrupados[$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 {