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); }
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); }