public InvestmentPortfolioModel GetAssetAllocationSummary_Adviser(string clientGroupId = null)
        {
            List<GroupAccount> groupAccounts = edisRepo.getAllClientGroupAccountsForAdviser(User.Identity.GetUserId(), DateTime.Now);
            List<ClientAccount> clientAccounts = edisRepo.getAllClientAccountsForAdviser(User.Identity.GetUserId(), DateTime.Now);

            double totalMarketValueAE = 0;
            double totalMarketValueIE = 0;
            double totalMarketValueMI = 0;
            double totalMarketValueDP = 0;
            double totalMarketValueFI = 0;
            double totalMarketValueCD = 0;

            foreach (var account in groupAccounts) {
                totalMarketValueAE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<AustralianEquity>();
                totalMarketValueIE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<InternationalEquity>();
                totalMarketValueMI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<ManagedInvestment>();
                totalMarketValueDP += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<DirectProperty>();
                totalMarketValueFI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<FixedIncome>();
                totalMarketValueCD += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<Cash>();
            }
            foreach (var account in clientAccounts)
            {
                totalMarketValueAE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<AustralianEquity>();
                totalMarketValueIE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<InternationalEquity>();
                totalMarketValueMI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<ManagedInvestment>();
                totalMarketValueDP += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<DirectProperty>();
                totalMarketValueFI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<FixedIncome>();
                totalMarketValueCD += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<Cash>();
            }

            InvestmentPortfolioModel model = new InvestmentPortfolioModel{
                data = new List<DataNameAmountPair>{

                    new DataNameAmountPair{name="Australian Equity", amount= totalMarketValueAE},
                    new DataNameAmountPair{name="International Equity", amount= totalMarketValueIE},
                    new DataNameAmountPair{name="Managed Investments", amount= totalMarketValueMI},
                    new DataNameAmountPair{name="Direct & Listed Property", amount= totalMarketValueDP},
                    new DataNameAmountPair{name="Miscellaneous Investments", amount= totalMarketValueAE},
                    new DataNameAmountPair{name="Fixed Income Investments", amount= totalMarketValueFI},
                    new DataNameAmountPair{name="Cash & Term Deposit", amount= totalMarketValueCD},
                },
            };

            return model;
            //return repo.ManagedInvestment_GetAssetAllocation_Adviser(User.Identity.GetUserId());
        }
        public InvestmentPortfolioModel GenerateInvestPortfolioModel(List<AssetBase> assets) {
            InvestmentPortfolioModel model = new InvestmentPortfolioModel {
                data = new List<DataNameAmountPair>{
                    new DataNameAmountPair{name="Australian Equity", amount = assets.GetTotalMarketValue_ByAssetType<AustralianEquity>(), returnValue = assets.OfType<AustralianEquity>().Cast<AssetBase>().ToList().GetTotalCost().CapitalGain},
                    new DataNameAmountPair{name="International Equity", amount= assets.GetTotalMarketValue_ByAssetType<InternationalEquity>(), returnValue = assets.OfType<InternationalEquity>().Cast<AssetBase>().ToList().GetTotalCost().CapitalGain},
                    new DataNameAmountPair{name="Managed Investments", amount= assets.GetTotalMarketValue_ByAssetType<ManagedInvestment>(), returnValue = assets.OfType<ManagedInvestment>().Cast<AssetBase>().ToList().GetTotalCost().CapitalGain},
                    new DataNameAmountPair{name="Direct & Listed Property", amount= assets.GetTotalMarketValue_ByAssetType<DirectProperty>(), returnValue = assets.OfType<DirectProperty>().Cast<AssetBase>().ToList().GetTotalCost().CapitalGain},
                    new DataNameAmountPair{name="Fixed Income Investments", amount= assets.GetTotalMarketValue_ByAssetType<FixedIncome>(), returnValue = assets.OfType<FixedIncome>().Cast<AssetBase>().ToList().GetTotalCost().CapitalGain},
                    new DataNameAmountPair{name="Cash & Term Deposit", amount= assets.GetTotalMarketValue_ByAssetType<Cash>(), returnValue = assets.OfType<Cash>().Cast<AssetBase>().ToList().GetTotalCost().CapitalGain},
                },
            };

            double totalAmount = model.data.Sum(d => d.amount);

            model.data.ForEach(d => {
                d.percentage = (totalAmount == 0 ? 0 : d.amount / totalAmount) * 100;
                model.total += d.amount;
                model.totalReturn += d.returnValue;
            });
            model.totalPercentage = 100;
            return model;
        }
        public InvestmentPortfolioModel GetInvestmentPortfolio_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);

                double totalMarketValueAE = 0;
                double totalMarketValueIE = 0;
                double totalMarketValueMI = 0;
                double totalMarketValueDP = 0;
                double totalMarketValueFI = 0;
                double totalMarketValueCD = 0;

                foreach (var account in groupAccounts)
                {
                    totalMarketValueAE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<AustralianEquity>();
                    totalMarketValueIE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<InternationalEquity>();
                    totalMarketValueMI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<ManagedInvestment>();
                    totalMarketValueDP += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<DirectProperty>();
                    totalMarketValueFI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<FixedIncome>();
                    totalMarketValueCD += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<Cash>();
                }
                foreach (var account in clientAccounts)
                {
                    totalMarketValueAE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<AustralianEquity>();
                    totalMarketValueIE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<InternationalEquity>();
                    totalMarketValueMI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<ManagedInvestment>();
                    totalMarketValueDP += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<DirectProperty>();
                    totalMarketValueFI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<FixedIncome>();
                    totalMarketValueCD += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<Cash>();
                }

                InvestmentPortfolioModel model = new InvestmentPortfolioModel
                {
                    data = new List<DataNameAmountPair>{

                        new DataNameAmountPair{name="Australian Equity", amount= totalMarketValueAE},
                        new DataNameAmountPair{name="International Equity", amount= totalMarketValueIE},
                        new DataNameAmountPair{name="Managed Investments", amount= totalMarketValueMI},
                        new DataNameAmountPair{name="Direct & Listed Property", amount= totalMarketValueDP},
                        new DataNameAmountPair{name="Miscellaneous Investments", amount= totalMarketValueAE},
                        new DataNameAmountPair{name="Fixed Income Investments", amount= totalMarketValueFI},
                        new DataNameAmountPair{name="Cash & Term Deposit", amount= totalMarketValueCD},
                    },
                };

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

                double totalMarketValueAE = 0;
                double totalMarketValueIE = 0;
                double totalMarketValueMI = 0;
                double totalMarketValueDP = 0;
                double totalMarketValueFI = 0;
                double totalMarketValueCD = 0;

                foreach (var account in accounts)
                {
                    totalMarketValueAE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<AustralianEquity>();
                    totalMarketValueIE += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<InternationalEquity>();
                    totalMarketValueMI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<ManagedInvestment>();
                    totalMarketValueDP += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<DirectProperty>();
                    totalMarketValueFI += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<FixedIncome>();
                    totalMarketValueCD += account.GetAssetsSync().GetTotalMarketValue_ByAssetType<Cash>();
                }
                InvestmentPortfolioModel model = new InvestmentPortfolioModel
                {
                    data = new List<DataNameAmountPair>{

                        new DataNameAmountPair{name="Australian Equity", amount= totalMarketValueAE},
                        new DataNameAmountPair{name="International Equity", amount= totalMarketValueIE},
                        new DataNameAmountPair{name="Managed Investments", amount= totalMarketValueMI},
                        new DataNameAmountPair{name="Direct & Listed Property", amount= totalMarketValueDP},
                        new DataNameAmountPair{name="Miscellaneous Investments", amount= totalMarketValueAE},
                        new DataNameAmountPair{name="Fixed Income Investments", amount= totalMarketValueFI},
                        new DataNameAmountPair{name="Cash & Term Deposit", amount= totalMarketValueCD},
                    },
                };

                return model;
            }
        }