private IEnumerable <StockPurchase> MapTransactionsToPurchases(ulong userId, List <object[]> transactions, FidelityTransactionColumns columns) { var purchases = new List <StockPurchase>(); for (var i = 0; i < transactions.Count; i++) { try { var purchase = new StockPurchase() { Comment = string.Empty, PurchaseDate = Convert.ToDateTime(transactions[i][columns.RunDate]), Price = Convert.ToDecimal(transactions[i][columns.Price]), Quantity = Convert.ToDecimal(transactions[i][columns.Quantity]), Ticker = Convert.ToString(transactions[i][columns.Symbol]), UserId = userId }; purchases.Add(purchase); } catch (Exception ex) { continue; } } return(purchases); }
public ActionResult SellStock(SellStockViewModel model, int StockPurchaseID) { AppUser user = db.Users.Find(User.Identity.GetUserId()); StockPortfolio stockPortfolio = user.StockPortfolio; model.stockPortfolioID = stockPortfolio.StockPortfolioID; if (ModelState.IsValid) { StockPurchase stockPurchase = db.StockPurchases.Find(StockPurchaseID); if (model.NumberOfSharesToSell > stockPurchase.NumberOfShares) { return(View("Error", new string[] { "You can't sell more shares than what you have." })); } if (model.NumberOfSharesToSell == 0) { return(View("Error", new string[] { "Why are you trying to sell 0 shares...?" })); } if (model.NumberOfSharesToSell < 0) { return(View("Error", new string[] { "You can't sell a negative number of shares." })); } model.stockPurchaseID = StockPurchaseID; model.StockName = stockPurchase.Stock.StockName; model.SellDate = DateTime.Now; model.NumberOfSharesToSell = model.NumberOfSharesToSell; model.NumberOfSharesRemaining = stockPurchase.NumberOfShares - model.NumberOfSharesToSell; model.Fees = stockPurchase.Stock.Fee; model.NetGainLoss = (stockPurchase.Stock.CurrentPrice * model.NumberOfSharesToSell) - (stockPurchase.InitialSharePrice * model.NumberOfSharesToSell); return(RedirectToAction("SellStockSummaryPage", model)); } ViewBag.CustomerStockPurchases = GetCustomerStockPurchases(); return(View(model)); }
public async Task <IActionResult> UpdateStockPurchase(int id, StockPurchase updatedStockPurchase) { if (id != updatedStockPurchase.Id) { return(BadRequest()); } var stockPurchaseFromDB = await _context.StockPurchases.FindAsync(id); if (stockPurchaseFromDB == null) { return(NotFound()); } stockPurchaseFromDB.Tracker = updatedStockPurchase.Tracker; stockPurchaseFromDB.PricePerShare = updatedStockPurchase.PricePerShare; stockPurchaseFromDB.Amount = updatedStockPurchase.Amount; stockPurchaseFromDB.LongOrShort = updatedStockPurchase.LongOrShort; stockPurchaseFromDB.BuyOrSell = updatedStockPurchase.BuyOrSell; stockPurchaseFromDB.PurchaseDate = updatedStockPurchase.PurchaseDate; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) when(!StockPurchaseExists(id)) { return(NotFound()); } return(NoContent()); }
public ActionResult DeleteConfirmed(int id) { StockPurchase stockPurchase = db.StockPurchases.Find(id); db.StockPurchases.Remove(stockPurchase); db.SaveChanges(); return(RedirectToAction("Index")); }
public async Task <StockPurchase> AddStockAndPurchaseInfo(StockPurchase stockPurchase) { stockPurchase.Stock = await AddStockInfo(stockPurchase); stockPurchase.StockId = stockPurchase.Stock.StockId; stockPurchase.Purchase = await AddPurchaseInfo(stockPurchase.StockId, stockPurchase); return(stockPurchase); }
public ActionResult Edit([Bind(Include = "StockPurchaseID,PurchaseDate,InitialSharePrice,NumberOfShares,TotalStockValue,ChangeInPrice,TotalChange")] StockPurchase stockPurchase) { if (ModelState.IsValid) { db.Entry(stockPurchase).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } return(View(stockPurchase)); }
public async Task <ActionResult <StockPurchase> > CreateStockPurchase(StockPurchase stockPurchase) { Console.WriteLine("Testline"); Console.WriteLine(stockPurchase); _context.StockPurchases.Add(stockPurchase); await _context.SaveChangesAsync(); return(CreatedAtAction( nameof(GetStockPurchase), new { id = stockPurchase.Id }, stockPurchase)); }
// GET: StockPurchases/Delete/5 public ActionResult Delete(int?id) { if (id == null) { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } StockPurchase stockPurchase = db.StockPurchases.Find(id); if (stockPurchase == null) { return(HttpNotFound()); } return(View(stockPurchase)); }
private async Task <Purchase> AddPurchaseInfo(ulong stockId, StockPurchase stockPurchase) { var purchase = new Purchase(); purchase.Comment = stockPurchase.Comment; purchase.Date = stockPurchase.PurchaseDate; purchase.Price = stockPurchase.Price; purchase.Quantity = stockPurchase.Quantity; purchase.StockId = stockId; purchase.UserId = stockPurchase.UserId; purchase = await _stockPurchaseService.AddStockPurchase(stockPurchase.UserId, purchase); return(purchase); }
private async Task <Stock> AddStockInfo(StockPurchase stockPurchase) { var stock = await _stockService.GetStockByTicker(stockPurchase.UserId, stockPurchase.Ticker.Trim()); if (stock == null) { var companyProfile = await _stockService.GetCompanyProfile(stockPurchase.Ticker); if (companyProfile == null || companyProfile.Profile == null) { throw new ArgumentException($"Ticket symbol is not valid"); } stock = new Stock(); stock.Ticker = stockPurchase.Ticker.Trim(); stock.CompanyName = FormatCompanyInformation(companyProfile.Profile.CompanyName, 100); stock.Country = companyProfile.Profile.Country; stock.Industry = FormatCompanyInformation(companyProfile.Profile.Industry, 50); stock.Sector = FormatCompanyInformation(companyProfile.Profile.Sector, 50); await _stockService.AddStock(stockPurchase.UserId, stock); } return(stock); }
public async Task <IActionResult> Post([FromBody] StockPurchase purchaseData) { try { if (!ModelState.IsValid) { return(BadRequest()); } await _stockAndPurchaseService.AddStockAndPurchaseInfo(purchaseData); await _stockHoldingService.AddPurchaseToHoldings(purchaseData.UserId, purchaseData.Purchase); return(Ok()); } catch (ArgumentException ex) { return(BadRequest(ex.Message)); } catch (Exception ex) { return(StatusCode(StatusCodes.Status500InternalServerError, ex.Message)); } }
public ActionResult PurchaseStock([Bind(Include = "StockPurchaseID,PurchaseDate,NumberOfShares")] StockPurchase stockPurchase, int SavingsAccountID, int StockID) { if (ModelState.IsValid) { AppUser user = db.Users.Find(User.Identity.GetUserId()); StockPortfolio stockPortfolio = user.StockPortfolio; SavingsAccount savingsAccount = db.SavingsAccounts.Find(SavingsAccountID); Stock stock = db.Stocks.Find(StockID); stockPurchase.StockPortfolio = stockPortfolio; stockPurchase.Stock = stock; stockPortfolio.StockPurchases.Add(stockPurchase); stock.StockPurchases.Add(stockPurchase); StockQuote quote = GetQuote.GetStock(stock.TickerSymbol, stockPurchase.PurchaseDate); Decimal stockPrice = quote.PreviousClose; stockPurchase.InitialSharePrice = stockPrice; stockPurchase.TotalStockValue = stockPrice * stockPurchase.NumberOfShares; stockPurchase.ChangeInPrice = stockPrice - stockPurchase.InitialSharePrice; stockPurchase.TotalChange = stockPurchase.TotalStockValue - (stockPurchase.InitialSharePrice * stockPurchase.NumberOfShares); stockPurchase.StockPurchaseDisplay = stockPurchase.Stock.StockName + ", Current Price: $" + stock.CurrentPrice.ToString("c") + ", Number of shares: " + stockPurchase.NumberOfShares.ToString(); if (savingsAccount.Balance < ((stockPurchase.InitialSharePrice * stockPurchase.NumberOfShares) + stockPurchase.Stock.Fee)) { return(View("Error", new string[] { "You do not have enough funds to make the purchase." })); } savingsAccount.Balance -= ((stockPurchase.InitialSharePrice * stockPurchase.NumberOfShares) + stockPurchase.Stock.Fee); stockPortfolio.StockPortionValue += (stockPurchase.InitialSharePrice * stockPurchase.NumberOfShares); Transaction StockTransaction = new Transaction(); StockTransaction.Amount = stockPurchase.InitialSharePrice * stockPurchase.NumberOfShares; StockTransaction.SavingsAccountAffected = savingsAccount; StockTransaction.Description = "Stock Purchase - Account " + stockPortfolio.AccountNumber.ToString(); StockTransaction.TransactionDate = stockPurchase.PurchaseDate; StockTransaction.TransactionType = "Withdrawal"; StockTransaction.isBeingDisputed = false; StockTransaction.isPending = false; StockTransaction.EmployeeComments = ""; Transaction TransactionFee = new Transaction(); TransactionFee.Amount = stockPurchase.Stock.Fee; TransactionFee.SavingsAccountAffected = savingsAccount; TransactionFee.Description = "Fee for purchase of " + stockPurchase.Stock.StockName; TransactionFee.TransactionDate = stockPurchase.PurchaseDate; TransactionFee.TransactionType = "Fee"; TransactionFee.isBeingDisputed = false; TransactionFee.isPending = false; TransactionFee.EmployeeComments = ""; int OrdinaryCount = 0; int IndexCount = 0; int MutalCount = 0; foreach (var s in stockPortfolio.StockPurchases) { if (s.Stock.StockType.Equals("Ordinary Stock")) { OrdinaryCount += 1; } else if (s.Stock.StockType.Equals("Index Fund")) { IndexCount += 1; } else if (s.Stock.StockType.Equals("Mutual Fund")) { MutalCount += 1; } } if (OrdinaryCount >= 2 && IndexCount >= 1 && MutalCount >= 1) { stockPortfolio.isBalanced = true; } else { stockPortfolio.isBalanced = false; } savingsAccount.Transactions.Add(StockTransaction); savingsAccount.Transactions.Add(TransactionFee); db.Transactions.Add(StockTransaction); db.Transactions.Add(TransactionFee); db.StockPurchases.Add(stockPurchase); db.SaveChanges(); return(RedirectToAction("PurchaseStockConfirmation", "StockPortfolios")); } ViewBag.SavingsAccounts = GetSavingsAccountsWithBalance(); ViewBag.Stocks = GetAvailableStocks(); return(View(stockPurchase)); }
public ActionResult SellStockSummaryPage(SellStockViewModel SellInfo, SellStockDecision decision) { switch (decision) { case SellStockDecision.Cancel: { return(RedirectToAction("Details", new { id = SellInfo.stockPortfolioID })); } case SellStockDecision.Confirm: { StockPortfolio stockPortfolio = db.StockPortfolios.Find(SellInfo.stockPortfolioID); StockPurchase stockPurchase = db.StockPurchases.Find(SellInfo.stockPurchaseID); stockPurchase.NumberOfShares = SellInfo.NumberOfSharesRemaining; stockPurchase.TotalStockValue = SellInfo.NumberOfSharesRemaining * stockPurchase.Stock.CurrentPrice; stockPurchase.TotalChange = (SellInfo.NumberOfSharesRemaining * stockPurchase.Stock.CurrentPrice) - (SellInfo.NumberOfSharesRemaining * stockPurchase.InitialSharePrice); stockPurchase.ChangeInPrice = stockPurchase.Stock.CurrentPrice - stockPurchase.InitialSharePrice; stockPurchase.StockPurchaseDisplay = stockPurchase.Stock.StockName + ", Current Price: " + stockPurchase.Stock.CurrentPrice.ToString("c") + ", Number of shares: " + stockPurchase.NumberOfShares.ToString(); stockPortfolio.CashValueBalance += ((SellInfo.NumberOfSharesToSell * stockPurchase.Stock.CurrentPrice) - SellInfo.Fees); stockPortfolio.StockPortionValue -= SellInfo.NumberOfSharesToSell * stockPurchase.Stock.CurrentPrice; Transaction StockTransaction = new Transaction(); StockTransaction.Amount = stockPurchase.Stock.CurrentPrice * SellInfo.NumberOfSharesToSell; StockTransaction.StockPortfolioAffected = stockPortfolio; StockTransaction.Description = "Sell Stock - Stock: " + SellInfo.StockName + ", Number of shares sold: " + SellInfo.NumberOfSharesToSell + ", Initial Share price: " + stockPurchase.InitialSharePrice.ToString("c") + ", Current Share Price: " + stockPurchase.Stock.CurrentPrice.ToString("c") + ", Total Gains/Loss: " + SellInfo.NetGainLoss.ToString("c"); StockTransaction.TransactionDate = SellInfo.SellDate; StockTransaction.TransactionType = "Deposit"; StockTransaction.isBeingDisputed = false; StockTransaction.isPending = false; StockTransaction.EmployeeComments = ""; Transaction TransactionFee = new Transaction(); TransactionFee.Amount = SellInfo.Fees; TransactionFee.StockPortfolioAffected = stockPortfolio; TransactionFee.Description = "Fee for sale of " + stockPurchase.Stock.StockName; TransactionFee.TransactionDate = SellInfo.SellDate; TransactionFee.TransactionType = "Fee"; TransactionFee.isBeingDisputed = false; TransactionFee.isPending = false; TransactionFee.EmployeeComments = ""; int OrdinaryCount = 0; int IndexCount = 0; int MutalCount = 0; foreach (var s in stockPortfolio.StockPurchases) { if (s.Stock.StockType.Equals("Ordinary Stock")) { OrdinaryCount += 1; } else if (s.Stock.StockType.Equals("Index Fund")) { IndexCount += 1; } else if (s.Stock.StockType.Equals("Mutual Fund")) { MutalCount += 1; } } if (OrdinaryCount >= 2 && IndexCount >= 1 && MutalCount >= 1) { stockPortfolio.isBalanced = true; } else { stockPortfolio.isBalanced = false; } stockPortfolio.Transactions.Add(StockTransaction); stockPortfolio.Transactions.Add(TransactionFee); db.Transactions.Add(StockTransaction); db.Transactions.Add(TransactionFee); if (stockPurchase.NumberOfShares == 0) { db.StockPurchases.Remove(stockPurchase); } db.SaveChanges(); return(RedirectToAction("SellStockConfirmation")); } } return(View(SellInfo)); }