public static CarLiabilitySummaryListViewModel GetCarLiabilitySummaryByUser(string username)
        {
            Entities entities = new Entities();
            CarLiabilitySummaryListViewModel result = new CarLiabilitySummaryListViewModel();
            DateTime current     = DateTime.Now;
            var      liabilities = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                              x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.CAR &&
                                                              !x.DisabledDate.HasValue).OrderBy(x => x.Name);

            foreach (var liability in liabilities)
            {
                CarLiabilitySummaryViewModel viewModel = CreateSummaryViewModel(liability);
                result.Liabilities.Add(viewModel);
            }

            var lbts = result.Liabilities.Where(x => x.StartDate <= current && x.EndDate >= current);

            result.TotalOriginalValue   = lbts.Sum(x => x.LiabilityValue);
            result.TotalLiabilityValue  = lbts.Sum(x => x.Value.Value);
            result.TotalInterestPayment = lbts.Sum(x => x.MonthlyInterestPayment);
            result.TotalOriginalPayment = lbts.Sum(x => x.MonthlyOriginalPayment);
            result.TotalPayment         = lbts.Sum(x => x.TotalMonthlyPayment);
            result.TotalRemainedValue   = lbts.Sum(x => x.RemainedValue);
            result.TotalInterestRate    = result.TotalLiabilityValue > 0 ? lbts.Sum(x => x.OriginalInterestPayment) / result.TotalLiabilityValue * 12 : 0;
            return(result);
        }
        public static CarLiabilitySummaryViewModel CreateSummaryViewModel(Liabilities liability)
        {
            DateTime current = DateTime.Now;

            CarLiabilitySummaryViewModel liabilityViewModel = new CarLiabilitySummaryViewModel();

            liabilityViewModel.Id               = liability.Id;
            liabilityViewModel.Source           = liability.Name;
            liabilityViewModel.LiabilityValue   = liability.OriginalValue.Value;
            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.Note             = liability.Note;
            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);
        }