/// <summary> /// Добавление сведений о заказе в историю заказов /// </summary> public async Task <OrderInfo> AddOrder(User user, PaymentInfoCache paymentInfoCache, SessionInfo sessionInfo) { using (var transaction = await dbContext.Database.BeginTransactionAsync()) { var orderGamesDto = await AddOrderGamesDto(paymentInfoCache); var orderSellersDto = await AddOrderSellersDto(paymentInfoCache); var orderSessionsDto = await AddOrderSessionsDto(sessionInfo); var orderDto = GetOrderDto(orderGamesDto, orderSellersDto, orderSessionsDto, paymentInfoCache, user); await dbContext.Orders.AddAsync(orderDto); await dbContext.SaveChangesAsync(); await transaction.CommitAsync(); return(new OrderInfo { Id = orderDto.Id, UserId = orderDto.UserId, Key = orderDto.Key, DateTime = orderDto.DateTime.ToString(CultureInfo.InvariantCulture), RecipientEmail = orderDto.RecipientEmail, Amount = orderDto.Amount, Game = orderGamesDto }); } }
/// <summary> /// Распределение денежных средств между плафтормой и продацом /// </summary> private async Task <Earnings> DistributeMoney(PaymentInfoCache paymentInfoCache) { var commission = paymentInfoCache.Amount / 100 * CommissionPercentage; var sellerBalance = dbContext.Balances.FirstOrDefault(balance => balance.UserId == paymentInfoCache.Game.SellerId); var platformStats = dbContext.PlatformStatistics.FirstOrDefault(); if (sellerBalance == null || platformStats == null) { throw new ArgumentException("Не удалось выполнить пополнение баланса"); } var sellerIncome = paymentInfoCache.Amount - commission; sellerBalance.Value += sellerIncome; platformStats.Balance += commission; using (var transaction = await dbContext.Database.BeginTransactionAsync()) { dbContext.Balances.Update(sellerBalance); dbContext.PlatformStatistics.Update(platformStats); await dbContext.SaveChangesAsync(); await transaction.CommitAsync(); } return(new Earnings { Commission = commission, Income = sellerIncome }); }
/// <summary> /// Добавление набора игровых ключей для игры /// </summary> public async Task AddKeystore(AddKeystoreRequest addKeystoreRequest) { var isOwner = await UserIsOwnerOfGame(addKeystoreRequest.GameId); if (!isOwner) { throw new ArgumentException("Невозможно добавить игровые ключи"); } var keys = addKeystoreRequest.Keys.Select(key => new KeyDto { Id = 0, GameId = addKeystoreRequest.GameId, Key = key, Reserved = false }); await dbContext.Keys.AddRangeAsync(keys); await dbContext.SaveChangesAsync(); }
/// <summary> /// Инициализация баланса нового продавца /// </summary> private async Task InitBalance(SignUp signUp) { if (signUp.Role == Roles.Seller) { await dbContext.Balances.AddAsync(new BalanceDto { UserId = (await userManager.FindByEmailAsync(signUp.Email)).Id, Value = 0 }); await dbContext.SaveChangesAsync(); } }
/// <summary> /// Добавление новой игры /// </summary> public async Task <GameDto> AddGame(AddGameRequest addGameRequest) { var game = GameToGameDto(addGameRequest); await dbContext.Games.AddAsync(game); await dbContext.SaveChangesAsync(); var keystore = new AddKeystoreRequest { GameId = game.Id, Keys = addGameRequest.Keys }; await keystoreService.AddKeystore(keystore); return(game); }