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