public MortgageInvestmentGeneralInfo GenerateGeneralInfo(List<LiabilityBase> liabilities) {
            double marketValue = 0;
            double outstandingLoans = 0;
            double propertyGearingRatio = 0;
            double monthlyRepayment = 0;

            foreach (var mah in liabilities.OfType<MortgageAndHomeLiability>()) {
                mah.GetActivitiesSync().OfType<FinancialActivity>().ToList().ForEach(a => monthlyRepayment += a.Expenses.Sum(e => e.Amount));
                marketValue += mah.Property.GetTotalMarketValue();
                propertyGearingRatio += mah.CurrentPropertyGearingRatio;
                outstandingLoans += mah.CurrentBalance;
                
            }

            MortgageInvestmentGeneralInfo info = new MortgageInvestmentGeneralInfo {
                marketValue = marketValue,
                propertyGearingRatio = propertyGearingRatio,
                outstandingLoans = outstandingLoans,
                monthlyRepayment = monthlyRepayment
            };
            return info;
        }
        public MortgageInvestmentGeneralInfo GetGeneralInfo_Client()
        {
            Client client = edisRepo.GetClientSync(User.Identity.GetUserId(), DateTime.Now);
            ClientGroup clientGroup = edisRepo.GetClientGroupSync(client.ClientGroupId, DateTime.Now);
            if (clientGroup.MainClientId == client.Id)
            {
                List<GroupAccount> groupAccounts = edisRepo.GetAccountsForClientGroupSync(clientGroup.ClientGroupNumber, DateTime.Now);
                List<ClientAccount> clientAccounts = edisRepo.GetAccountsForClientSync(client.ClientNumber, DateTime.Now);

                List<LiabilityBase> liabilities = new List<LiabilityBase>();

                double marketValue = 0;
                double outstandingLoans = 0;
                double propertyGearingRatio = 0;
                double monthlyRepayment = 0;

                foreach (var account in groupAccounts)
                {
                    liabilities.AddRange(account.GetLiabilitiesSync());
                }
                foreach (var account in clientAccounts)
                {
                    liabilities.AddRange(account.GetLiabilitiesSync());
                }
                var mahs = liabilities.OfType<MortgageAndHomeLiability>();

                foreach (var mah in mahs)
                {
                    foreach (var activity in mah.GetActivitiesSync().OfType<FinancialActivity>())
                    {
                        monthlyRepayment += activity.Incomes.Sum(i => i.Amount);
                    }
                    marketValue += mah.Property.GetTotalMarketValue();
                    propertyGearingRatio += mah.CurrentPropertyGearingRatio;
                    outstandingLoans += mah.CurrentBalance;
                }
                MortgageInvestmentGeneralInfo info = new MortgageInvestmentGeneralInfo
                {
                    marketValue = marketValue,
                    propertyGearingRatio = propertyGearingRatio,
                    outstandingLoans = outstandingLoans,
                    monthlyRepayment = monthlyRepayment
                };

                return info;
            }
            else
            {
                List<ClientAccount> accounts = edisRepo.GetAccountsForClientSync(client.ClientNumber, DateTime.Now);

                List<LiabilityBase> liabilities = new List<LiabilityBase>();

                double marketValue = 0;
                double outstandingLoans = 0;
                double propertyGearingRatio = 0;
                double monthlyRepayment = 0;

                foreach (var account in accounts)
                {
                    liabilities.AddRange(account.GetLiabilitiesSync());
                }
                var mahs = liabilities.OfType<MortgageAndHomeLiability>();

                foreach (var mah in mahs)
                {
                    foreach (var activity in mah.GetActivitiesSync().OfType<FinancialActivity>())
                    {
                        monthlyRepayment += activity.Incomes.Sum(i => i.Amount);
                    }
                    marketValue += mah.Property.GetTotalMarketValue();
                    propertyGearingRatio += mah.CurrentPropertyGearingRatio;
                    outstandingLoans += mah.CurrentBalance;
                }
                MortgageInvestmentGeneralInfo info = new MortgageInvestmentGeneralInfo
                {
                    marketValue = marketValue,
                    propertyGearingRatio = propertyGearingRatio,
                    outstandingLoans = outstandingLoans,
                    monthlyRepayment = monthlyRepayment
                };

                return info;
            }
        }