/// <summary> /// Buys the stock. /// </summary> /// <param name="selectedUser">The selected user.</param> public async Task BuyStock(object selectedUser, DateTime dateTime) { IsValidationMessageVisible = false; this.IsBusy = true; var basePrice = Quantity * Price; var commission = CalculateCommission(basePrice); var newPrice = basePrice + commission; var transactionId = Guid.NewGuid(); var portfolio = new PostPortfolio() { TransactionId = transactionId, Date = dateTime.ToString(), Price = Price, Company = ShareName.ToUpper(), Quantity = Quantity, Name = selectedUser.ToString(), TransactionType = Constants.Buy, Total = newPrice }; await tmsService.PostPortfolioData(portfolio); await UpdateStockDB(); await CalculateBuyAverage(selectedUser, newPrice, transactionId); ResetValue(); this.IsBusy = false; }
/// <summary> /// Updates the stock database. /// </summary> private async Task UpdateStockDB() { if (ShareNameList.FirstOrDefault(x => x.StockName.Equals(ShareName.ToUpper())) == null) { var stock = new Stocks() { StockName = ShareName.ToUpper() }; await tmsService.PostStockName(stock); await GetStockNameList(); } }
/// <summary> /// Sells the stock. /// </summary> /// <param name="selectedUser">The selected user.</param> public async Task SellStock(object selectedUser, DateTime dateTime) { IsValidationMessageVisible = false; this.IsBusy = true; var basePrice = Quantity * Price; var commission = CalculateCommission(basePrice); var newPrice = basePrice - commission; var transactionId = Guid.NewGuid(); var portfolio = new PostPortfolio() { TransactionId = transactionId, Date = dateTime.ToString(), Price = Price, Company = ShareName.ToUpper(), Quantity = Quantity, Name = selectedUser.ToString(), TransactionType = Constants.Sell, Total = newPrice }; await CalculateSellAverage(selectedUser, newPrice, transactionId); if (!IsBalanceNegative) { await tmsService.PostPortfolioData(portfolio); await UpdateStockDB(); ResetValue(); } else { this.IsBusy = false; UserDialogs.Instance.Alert("Selling quantity is more than available quantity.", okText: "OK"); } this.IsBusy = false; }
/// <summary> /// Calculates the specific average. /// </summary> /// <param name="prevAvgData">The previous average data.</param> /// <param name="newAvg">The new average.</param> /// <param name="multiplier">The multiplier.</param> /// <param name="newPrice">The new price.</param> private async Task CalculateSpecificAverage(Average prevAvgData, Average newAvg, int multiplier, double newPrice) { if (prevAvgData != null) { var finalPrice = multiplier * newPrice; double totalQuantity; if (multiplier == 1) { totalQuantity = prevAvgData.Quantity + Quantity; } else { totalQuantity = prevAvgData.Quantity - Quantity; } if (totalQuantity != 0) { var totalAvg = (prevAvgData.TotalPrice + finalPrice) / totalQuantity; var postAvg = new Average() { TotalPrice = totalQuantity * totalAvg, Quantity = totalQuantity, ShareName = this.ShareName.ToUpper(), AveragePrice = totalAvg }; await tmsService.PostAverageData(postAvg, "Total"); } else { await tmsService.DeleteSpecificShareData("Total", ShareName.ToUpper()); } } else { await tmsService.PostAverageData(newAvg, "Total"); } }
/// <summary> /// Calculates the sell average. /// </summary> /// <param name="selectedUser">The selected user.</param> /// <param name="newPrice">The new price.</param> public async Task CalculateSellAverage(object selectedUser, double newPrice, Guid transactionId) { var newQuantity = -Quantity; var postAvg = await PostCalculatedAverage(selectedUser, newPrice, newQuantity, -1, transactionId); if (!IsBalanceNegative) { var shareSpecificTotalAvg = await tmsService.GetSpecificAverageData("Total", ShareName.ToUpper()); await CalculateSpecificAverage(shareSpecificTotalAvg, postAvg, -1, newPrice); if (postAvg != null) { await tmsService.PostAverageData(postAvg, selectedUser.ToString()); } else { await tmsService.DeleteSpecificShareData(selectedUser.ToString(), ShareName.ToUpper()); } SelectedNameValue = selectedUser.ToString(); await GetUserAverageData(selectedUser.ToString()); } }
/// <summary> /// Calculates the buy average. /// </summary> /// <param name="selectedUser">The selected user.</param> /// <param name="newPrice">The new price.</param> public async Task CalculateBuyAverage(object selectedUser, double newPrice, Guid transactionId) { var newQuantity = Quantity; var postAvg = await PostCalculatedAverage(selectedUser, newPrice, newQuantity, 1, transactionId); var shareSpecificTotalAvg = await tmsService.GetSpecificAverageData("Total", ShareName.ToUpper()); await CalculateSpecificAverage(shareSpecificTotalAvg, postAvg, 1, newPrice); await tmsService.PostAverageData(postAvg, selectedUser.ToString()); SelectedNameValue = selectedUser.ToString(); await GetUserAverageData(selectedUser.ToString()); }
/// <summary> /// Posts the calculated average. /// </summary> /// <param name="selectedUser">The selected user.</param> /// <param name="newPrice">The new price.</param> /// <param name="quantity">The quantity.</param> /// <param name="multiplier">The multiplier.</param> /// <returns></returns> public async Task <Average> PostCalculatedAverage(object selectedUser, double newPrice, double quantity, double multiplier, Guid transactionId) { double totalPrice; double totalQuantity; double averagePrice; IsBalanceNegative = false; var avgResult = await tmsService.GetSpecificAverageData(selectedUser.ToString(), ShareName.ToUpper()); if (avgResult != null) { var previousAvg = avgResult.AveragePrice; var previousQty = avgResult.Quantity; var totalPreviousPrice = previousAvg * previousQty; totalQuantity = previousQty + quantity; if (totalQuantity > 0) { if (multiplier == 1) { averagePrice = (totalPreviousPrice + newPrice) / totalQuantity; } else { averagePrice = (totalPreviousPrice - newPrice) / totalQuantity; } totalPrice = totalQuantity * averagePrice; } else if (totalQuantity == 0) { var profitLossValue = newPrice - avgResult.TotalPrice; string pLIdentifier; if (profitLossValue > 0) { pLIdentifier = "Profit"; } else if (profitLossValue < 0) { pLIdentifier = "Loss"; } else { pLIdentifier = "Even"; } profitLossValue = Math.Abs(profitLossValue); var postPL = new ProfitLoss() { TransactionId = transactionId, Company = avgResult.ShareName, Date = DateTime.UtcNow.ToString(), Name = selectedUser.ToString(), Price = profitLossValue, ProfitLossIdentifier = pLIdentifier, }; await tmsService.LogProfitLoss(postPL); var currentBalance = await tmsService.GetPreviousBalanceDetails(selectedUser.ToString()); var balanceDetails = new Balance() { TotalBalance = currentBalance.TotalBalance + (newPrice - avgResult.TotalPrice) }; await tmsService.PutUpdatedBalanceDetails(balanceDetails, selectedUser.ToString()); return(null); } else { IsBalanceNegative = true; return(null); } } else { totalQuantity = quantity; totalPrice = newPrice; averagePrice = newPrice / totalQuantity; } var postAvg = new Average() { TotalPrice = totalPrice, Quantity = totalQuantity, ShareName = this.ShareName.ToUpper(), AveragePrice = averagePrice }; return(postAvg); }