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);
        }
Exemplo n.º 2
0
        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());
        }
Exemplo n.º 4
0
        public ActionResult DeleteConfirmed(int id)
        {
            StockPurchase stockPurchase = db.StockPurchases.Find(id);

            db.StockPurchases.Remove(stockPurchase);
            db.SaveChanges();
            return(RedirectToAction("Index"));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
 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));
        }
Exemplo n.º 8
0
        // 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));
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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));
        }
Exemplo n.º 13
0
        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));
        }