Пример #1
0
        public async Task <IActionResult> Patch([FromBody] SaveAmountRecordRequest request)
        {
            var amountRecords             = request.AmountRecords.Select(x => AmountRecord.Load(x.Id, x.Description, x.Amount));
            SaveAmountRecordResult result = await _useCase.Execute <Income>(request.AccountId, request.Id, amountRecords);

            return(Ok(result));
        }
Пример #2
0
        public AccountBuilder WithInvestment(Guid investmentId, Guid firstAmountRecordId, params decimal[] amountRecordValues)
        {
            Investment investment = Investment.Load(investmentId, GenerateName(5), new AmountRecordCollection(), MonthYear.Now);

            investment.AmountRecords.Add(AmountRecord.Load(firstAmountRecordId, GenerateName(5), amountRecordValues[0]));
            for (int i = 1; i < amountRecordValues.Length; i++)
            {
                investment.AmountRecords.Add(AmountRecord.Load(Guid.NewGuid(), GenerateName(5), amountRecordValues[i]));
            }
            Investments.Add(investment);
            return(this);
        }
Пример #3
0
        public AccountBuilder WithExpense(Guid expenseId, Guid firstAmountRecordId, params decimal[] amountRecordValues)
        {
            Expense expense = Expense.Load(expenseId, GenerateName(5), new AmountRecordCollection(), MonthYear.Now);

            expense.AmountRecords.Add(AmountRecord.Load(firstAmountRecordId, GenerateName(5), amountRecordValues[0]));
            for (int i = 1; i < amountRecordValues.Length; i++)
            {
                expense.AmountRecords.Add(AmountRecord.Load(Guid.NewGuid(), GenerateName(5), amountRecordValues[i]));
            }
            Expenses.Add(expense);
            return(this);
        }
Пример #4
0
        public void Should_Throw_Exception_Given_Nonexistent_Account()
        {
            Guid accountId = Guid.NewGuid();
            Guid expenseId = Guid.NewGuid();

            AmountRecord[] amountRecords = new AmountRecord[] { new AmountRecord(124.99m) };
            _accountReadOnlyRepository
            .Setup(x => x.Get(accountId))
            .ReturnsAsync(default(Account))
            .Verifiable();

            Assert.ThrowsAsync <AccountNotFoundException>(() => _saveAmountRecordUseCase.Execute <Expense>(accountId, expenseId, amountRecords));

            _accountReadOnlyRepository.VerifyAll();
        }
Пример #5
0
        public async Task Should_Add_Amount_Record_To_Expenses()
        {
            Guid accountId = Guid.NewGuid();
            Guid expenseId = Guid.NewGuid();

            AmountRecord[] amountRecords = new AmountRecord[] {
                new AmountRecord(700),
                new AmountRecord(300)
            };
            Account account = AccountBuilder
                              .New
                              .WithId(accountId)
                              .WithExpenses(expenseId, 700, 600, 500)
                              .WithIncomes(5000m)
                              .Build();

            _accountReadOnlyRepository
            .Setup(x => x.Get(accountId))
            .ReturnsAsync(account);

            _accountWriteOnlyRepository
            .Setup(x => x.Update(account, It.IsAny <IFinanceStatement>()));


            var result = await _saveAmountRecordUseCase.Execute <Expense>(accountId, expenseId, amountRecords);

            decimal expectedTotal             = 1_000m;
            decimal expectedExpenseTotal      = 2_100m;
            double  expectedPercentage        = 47.62;
            double  expectedExpensePercentage = 42;


            Assert.Equal(expenseId, result.Id);
            Assert.Equal(expectedTotal, result.Total);
            Assert.Equal(expectedPercentage, Math.Round(result.Percentage * 100, 2));
            Assert.Equal(expectedExpenseTotal, result.Expense.Total);
            Assert.Equal(expectedExpensePercentage, Math.Round(result.Expense.Percentage * 100, 2));
            Assert.NotEmpty(result.AmountRecords);

            _accountReadOnlyRepository.Verify(x => x.Get(accountId), Times.Once);
            _accountWriteOnlyRepository.Verify(x => x.Update(account, It.IsAny <IFinanceStatement>()), Times.Once);
        }
Пример #6
0
        public async Task Should_Add_Amount_Record_To_Investment()
        {
            Guid accountId    = Guid.NewGuid();
            Guid investmentId = Guid.NewGuid();

            AmountRecord[] amountRecords = new AmountRecord[] {
                new AmountRecord(500),
                new AmountRecord(300)
            };
            Account account = AccountBuilder
                              .New
                              .WithId(accountId)
                              .WithInvestments(investmentId, 500m, 300m)
                              .Build();

            _accountReadOnlyRepository
            .Setup(x => x.Get(accountId))
            .ReturnsAsync(account);

            _accountWriteOnlyRepository
            .Setup(x => x.Update(account, It.IsAny <IFinanceStatement>()));


            var result = await _saveAmountRecordUseCase.Execute <Investment>(accountId, investmentId, amountRecords);

            decimal expectedTotal           = 800m;
            decimal expectedInvestmentTotal = 1_100m;


            Assert.Equal(investmentId, result.Id);
            Assert.Equal(expectedTotal, result.Total);
            Assert.Equal(expectedInvestmentTotal, result.Investment.Total);
            Assert.Equal(0, result.Investment.Percentage);


            _accountReadOnlyRepository.Verify(x => x.Get(accountId), Times.Once);
            _accountWriteOnlyRepository.Verify(x => x.Update(account, It.IsAny <IFinanceStatement>()), Times.Once);
        }
Пример #7
0
        public async Task <AccountQueryResult> GetAccount(System.Guid accountId)
        {
            Entities.Account account = await _context
                                       .Accounts
                                       .Find(x => x.Id == accountId)
                                       .SingleOrDefaultAsync();

            if (account == null)
            {
                throw new AccountNotFoundException($"The account {accountId} does not exists");
            }

            if (!account.Actived)
            {
                throw new AccountDeactivatedException($"The account {accountId} is deactivated!");
            }

            IEnumerable <Entities.FinanceStatement> incomes = await _context
                                                              .Incomes
                                                              .Find(x => x.AccountId == accountId)
                                                              .ToListAsync();

            IEnumerable <Entities.FinanceStatement> expenses = await _context
                                                               .Expenses
                                                               .Find(x => x.AccountId == accountId)
                                                               .ToListAsync();

            IEnumerable <Entities.FinanceStatement> investments = await _context
                                                                  .Investments
                                                                  .Find(x => x.AccountId == accountId)
                                                                  .ToListAsync();


            FinanceStatementCollection incomeCollection = new FinanceStatementCollection();

            foreach (var income in incomes)
            {
                IEnumerable <Entities.AmountRecord> amountRecords = await _context
                                                                    .AmountRecords
                                                                    .Find(x => x.FinanceStatementId == income.Id)
                                                                    .ToListAsync();

                AmountRecordCollection amountRecordCollection = new AmountRecordCollection(amountRecords.Select(x => AmountRecord.Load(x.Id, x.Description, x.Amount)));

                incomeCollection.Add(Income.Load(income.Id, income.Title, amountRecordCollection, income.ReferenceDate));
            }

            FinanceStatementCollection expenseCollection = new FinanceStatementCollection();

            foreach (var expense in expenses)
            {
                IEnumerable <Entities.AmountRecord> amountRecords = await _context
                                                                    .AmountRecords
                                                                    .Find(x => x.FinanceStatementId == expense.Id)
                                                                    .ToListAsync();

                AmountRecordCollection amountRecordCollection = new AmountRecordCollection(amountRecords.Select(x => AmountRecord.Load(x.Id, x.Description, x.Amount)));

                expenseCollection.Add(Expense.Load(expense.Id, expense.Title, amountRecordCollection, expense.ReferenceDate));
            }

            FinanceStatementCollection investmentsCollection = new FinanceStatementCollection();

            foreach (var investment in investments)
            {
                IEnumerable <Entities.AmountRecord> amountRecords = await _context
                                                                    .AmountRecords
                                                                    .Find(x => x.FinanceStatementId == investment.Id)
                                                                    .ToListAsync();

                AmountRecordCollection amountRecordCollection = new AmountRecordCollection(amountRecords.Select(x => AmountRecord.Load(x.Id, x.Description, x.Amount)));

                investmentsCollection.Add(Investment.Load(investment.Id, investment.Title, amountRecordCollection, investment.ReferenceDate));
            }

            AccountQueryResult result = new AccountQueryResult(account.Id, expenseCollection, incomeCollection, investmentsCollection);

            return(result);
        }
Пример #8
0
        public AccountBuilder WithExpenses(Guid firstItemId, int length = 3)
        {
            var list = new List <Expense>();

            list.Add(Expense.Load(firstItemId, GenerateName(9), new AmountRecordCollection(new[] { AmountRecord.Load(Guid.NewGuid(), null, GenerateDecimal()) }), MonthYear.Now));
            for (int i = 0; i < length - 1; i++)
            {
                list.Add(Expense.Load(Guid.NewGuid(), GenerateName(9), new AmountRecordCollection(new[] { AmountRecord.Load(Guid.NewGuid(), null, GenerateDecimal()) }), MonthYear.Now));
            }

            Expenses = new FinanceStatementCollection(list);
            return(this);
        }
Пример #9
0
        public AccountBuilder WithExpenses(params decimal[] values)
        {
            var list = new List <Expense>();

            foreach (var value in values)
            {
                list.Add(Expense.Load(Guid.NewGuid(), GenerateName(9), new AmountRecordCollection(new[] { AmountRecord.Load(Guid.NewGuid(), null, value) }), MonthYear.Now));
            }
            Expenses = new FinanceStatementCollection(list);
            return(this);
        }
Пример #10
0
        public AccountBuilder WithIncomes(Guid firstItemId, params decimal[] values)
        {
            var list = new List <Income>();

            list.Add(Income.Load(firstItemId, GenerateName(9), new AmountRecordCollection(new[] { AmountRecord.Load(Guid.NewGuid(), null, values[0]) }), MonthYear.Now));

            for (int i = 1; i < values.Length; i++)
            {
                list.Add(Income.Load(Guid.NewGuid(), GenerateName(9), new AmountRecordCollection(new[] { AmountRecord.Load(Guid.NewGuid(), null, values[i]) }), MonthYear.Now));
            }

            Incomes = new FinanceStatementCollection(list);
            return(this);
        }
Пример #11
0
        public AccountBuilder WithIncomes(int length = 2)
        {
            var list = new List <Income>();

            for (int i = 0; i < length; i++)
            {
                list.Add(Income.Load(Guid.NewGuid(), GenerateName(9), new AmountRecordCollection(new[] { AmountRecord.Load(Guid.NewGuid(), null, GenerateDecimal()) }), MonthYear.Now));
            }
            Incomes = new FinanceStatementCollection(list);
            return(this);
        }
Пример #12
0
        public async Task <Account> Get(Guid accountId)
        {
            Entities.Account account = await _context
                                       .Accounts
                                       .Find(x => x.Id == accountId)
                                       .SingleOrDefaultAsync();


            IEnumerable <Entities.FinanceStatement> incomes = await _context
                                                              .Incomes
                                                              .Find(x => x.AccountId == accountId)
                                                              .ToListAsync();

            IEnumerable <Entities.FinanceStatement> expenses = await _context
                                                               .Expenses
                                                               .Find(x => x.AccountId == accountId)
                                                               .ToListAsync();

            IEnumerable <Entities.FinanceStatement> investments = await _context
                                                                  .Investments
                                                                  .Find(x => x.AccountId == accountId)
                                                                  .ToListAsync();


            FinanceStatementCollection incomeCollection = new FinanceStatementCollection();

            foreach (var income in incomes)
            {
                IEnumerable <Entities.AmountRecord> amountRecords = await _context
                                                                    .AmountRecords
                                                                    .Find(x => x.FinanceStatementId == income.Id)
                                                                    .ToListAsync();

                AmountRecordCollection amountRecordCollection = new AmountRecordCollection(amountRecords.Select(x => AmountRecord.Load(x.Id, x.Description, x.Amount)));

                incomeCollection.Add(Income.Load(income.Id, income.Title, amountRecordCollection, income.ReferenceDate));
            }

            FinanceStatementCollection expenseCollection = new FinanceStatementCollection();

            foreach (var expense in expenses)
            {
                IEnumerable <Entities.AmountRecord> amountRecords = await _context
                                                                    .AmountRecords
                                                                    .Find(x => x.FinanceStatementId == expense.Id)
                                                                    .ToListAsync();

                AmountRecordCollection amountRecordCollection = new AmountRecordCollection(amountRecords.Select(x => AmountRecord.Load(x.Id, x.Description, x.Amount)));

                expenseCollection.Add(Expense.Load(expense.Id, expense.Title, amountRecordCollection, expense.ReferenceDate));
            }

            FinanceStatementCollection investmentsCollection = new FinanceStatementCollection();

            foreach (var investment in investments)
            {
                IEnumerable <Entities.AmountRecord> amountRecords = await _context
                                                                    .AmountRecords
                                                                    .Find(x => x.FinanceStatementId == investment.Id)
                                                                    .ToListAsync();

                AmountRecordCollection amountRecordCollection = new AmountRecordCollection(amountRecords.Select(x => AmountRecord.Load(x.Id, x.Description, x.Amount)));

                investmentsCollection.Add(Investment.Load(investment.Id, investment.Title, amountRecordCollection, investment.ReferenceDate));
            }

            Account result = Account.Load(
                account.Id,
                account.Actived,
                incomeCollection,
                expenseCollection,
                investmentsCollection
                );

            return(result);
        }