/*************************************************************/

        /* Methods that enable the Views to fetch the desired accounts
         * /*************************************************************/

        /** Yearly ER - Fetch main-groups **/
        public async Task <YearViewModel> FetchMainGroupsForYearlyER(StructureType selectedType,
                                                                     int mostRecentFinancialYear,
                                                                     int selectedYear,
                                                                     int selectedLevel)
        {
            int previousYear = selectedYear - 1;
            var years        = new List <int> {
                previousYear, selectedYear
            };

            bool isFunctionGroups = selectedType == StructureType.Functions || selectedType == StructureType.FunctionsThenSubjects;
            var  query            = GetQueryForErAccounts(isFunctionGroups, years, selectedLevel);

            List <AccountYearViewModel> allAccounts = await query.ToListAsync();

            List <AccountYearViewModel> accountsForPreviousYear = allAccounts.Where(a => a.Year == previousYear).OrderBy(a => a.AccountId).ToList();
            List <AccountYearViewModel> accountsForSelectedYear = allAccounts.Where(a => a.Year == selectedYear).OrderBy(a => a.AccountId).ToList();

            SetPercentChangesBetweenTwoYears(accountsForPreviousYear, accountsForSelectedYear, mostRecentFinancialYear, selectedYear);

            YearTotalsViewModel totalsForSelectedYear = GetTotalsForYears(years, allAccounts, mostRecentFinancialYear).FirstOrDefault(y => y.Year == selectedYear);

            return(new YearViewModel
            {
                Year = selectedYear,
                Accounts = accountsForSelectedYear,
                AccountYearTotals = totalsForSelectedYear
            });
        }
        private List <YearTotalsViewModel> GetTotalsForYears(List <int> years,
                                                             List <AccountYearViewModel> allAccounts,
                                                             int mostRecentFinancialYear)
        {
            List <YearTotalsViewModel> totalsForSelectedYears = new List <YearTotalsViewModel>();

            for (int i = 0; i < years.Count; i++)
            {
                var  accSelectedY = allAccounts.Where(a => a.Year == years[i]).ToList();
                bool hasAcc       = accSelectedY.Any();

                YearTotalsViewModel ts = new YearTotalsViewModel {
                    Year = years[i]
                };

                if (hasAcc)
                {
                    ts.ExpensesActualTotal = accSelectedY.Where(a => a.Year == years[i]).Select(a => a.ExpensesActual).Sum();
                    ts.ExpensesBudgetTotal = accSelectedY.Where(a => a.Year == years[i]).Select(a => a.ExpensesBudget).Sum();
                    ts.IncomeActualTotal   = accSelectedY.Where(a => a.Year == years[i]).Select(a => a.IncomeActual).Sum();
                    ts.IncomeBudgetTotal   = accSelectedY.Where(a => a.Year == years[i]).Select(a => a.IncomeBudget).Sum();
                    ts.BalanceActualTotal  = (ts.IncomeActualTotal ?? 0) - (ts.ExpensesActualTotal ?? 0);
                    ts.BalanceBudgetTotal  = (ts.IncomeBudgetTotal ?? 0) - (ts.ExpensesBudgetTotal ?? 0);
                }
                else
                {
                    totalsForSelectedYears.Add(ts);
                    continue;
                }

                // If a previous year exists and contains at least one account, calculate percentage of changes
                if (i > 0 && allAccounts.Any(a => a.Year == years[i - 1]))
                {
                    // Get totals of previous year
                    YearTotalsViewModel totalsOfPY = totalsForSelectedYears[i - 1];
                    ts.HasPreviousYear = true;

                    if (years[i] <= mostRecentFinancialYear)
                    {
                        ts.PercentageChangeExpensesActualTotal = _helpers.GetPercentageChange(totalsOfPY.ExpensesActualTotal, ts.ExpensesActualTotal);
                        ts.PercentageChangeIncomeActualTotal   = _helpers.GetPercentageChange(totalsOfPY.IncomeActualTotal, ts.IncomeActualTotal);
                        ts.PercentageChangeBalanceActualTotal  = _helpers.GetPercentageChange(totalsOfPY.BalanceActualTotal, ts.BalanceActualTotal);
                    }
                    else if (years[i] == (mostRecentFinancialYear + 1))
                    {
                        ts.PercentageChangeExpensesBudgetTotal = _helpers.GetPercentageChange(totalsOfPY.ExpensesActualTotal, ts.ExpensesBudgetTotal);
                        ts.PercentageChangeIncomeBudgetTotal   = _helpers.GetPercentageChange(totalsOfPY.IncomeActualTotal, ts.IncomeBudgetTotal);
                        ts.PercentageChangeBalanceBudgetTotal  = _helpers.GetPercentageChange(totalsOfPY.BalanceActualTotal, ts.BalanceBudgetTotal);
                    }
                    else if (years[i] > (mostRecentFinancialYear + 1))
                    {
                        ts.PercentageChangeExpensesBudgetTotal = _helpers.GetPercentageChange(totalsOfPY.ExpensesBudgetTotal, ts.ExpensesBudgetTotal);
                        ts.PercentageChangeIncomeBudgetTotal   = _helpers.GetPercentageChange(totalsOfPY.IncomeBudgetTotal, ts.IncomeBudgetTotal);
                        ts.PercentageChangeBalanceBudgetTotal  = _helpers.GetPercentageChange(totalsOfPY.BalanceBudgetTotal, ts.BalanceBudgetTotal);
                    }
                }

                totalsForSelectedYears.Add(ts);
            }
            return(totalsForSelectedYears);
        }