public static void Run2_MultiListing() { var allstock = AllStockExporter2.LoadLocalFile(); var fullCatalog = FullCatalog2.LoadLocalFile(); //костыль. удаляем артикулы с пустыми размерами var count = allstock.sneakers.RemoveAll(x => x.sizes.Count == 0); //костыль. удаляем артикулы у которых все офферы пустые var count2 = allstock.sneakers.RemoveAll(x => x.sizes.Find(y => y.offers.Count > 0) == null); _logger.Info("Всего артикулов в фулкаталог: " + fullCatalog.records.Count); _logger.Info("Всего артикулов оллсток: " + allstock.sneakers.Count); DeleteRussianOffersFromAllStock(allstock); _logger.Info("Артикулов в оллсток после удаления предложений из русских магазинов: " + allstock.sneakers.Count); _logger.Info("Размеров в оллсток: " + allstock.GetCountSizes()); var count3 = allstock.sneakers.RemoveAll(x => x.sizes.FindAll(y => y.offers.Count > 0) == null); BonanzaRoot bonanza = CreateBonanzaRecords_MultiListing(allstock, fullCatalog); _logger.Info("Создано записей бонанзы: " + bonanza.Records.Count); bonanza.update_date = DateTime.Now; //AddUPC(bonanza); SaveJson(bonanza); SaveCSV(bonanza); }
public void Run() { var discontSamara = DiscontSamaraParser.LoadLocalFileJson(); fullCatalog = FullCatalog2.LoadLocalFile(); var shopifyRecords = CreateShopifyRecords(discontSamara); }
/// <summary> /// беру файл оллстока и создаю xml файл для авито /// </summary> public static void Run() { DateTime startTime = new DateTime(2017, 04, 17, 07, 00, 00, DateTimeKind.Local); //запуск 17 апреля в 7 утра var allstock = AllStockExporter2.LoadLocalFile(); var fullCatalog = FullCatalog2.LoadLocalFile(); AvitoAds avito = createAds(allstock, fullCatalog, startTime); //удалим все детские кроссы avito.AdList.RemoveAll(x => x.Category == "Детская одежда и обувь"); SaveToJson(avito, FolderName); //AvitoAds avito2 = LoadFromJson(); SaveToXml(avito, FolderName); ReplaceChecialCharacterInXml(FolderName); UploadXmlToFtp(FolderName, "Avito"); }
/// <summary> /// берем оллсток2, берем фулкаталог /// проходимся по оллстоку 2 и для каждого размера создает запись бонанзы /// формируем цену и другие данные /// в конце проходимся по всему каталогу и добавляем upc /// </summary> public static void Run() { var allstock = AllStockExporter2.LoadLocalFile(); var fullCatalog = FullCatalog2.LoadLocalFile(); allstock.sneakers = allstock.sneakers.FindAll(x => x.category != "kids").ToList(); fullCatalog.records = fullCatalog.records.FindAll(x => x.category != "kids").ToList(); BonanzaRoot bonanza = CreateBonanzaRecords(allstock, fullCatalog); bonanza.update_date = DateTime.Now; //AddUPC(bonanza); SaveJson(bonanza); SaveCSV(bonanza); }
/// <summary> /// беру файл оллстока и создаю xml файл для авито /// </summary> public static new void Run() { DateTime startTime = new DateTime(2017, 06, 04, 00, 00, 00, DateTimeKind.Local); // 8 мая в 7 утра //var allstock = AllStockExporter2.LoadLocalFile(); var discontSamara = DiscontMskNovoslobParser.LoadLocalFileJson(); var fullCatalog = FullCatalog2.LoadLocalFile(); AvitoAds avito = createAds(discontSamara, fullCatalog, startTime); //todo отсортировать артикулы по возрастанию или убыванию артикулов. чтобы всегда был единый порядок SaveToJson(avito, FolderName); //AvitoAds avito2 = LoadFromJson(); SaveToXml(avito, FolderName); ReplaceChecialCharacterInXml(FolderName); //UploadXmlToFtp(FolderName,"Avito"); }
private static HotOffersRoot GetHotOffers(AllStockRoot allStock) { /* Как определить лучшее предолжение? Горячий пирожок? Как найти самые большие скидки в нашей базе данных? * Я думаю что для нас выгодными будут предложения, которые с учетом доставки и ват будут на 30% или даже дешевле чем ритейл цена. * Что такое горячий пирожок? Это артикул, у которого есть несколько размеров, удовлетворяющих этому условию * Что мы заносим в пирожок? * - артикул, * - цену себестоимости, * - размеры которые попадают под это условия. * - на каждый размер: * - ссылка на магазин, где можно купить по этой цене данный размер * - ссылки на изображения с нашего сервака (несколько изображений) * - цена этого размера * - максимальную цену среди всех размеров (какие-то размеры дешевле, какие-то дороже * чтобы определить ритейл цену, берем среднюю цену без учета скидки всех размеров всех офферов */ double minMargin = MIN_NEED_MARGIN; //минимальная маржа в долларах с пирожка. То есть минимальная стоимость разницы между ритейл ценой и себест. с доставкой и вычетом ват double minSalePercent = 0.3; //минимальная скидка в процентах var myHotOffers = new HotOffersRoot(); FullCatalogRoot fullCatalog = FullCatalog2.LoadFullCatalogFromFtp(); foreach (var sneaker in allStock.sneakers) { var hOffer = GetHotOfferFromAllStockSneaker(sneaker, fullCatalog, minMargin, minSalePercent); if (hOffer != null) { myHotOffers.offers.Add(hOffer); } } if (myHotOffers.offers.Count > 0) { return(myHotOffers); } else { return(null); } }
public VkExporter() { Allstock = AllStockExporter2.LoadLocalFile(); FullCatalog = FullCatalog2.LoadLocalFile(); Posting = new VkPosting(); }
// ReSharper disable once RedundantAssignment public static void Main(string[] args) { #if Feanor Logger.Info("Feanor mode!"); args = new[] { "-DownloadImage" }; //args = new string[] { "-afew" }; //args = new string[] { "-bonanza_export" }; //args = new string[] { "-upcdb" }; //args = new string[] { "-nashStockParseCSVinJSONandGoToFTP" }; //args = new string[] { "-basketshop_einhalb_queens" }; #elif DEBUG Logger.Info("Debug mode!"); args = new[] { "-debug" }; //args = new[] { "-snkrs.com" }; //args = new[] { "-ValidateAllShops" }; //args = new[] { "-DbCreate" }; //args = new[] { "-DbController.DownloadImages" }; //args = new[] { "-BonanzaExport3OnlyBonanza" }; //args = new[] { "-BonanzaExport3" }; //args = new[] { "-LoadVkGoods" }; //args = new[] { "-SivasAB" }; //args = new[] { "-PostHotOfferVk" }; //args = new[] { "-SivasAB" }; //args = new[] { "-snsAllBrands" }; //args = new[] { "-OnlyBonanzaExport2" }; //args = new[] { "-BonanzaExport2" }; //args = new[] { "-AvitoNovoslob" }; #else Console.WriteLine("Release mode!"); #endif var startTime = DateTime.Now; if (args.Count() > 0) { Logger.Info("Параметр:" + args[0]); if (args[0] == "-AvitoNovoslob") { //парсим файл дисконта, создаем csv и json файлы //DiscontMskNovoslobParser novoslobParser = new DiscontMskNovoslobParser(); //novoslobParser.Run(); //добавляем инфу в фулкаталог //FullCatalog2.Run(); Logger.Info("FullCatalog2 created"); //подгружаем фотки //FullCatalog2.UpdateFullCatalogImages(); //FullCatalog2.LoadImagesToFullCatalogFromImagesFolder(); Logger.Info("FullCatalog2 images updated"); //делаем фид ля авито AvitoMskNovoslobExporter.Run(); Logger.Info("Avito Feed created"); } if (args[0] == "-SivasAB") { SivasParserAB sivasParserAb = new SivasParserAB(); sivasParserAb.Run(); } if (args[0] == "-snkrs.com") { SnkrsComParserAllBrands snrks = new SnkrsComParserAllBrands(); snrks.Run(); } if (args[0] == "-snsAllBrands") { SneakersnstuffParserAllBrands snsAllBrands = new SneakersnstuffParserAllBrands(); //snsAllBrands.ParseOneSneaker("https://www.sneakersnstuff.com/en/product/25821/reebok-question-lux"); snsAllBrands.Run(); } if (args[0] == "-LoadVkGoods") { var vkExporter = new VkExporter(); vkExporter.Run(); } if (args[0].Equals("-feanor")) { //Bitmap image1 = (Bitmap)Image.FromFile(@"C:\test\test.jpg", true); //var color0 = image1.GetPixel(0, 0); //var color1 = image1.GetPixel(1, 0); //var color2 = image1.GetPixel(0, image1.Height - 1); //var color3 = image1.GetPixel(1, image1.Height - 1); //var blackLine = true; ////string hex = "#FFFFFF"; ////Color _color = System.Drawing.ColorTranslator.FromHtml(hex); //for (var i = 0; i < image1.Width; i++) //{ // var color = image1.GetPixel(i, image1.Height - 1); // if (color.B < 253 && color.G < 253 && color.R < 253) // { // blackLine = false; // } //} //Console.WriteLine("blackLine"); //var vkExporter = new VkExporter(); //vkExporter.Run(); //var id = 798354; //var array = new List<string> //{ // "http://img.sneaker-icon.ru/shops/16/images/860558-001-1.jpg", // "http://img.sneaker-icon.ru/shops/16/images/860558-001-2.jpg", // "http://img.sneaker-icon.ru/shops/16/images/860558-001-3.jpg", // "http://img.sneaker-icon.ru/shops/16/images/860558-001-4.jpg" //}; //var sizeArray = new List<Size> //{ // new Size("brand", "category", "us1", "eu1", "uk1", "cm1", "ru1"), // new Size("brand", "category", "us2", "eu2", "uk2", "cm2", "ru2"), // new Size("brand", "category", "us3", "eu3", "uk3", "cm3", "ru3"), // new Size("brand", "category", "us4", "eu4", "uk4", "cm4", "ru4"), // new Size("brand", "category", "us5", "eu5", "uk5", "cm5", "ru5") //}; //var vkGood = new VkGoodsItem() //{ // Name = "NoName", // Description = "Other Description", // Price = 500, // Images = array, // Sizes = sizeArray //}; //var vk = new VkPosting(); ////var idAdd = vk.AddOrEditVkGoods(vkGood, 798354); //vk.DeleteVkGoods(id); } if (args[0] == "-bonanza_export") { // ReSharper disable once UnusedVariable CreateCatalog createCatalog = new CreateCatalog(); FullCatalog.CleanFullCatalog(); //очищаем каталог от левых артикулов, поправляем названия и бренды. костыль Logger.Info("FullCatalog created"); CurrencyRate currate = new CurrencyRate(); currate.Run(); AllStockExporter exporter = new AllStockExporter(); exporter.CreateAllStockList(); Logger.Info("AllStock created"); BonanzaExporter bonanza = new BonanzaExporter(); bonanza.Run(); Logger.Info("Bonanza created"); TiuExporter tiu = new TiuExporter(); tiu.Run(); Logger.Info("Tiu created"); SneakerIconExporter sneakerIconExporter = new SneakerIconExporter(); sneakerIconExporter.Run(); Logger.Info("Sneaker-icon.ru.csv created"); //FullCatalog2.Run(); //Console.WriteLine("FullCatalog2 created"); //FullCatalog2.PostNewTodayItems(); //AllStockExporter2.Run(); //Console.WriteLine("AllStock2 created"); } if (args[0] == "-BonanzaExport2") { FullCatalog2.Run(); Logger.Info("FullCatalog2 created"); FullCatalog2.UpdateFullCatalogImages(); FullCatalog2.LoadImagesToFullCatalogFromImagesFolder(); Logger.Info("FullCatalog2 images updated"); AllStockExporter2.Run(); Logger.Info("AllStock2 created"); BonanzaExporter2.Run(); Logger.Info("Bonanza2 created"); } if (args[0] == "-OnlyBonanzaExport2") { BonanzaExporter2.Run(); Logger.Info("Bonanza2 created"); } if (args[0] == "-ValidateAllShops") { ValidatorAllBrands.ValidateAllShops(); } if (args[0] == "-DbCreate") { var db = new DbController(); db.Create(); Logger.Info("DB created"); } if (args[0] == "-DbController.DownloadImages") { DbController.DownloadImages(); } if (args[0] == "-BonanzaExport3OnlyBonanza") { BonanzaExporterAllBrands bnnzAllBrands = new BonanzaExporterAllBrands(); bnnzAllBrands.Run(); } if (args[0] == "-BonanzaExport3") { ValidatorAllBrands.ValidateAllShops(); DbController db = new DbController(); db.Create(); Logger.Info("DB created"); DbController.DownloadImages(); BonanzaExporterAllBrands bnnzAllBrands = new BonanzaExporterAllBrands(); bnnzAllBrands.Run(); } if (args[0] == "-sivas_sale_parser") { CurrencyRate currate = new CurrencyRate(); currate.Run(); SivasSaleParser sivasSale = new SivasSaleParser(); sivasSale.Run(); } if (args[0] == "-basketshop") { BasketShopParser basketShopParser = new BasketShopParser(); basketShopParser.Update(); } if (args[0] == "-einhalb") { //BasketShopParser basketShopParser = new BasketShopParser(); EinhalbParser einhalpParser = new EinhalbParser(); //QueensParser queensParser = new QueensParser(); //basketShopParser.Update(); einhalpParser.Update(); //queensParser.Update(); } if (args[0] == "-queens") { //BasketShopParser basketShopParser = new BasketShopParser(); //EinhalbParser einhalpParser = new EinhalbParser(); QueensParser queensParser = new QueensParser(); //basketShopParser.Update(); //einhalpParser.Update(); queensParser.Update(); } if (args[0] == "-basketshop_einhalb_queens") { BasketShopParser basketShopParser = new BasketShopParser(); EinhalbParser einhalpParser = new EinhalbParser(); QueensParser queensParser = new QueensParser(); basketShopParser.Update(); einhalpParser.Update(); queensParser.Update(); } if (args[0] == "-streetbeat") { //парсится 1 минуту StreetBeatParser strbeatParse = new StreetBeatParser(); strbeatParse.Update(); } if (args[0] == "-sneakersnstuff") { //70 минут парсится SneakersnstuffParser sneakerStuff = new SneakersnstuffParser(); sneakerStuff.Run(); } if (args[0] == "-SivasAllBrands") { SivasParserAB siavParserAb = new SivasParserAB(); siavParserAb.Run(); } if (args[0] == "-overkillshop") { //14 минут парсится OverkillshopParser overkillshop = new OverkillshopParser(); overkillshop.Run(); } if (args[0] == "-afew") { AfewStoreParser afew = new AfewStoreParser(); afew.Run(); } if (args[0] == "-suppa") { //7 минут парсится SuppaStoreParser suppa = new SuppaStoreParser(); suppa.Run(); } if (args[0] == "-chmielna") { //3 минуты парсится ChmielnaParser chmielna = new ChmielnaParser(); chmielna.Run(); } if (args[0] == "-viktor") { SivasParser sivas = new SivasParser(); sivas.Run2(); SolehavenParser solehaven = new SolehavenParser(); solehaven.Run(); TitoloParser titolo = new TitoloParser(); titolo.Run2(); BdgastoreParser bdgastore = new BdgastoreParser(); bdgastore.Run(); AsphaltgoldParser asfaltgold = new AsphaltgoldParser(); asfaltgold.Run(); NashStockParser nashStockParser = new NashStockParser(); nashStockParser.Run(); DiscontSamaraParser discont = new DiscontSamaraParser(); discont.Run(); } if (args[0] == "-upcdb") { for (var i = 0; i < 300; i++) { var upcdb = new UPCDB(); upcdb.run3(10); } } if (args[0] == "-UpdateFullCatalogImages") { FullCatalog2.UpdateFullCatalogImages(); FullCatalog2.LoadImagesToFullCatalogFromImagesFolder(); } if (args[0] == "-HotOffers") { //HotOffers.Run(); FullCatalog2.PostNewTodayItems(); HotOffers.Run2(5); } if (args[0] == "-NewToday") { FullCatalog2.PostNewTodayItems(); } if (args[0] == "-DownloadImage") { var imageDownload = new ImageDownload(); imageDownload.Run(); } if (args[0] == "-DownloadImageForStock") { var imageDownload = new ImageDownload(); try { Logger.Debug("Введите номер стока"); var numberString = Console.ReadLine(); Logger.Debug("Номер стока " + numberString); if (numberString == null) { throw new NullReferenceException("numberString = null"); } var number = int.Parse(numberString); imageDownload.RunForStock(number); } catch (Exception e) { Logger.Error(e, "Ошибка при распознавании номера стока"); } } if (args[0] == "-Avito") { AvitoExporter3.Run(); } if (args[0] == "-AvitoDiscontSamaraToSamara") { AvitoDiscontSamaraToSamara.Run(); } if (args[0] == "-PostHotOfferVk") { var rnd = new Random().Next(61); //случайная задержка в минутах Logger.Info("Задержка: " + rnd); Thread.Sleep(rnd * 60 * 1000); HotOffers.PostVkRandomOffer(); } if (args[0] == "-DiscontParsing") { //из файла самарского дисконта делаем лист стокрекорд //csv файл должен быть в формате utf-8 и разделен точкой с запятой DiscontStock dStock = new DiscontStock(); dStock.ParseStockOnHand(Config.GetConfig().DirectoryPath + @"Parsing\discont\Stock On Hand.csv"); dStock.SaveStockToCSV(Config.GetConfig().DirectoryPath + @"Parsing\discont\StockDiscont.csv"); dStock.ParseStockOnHand2(Config.GetConfig().DirectoryPath + @"Parsing\discont\Stock On Hand.csv"); dStock.SaveStockToCSV2(Config.GetConfig().DirectoryPath + @"Parsing\discont\StockDiscont2.csv"); } if (args[0] == "-AllBrandsDownloadImages") { DbController.DownloadImages(); } if (args[0] == "-debug") { var lodkiLarisa = new LarisaLodki(); var lodki = lodkiLarisa.ParseLodki(); //var upwork = new UpworkCarelulu(); //upwork.Run(); //PortfolioMobiInterestComUpworkParser.Run(); //var d = Parser.GetHtmlPagePhantomJs("http://httpbin.org/ip"); //SizeChartAllBrands sizeChartAllBrands = new SizeChartAllBrands(); //sizeChartAllBrands.LoadSizeChartFromFtp(); //ShopValidatorAllBrands validator = new ShopValidatorAllBrands(); //validator.ValidateShop("snkrs.com"); //MyTelegram.PostMessageWaitRelease("test"); //BonanzaExporterAllBrands bnnzAllBrands = new BonanzaExporterAllBrands(); //bnnzAllBrands.Run(); //AvitoDiscontSamaraToSamara.Run(); //ValidatorAllBrands.ValidateAllShops(); //DbController.Update(); //var upcdb = new upcdb(); //upcdb.run2(); //Test.Crawlera(); //Test.Upcdb(); //AllStockExporter2.Run(); //FullCatalog.CleanFullCatalog(); //CreateCatalog createCatalog = new CreateCatalog(); //Console.WriteLine("FullCatalog created"); //FullCatalog.SaveCatalogToJson(); //FullCatalog2.Run(); //FullCatalog2.DeleteDuplicateItems(); //FullCatalog2.UpdateFullCatalogImages(); //NashStockParser nashStockParser = new NashStockParser(); //nashStockParser.Run(); //HotOffers.Run2(1); //FullCatalog2.Run(); //Console.WriteLine("FullCatalog2 created"); //AllStockExporter2.Run(); //Console.WriteLine("AllStock2 created"); //FullCatalog2.PostNewTodayItems(); //AllStockExporter2.TestForDima(); // var imageDownload = new ImageDownload(); //imageDownload.Run(); //Helper.TelegramPost("test message", "-1001116441282"); //AvitoExporter3.SaveToXml(null); //AvitoExporter3.Run(); //BonanzaExporter2.Run(); //BonanzaExporter2.Run2_MultiListing(); //Validator.ValidateAllShops(); //EinhalbParser einhalpParser = new EinhalbParser(); //einhalpParser.Run(); //Test.SortAllStock(); //Test.PostVk(); //FullCatalog2.DetectCategoryFromTitleAndUpdateFullCatalog(); //var hotOffers = HotOffers.CreateHotOffers(); //HotOffers.PostVkRandomOffer(); //Test.LoadVkGoods(); //FullCatalog2.LoadImagesToFullCatalogFromImagesFolder(); //SneakersnstuffParserAllBrands snsAllBrands = new SneakersnstuffParserAllBrands(); //snsAllBrands.ParseOneSneaker("https://www.sneakersnstuff.com/en/product/25821/reebok-question-lux"); //snsAllBrands.Run(); } } else { Logger.Warn("Программа запущена без параметров"); } //SivasParser sivas = new SivasParser(); //sivas.Update(); //TitoloParser titolo = new TitoloParser(); //titolo.Run(); //basketShopParser.Run(); //einhalpParser.Run(); //queensParser.Run(); //strbeatParse.Run(); //sivas.Run(); //DiscontStock dStock = new DiscontStock(); //dStock.ReadStockFromCSV(); //dStock.AddSaleToRecords(); //dStock.SaveStockToCSV(); //из файла кузьминок делает лист стокрекорд //DiscontStock dStock = new DiscontStock(); //dStock.ParseStockOnHand(@"C:\Users\Администратор\YandexDisk\fullCatalogSneaker-icon\Parsing\discont_msk_kuzminki\Stock On Hand.csv"); //dStock.SaveStockToCSV(@"C:\Users\Администратор\YandexDisk\fullCatalogSneaker-icon\Parsing\discont_msk_kuzminki\StockDiscont.csv"); //dStock.ParseStockOnHand2(@"C:\Users\Администратор\YandexDisk\fullCatalogSneaker-icon\Parsing\discont_msk_kuzminki\Stock On Hand.csv"); //dStock.SaveStockToCSV2(@"C:\Users\Администратор\YandexDisk\fullCatalogSneaker-icon\Parsing\discont_msk_kuzminki\StockDiscont2.csv"); //из файла самарского дисконта делаем лист стокрекорд //csv файл должен быть в формате utf-8 и разделен точкой с запятой //DiscontStock dStock = new DiscontStock(); //dStock.ParseStockOnHand(Settings.DIRECTORY_PATH + @"Parsing\discont\Stock On Hand.csv"); //dStock.SaveStockToCSV(Settings.DIRECTORY_PATH + @"Parsing\discont\StockDiscont.csv"); //dStock.ParseStockOnHand2(Settings.DIRECTORY_PATH + @"Parsing\discont\Stock On Hand.csv"); //dStock.SaveStockToCSV2(Settings.DIRECTORY_PATH + @"Parsing\discont\StockDiscont2.csv"); //string StockDiscont2 = @"C:\Users\Администратор\YandexDisk\fullCatalogSneaker-icon\Parsing\discont\StockDiscont2.csv"; //var discont = new DiscontStock(); //discont.ReadStockFromCSV2(StockDiscont2); //bool isTrue = discont.AddStandtoRecords(); //if (isTrue) discont.SaveStockToCSV2(StockDiscont2); //AmazonExporter amazonExporter = new AmazonExporter(); //amazonExporter.run2(); //AmazonExporter amazonExporter = new AmazonExporter(); //amazonExporter.run3(); //AmazonExporter amazonExporter = new AmazonExporter(); //amazonExporter.run3(); //BonanzaExporterAndrew bonanzaAndrew = new BonanzaExporterAndrew(); //bonanzaAndrew.Run(); //AvitoExporter avito = new AvitoExporter(); //AvitoExporter2 avito2 = new AvitoExporter2(); //avito2.Run(); //Test test = new Test(); //WithoutPhotoExporter withoutPhotoExporter = new WithoutPhotoExporter(); //C:\SneakerIcon\repository\SneakerIcon\ConsoleApplication1\Classes\Utils\NetworkUtils.cs //SizeConverter sc = new SizeConverter("8", "Мужская"); //string sizeEUR = sc.sizeEUR; //NashStock nashStock = new NashStock(); //nashStock.ReadStockFromCSV(); //var upcdb = new UPCDB(); //upcdb.run2(); //var addPhotos = new AddPhotos(); //addPhotos.Run(); //ModemReboot.Run(); //SizeConverter.GenerateNikeSizeChart(); if (args.Count() > 0) { Logger.Info("Параметр:" + args[0]); } var endTime = DateTime.Now; var dlit = endTime - startTime; Logger.Info("Начало выполнения программы: " + startTime); Logger.Info("Конец выполения программы: " + endTime); Logger.Info("Длительность выполения, минут: " + dlit.TotalMinutes); Logger.Info("Выполнение программы завершено, нажмите любую клавишу"); #if DEBUG Console.ReadLine(); #elif Feanor Console.ReadLine(); #else #endif }
public void SaveToFtp() { FullCatalog2.SaveFullCatalogToFtp(this); }