Beispiel #1
0
        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));
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
 private static bool IsDifferenceTotal(CategoryStatisticQuery query)
 {
     return(query?.CategoryType == null || query.CategoryType == Enums.CategoryType.None);
 }