예제 #1
0
        public void GetBalances_SplitsExpensesBetweenAll()
        {
            var userA = CreateSettlementUser();
            var userB = CreateSettlementUser();
            var userC = CreateSettlementUser();
            var users = new[] { userA, userB, userC };

            _settlementUsersRepository.GetSettlementUsers(_settlementId)
            .Returns(users);
            var expenses = new[]
            {
                new Expense {
                    WhoPaid = userA, Amount = 9
                }
            };

            _expensesRepository.GetExpenses(_settlementId)
            .Returns(expenses);
            var provider = CreateBalancesProvider();

            var balances = provider.GetBalances(_settlementId);

            Assert.Collection(balances,
                              item => Assert.Equal(6M, item.Balance),
                              item => Assert.Equal(-3M, item.Balance),
                              item => Assert.Equal(-3M, item.Balance)
                              );
        }
예제 #2
0
        public IReadOnlyList <UserBalance> GetBalances(string settlementId)
        {
            var expenses             = _expensesRepository.GetExpenses(settlementId).ToList();
            var expensesSumByWhoPaid = expenses
                                       .GroupBy(e => e.WhoPaid.Id)
                                       .ToDictionary(g => g.Key, g => g.Sum(e => e.Amount));
            var settlementUsers = _settlementUsersRepository.GetSettlementUsers(settlementId)
                                  .ToList();
            var usersCount = settlementUsers.Count();
            var expensesSumByParticipant = settlementUsers
                                           .ToDictionary(u => u.Id, u =>
                                                         Round(expenses
                                                               .Where(e => e.Participants.IsNullOrEmpty() || e.Participants.Any(p => p.Id == u.Id))
                                                               .Sum(e => e.Amount / (e.Participants.IsNullOrEmpty() ? usersCount : e.Participants.Count))));
            var transactions = _transactionsRepository.GetTransactions(settlementId)
                               .ToList();
            var outgoingTransactionsSumByUser = transactions
                                                .GroupBy(t => t.From.Id)
                                                .ToDictionary(g => g.Key, g => g.Sum(t => t.Amount));
            var incomingTransactionsSumByUser = transactions
                                                .GroupBy(t => t.To.Id)
                                                .ToDictionary(g => g.Key, g => g.Sum(t => t.Amount));

            return(settlementUsers
                   .Select(u => new UserBalance
            {
                User = u,
                Balance = expensesSumByWhoPaid.GetValueOrDefault(u.Id, 0)
                          - expensesSumByParticipant.GetValueOrDefault(u.Id, 0)
                          + outgoingTransactionsSumByUser.GetValueOrDefault(u.Id, 0)
                          - incomingTransactionsSumByUser.GetValueOrDefault(u.Id, 0)
            })
                   .ToList());
        }
        public async Task <IActionResult> Index(int Id)
        {
            if (Id == 0)
            {
                Id = CashAccount_Id;
            }
            else
            {
                CashAccount_Id = Id;
            }

            var accessToken = await HttpContext.GetTokenAsync("access_token");

            var content = await _expensesRepository.GetExpenses(
                "https://localhost:44382/Expenses/Get?id=" + Id.ToString(), accessToken);

            List <ExpensesViewModel> expensesViewModels = new List <ExpensesViewModel>();

            if (content == null)
            {
                return(View(expensesViewModels));
            }
            else
            {
                var expenses = _expensesRepository.DeseralizeExpenses(content);

                expensesViewModels = _mapper.Map <List <ExpensesJsonModel>,
                                                  List <ExpensesViewModel> >(expenses);

                return(View(expensesViewModels));
            }
        }
예제 #4
0
        public async Task <IActionResult> GetExpenses()
        {
            var expenses = await _repo.GetExpenses();

            var expensesToReturn = _mapper.Map <IEnumerable <ExpensesForListDto> >(expenses);

            return(Ok(expensesToReturn));
        }
예제 #5
0
 public async Task <IHttpActionResult> Get()
 {
     try
     {
         List <ExpensesModel> result = _repository.GetExpenses();
         return(Ok(result));
     }
     catch (Exception ex)
     {
         return(InternalServerError(ex));
     }
 }
예제 #6
0
        public IEnumerable <Expense> Get(
            [FromQuery(Name = "startDate")] DateTime startDate,
            [FromQuery(Name = "endDate")] DateTime endDate,
            [FromQuery(Name = "expenseType")] int expenseType)
        {
            // If no relevent month is set, use current month
            if (startDate.Year < 2000)
            {
                startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
                var tempDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month + 1, 1);
                endDate = tempDate - TimeSpan.FromDays(1);
            }

            return(expensesRepository.GetExpenses(startDate, endDate, expenseType));
        }
 public IEnumerable <Expense> Get()
 {
     return(_expenses.GetExpenses());
 }
예제 #8
0
 public IEnumerable <Expenses> GetExpenses()
 {
     return(_expensesRepository.GetExpenses());
 }
예제 #9
0
 public ActionResult GetAll(string settlementId)
 {
     return(Ok(_expensesRepository.GetExpenses(settlementId)));
 }
예제 #10
0
        public async ValueTask <bool> IsEmptyCategory(Guid categoryId)
        {
            var expenses = await _expenseRepo.GetExpenses(null, null);

            return(!expenses.Any(e => e.CategoryId == categoryId));
        }