Exemplo n.º 1
0
        //Сделать Ставку На Аукцион
        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();
        }
Exemplo n.º 2
0
        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();
                }
            }
        }
Exemplo n.º 3
0
        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();
        }