public void Criar_contrato(ContratoData data) { var id = Guid.NewGuid(); var contrato = ContratoDeEmprestimoAggregate.CriarContrato( new ParametrosDeContratoDeEmprestimo { Id = id, ValorLiquido = data.ValorLiquido, QuantidadeDeParcelas = data.Prazo, TaxaAoMes = data.TaxaAoMes, Tac = data.Tac, Iof = data.Iof, DiasDeCarencia = data.DiasDeCarencia }); contrato.Id.Should().Be(id); contrato.TaxaAoDia.Should().BeEquivalentTo(new Percentual(data.TaxaAoDia)); contrato.ValorCarencia.Should().BeEquivalentTo(new ValorMonetario(data.ValorCarencia)); contrato.ValorFinanciado.Should().BeEquivalentTo(new ValorMonetario(data.ValorFinanciado)); ValorMonetario.ToDecimal(contrato.ValorDaParcela) .Should() .BeApproximately(data.ValorDaParcela, PRECISION); contrato.Parcelas.Should().HaveCount(data.Prazo); foreach (var parcela in contrato.Parcelas) { var parcelaExpected = data.Parcelas.Single(p => p.Numero == parcela.Numero); ValorMonetario.ToDecimal(parcela.SaldoDevedorInicial) .Should() .BeApproximately(ValorMonetario.ToDecimal(parcelaExpected.SaldoDevedorInicial), PRECISION); ValorMonetario.ToDecimal(parcela.Valor) .Should() .BeApproximately(ValorMonetario.ToDecimal(parcelaExpected.Valor), PRECISION); ValorMonetario.ToDecimal(parcela.Principal) .Should() .BeApproximately(ValorMonetario.ToDecimal(parcelaExpected.Principal), PRECISION); ValorMonetario.ToDecimal(parcela.Juros) .Should() .BeApproximately(ValorMonetario.ToDecimal(parcelaExpected.Juros), PRECISION); ValorMonetario.ToDecimal(parcela.SaldoDevedorFinal) .Should() .BeApproximately(ValorMonetario.ToDecimal(parcelaExpected.SaldoDevedorFinal), PRECISION); } }
protected override async Task Handle(CriarContratoCmd request, CancellationToken cancellationToken = default) { _logger.Information("Criando contrato com os parâmetros {@ParametrosContrato}", request); await CheckIfAlreadyExists(request); await _repository.SaveAsync( ContratoDeEmprestimoAggregate.CriarContrato( new ContratoDeEmprestimoAggregate.ParametrosDeContratoDeEmprestimo { Id = request.Id, ValorLiquido = request.ValorLiquido, QuantidadeDeParcelas = request.QuantidadeDeParcelas, TaxaAoMes = request.TaxaAoMes, Tac = request.Tac, Iof = request.Iof, DiasDeCarencia = request.DiasDeCarencia, }), cancellationToken); }
public ValorMonetario CalcularJuros(ContratoDeEmprestimoAggregate contrato, NumeroParcela numeroParcela) => contrato.TaxaAoMes.Aplicar(CalcularSaldoDevedorInicial(contrato, numeroParcela));
public ValorMonetario CalcularSaldoDevedorInicial(ContratoDeEmprestimoAggregate contrato, NumeroParcela numeroParcela) => contrato.ObterParcela(numeroParcela - 1).SaldoDevedorFinal;
public decimal CalcularPrincipal(ContratoDeEmprestimoAggregate contrato, NumeroParcela numeroParcela) => contrato.ValorDaParcela - CalcularJuros(contrato, numeroParcela);
public ValorMonetario CalcularJuros(ContratoDeEmprestimoAggregate contrato, NumeroParcela numeroParcela) => contrato.TaxaAoMes.Aplicar(contrato.ValorFinanciado);
public ValorMonetario CalcularSaldoDevedorInicial(ContratoDeEmprestimoAggregate contrato, NumeroParcela numeroParcela) => contrato.ValorCarencia + contrato.ValorFinanciado;