Exemplo n.º 1
0
        public async Task <ExpensesListModel> GetExpensesForDay(ExpensesFilter filter)
        {
            // отбираем нужные счета
            var expensesQueries = _repository.GetQuery <ExpenseBill>();

            var flowId   = filter.FlowId;
            var today    = filter.DateFrom.Date;
            var tomorrow = today.AddDays(1);
            var ownerId  = _currentSession.UserId;

            var goodsGroups = await expensesQueries
                              .Where(x => x.OwnerId == ownerId && (flowId == null || x.ExpenseFlowId == flowId) &&
                                     x.DateTime >= today && x.DateTime < tomorrow)
                              .OrderBy(x => x.DateTime)
                              .Select(x => new FlowBillGoodsGroup
            {
                BillIds = new List <int> {
                    x.Id
                },
                DateTime    = x.DateTime,
                Sum         = x.SumPrice,
                AccountName = x.Account.Name
            })
                              .ToListAsync()
                              .ConfigureAwait(false);

            // группируем категории и товары с сортировкой
            await GroupAndSortBillsGoodsAsync(goodsGroups);

            // финальное преобразование из внутренних моделей
            var expenses = new ExpensesListModel
            {
                Expenses = goodsGroups.Select(x => new ExpensesListItemModel
                {
                    BillIds         = x.BillIds,
                    Sum             = x.Sum,
                    DateFrom        = today.ToStandardString(),
                    DateTo          = tomorrow.ToStandardString(),
                    Period          = x.AccountName,
                    Caption         = x.DateTime.ToStandardString(),
                    Goods           = x.Goods.Select(g => g.Name).ToList().GetLaconicString(),
                    IsDangerExpense = false
                }).ToList(),
                Pagination = null,

                // считаем тоталы
                Totals = new TotalsInfoModel
                {
                    Caption = $"Итого за день с {today.ToStandardDateStr()} по {tomorrow.ToStandardDateStr()}",
                    Total   = await _repository.GetQuery <ExpenseBill>()
                              .Where(x => x.OwnerId == ownerId && (flowId == null || x.ExpenseFlowId == flowId) &&
                                     x.DateTime >= today && x.DateTime < tomorrow)
                              .SumAsync(x => x.SumPrice)
                              .ConfigureAwait(false)
                }
            };

            return(expenses);
        }
Exemplo n.º 2
0
        private async Task <ExpensesListModel> GetExpenses(
            ExpensesFilter filter, PaginationArgs paginationArgs, bool byMonth)
        {
            var flowId   = filter.FlowId;
            var dateFrom = filter.DateFrom;
            var dateTo   = filter.DateTo;
            var userId   = _currentSession.UserId;

            // отбираем нужные счета и группируем их по дате
            var goodsGroupsWithPagination = byMonth
                ? await GetGoodsGroupsByMonthAsync(flowId, dateFrom, dateTo, paginationArgs)
                : await GetGoodsGroupsByDayAsync(flowId, dateFrom, dateTo, paginationArgs);

            var goodsGroups = goodsGroupsWithPagination.GoodsGrops;

            // группируем все товары и категории и сортируем их в порядке уменьшения общей стоимости в каждой группе
            await GroupAndSortBillsGoodsAsync(goodsGroups);

            // финальное преобразование из внутренних моделей
            var expenses = new ExpensesListModel
            {
                Expenses = goodsGroups.Select(x => new ExpensesListItemModel
                {
                    BillIds = x.BillIds,
                    Sum     = x.Sum,

                    DateFrom = byMonth
                        ? x.DateTime.StartOfTheMonth().ToStandardString()
                        : x.DateTime.Date.ToStandardString(),

                    DateTo = byMonth
                        ? x.DateTime.EndOfTheMonth().ToStandardString()
                        : x.DateTime.Date.AddDays(1).AddMinutes(-1).ToStandardString(),

                    Period = byMonth
                        ? $"{x.DateTime.StartOfTheMonth().ToStandardDateStr()} - {x.DateTime.EndOfTheMonth().ToStandardDateStr()}"
                        : x.DateTime.ToStandardDateStr(),

                    Caption         = byMonth ? x.DateTime.GetMonthName() : x.DateTime.GetWeekDayName().Capitalize(),
                    Goods           = x.Goods.Select(g => g.Name).ToList().GetLaconicString(),
                    IsDangerExpense = x.Sum >= _userSettings.DangerExpense(byMonth)
                }).ToList(),
                Pagination = goodsGroupsWithPagination.Pagination,

                // считаем тоталы
                Totals = new TotalsInfoModel
                {
                    Caption = $"Итого за период с {dateFrom.ToStandardDateStr()} по {dateTo.ToStandardDateStr()}",
                    Total   = await _repository.GetQuery <ExpenseBill>()
                              .Where(x => x.OwnerId == userId && (flowId == null || x.ExpenseFlowId == flowId) &&
                                     x.DateTime >= dateFrom && x.DateTime < dateTo)
                              .SumAsync(x => x.SumPrice)
                              .ConfigureAwait(false)
                }
            };

            return(expenses);
        }