/// <summary> /// /// </summary> /// <param name="funding"></param> /// <returns></returns> public async Task <bool> FundNoobWallet(Funding funding) { var wallet = GetWalletById(funding.DestinationId); if (funding.CurrencyId == wallet.CurrencyId) { wallet.Balance += funding.Amount; _transactionRepository.CreateTransaction(TransactionType.Credit, funding.Amount, wallet.Id, wallet.CurrencyId); } else { var targetCode = _currencyRepository.GetCurrencyCode(wallet.CurrencyId); var sourceCode = _currencyRepository.GetCurrencyCode(funding.CurrencyId); var newAmount = await CurrencyRate.ConvertCurrency(sourceCode, targetCode, funding.Amount); wallet.Balance += newAmount ?? 0; _transactionRepository.CreateTransaction(TransactionType.Credit, newAmount ?? 0, wallet.Id, funding.CurrencyId); } return(await UpdateWallet(wallet)); }
/// <summary> /// /// </summary> /// <param name="withdrawalDto"></param> /// <returns></returns> public async Task <bool> WithdrawFromWallet(WithdrawalDto withdrawalDto) { var wallet = GetWalletById(withdrawalDto.WalletId); if (wallet.CurrencyId == withdrawalDto.CurrencyId) { if (!CanWithdrawFromWallet(wallet.Balance, withdrawalDto.Amount)) { return(false); } wallet.Balance -= withdrawalDto.Amount; _transactionRepository.CreateTransaction(TransactionType.Debit, withdrawalDto.Amount, withdrawalDto.WalletId, withdrawalDto.CurrencyId); } else { var targetCode = _currencyRepository.GetCurrencyCode(wallet.CurrencyId); var sourceCode = _currencyRepository.GetCurrencyCode(withdrawalDto.CurrencyId); var newAmount = await CurrencyRate.ConvertCurrency(sourceCode, targetCode, withdrawalDto.Amount); if (!CanWithdrawFromWallet(wallet.Balance, newAmount)) { return(false); } wallet.Balance -= newAmount ?? 0; _transactionRepository.CreateTransaction(TransactionType.Debit, newAmount ?? 0, withdrawalDto.WalletId, withdrawalDto.CurrencyId); } return(await UpdateWallet(wallet)); }
private static double GetAverageRegularPrice(AllStockSneaker sneaker) { //определяем среднюю ритейл цену этого кросса в долларах var regPriceList = new List <double>(); foreach (var size in sneaker.sizes) { foreach (var offer in size.offers) { var regPrice = offer.price; if (offer.old_price != 0) { regPrice = offer.old_price; } var regPriceUsd = CurrencyRate.ConvertCurrency(offer.currency, "USD", regPrice); regPriceList.Add(regPriceUsd); } } double sum = 0; foreach (var price in regPriceList) { sum += price; } double average = sum / regPriceList.Count; return(Math.Round(average, 2)); }
/// <summary> /// /// </summary> /// <param name="main"></param> /// <param name="source"></param> /// <returns></returns> public async Task <bool> FundWallet(Wallet main, Wallet source) { //var wallet = GetWalletById(funding.DestinationId); if (main.CurrencyId == source.CurrencyId) { main.Balance += source.Balance; _transactionRepository.CreateTransaction(TransactionType.Credit, source.Balance, main.Id, source.CurrencyId); } else { var targetCode = _currencyRepository.GetCurrencyCode(main.CurrencyId); var sourceCode = _currencyRepository.GetCurrencyCode(source.CurrencyId); var newAmount = await CurrencyRate.ConvertCurrency(sourceCode, targetCode, source.Balance); main.Balance += newAmount ?? 0; _transactionRepository.CreateTransaction(TransactionType.Credit, newAmount ?? 0, main.Id, source.CurrencyId); } return(await UpdateWallet(main)); }
/// <summary> /// /// </summary> /// <param name="updateWalletDto"></param> /// <returns></returns> public async Task <bool> UpdateWallet(UpdateWalletDto updateWalletDto) { var walletToUpdate = GetWalletById(updateWalletDto.WalletId); if (walletToUpdate.CurrencyId != updateWalletDto.CurrencyId) { var targetCode = _currencyRepository.GetCurrencyCode(updateWalletDto.CurrencyId); var sourceCode = _currencyRepository.GetCurrencyCode(walletToUpdate.CurrencyId); var newAmount = await CurrencyRate.ConvertCurrency(sourceCode, targetCode, walletToUpdate.Balance); walletToUpdate.CurrencyId = updateWalletDto.CurrencyId; walletToUpdate.Balance = newAmount ?? 0; } return(await UpdateWallet(walletToUpdate)); }
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 static async void PostPrivateToTelegram(HotOffer offer) { var message = "Горячее предложение\n" + "Название: " + offer.title + " \n" + "Артикул: " + offer.sku + "\n"; var regPriceRub = CurrencyRate.ConvertCurrency("USD", "RUB", offer.regular_price); message += "Цена в розницу: " + offer.regular_price + " USD = " + regPriceRub + " RUB\n"; var ourPriceRub = CurrencyRate.ConvertCurrency("USD", "RUB", offer.our_price); message += "Наша цена со скидкой: " + offer.our_price + " USD = " + ourPriceRub + "RUB\n"; var rusCategory = Helper.ConvertEngToRusCategory(offer.sizes[0].size.category); message += "Категория: " + rusCategory + "\n"; //sizes message += "\nДоступные размеры:\n"; var sizeChart = SizeChart.ReadSizeChartJson(); var shops = new List <string>(); var sizesUS = new List <string>(); var ourPrices = new List <double>(); foreach (var offerSize in offer.sizes) { var size = sizeChart.GetSize(offerSize.size); if (size != null) { message += size.us + " US / " + size.eu + " EU / " + size.uk + " UK / " + size.cm + " CM \n"; ourPrices.Add(offerSize.price); //message += offerSize.price + "USD (with ship and return vat) \n"; if (!shops.Contains(offerSize.url)) { shops.Add(offerSize.url); } //message += offerSize.url + "\n"; } else { Program.Logger.Warn("Ошибка в размере " + offer.title + " " + offer.sku); } } //our prices message += "\nНаша цена (с доставкой до РФ и вычетом VAT если есть)\n"; foreach (var offerSize in offer.sizes) { var rubPrice = CurrencyRate.ConvertCurrency("USD", "RUB", offerSize.price); message += offerSize.size.us + " US: " + offerSize.price + "USD = " + rubPrice + "RUB\n"; } //shops message += "\nОткуда брать:\n"; foreach (var url in shops) { message += url + "\n"; } //images message += "\nИзображения:\n"; foreach (var image in offer.images) { message += image + "\n"; } var chatId = "-1001101919442"; await Helper.TelegramPost(message, chatId); }
private static async void PostPublicToTelegram(HotOffer offer) { var message = "Горячее предложение\n" + "Название: " + offer.title + " \n" + "Артикул: " + offer.sku + "\n"; var rusCategory = Helper.ConvertEngToRusCategory(offer.sizes[0].size.category); message += "Категория: " + rusCategory + "\n"; message += "\nЦены: \n"; var regPriceRub = CurrencyRate.ConvertCurrency("USD", "RUB", offer.regular_price); message += "Ритейл: " + offer.regular_price + " USD = " + regPriceRub + " RUB\n"; var price = offer.our_price + MARGIN_USD; var ourPriceRub = CurrencyRate.ConvertCurrency("USD", "RUB", price); message += "Наша: " + price + " USD = " + ourPriceRub + "RUB\n"; //sizes message += "\nДоступные размеры:\n"; var sizeChart = SizeChart.ReadSizeChartJson(); var shops = new List <string>(); var sizesUS = new List <string>(); var ourPrices = new List <double>(); foreach (var offerSize in offer.sizes) { var size = sizeChart.GetSize(offerSize.size); if (size != null) { message += size.us + " US / " + size.eu + " EU / " + size.uk + " UK / " + size.cm + " CM \n"; ourPrices.Add(offerSize.price); //message += offerSize.price + "USD (with ship and return vat) \n"; if (!shops.Contains(offerSize.url)) { shops.Add(offerSize.url); } //message += offerSize.url + "\n"; } } // message += "\nКак заказать:\n"; message += "Звоните по телефону +78002001121 \n"; message += "Пишите в WhatsApp, Viber: +79179549490 (Дмитрий)\n"; message += "В Телеграм: @Sneaker_icon (Евгений)\n"; //message += "Наша группа Вконтакте (отзывы о нашей работе с 2012 года): https://vk.com/sneaker_icon \n"; message += "\nДоставка / Оплата \n"; message += "Доставка по РФ и СНГ в течение 7-14 дней\n"; message += "Работаем только по 100% предоплате\n"; //images message += "\nИзображения:\n"; foreach (var image in offer.images) { message += image + "\n"; } var chatId = "@sneaker_icon_hot"; await Helper.TelegramPost(message, chatId); }
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); } }