Пример #1
0
        public IActionResult Buy(long id)
        {
            var buyStockViewModel = new BuyStockViewModel
            {
                Id             = id,
                AmountOfShares = 0,
                TimeOut        = DateTime.Today.AddDays(1),
                Price          = 0
            };

            return(View(buyStockViewModel));
        }
Пример #2
0
        public IActionResult BuyWithInput(long stockId, int amountOfShares, double price, long timeOutTicks)
        {
            var buyStockViewModel = new BuyStockViewModel
            {
                Id             = stockId,
                AmountOfShares = amountOfShares,
                TimeOut        = new DateTime(timeOutTicks),
                Price          = price
            };

            _logger.LogInformation("Sending BuyStockViewModel {@buyStockViewModel} to Buy", buyStockViewModel);
            return(View("Buy", buyStockViewModel));
        }
Пример #3
0
        public ActionResult BuyStock(string stockCode)
        {
            var latestStockDetails = _stockService.GetLatestStockDetails(stockCode);

            if (latestStockDetails == null)
            {
                TempData["Message"]     = "You cannot buy selected stock.";
                TempData["MessageType"] = "error";
                return(RedirectToAction("Dashboard", controllerName: "Home"));
            }

            BuyStockViewModel buyStockModel = Mapper.Map <BuyStockViewModel>(latestStockDetails);

            ViewBag.BuyStockStatus = TempData["BuyStockStatus"];

            return(View(buyStockModel));
        }
Пример #4
0
        public async Task <IActionResult> Buy([Bind("Id,TimeOut,AmountOfShares,Price")] BuyStockViewModel createStockViewModel)
        {
            var placeBidRequest = new PlaceBidRequest
            {
                AmountOfShares = createStockViewModel.AmountOfShares,
                TimeOut        = createStockViewModel.TimeOut,
                Price          = createStockViewModel.Price,
                StockId        = createStockViewModel.Id
            };

            var(jwtToken, _) = JwtHelper.GetJwtAndIdFromJwt(Request);
            var validationResult = await _stockShareRequesterClient.PlaceBid(placeBidRequest, jwtToken);

            if (validationResult.Valid)
            {
                return(await StockList());
            }
            ViewBag.ShowErrorDialog = true;
            ViewBag.ErrorText       = validationResult.ErrorMessage;
            return(View(createStockViewModel));
        }
        // GET: StockPortfolios/BuyStock/5
        public async Task <IActionResult> BuyStock(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            var stockList = await _context.Stocks.Select(s => new SelectListItem()
            {
                Text = s.Name, Value = s.Id.ToString()
            }).ToListAsync();

            var buyStockViewModel = new BuyStockViewModel()
            {
                StockList = stockList
            };

            ViewBag.PortfolioId   = id;
            TempData["StockList"] = JsonConvert.SerializeObject(stockList);

            return(View(buyStockViewModel));
        }
Пример #6
0
        public async Task <IActionResult> BuyStock([FromRoute] Guid requestId, [FromBody] BuyStockViewModel buyStock)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            try
            {
                var requestStatus = await _buyerService.BuyStock(requestId, buyStock.UserId);

                if (requestStatus == null)
                {
                    return(BadRequest(new { Status = "failure" }));
                }
                return(Ok(new { Status = "success" }));
            }
            catch (System.Exception)
            {
                return(BadRequest(new { Status = "failure" }));
            }
        }
Пример #7
0
        public ActionResult BuyStockConfirmed(BuyStockViewModel buyStockModel)
        {
            if (ModelState.IsValid == false)
            {
                return(View("Buy", buyStockModel));
            }

            var userId         = User.Identity.GetUserId();
            var buyStockStatus = _stockService.BuyStock(userId, buyStockModel);

            if (buyStockStatus == Infrastructure.Enum.StockBuyStatus.Success)
            {
                TempData["Message"]     = "You have successfully bought stocks!";
                TempData["MessageType"] = "success";
                return(RedirectToAction("dashboard", controllerName: "home"));
            }
            else
            {
                TempData["BuyStockStatus"] = buyStockStatus;
                return(RedirectToAction("Buy", new { stockCode = buyStockModel.Code.ToLower() }));
            }
        }
        public async Task <IActionResult> BuyStock(int id, [Bind("StockId", "NumberOfShares")] BuyStockViewModel buyStockViewModel)
        {
            if (ModelState.IsValid)
            {
                var portfolioId = id;
                var stockId     = buyStockViewModel.StockId;

                // Stock/Stock portfolio is loaded into memory from database.
                var stockPortfolio = _context.StockPortfolios.Where(sp => sp.Id == portfolioId).Single();
                var stock          = _context.Stocks.Where(s => s.Id == stockId).Single();

                var shareBlock = GetShareBlock(portfolioId, stockId);

                if (shareBlock == null)
                {
                    shareBlock = new ShareBlock
                    {
                        NumberOfShares   = buyStockViewModel.NumberOfShares,
                        ParentStockId    = buyStockViewModel.StockId,
                        OwnerPortfolioId = id,
                        ParentStock      = stock,
                        OwnerPortfolio   = stockPortfolio
                    };

                    var SpsMapping = new StockPortfolioStockMapping {
                        StockId = stockId, StockPortfolioId = portfolioId
                    };

                    stock.ShareBlocks.Add(shareBlock);
                    stock.SpsMappings.Add(SpsMapping);
                    stockPortfolio.SpsMappings.Add(SpsMapping);

                    _context.Update(stock);
                    _context.Update(stockPortfolio);
                    _context.Add(shareBlock);
                }
                else
                {
                    shareBlock.NumberOfShares += buyStockViewModel.NumberOfShares;
                    _context.Update(shareBlock);
                }

                try
                {
                    await _context.SaveChangesAsync();
                }

                catch (DbUpdateConcurrencyException)
                {
                    // Returns NotFound() if the stock portfolio has been deleted from the database since it was loaded into memory.
                    if (!StockPortfolioExists(stockPortfolio.Id))
                    {
                        return(NotFound());
                    }
                    else
                    {
                        throw;
                    }
                }

                return(RedirectToAction("Content", new { id = id }));
            }

            buyStockViewModel.StockList = JsonConvert.DeserializeObject <IEnumerable <SelectListItem> >(TempData["StockList"].ToString());
            TempData.Keep("StockList");

            return(View(buyStockViewModel));
        }
Пример #9
0
 public ActionResult BuyStock(BuyStockViewModel buyStockModel)
 {
     return((ModelState.IsValid) ?
            View("BuyConfirm", buyStockModel) : View("Buy", buyStockModel));
 }
Пример #10
0
        public StockBuyStatus BuyStock(string userId, BuyStockViewModel buyStockModel)
        {
            // check if user change the form data, provided stock value has to exists in database
            StockValue purchasingStockValue = GetStockForCodeAndValue(buyStockModel.Code, buyStockModel.Unit, buyStockModel.Price);

            if (purchasingStockValue == null)
            {
                return(StockBuyStatus.Unknown);
            }
            decimal totalCost = buyStockModel.AmountToBuy / purchasingStockValue.Unit * purchasingStockValue.Price;

            // case 1: User does not have enough money
            User buyer = _db.UserApp.Where(x => x.Id.Equals(userId) && x.Money >= totalCost)
                         .FirstOrDefault();

            if (buyer == null)
            {
                return(StockBuyStatus.UserHasNotEnoughMoney);
            }
            // case 2: Stock Exchange does not have enough stock
            if (purchasingStockValue.Stock.AvailableAmount < buyStockModel.AmountToBuy)
            {
                return(StockBuyStatus.AmountNotAvailable);
            }

            // case 3: Stock value data have changed - there was an update
            StockDetails latestStockDetails = GetLatestStockDetails(buyStockModel.Code);
            bool         isBuyerBuyingStockByLatestPrice = AreDatesTheSameComparisonLikeHuman(
                latestStockDetails.PublicationDate, purchasingStockValue.PublicationDate);

            if (isBuyerBuyingStockByLatestPrice == false)
            {
                return(StockBuyStatus.StockValueDataHaveChanged);
            }

            using (var dbContextTransaction = _db.Database.BeginTransaction())
            {
                try
                {
                    // then 1: Subtract money from User wallet
                    buyer.Money -= totalCost;

                    // then 2: Add specified amount of stock to UserStocks
                    UserStocks stockOwnedByBuyer = buyer.Stocks.FirstOrDefault(
                        x => x.StockID == purchasingStockValue.StockID);
                    if (stockOwnedByBuyer != null)
                    {
                        stockOwnedByBuyer.Amount          += buyStockModel.AmountToBuy;
                        _db.Entry(stockOwnedByBuyer).State = System.Data.Entity.EntityState.Modified;
                    }
                    else
                    {
                        stockOwnedByBuyer = new UserStocks
                        {
                            UserID  = userId,
                            StockID = purchasingStockValue.StockID,
                            Amount  = buyStockModel.AmountToBuy
                        };
                        _db.UserStocks.Add(stockOwnedByBuyer);
                    }

                    // then 3: Decrease available stock amount
                    _db.Stock.Attach(purchasingStockValue.Stock);
                    _db.Entry(purchasingStockValue.Stock).Reload();
                    if (purchasingStockValue.Stock.AvailableAmount < buyStockModel.AmountToBuy)
                    {
                        _logger.Info("Rollback");
                        dbContextTransaction.Rollback();
                        return(StockBuyStatus.AmountNotAvailable);
                    }
                    purchasingStockValue.Stock.AvailableAmount -= buyStockModel.AmountToBuy;
                    _db.Entry(purchasingStockValue.Stock).State = System.Data.Entity.EntityState.Modified;

                    // save and commit
                    _db.SaveChanges();
                    dbContextTransaction.Commit();
                    return(StockBuyStatus.Success); // everything went well, so finally success
                }
                catch (Exception e)
                {
                    _logger.Error("Transaction error during buying stock. Error:" + e.Message);
                    _logger.Error("Rollback...");
                    dbContextTransaction.Rollback();
                }
            }

            return(StockBuyStatus.Unknown);
        }