public static void Process(IList <KCStore> stores)
 {
     logger.SetRequestId(GetRequestId());
     for (int i = 0; i < stores.Count; i++)
     {
         var tokenSource = new CancellationTokenSource();
         try
         {
             ProcessStore(stores[i], tokenSource.Token);
             PXProcessing <KCStore> .SetInfo(i, KCMessages.BulkUploadSuccess(stores[i].SiteMasterCD));
         }
         catch (Exception exception)
         {
             string log = KCMessages.ProcessException(stores[i].SiteMasterCD, exception.Message, exception.StackTrace);
             PXTrace.WriteError(exception);
             logger.ClearLoggingIds();
             logger.Error(log);
             PXProcessing <KCStore> .SetError(i, new Exception(log));
         }
         finally
         {
             tokenSource.Cancel(true);
             tokenSource.Dispose();
         }
     }
 }
        public void ExportProducts(KCStore store, List <KeyValuePair <string, InventoryItem> > productsForExport = null)
        {
            DateTime today = DateTime.Now;

            _store = store;
            KCSiteMaster  connection = Graph.StoreConfig.Select().RowCast <KCSiteMaster>().First(x => x.SiteMasterCD.Equals(store.SiteMasterCD));
            KCARestClient client     = new KCARestClient(connection);

            ApiHelper = new KCInventoryItemAPIHelper(client);
            if (productsForExport == null)
            {
                productsForExport = GetProductsForExport();
            }

            List <KCBulkProduct> dtos = HandleItems(productsForExport);

            foreach (var item in dtos)
            {
                var          id  = Graph.ItemByCD.SelectSingle(item.Product.Sku).InventoryID;
                ARSalesPrice rec = Graph.KCSalesPrice.SelectSingle("B", id);
                if (rec != null)
                {
                    item.Product.RetailPrice = rec.SalesPrice;
                }
            }

            bool anyProductToExport = dtos.Count > 0;

            if (anyProductToExport)
            {
                string bulkFile        = PrepareItemBulkFile(dtos);
                string productFilePath = GenerateProductUploadPath(connection);
                UploadFileToFTP(connection, bulkFile, productFilePath);
            }

            logger.ClearLoggingIds();
            logger.Information(anyProductToExport ? KCMessages.BulkUploadSuccess(store.SiteMasterCD) : KCMessages.NoProductsToExport);
        }