//Сделать Ставку На Аукцион public void MakeBidToAuction(MakeBidVm model) { var bidExists = _aplicationDbContext.Bids .Any(p => p.Price == model.Price && p.AuctionId == model.AuctionId && p.Description == model.Description && p.OrganizationId == model.OrganizationId); if (bidExists) { throw new Exception("Invalid bid"); } var inValidPriceRange = _aplicationDbContext .Auctions.Where(p => p.Id == model.AuctionId && p.PriceAtMinimum <model.Price && p.PriceAtStart> model.Price); var inStepRange = inValidPriceRange .Any(p => (p.PriceAtStart - model.Price) % p.PriceChangeStep == 0); if (!inStepRange) { throw new Exception("Invalid bid according price step"); } Bid bid = new Bid() { Price = model.Price, Description = model.Description, AuctionId = model.AuctionId, OrganizationId = model.OrganizationId, CreatedDate = DateTime.Now }; _aplicationDbContext.Bids.Add(bid); _aplicationDbContext.SaveChanges(); }
public void MakeBidToAuction(MakeBidVm model, decimal paymentForBids) { var bidExists = _aplicationDbContext.Bids .Any(p => p.Price == model.Price && p.AuctionId == model.AuctionId && p.Description == model.Description && p.OrganizationId == model.OrganizationId); if (bidExists) { throw new Exception("Invalid bid"); } var inValidPriceRange = _aplicationDbContext .Auctions.Where(p => p.Id == model.AuctionId && p.PriceAtMinimum <model.Price && p.PriceAtStart> model.Price); var inStepRange = inValidPriceRange .Any(p => (p.PriceAtStart - model.Price) % p.PriceChangeStep == 0); if (!inStepRange) { throw new Exception("Invalid bid according price step"); } var organizationTransactions = _aplicationDbContext.Transactions .Where(p => p.OrganizationId == model.OrganizationId).ToList(); if (organizationTransactions.Count == 0) { throw new Exception("Organization has zero balance!"); } var organizationBalance = organizationTransactions .Where(p => p.TransactionType == TransactionType.Deposit) .Sum(p => p.Sum) - organizationTransactions .Where(p => p.TransactionType == TransactionType.Withdraw) .Sum(p => p.Sum); if (organizationBalance < paymentForBids) { throw new Exception("Organization does not have enough money"); } using (var transaction1 = _aplicationDbContext.Database.BeginTransaction()) { try { Bid bid = new Bid() { Price = model.Price, Description = model.Description, AuctionId = model.AuctionId, OrganizationId = model.OrganizationId, CreatedDate = DateTime.Now, BidStatus = BidStatus.Active }; _aplicationDbContext.Bids.Add(bid); _aplicationDbContext.SaveChanges(); Transaction transaction = new Transaction() { Sum = paymentForBids, TransactionType = TransactionType.Withdraw, TransactionDate = DateTime.Now, OrganizationId = model.OrganizationId, Description = $"Withdraw participation cost for bids {model.AuctionId}" }; _aplicationDbContext.Transactions.Add(transaction); _aplicationDbContext.SaveChanges(); transaction1.Commit(); } catch (Exception ex) { transaction1.Rollback(); } } }
public void MakeBidToAuction(MakeBidVm model) { var bidExists = _aplicationDbContext.Bids .Any(p => p.Price == model.Price && p.AuctionId == model.AuctionId && p.Description == model.Description && p.OrganizationId == model.OrganizationId); if (bidExists) { throw new Exception("This bid already exists"); } var auctionExistsAndActive = _aplicationDbContext.Auctions.Any(p => p.Id == model.AuctionId && p.OrganizationId == model.OrganizationId); if (!auctionExistsAndActive) { throw new Exception("Данная организация не участвует в активных аукционах"); } var organizationDeposits = _aplicationDbContext.Transactions.Where(p => p.OrganizationId == model.OrganizationId && p.TransactionType == TransactionType.Deposit).ToList(); var organizationWithdrawals = _aplicationDbContext.Transactions.Where(p => p.OrganizationId == model.OrganizationId && p.TransactionType == TransactionType.Withdraw).ToList(); var organizationBalance = organizationDeposits.Sum(p => p.Sum) - organizationWithdrawals.Sum(p => p.Sum); if (organizationBalance < model.Price) { throw new Exception($"У организации {_aplicationDbContext.Organizations.SingleOrDefault(p=>p.Id==model.OrganizationId).FullName} не хватает средств на балансе"); } var inValidPriceRange = _aplicationDbContext .Auctions.Where(p => p.Id == model.AuctionId && p.PriceAtMinimum <model.Price && p.PriceAtStart> model.Price); var inStepRange = inValidPriceRange .Any(p => (p.PriceAtStart - model.Price) % p.PriceChangeStep == 0); if (!inStepRange) { throw new Exception("Invalid bid according to price step"); } Bid bid = new Bid() { Price = model.Price, Description = model.Description, AuctionId = model.AuctionId, OrganizationId = model.OrganizationId, CreatedDate = DateTime.Now, BidStatus = BidStatus.Active }; _aplicationDbContext.Bids.Add(bid); Transaction transaction = new Transaction() { Description = "Withdraw for making a bid to take part in the auction", OrganizationId = model.OrganizationId, Sum = model.Price, TransactionDate = DateTime.Now, TransactionType = TransactionType.Withdraw }; _aplicationDbContext.Transactions.Add(transaction); _aplicationDbContext.SaveChanges(); }