public IHttpActionResult DoExport(CsvExportInfo exportInfo)
		{
			var notification = new ExportNotification(CurrentPrincipal.GetCurrentUserName())
			{
				Title = "Catalog export task",
				Description = "starting export...."
			};
			_notifier.Upsert(notification);

			var catalog = _catalogService.GetById(exportInfo.CatalogId);
			if (catalog == null)
			{
				throw new NullReferenceException("catalog");
			}
			var curencySetting = _settingsManager.GetSettingByName("VirtoCommerce.Core.General.Currencies");
			var defaultCurrency = EnumUtility.SafeParse<CurrencyCodes>(curencySetting.DefaultValue, CurrencyCodes.USD);

			var exportJob = new CsvCatalogExportJob();
			BackgroundJob.Enqueue(() => exportJob.DoExport(exportInfo.CatalogId, exportInfo.CategoryIds, exportInfo.ProductIds,
														   exportInfo.PriceListId, exportInfo.FulfilmentCenterId, exportInfo.Currency ?? defaultCurrency,
														   catalog.DefaultLanguage.LanguageCode, notification));

			return Ok(notification);

		}
Ejemplo n.º 2
0
		public virtual void DoExport(string catalogId, string[] exportedCategories, string[] exportedProducts, string pricelistId, string fulfilmentCenterId, CurrencyCodes currency, string languageCode, ExportNotification notification)
		{
			var memoryStream = new MemoryStream();
			var streamWriter = new StreamWriter(memoryStream);
			streamWriter.AutoFlush = true;
			var productPropertyInfos = typeof(CatalogProduct).GetProperties(BindingFlags.Instance | BindingFlags.Public);
			string catalogName = null;
			using (var csvWriter = new CsvWriter(streamWriter))
			{
				csvWriter.Configuration.Delimiter = ";";

				//Notification
				notification.Description = "loading products...";
				_notifier.Upsert(notification);

				try
				{
					//Load all products to export
					var products = LoadProducts(catalogId, exportedCategories, exportedProducts);

					//Notification
					notification.Description = "loading prices...";
					_notifier.Upsert(notification);
					var allProductIds = products.Select(x=>x.Id).ToArray();
					//Load prices for products
					var priceEvalContext = new  PriceEvaluationContext {
						ProductIds = allProductIds,
						PricelistIds = pricelistId == null ? null : new string[] { pricelistId },
						Currency = currency
					};

					var allProductPrices = _pricingService.EvaluateProductPrices(priceEvalContext).ToArray();
					foreach(var product in products)
					{
						product.Prices = allProductPrices.Where(x => x.ProductId == product.Id).ToList();
					}
					//Load inventories
					notification.Description = "loading inventory information...";
					_notifier.Upsert(notification);
					var allProductInventories = _inventoryService.GetProductsInventoryInfos(allProductIds);
					foreach (var product in products)
					{
						product.Inventories = allProductInventories.Where(x => x.ProductId == product.Id)
							.Where(x => fulfilmentCenterId == null ? true : x.FulfillmentCenterId == fulfilmentCenterId).ToList();
					}

					notification.TotalCount = products.Count();
					//populate export configuration
					Dictionary<string, Func<CatalogProduct, string>> exportConfiguration = new Dictionary<string, Func<CatalogProduct, string>>();
					PopulateProductExportConfiguration(exportConfiguration, products);

					//Write header
					foreach (var cfgItem in exportConfiguration)
					{
						csvWriter.WriteField(cfgItem.Key);
					}
					csvWriter.NextRecord();

					var notifyProductSizeLimit = 50;
					var counter = 0;
					//Write products
					foreach (var product in products)
					{
						if(catalogName == null && product.Catalog != null)
						{
							catalogName = product.Catalog.Name;
						}

						try
						{
							foreach (var cfgItem in exportConfiguration)
							{
								var fieldValue = String.Empty;
								if (cfgItem.Value == null)
								{
									var propertyInfo = productPropertyInfos.FirstOrDefault(x => x.Name == cfgItem.Key);
									if (propertyInfo != null)
									{
										var objValue = propertyInfo.GetValue(product);
										fieldValue = objValue != null ? objValue.ToString() : fieldValue;
									}
								}
								else
								{
									fieldValue = cfgItem.Value(product);
								}
								csvWriter.WriteField(fieldValue);
							}
							csvWriter.NextRecord();
						}
						catch(Exception ex)
						{
							notification.ErrorCount++;
							notification.Errors.Add(ex.ToString());
							_notifier.Upsert(notification);
						}

						//Raise notification each notifyProductSizeLimit products
						counter++;
						notification.ProcessedCount = counter;
						notification.Description = string.Format("{0} of {1} products processed", notification.ProcessedCount, notification.TotalCount);
						if (counter % notifyProductSizeLimit == 0)
						{
							_notifier.Upsert(notification);
						}
					}
					memoryStream.Position = 0;
					//Upload result csv to blob storage
					var uploadInfo = new UploadStreamInfo
					{
						FileName = "Catalog-" + (catalogName ?? catalogId) + "-export.csv",
						FileByteStream = memoryStream,
						FolderName = "temp"
					};
					var blobKey = _blobStorageProvider.Upload(uploadInfo);
					//Get a download url
					notification.DownloadUrl = _blobUrlResolver.GetAbsoluteUrl(blobKey);
					notification.Description = "Export finished";
				}
				catch(Exception ex)
				{
					notification.Description = "Export error";
					notification.ErrorCount++;
					notification.Errors.Add(ex.ToString());
				}
				finally
				{
					notification.Finished = DateTime.UtcNow;
					_notifier.Upsert(notification);
				}
		
			}
			
		}