示例#1
0
        /// <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));
        }
示例#2
0
        /// <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));
        }
示例#4
0
        /// <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));
        }
示例#5
0
        /// <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);
        }
示例#9
0
        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);
            }
        }