// GET: FinancialStatus
        public ActionResult Index()
        {
            FinancialStatusViewModel model = FinancialStatusQueries.GetFinancialStatusByUser(UserQueries.GetCurrentUsername());

            return(View(model));
        }
Esempio n. 2
0
        public static FinancialStatusViewModel GetFinancialStatusByUser(string username)
        {
            FinancialStatusViewModel result = new FinancialStatusViewModel();
            Entities entities = new Entities();
            DateTime current  = DateTime.Now;

            result.CompleteInitialization = UserQueries.GetUserByUsername(username).CompleteInitialization;

            result.SalaryIncome = entities.Incomes.Where(x => x.Username.Equals(username) &&
                                                         x.IncomeType == (int)Constants.Constants.INCOME_TYPE.SALARY_INCOME &&
                                                         !x.DisabledDate.HasValue && x.StartDate <= current).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.RealEstateIncome = entities.Incomes.Where(x => x.Username.Equals(username) &&
                                                             x.IncomeType == (int)Constants.Constants.INCOME_TYPE.REAL_ESTATE_INCOME &&
                                                             !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.BusinessIncome = entities.Incomes.Where(x => x.Username.Equals(username) &&
                                                           x.IncomeType == (int)Constants.Constants.INCOME_TYPE.BUSINESS_INCOME &&
                                                           !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.InterestIncome = entities.Assets.Where(x => x.Username.Equals(username) &&
                                                          x.AssetType == (int)Constants.Constants.ASSET_TYPE.BANK_DEPOSIT &&
                                                          !x.DisabledDate.HasValue).Select(x => x.Value * x.InterestRate.Value / 1200).DefaultIfEmpty(0).Sum();

            var stocks = entities.Assets.Where(x => x.Username.Equals(username) &&
                                               x.AssetType == (int)Constants.Constants.ASSET_TYPE.STOCK &&
                                               !x.DisabledDate.HasValue);

            foreach (var stock in stocks)
            {
                var transactions = entities.StockTransactions.Where(x => x.Username.Equals(username) && x.AssetId == stock.Id && !x.DisabledDate.HasValue);
                if (transactions.Any())
                {
                    double quantity     = entities.StockTransactions.Where(x => x.Username.Equals(username) && x.AssetId == stock.Id && !x.DisabledDate.HasValue).Sum(x => x.NumberOfShares);
                    double interestRate = entities.StockTransactions.Where(x => x.Username.Equals(username) && x.AssetId == stock.Id && !x.DisabledDate.HasValue).OrderByDescending(x => x.TransactionDate).FirstOrDefault().ExpectedDividend;
                    result.DividendIncome += quantity * 10000 * interestRate / 100;
                }
                else
                {
                    result.DividendIncome = 0;
                }
            }

            result.FamilyExpenses = entities.Expenses.Where(x => x.Username.Equals(username) &&
                                                            x.ExpenseType == (int)Constants.Constants.EXPENSE_TYPE.FAMILY &&
                                                            !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.FamilyExpenses += entities.Expenses.Where(x => x.Username.Equals(username) &&
                                                             x.ExpenseType == (int)Constants.Constants.EXPENSE_TYPE.INSURANCE &&
                                                             !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.OtherExpenses = entities.Expenses.Where(x => x.Username.Equals(username) &&
                                                           x.ExpenseType == (int)Constants.Constants.EXPENSE_TYPE.OTHERS &&
                                                           !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.AvailableMoney = entities.Assets.Where(x => x.Username.Equals(username) &&
                                                          x.AssetType == (int)Constants.Constants.ASSET_TYPE.AVAILABLE_MONEY &&
                                                          !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.RealEstateValue = entities.Assets.Where(x => x.Username.Equals(username) &&
                                                           x.AssetType == (int)Constants.Constants.ASSET_TYPE.REAL_ESTATE &&
                                                           !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.BusinessValue = entities.Assets.Where(x => x.Username.Equals(username) &&
                                                         x.AssetType == (int)Constants.Constants.ASSET_TYPE.BUSINESS &&
                                                         !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.BankDepositValue = entities.Assets.Where(x => x.Username.Equals(username) &&
                                                            x.AssetType == (int)Constants.Constants.ASSET_TYPE.BANK_DEPOSIT &&
                                                            !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.InsuranceValue = entities.Assets.Where(x => x.Username.Equals(username) &&
                                                          x.AssetType == (int)Constants.Constants.ASSET_TYPE.INSURANCE &&
                                                          !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.StockValue = entities.StockTransactions.Where(x => x.Username.Equals(username) &&
                                                                 !x.DisabledDate.HasValue).Select(x => x.TransactionType == (int)Constants.Constants.TRANSACTION_TYPE.SELL ? 0 - x.Value : x.Value).DefaultIfEmpty(0).Sum();

            result.HomeMortgageLiability = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                                      x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.REAL_ESTATE &&
                                                                      !x.ParentLiabilityId.HasValue && !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            var carLiabilities = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                            x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.CAR &&
                                                            !x.DisabledDate.HasValue && x.StartDate <= current && x.EndDate >= current);

            foreach (var carLiability in carLiabilities)
            {
                result.CarPayment += LiabilityQueries.GetCurrentMonthlyPayment(carLiability.Id);
            }

            var creditCardLiabilities = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                                   x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.CREDIT_CARD &&
                                                                   !x.DisabledDate.HasValue);

            foreach (var creditCarLiability in creditCardLiabilities)
            {
                result.CreditCard += creditCarLiability.Value * creditCarLiability.InterestRate / 1200;
            }

            var homeLiabilities = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                             x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.REAL_ESTATE &&
                                                             !x.DisabledDate.HasValue && x.StartDate <= current && x.EndDate >= current);

            foreach (var homeLiability in homeLiabilities)
            {
                result.HomeMortgage += LiabilityQueries.GetCurrentMonthlyPayment(homeLiability.Id);
            }

            var businessLiabilities = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                                 x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.BUSINESS &&
                                                                 !x.DisabledDate.HasValue && x.StartDate <= current && x.EndDate >= current);

            foreach (var businessLiability in businessLiabilities)
            {
                result.BusinessLoanExpenses += LiabilityQueries.GetCurrentMonthlyPayment(businessLiability.Id);
            }

            var otherLiabilities = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                              x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.OTHERS &&
                                                              !x.DisabledDate.HasValue && x.StartDate <= current && x.EndDate >= current);

            foreach (var otherLiability in otherLiabilities)
            {
                result.OtherLoanExpenses += LiabilityQueries.GetCurrentMonthlyPayment(otherLiability.Id);
            }

            result.StockLoan = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                          x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.STOCK &&
                                                          !x.DisabledDate.HasValue && x.StartDate <= current && x.EndDate >= current).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            var stockLiabilities = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                              x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.STOCK &&
                                                              !x.DisabledDate.HasValue);

            foreach (var stockLiability in stockLiabilities)
            {
                result.StockExpenses += LiabilityQueries.GetCurrentMonthlyPayment(stockLiability.Id);
            }

            result.CreditCardLiability = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                                    x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.CREDIT_CARD &&
                                                                    !x.DisabledDate.HasValue).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.CarLoan = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                        x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.CAR &&
                                                        !x.DisabledDate.HasValue && x.StartDate <= current && x.EndDate >= current).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.BusinessLoan = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                             x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.BUSINESS &&
                                                             !x.DisabledDate.HasValue && !x.ParentLiabilityId.HasValue && x.StartDate <= current && x.EndDate >= current).Select(x => x.Value).DefaultIfEmpty(0).Sum();

            result.OtherLoans = entities.Liabilities.Where(x => x.Username.Equals(username) &&
                                                           x.LiabilityType == (int)Constants.Constants.LIABILITY_TYPE.OTHERS &&
                                                           !x.DisabledDate.HasValue && x.StartDate <= current && x.EndDate >= current).Select(x => x.Value).DefaultIfEmpty(0).Sum();


            result.TotalIncomes     = result.SalaryIncome + result.RealEstateIncome + result.BusinessIncome + result.InterestIncome + result.DividendIncome;
            result.TotalAssets      = result.AvailableMoney + result.RealEstateValue + result.BusinessValue + result.BankDepositValue + result.StockValue + result.InsuranceValue;
            result.TotalExpenses    = result.HomeMortgage + result.CarPayment + result.CreditCard + result.BusinessLoanExpenses + result.StockExpenses + result.OtherExpenses + result.FamilyExpenses;
            result.TotalLiabilities = result.HomeMortgageLiability + result.CarLoan + result.CreditCardLiability + result.BusinessLoan + result.StockLoan + result.OtherLoans;
            result.Equipty          = result.TotalAssets - result.TotalLiabilities;

            result.MonthlyCashflow  = result.TotalIncomes - result.TotalExpenses;
            result.PassiveIncome    = result.BusinessIncome + result.RealEstateIncome + result.InterestIncome + result.DividendIncome;
            result.FinancialFreedom = result.TotalExpenses > 0 && result.TotalIncomes >= result.TotalExpenses ? result.PassiveIncome / result.TotalExpenses * 100 : 0;

            return(result);
        }