public async Task <CategoryStatistic> GetCategoryStatisticAsync( CategoryStatisticQuery query = null, IComparer <CategoryStatisticItem> categoryStatisticItemComparer = null) { var transactionQuery = new TransactionQuery( dateRangeQuery: query?.DateRangeQuery, type: query?.CategoryType); if (categoryStatisticItemComparer == null) { categoryStatisticItemComparer = CategoryStatisticItemComparers.DefaultCategoryStatisticItemComparer; } var transactions = await _transactionRepository.FindAsync(transactionQuery); var statisticItems = transactions .Where(t => t.Category != null) .GroupBy(t => t.Category) .Select(g => new CategoryStatisticItem( category: g.Key, cost: g.Select(c => c.Amount).Sum())) .OrderBy(i => i, categoryStatisticItemComparer) .ToArray(); decimal total = GetTotal(query, statisticItems); return(new CategoryStatistic(statisticItems, total)); }
private static decimal GetTotal(CategoryStatisticQuery query, CategoryStatisticItem[] statisticItems) { decimal total = 0; if (IsDifferenceTotal(query)) { var totalIncomes = statisticItems .Where(item => item.Category.Type == Enums.CategoryType.Income) .Sum(item => item.Cost); var totalExpenditures = statisticItems .Where(item => item.Category.Type == Enums.CategoryType.Expenditure) .Sum(item => item.Cost); total = totalIncomes - totalExpenditures; } else { total = statisticItems.Sum(item => item.Cost); } return(total); }
public async Task GetCategoryStatisticByDateRangeTest() { var category1 = CategoryData.CreateCategory(Guid.NewGuid(), "Products", "Orange", Enums.CategoryType.Expenditure); var category2 = CategoryData.CreateCategory(Guid.NewGuid(), "Products", "Cheese", Enums.CategoryType.Expenditure); var startDate = new DateTime(2018, 1, 1); var endDate = new DateTime(2018, 1, 2); var transaction0 = TransactionData.CreateTransaction(Guid.NewGuid(), startDate, 200, category1); var transaction1 = TransactionData.CreateTransaction(Guid.NewGuid(), endDate, 100, category2); var transaction2 = TransactionData.CreateTransaction(Guid.NewGuid(), new DateTime(2017, 1, 1)); var transaction3 = TransactionData.CreateTransaction(Guid.NewGuid(), new DateTime(2019, 1, 1)); await _transactionRepository.CreateAsync(transaction0); await _transactionRepository.CreateAsync(transaction1); await _transactionRepository.CreateAsync(transaction2); await _transactionRepository.CreateAsync(transaction3); var query = new CategoryStatisticQuery( new DateRangeQuery(new DateQuery(startDate), new DateQuery(endDate)), Enums.CategoryType.Expenditure); var statistic = await _statisticService.GetCategoryStatisticAsync(query); var expected = new CategoryStatistic(new[] { new CategoryStatisticItem(category1, 200), new CategoryStatisticItem(category2, 100) }, 300); var actual = statistic; Assert.That(expected, Is.EqualTo(actual)); }
private static bool IsDifferenceTotal(CategoryStatisticQuery query) { return(query?.CategoryType == null || query.CategoryType == Enums.CategoryType.None); }