public async ValueTask <YearPivotTable?> GetYearExpenses(int year, ExpensesGroupingType groupingType)
        {
            if (year == 0)
            {
                return(null);
            }

            var firstDay = new DateTimeOffset(year, 1, 1, 0, 0, 0, TimeSpan.Zero);
            var lastDay  = new DateTimeOffset(year, 12, 31, 0, 0, 0, TimeSpan.Zero);
            var expenses = await _expensesSvc.GetExpenses(startDate : firstDay, endDate : lastDay, filter : null);

            if (expenses.Count == 0)
            {
                return(null);
            }

            switch (groupingType)
            {
            case ExpensesGroupingType.ByCategory:

                var categories = await _categoriesSvc.GetCategories();

                if (categories.Count == 0)
                {
                    return(null);                           //
                }
                Func <IEnumerable <Expense>, IEnumerable <(string, double)> > groupingLogicC = items => categories
                                                                                               .OrderBy(c => c.Sort)
                                                                                               .GroupJoin(
                    items,
                    c => c.Id,
                    i => i.CategoryId,
                    (category, items) => (category.Name, items.Select(e => e.Amounth).DefaultIfEmpty().Sum()));

                return(new YearPivotTable(year: year, groupingParamName: "Категория", expenses, groupingLogicC));

            case ExpensesGroupingType.ByGroup:

                var groups = await _groupsSvc.GetGroups();

                if (groups.Count == 0)
                {
                    return(null);
                }

                Func <IEnumerable <Expense>, IEnumerable <(string, double)> > groupingLogicG = items => groups.Concat(new List <Group> {
                    new Group {
                        Id = default, Name = "Без группы", Sort = 1000
                    }
                })
 public (string, string, string) GetTableHeaders(ExpensesGroupingType groupingType) => groupingType switch
 {