public IActionResult Buy(long id) { var buyStockViewModel = new BuyStockViewModel { Id = id, AmountOfShares = 0, TimeOut = DateTime.Today.AddDays(1), Price = 0 }; return(View(buyStockViewModel)); }
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)); }
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)); }
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)); }
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" })); } }
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)); }
public ActionResult BuyStock(BuyStockViewModel buyStockModel) { return((ModelState.IsValid) ? View("BuyConfirm", buyStockModel) : View("Buy", buyStockModel)); }
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); }