private static string GetBonanzaRecordDescription(AllStockSize asSize, AllStockSneaker asSneaker, FullCatalogRoot fullCatalog) { var boothUrl = System.Configuration.ConfigurationManager.AppSettings["bonanzaBoothUrl"]; var title = asSneaker.title; var sku = asSneaker.sku; var size = SizeChart.GetSizeStatic(new Size(asSneaker.brand, asSneaker.category, asSize.us, null, null, null, null)); if (size == null) { _logger.Warn("Ошибка в размере. sku: " + asSneaker.sku); return(null); } var sizeString = size.GetSizeStringUsEuUkCm(); string description = "<h3 style=\"text-align: center;\"><strong>" + title.ToUpper() + "</strong></h3>" + "<h3 style=\"text-align: center;\"><strong>" + "STYLE: " + sku + "</strong></h3>" + "<h3 style=\"text-align: center;\"><strong>" + "SIZE: " + sizeString + "</strong></h3>" + "<h3 style=\"text-align: center;\"><strong>" + "100% AUTHENTIC" + "</strong></h3>" + "<h3 style=\"text-align: center;\"><strong>" + "WORLDWIDE SHIPPING FOR 5-10 DAYS IN DOUBLE BOX WITH TRACKING NUMBER.<br>" + "</strong></h3>" + "<h3 style=\"text-align: center;\"><strong>" + "SHIP IN 2 BUSINESS DAY." + "</strong></h3>"; //description += "<h3 style=\"text-align: center;\"><strong>All sizes of this model available in stock</strong></h3>"; //if (sizeList != null) //{ // if (sizeList.Count > 0) // { // foreach (var size in sizeList) // { // //725076-301+6.5US // description += "<h4 style=\"text-align: center;\"><strong><a href=\"" + boothUrl + "?utf8=%E2%9C%93&item_sort_options%5Bfilter_string%5D=" + sku + "+" + size + "US&item_sort_options%5Bfilter_category_id%5D=&item_sort_options%5Bcustom_category_id%5D=&commit=Go\" rel=\"nofollow\" target=\"_blank\">Size " + size + " US</a></strong></h4>"; // } // } //} description += "<h3 style=\"text-align: center;\"><strong>" + "Other sizes of this model available in out stock: " + "<a href=\"" + boothUrl + "?utf8=%E2%9C%93&item_sort_options%5Bfilter_string%5D=" + sku + "&item_sort_options%5Bfilter_category_id%5D=&item_sort_options%5Bcustom_category_id%5D=&commit=Go\" rel=\"nofollow\" target=\"_blank\">Link</a>" + "</strong></h3>"; description += "<h3 style=\"text-align: center;\"><strong>" + "Please feel free to ask any questions and see <a href=\"" + boothUrl + "\" rel=\"nofollow\" target=\"_blank\">all our listings</a> for more great deals." + "</strong></h3>"; //throw new NotImplementedException(); return(description); }
private static AllStockSize CreateSize(ListingSize size, AllStockSneaker sneaker, Listing listing, RootParsingObject market, Shop jsonMarket) { var sizeAllStock = new AllStockSize(); if (size.us == null) { size.us = SizeConverters.SizeConverter.GetSizeUs(sneaker.brand, sneaker.category, size.eu, size.uk, size.cm); } if (size.us == null) { //значит размер левый или его нет в таблице размеров return(null); } else { if (listing.category != sneaker.category) { Program.Logger.Warn("wrong category. SKU:" + listing.sku + "\n" + "Listing Category: " + listing.category + ".\n" + "FullCatalog Category:" + sneaker.category + "\n" + "ListingTite: " + listing.title + "\n" + "Listing Link:" + listing.url); return(null); } var schSize = SizeChart.GetSizeStatic(new Size(sneaker.brand, sneaker.category, size.us, size.eu, size.uk, size.cm, size.ru)); if (schSize == null) { Program.Logger.Warn("wrong size. SKU:" + listing.sku + "\n" + "Listing Category: " + listing.category + ".\n" + "FullCatalog Category:" + sneaker.category + "\n" + "ListingTite: " + listing.title + "\n" + "Listing Link:" + listing.url); return(null); } sizeAllStock.us = size.us; sizeAllStock.sku2 = sneaker.sku + "-" + size.us; sizeAllStock.upc = size.upc; var offer = CreateOffer(listing, market, jsonMarket); sizeAllStock.offers.Add(offer); return(sizeAllStock); } }
private static AvitoAd GetAdFromSneaker(Listing sneaker, FullCatalogRecord fcSneaker, DateTime startTime, int position, int count) { AvitoAd Ad = new AvitoAd(); if (fcSneaker == null) { _logger.Warn("is not exist in fullcatalog sku:" + sneaker.sku); return(null); } _logger.Info("sku: " + sneaker.sku + " title: " + fcSneaker.title); if (String.IsNullOrWhiteSpace(sneaker.category)) { _logger.Warn("Skip sneaker. Reason: category is empty"); return(null); } else if (sneaker.category == "kids") { _logger.Info("skip sneaker. Reason: kids category"); return(null); } if (sneaker.sizes == null) { _logger.Warn("Skip sneaker. Reason: sizes is empty"); return(null); } if (sneaker.sizes.Count == 0) { _logger.Warn("Skip sneaker. Reason: sizes is empty. Sku:" + sneaker.sku); return(null); } if (fcSneaker.images == null) { _logger.Warn("Skip sneaker. Reason: images is empty. Sku: " + sneaker.sku); return(null); } else if (fcSneaker.images.Count == 0) { _logger.Warn("Skip sneaker. Reason: images is empty. Sku: " + sneaker.sku); return(null); } Ad.Id = sneaker.sku; //DateBegin /* нужно все объявления размазать на месяц (ну пусть будет на 30 дней). * допустим если у меня есть 3000 объявлений то это значит что нужно постить по 100 в день * Постить будем допустим с 7.00 утра 23.59. Получается 17 часов. это 61200 секунд. * Получается объявление нужно постить каждые 612 секунд, начиная с 7 утра * * В сутках 24 часа, это 86400 секунд. * В 30 днях 2 592 000 секунд * То есть если у нас есть 3000 объявлений, значит начиная с текущего момента нужно постить объявление каждые 864 секунды */ double delay = 2592000 / count * position; //todo сделать распределение на 10 часов а не 24 var intDelay = (int)delay; //Ad.DateBegin = startTime.AddSeconds(intDelay); //todo datebegin можно определить только после того, как известно точное кол-во выгружаемых позиций (с учетом отфильтрованных невалидных) //Ad.DateBegin = startTime; Ad.DateBegin = GetDateBegin(startTime, count, position, DaysPeriod, EndHour, StartHour); Ad.ManagerName = "Роман"; Ad.ContactPhone = "88002001121"; Ad.AllowEmail = "Да"; //Ad.Region = "Самарская область"; Ad.City = "Москва"; //goods type var category = fcSneaker.category; if (category == "men") { Ad.Category = "Одежда, обувь, аксессуары"; Ad.GoodsType = "Мужская одежда"; } else if (category == "women") { Ad.Category = "Одежда, обувь, аксессуары"; Ad.GoodsType = "Женская одежда"; } else if (category == "kids") { _logger.Info("skip sneaker. Reason: kids category"); return(null); } else { _logger.Warn("null or wrong category"); return(null); } Ad.Apparel = "Обувь"; //size //буду брать случайный русский размер из списка размеров, нужно будет округлить до целого var rnd2 = new Random().Next(sneaker.sizes.Count - 1); //todo брать только артикулы у которых 3 или больше размеров в наличии var sizeUsAllStock = sneaker.sizes[rnd2]; var sizeAllStock = new Size(sneaker.brand, sneaker.category, sizeUsAllStock.us, null, null, null, null); var sizeFromSizeChart = SizeChart.GetSizeStatic(sizeAllStock); if (sizeFromSizeChart == null) { Ad.Size = "Без размера"; } else { var ruSize = sizeFromSizeChart.ru.Replace(".", ","); double doubleRuSize = 0; if (Double.TryParse(ruSize, out doubleRuSize)) { Ad.Size = Math.Round(doubleRuSize, 0).ToString(); } else { Ad.Size = "Без размера"; } } if (Ad.Size == "Без размера") { _logger.Error("Wrong size: " + sizeUsAllStock.us); return(null); //if (sneaker.category == "men") // Ad.Size = "42"; //else if (sneaker.category == "women") // Ad.Size = "37"; //else if (sneaker.category == "kids") // Ad.Size = "35"; } //title var type = string.Empty; if (!string.IsNullOrWhiteSpace(fcSneaker.type)) { type = fcSneaker.type + " "; } Ad.Title = "Новые " + type + sneaker.title.ToLower(); if (Ad.Title.Length > 50) { Ad.Title = Ad.Title.Substring(0, 50); } Ad.Title = Helper.UpperFirstCharInWord(Ad.Title); //description var br = "\n"; var desc = "<![CDATA[" + br; if (fcSneaker.type == null) { fcSneaker.type = String.Empty; } desc += "<p>Новые оригинальные " + fcSneaker.type.ToLower() + " " + sneaker.title.ToUpper() + "</p>" + br; desc += "<p>Артикул: " + sneaker.sku + "</p>" + br; desc += "<p>В оригинальной упаковке Nike.</p>" + br; desc += "<p>БЕСПЛАТНАЯ доставка по Москве в день заказа или на следующий день</p>" + br; desc += "<p>Работаем 7 дней в неделю, без праздников и выходных</p>" + br; desc += "<p>Доставка по России 3-5 дней компанией СДЭК.</p>" + br; desc += "<p>Стоимость доставки по РФ - 300 рублей.</p>" + br; desc += "<p>Доставка по РФ только по 100% предоплате, наложенным платежом не отправляем</p>" + br; desc += "<p>Работаем с 2014 года, более 4000 моделей в ассортименте. Можете перейти в магазин авито (страница Контакты), потом на сайт и в группу Вконтакте, чтобы убедиться в том, что мы ПРОДАЕМ ТОЛЬКО ОРИГИНАЛЬНУЮ ОБУВЬ. НИКАКИХ ПОДДЕЛОК И РЕПЛИК!</p>" + br; desc += "<p>В нашей группе Вконтакте более 70 реальных отзывов от клиентов!</p>" + br; desc += "<p>Размеры в наличии:</p>" + br; desc += "<ul>" + br; foreach (var size in sneaker.sizes) { var scSize = SizeChart.GetSizeStatic(new Size(sneaker.brand, sneaker.category, size.us, null, null, null, null)); if (scSize != null) { desc += "<li>" + scSize.GetAllSizeString() + "</li>" + br; } } desc += "</ul>" + br; desc += "<p>Уточняйте наличие размеров.</p>" + br; desc += "<p>Если размера нет в наличии, возможно его можно привезти под заказ. Срок поставки товара под заказ: 7-10 дней. </p>" + br; desc += "<p>Sneaker Icon - это большой выбор оригинальной брендовой обуви Nike и Jordan. Кроссовки, кеды, бутсы, футзалки, шиповки, сланцы, ботинки и другие типы обуви</p>" + br; desc += "<p>БОЛЬШИЕ РАЗМЕРЫ: доставляем под заказ обувь до 55 размера, а также обувь двойной полноты стопы и другие редкие модели и размеры</p>" + br; desc += "<p>ДЛЯ СПОРТИВНЫХ КОМАНД: подбираем полные комплекты обуви, одежды и сопутствующих товаров для спортивных команд</p>" + br; desc += "<p>ДЛЯ ОПТОВИКОВ: отправляем в регионы оптом брендовую обувь, одежду и аксессуары по оптовым ценам.</p>" + br; desc += "<p>Звоните или пишите в сообщения Авито по всем вопросам</p>" + br; desc += "]]>"; Ad.Description = desc; //price Ad.Price = (int)sneaker.price + MARGIN; Ad.Images = fcSneaker.images; return(Ad); }
private static AvitoAd GetAdFromSneaker(Model.AllStock.AllStockSneaker sneaker, FullCatalogRecord fcSneaker, DateTime startTime, int position, int count) { AvitoAd Ad = new AvitoAd(); if (fcSneaker.images == null) { return(null); } if (fcSneaker.images.Count == 0) { return(null); } if (String.IsNullOrWhiteSpace(sneaker.category)) { return(null); } if (sneaker.sizes == null) { return(null); } if (sneaker.sizes.Count == 0) { return(null); } Ad.Id = sneaker.sku; //DateBegin /* нужно все объявления размазать на месяц (ну пусть будет на 30 дней). * допустим если у меня есть 3000 объявлений то это значит что нужно постить по 100 в день * Постить будем допустим с 7.00 утра 23.59. Получается 17 часов. это 61200 секунд. * Получается объявление нужно постить каждые 612 секунд, начиная с 7 утра * * В сутках 24 часа, это 86400 секунд. * В 30 днях 2 592 000 секунд * То есть если у нас есть 3000 объявлений, значит начиная с текущего момента нужно постить объявление каждые 864 секунды */ double delay = 2592000 / count * position; var intDelay = (int)delay; //Ad.DateBegin = startTime.AddSeconds(intDelay); Ad.DateBegin = startTime; Ad.ManagerName = "Евгений"; Ad.ContactPhone = "88002001121"; Ad.AllowEmail = "Да"; Ad.Region = "Москва"; //goods type if (sneaker.category == "men") { Ad.Category = "Одежда, обувь, аксессуары"; Ad.GoodsType = "Мужская одежда"; } else if (sneaker.category == "women") { Ad.Category = "Одежда, обувь, аксессуары"; Ad.GoodsType = "Женская одежда"; } else if (sneaker.category == "kids") { Ad.Category = "Детская одежда и обувь"; var rnd = new Random().NextDouble(); if (rnd > 0.5) { Ad.GoodsType = "Для девочек"; } else { Ad.GoodsType = "Для мальчиков"; } } Ad.Apparel = "Обувь"; //size //буду брать случайный русский размер из списка размеров, нужно будет округлить до целого var rnd2 = new Random().Next(sneaker.sizes.Count - 1); var sizeUsAllStock = sneaker.sizes[rnd2]; var sizeAllStock = new Size(sneaker.brand, sneaker.category, sizeUsAllStock.us, null, null, null, null); var sizeFromSizeChart = SizeChart.GetSizeStatic(sizeAllStock); if (sizeFromSizeChart == null) { Ad.Size = "Без размера"; } else { var ruSize = sizeFromSizeChart.ru.Replace(".", ","); double doubleRuSize = 0; if (Double.TryParse(ruSize, out doubleRuSize)) { Ad.Size = Math.Round(doubleRuSize, 0).ToString(); } else { Ad.Size = "Без размера"; } } if (Ad.Size == "Без размера") { if (sneaker.category == "men") { Ad.Size = "42"; } else if (sneaker.category == "women") { Ad.Size = "37"; } else if (sneaker.category == "kids") { Ad.Size = "35"; } } //title Ad.Title = "Новые оригинальные " + sneaker.title.ToUpper() + " " + sneaker.sku; if (Ad.Title.Length > 50) { Ad.Title = Ad.Title.Substring(0, 50); } //Ad.Title = Ad.Title.ToLower(); //description var br = "\n"; var desc = "<![CDATA[" + br; if (fcSneaker.type == null) { fcSneaker.type = String.Empty; } desc += "<p>Новые оригинальные " + fcSneaker.type.ToLower() + " " + sneaker.title.ToUpper() + "</p>" + br; desc += "<p>Артикул: " + sneaker.sku + "</p>" + br; desc += "<p>В оригинальной упаковке Nike.</p>" + br; desc += "<p>БЕСПЛАТНАЯ доставка по Москве</p>" + br; desc += "<p>Доставка по России 3-5 дней компанией СДЭК.</p>" + br; desc += "<p>Стоимость доставки по РФ - 300 рублей.</p>" + br; desc += "<p>Доставка в регионы только по 100% предоплате, наложенным платежом не отправляем</p>" + br; desc += "<p>Работаем с 2012 года, более 4000 моделей в ассортименте. Можете перейти в магазин авито (страница Контакты), потом на сайт и в группу Вконтакте, чтобы убедиться в том, что мы продаем только оригинальную обувь. Никаких подделок и реплик!</p>" + br; desc += "<p>В нашей группе Вконтакте более 70 реальных отзывов от клиентов!</p>" + br; desc += "<p>Размеры в наличии:</p>" + br; desc += "<ul>" + br; foreach (var size in sneaker.sizes) { var scSize = SizeChart.GetSizeStatic(new Size(sneaker.brand, sneaker.category, size.us, null, null, null, null)); var priceSize = size.offers[0].price_usd_with_delivery_to_usa_and_minus_vat; var priceSizeRub = (int)CurrencyRate.ConvertCurrency("USD", "RUB", priceSize) + MARGIN; if (scSize != null) { desc += "<li>" + scSize.GetAllSizeString() + ". Цена:" + priceSizeRub + "</li>" + br; } } desc += "</ul>" + br; desc += "<p>Уточняйте наличие размеров.</p>" + br; desc += "<p>Если размера нет в наличии, можем его привезти под заказ. Срок поставки товара под заказ: 7-10 дней. </p>" + br; desc += "<p>Sneaker Icon - это большой выбор оригинальной брендовой обуви Nike и Jordan. Кроссовки, кеды, бутсы, футзалки, шиповки, сланцы, ботинки и другие типы обуви</p>" + br; desc += "<p>Звоните или пишите в сообщения Авито по всем вопросам</p>" + br; desc += "]]>"; Ad.Description = desc; //price var priceUsd = sneaker.GetMinPrice(); var priceRub = CurrencyRate.ConvertCurrency("USD", "RUB", priceUsd); var pricetest = (int)priceRub + MARGIN; Ad.Price = (int)Math.Round(priceRub, 0) + MARGIN; Ad.Images = fcSneaker.images; return(Ad); }
private VkGoodsItem PostItemToVk(FullCatalogRoot fullCatalog, AllStockSneaker artikul, VkGoodsRoot oldVkGoodsRoot) { try { var task = new VkTask(); var fcSneaker = fullCatalog.records.Find(x => x.sku == artikul.sku); if (fcSneaker.images == null) { return(null); } if (fcSneaker.images.Count == 0) { return(null); } if (string.IsNullOrWhiteSpace(artikul.category)) { return(null); } if (artikul.sizes == null) { return(null); } if (artikul.sizes.Count == 0) { return(null); } task.Header = artikul.title.ToUpper() + " " + fcSneaker.sku; var sizeBlock = ""; foreach (var size in artikul.sizes) { var scSize = SizeChart.GetSizeStatic(new Size(artikul.brand, artikul.category, size.us, null, null, null, null)); var priceSize = size.offers[0].price_usd_with_delivery_to_usa_and_minus_vat; var priceSizeRub = (int)CurrencyRate.ConvertCurrency("USD", "RUB", priceSize) + Margin; if (scSize != null) { sizeBlock += scSize.GetAllSizeString() + ". Цена:" + priceSizeRub + Environment.NewLine; } } var start = fcSneaker.type.ToLower() + " " + artikul.title.ToUpper() + Environment.NewLine; task.Description = start.Substring(0, 1).ToUpper() + start.Remove(0, 1); task.Description += "Артикул: " + artikul.sku + Environment.NewLine; task.Description += "В оригинальной упаковке Nike." + Environment.NewLine; task.Description += "БЕСПЛАТНАЯ доставка по Москве" + Environment.NewLine; task.Description += "Доставка по России 3-5 дней компанией СДЭК." + Environment.NewLine; task.Description += "Стоимость доставки по РФ - 300 рублей." + Environment.NewLine; task.Description += "Доставка в регионы только по 100% предоплате, наложенным платежом не отправляем" + Environment.NewLine; task.Description += "Работаем с 2012 года, более 4000 моделей в ассортименте. Можете перейти в группу Вконтакте, чтобы убедиться в том, что мы продаем только оригинальную обувь. Никаких подделок и реплик!" + Environment.NewLine; task.Description += "В нашей группе Вконтакте более 70 реальных отзывов от клиентов!" + Environment.NewLine; task.Description += "Размеры в наличии:" + Environment.NewLine; task.Description += sizeBlock; task.Description += "Уточняйте наличие размеров." + Environment.NewLine; task.Description += "Если размера нет в наличии, можем его привезти под заказ. Срок поставки товара под заказ: 7-10 дней." + Environment.NewLine; task.Description += "Sneaker Icon - это большой выбор оригинальной брендовой обуви Nike и Jordan. Кроссовки, кеды, бутсы, футзалки, шиповки, сланцы, ботинки и другие типы обуви" + Environment.NewLine; var priceUsd = artikul.GetMinPrice(); var priceRub = (int)CurrencyRate.ConvertCurrency("USD", "RUB", priceUsd) + Margin; task.Price = priceRub; task.ImageList = fcSneaker.images; task.CollectionList = GetCollectionsName(fcSneaker.sku); //todo пока так. Нормально удаление сделаю, как попросят. task.IsDeleted = false; task.SKU = fcSneaker.sku; var oldItem = oldVkGoodsRoot.Records.Where(x => x.SKU != null).FirstOrDefault(x => x.SKU.Equals(fcSneaker.sku)); var result = Posting.AddOrEditVkGoods(task, oldItem); if (result != null) { //todo подумать над информативностью. Тут не только именно отправленные данные. _logger.Debug($"В товары ВК отправлен SKU {fcSneaker.sku} ID {result.VkId}"); } return(result); } catch (Exception e) { _logger.Error(e, "Ошибка при добавлении товара в ВК"); _logger.Error(e.StackTrace); return(null); } }