public ActionResult _LiabilityTable()
        {
            StockLiabilityListCreateViewModel liabilities = (StockLiabilityListCreateViewModel)HttpContext.Session["LIABILITIES"];
            StockLiabilityListViewModel       model       = new StockLiabilityListViewModel();

            if (liabilities == null)
            {
                liabilities = new StockLiabilityListCreateViewModel();
            }
            foreach (var liability in liabilities.Liabilities)
            {
                StockLiabilityViewModel viewModel = new StockLiabilityViewModel();
                viewModel.Id               = liability.Id;
                viewModel.Source           = liability.Source;
                viewModel.Value            = liability.Value;
                viewModel.InterestRate     = liability.InterestRate / 100;
                viewModel.InterestRatePerX = StockLiabilityQueries.Helper.GetInterestTypePerX(liability.InterestRatePerX);
                viewModel.StartDate        = liability.StartDate;
                viewModel.EndDate          = liability.EndDate;
                viewModel.InterestType     = StockLiabilityQueries.Helper.GetInterestType(liability.InterestType);
                viewModel.PaymentPeriod    = StockLiabilityQueries.Helper.CalculateTimePeriod(viewModel.StartDate.Value, viewModel.EndDate.Value);
                model.Liabilities.Add(viewModel);
            }
            return(PartialView(model));
        }
        public static StockTransactionViewModel CreateViewModel(StockTransactions transaction)
        {
            Entities entities = new Entities();
            StockTransactionViewModel model = new StockTransactionViewModel();

            model.NumberOfStock    = transaction.NumberOfShares;
            model.SpotRice         = transaction.SpotPrice;
            model.StockValue       = transaction.Value;
            model.ExpectedDividend = transaction.ExpectedDividend / 100;

            var liabilities = entities.Liabilities.Where(x => x.TransactionId == transaction.Id);

            foreach (var liability in liabilities.Where(x => !x.DisabledDate.HasValue))
            {
                StockLiabilityViewModel liabilityViewModel = StockLiabilityQueries.CreateViewModel(liability);
                model.Liabilities.Liabilities.Add(liabilityViewModel);
            }

            return(model);
        }
        public ActionResult _Confirm()
        {
            DateTime current = DateTime.Now;

            StockCreateViewModel model     = (StockCreateViewModel)HttpContext.Session["STOCK"];
            StockViewModel       viewModel = new StockViewModel();

            viewModel.Name = model.Name;
            viewModel.Note = model.Note;
            viewModel.Transactions.Transactions.Add(new StockTransactionViewModel
            {
                NumberOfStock    = model.NumberOfStock,
                SpotRice         = model.SpotRice,
                StockValue       = model.StockValue,
                ExpectedDividend = model.ExpectedDividend / 100,
            });

            StockLiabilityListCreateViewModel liabilities = (StockLiabilityListCreateViewModel)HttpContext.Session["LIABILITIES"];

            if (liabilities != null && liabilities.Liabilities.Count > 0)
            {
                foreach (var liability in liabilities.Liabilities)
                {
                    StockLiabilityViewModel liabilityViewModel = new StockLiabilityViewModel();
                    liabilityViewModel.Source           = liability.Source;
                    liabilityViewModel.Value            = liability.Value;
                    liabilityViewModel.InterestType     = StockLiabilityQueries.Helper.GetInterestType(liability.InterestType);
                    liabilityViewModel.InterestRatePerX = StockLiabilityQueries.Helper.GetInterestTypePerX(liability.InterestRatePerX);
                    liabilityViewModel.InterestRate     = liability.InterestRate / 100;
                    liabilityViewModel.StartDate        = liability.StartDate.Value;
                    liabilityViewModel.EndDate          = liability.EndDate.Value;
                    liabilityViewModel.PaymentPeriod    = StockLiabilityQueries.Helper.CalculateTimePeriod(liabilityViewModel.StartDate.Value, liabilityViewModel.EndDate.Value);

                    if (liabilityViewModel.StartDate <= current && current <= liabilityViewModel.EndDate)
                    {
                        int    currentPeriod = Helper.CalculateTimePeriod(liabilityViewModel.StartDate.Value, DateTime.Now);
                        double interestRate  = liability.InterestRatePerX == (int)Constants.Constants.INTEREST_RATE_PER.MONTH ? liability.InterestRate.Value / 100 : liability.InterestRate.Value / 1200;
                        liabilityViewModel.OriginalInterestPayment = liabilityViewModel.Value.Value * interestRate;
                        //Fixed interest type
                        if (liability.InterestType == (int)Constants.Constants.INTEREST_TYPE.FIXED)
                        {
                            liabilityViewModel.MonthlyOriginalPayment = liabilityViewModel.Value.Value / liabilityViewModel.PaymentPeriod;
                            liabilityViewModel.MonthlyInterestPayment = liabilityViewModel.Value.Value * interestRate;
                            liabilityViewModel.TotalMonthlyPayment    = liabilityViewModel.MonthlyOriginalPayment + liabilityViewModel.MonthlyInterestPayment;
                            liabilityViewModel.TotalPayment           = RealEstateLiabilityQueries.Helper.CalculateAnnualPayment(liability);
                            liabilityViewModel.RemainedValue          = liabilityViewModel.Value.Value - liabilityViewModel.MonthlyOriginalPayment * (currentPeriod + 1);
                            liabilityViewModel.Status     = "Đang nợ";
                            liabilityViewModel.StatusCode = "label-success";
                        }
                        //Reduced interest type
                        else
                        {
                            liabilityViewModel.MonthlyOriginalPayment = liabilityViewModel.Value.Value / liabilityViewModel.PaymentPeriod;
                            liabilityViewModel.RemainedValue          = liabilityViewModel.Value.Value - liabilityViewModel.MonthlyOriginalPayment * (currentPeriod + 1);
                            liabilityViewModel.MonthlyInterestPayment = (liabilityViewModel.Value.Value - liabilityViewModel.MonthlyOriginalPayment * currentPeriod) * interestRate;
                            liabilityViewModel.TotalMonthlyPayment    = liabilityViewModel.MonthlyOriginalPayment + liabilityViewModel.MonthlyInterestPayment;
                            liabilityViewModel.TotalPayment           = RealEstateLiabilityQueries.Helper.CalculateAnnualPayment(liability);
                            liabilityViewModel.Status     = "Đang nợ";
                            liabilityViewModel.StatusCode = "label-success";
                        }
                    }
                    else
                    {
                        liabilityViewModel.MonthlyOriginalPayment = 0;
                        liabilityViewModel.MonthlyInterestPayment = 0;
                        liabilityViewModel.TotalMonthlyPayment    = 0;
                        liabilityViewModel.TotalPayment           = 0;
                        liabilityViewModel.RemainedValue          = 0;
                    }

                    viewModel.Transactions.Transactions.FirstOrDefault().Liabilities.Liabilities.Add(liabilityViewModel);
                }

                var lbts = viewModel.Transactions.Transactions.Select(x => x.Liabilities.Liabilities.Where(y => y.StartDate <= current && y.EndDate >= current));
                viewModel.TotalLiabilityValue  = lbts.Sum(x => x.Sum(y => y.Value.HasValue ? y.Value.Value : 0));
                viewModel.TotalOriginalPayment = lbts.Sum(x => x.Sum(y => y.MonthlyOriginalPayment));
                viewModel.TotalInterestPayment = lbts.Sum(x => x.Sum(y => y.MonthlyInterestPayment));
                viewModel.TotalMonthlyPayment  = lbts.Sum(x => x.Sum(y => y.TotalMonthlyPayment));
                viewModel.TotalPayment         = lbts.Sum(x => x.Sum(y => y.TotalPayment));
                viewModel.TotalRemainedValue   = lbts.Sum(x => x.Sum(y => y.RemainedValue));
                viewModel.TotalInterestRate    = viewModel.TotalLiabilityValue > 0 ? lbts.Sum(x => x.Sum(y => y.OriginalInterestPayment)) / viewModel.TotalLiabilityValue * 12 : 0;
                viewModel.RowSpan = viewModel.Transactions.Transactions.Any() ? viewModel.Transactions.Transactions.Count() + viewModel.Transactions.Transactions.Select(x => x.Liabilities.Liabilities).Count() + 4 : 4;

                if (viewModel.Transactions.Transactions.Any())
                {
                    viewModel.RowSpan = 4;
                    bool flag = false;
                    foreach (var transaction in viewModel.Transactions.Transactions)
                    {
                        if (transaction.Liabilities.Liabilities.Count() > 0)
                        {
                            if (flag == false)
                            {
                                flag = true;
                            }
                            viewModel.RowSpan += transaction.Liabilities.Liabilities.Count();
                        }
                    }
                    if (flag == true)
                    {
                        viewModel.RowSpan += 1;
                    }
                }
                else
                {
                    viewModel.RowSpan = 4;
                }
            }

            return(PartialView(viewModel));
        }
        public static StockLiabilityViewModel CreateViewModel(Liabilities liability)
        {
            DateTime current = DateTime.Now;

            StockLiabilityViewModel liabilityViewModel = new StockLiabilityViewModel();

            liabilityViewModel.Id               = liability.Id;
            liabilityViewModel.Source           = liability.Name;
            liabilityViewModel.Value            = liability.Value;
            liabilityViewModel.InterestType     = Helper.GetInterestType(liability.InterestType.Value);
            liabilityViewModel.InterestRatePerX = Helper.GetInterestTypePerX(liability.InterestRatePerX);
            liabilityViewModel.InterestRate     = liability.InterestRate / 100;
            liabilityViewModel.StartDate        = liability.StartDate.Value;
            liabilityViewModel.EndDate          = liability.EndDate.Value;
            liabilityViewModel.PaymentPeriod    = Helper.CalculateTimePeriod(liabilityViewModel.StartDate.Value, liabilityViewModel.EndDate.Value);

            if (liabilityViewModel.StartDate <= current && current <= liabilityViewModel.EndDate)
            {
                int    currentPeriod = Helper.CalculateTimePeriod(liabilityViewModel.StartDate.Value, DateTime.Now);
                double interestRate  = liability.InterestRatePerX == (int)Constants.Constants.INTEREST_RATE_PER.MONTH ? liability.InterestRate / 100 : liability.InterestRate / 1200;
                liabilityViewModel.OriginalInterestPayment = liabilityViewModel.Value.Value * interestRate;
                //Fixed interest type
                if (liability.InterestType == (int)Constants.Constants.INTEREST_TYPE.FIXED)
                {
                    liabilityViewModel.MonthlyOriginalPayment = liabilityViewModel.Value.Value / liabilityViewModel.PaymentPeriod;
                    liabilityViewModel.MonthlyInterestPayment = liabilityViewModel.Value.Value * interestRate;
                    liabilityViewModel.TotalMonthlyPayment    = liabilityViewModel.MonthlyOriginalPayment + liabilityViewModel.MonthlyInterestPayment;
                    liabilityViewModel.TotalPayment           = RealEstateLiabilityQueries.Helper.CalculateAnnualPayment(liability);
                    liabilityViewModel.RemainedValue          = liabilityViewModel.Value.Value - liabilityViewModel.MonthlyOriginalPayment * (currentPeriod + 1);
                    liabilityViewModel.Status     = "Đang nợ";
                    liabilityViewModel.StatusCode = "label-success";
                }
                //Reduced interest type
                else
                {
                    liabilityViewModel.MonthlyOriginalPayment = liabilityViewModel.Value.Value / liabilityViewModel.PaymentPeriod;
                    liabilityViewModel.RemainedValue          = liabilityViewModel.Value.Value - liabilityViewModel.MonthlyOriginalPayment * (currentPeriod + 1);
                    liabilityViewModel.MonthlyInterestPayment = (liabilityViewModel.Value.Value - liabilityViewModel.MonthlyOriginalPayment * currentPeriod) * interestRate;
                    liabilityViewModel.TotalMonthlyPayment    = liabilityViewModel.MonthlyOriginalPayment + liabilityViewModel.MonthlyInterestPayment;
                    liabilityViewModel.TotalPayment           = RealEstateLiabilityQueries.Helper.CalculateAnnualPayment(liability);
                    liabilityViewModel.Status     = "Đang nợ";
                    liabilityViewModel.StatusCode = "label-success";
                }
            }
            else
            {
                liabilityViewModel.MonthlyOriginalPayment = 0;
                liabilityViewModel.MonthlyInterestPayment = 0;
                liabilityViewModel.TotalMonthlyPayment    = 0;
                liabilityViewModel.TotalPayment           = 0;
                liabilityViewModel.RemainedValue          = 0;
                if (liabilityViewModel.EndDate < current)
                {
                    liabilityViewModel.StatusCode = "label-warning";
                    liabilityViewModel.Status     = "Đã trả hết nợ";
                }
                else
                {
                    liabilityViewModel.StatusCode = "label-danger";
                    liabilityViewModel.Status     = "Chưa tới kì hạn";
                }
            }
            return(liabilityViewModel);
        }