예제 #1
0
        public async Task <Guid> ExecutarTransacaoAsync(ContaCorrente contaCorrenteOrigem, ContaCorrente contaCorrenteDestino,
                                                        TipoLancamento tipoTransacao, decimal valor, CancellationToken cancellationToken)
        {
            var autenticacaoBancariaId = Guid.NewGuid();
            var lancamentos            = new[]
            {
                new Lancamento
                {
                    IdentificadorLancamento = Guid.NewGuid(),
                    IdentificadorTransacao  = autenticacaoBancariaId,
                    IdentificadorConta      = contaCorrenteOrigem.IdentificadorConta,
                    DataLancamento          = DateTimeOffset.UtcNow,
                    TipoLancamento          = TipoLancamento.TransferenciaEntreContas,
                    TipoTransacao           = TipoTransacao.Debito,
                    Valor = valor
                },
                new Lancamento
                {
                    IdentificadorLancamento = Guid.NewGuid(),
                    IdentificadorTransacao  = autenticacaoBancariaId,
                    IdentificadorConta      = contaCorrenteDestino.IdentificadorConta,
                    DataLancamento          = DateTimeOffset.UtcNow,
                    TipoLancamento          = TipoLancamento.TransferenciaEntreContas,
                    TipoTransacao           = TipoTransacao.Credito,
                    Valor = valor
                }
            };

            var lancamentosRealizados = await _lancamentoRepositorio.SalvarLancamentosAsync(lancamentos);

            if (!lancamentosRealizados)
            {
                throw new LancamentosNaoRealizadosException("Ocorreu um erro ao efetuar a transação.");
            }

            var saldoContaOrigem =
                await _lancamentoRepositorio.ObterSaldoContaAsync(contaCorrenteOrigem.IdentificadorConta);

            var saldoContaDestino =
                await _lancamentoRepositorio.ObterSaldoContaAsync(contaCorrenteDestino.IdentificadorConta);

            contaCorrenteOrigem.AtualizarSaldo(saldoContaOrigem);
            contaCorrenteDestino.AtualizarSaldo(saldoContaDestino);

            var contasAtualizadas = await _contaCorrenteRepositorio.AtualizarSaldoContasAsync(new[]
            {
                contaCorrenteOrigem,
                contaCorrenteDestino
            }, cancellationToken);

            if (!contasAtualizadas)
            {
                throw new ApplicationException("Ocorreu um erro ao atualizar o saldo da conta.");
            }

            return(autenticacaoBancariaId);
        }
예제 #2
0
        public async Task <CriarContaCorrenteCommandResult> Handle(CriarContaCorrenteCommand request, CancellationToken cancellationToken)
        {
            var contaCorrente = _mapper.Map <ContaCorrente>(request);

            if (request.TipoConta != TipoConta.Corrente)
            {
                throw new PermitidoAbrirSomenteContaCorrenteException("É permitido abrir somente conta corrente no momento.");
            }

            var contaExistente = await _contaCorrenteRepositorio.ObterContaPorDadosBancariosAsync(request.Agencia,
                                                                                                  request.NumeroConta, request.DigitoVerificadorConta, request.NumeroDocumento, request.TipoConta, cancellationToken);

            if (contaExistente != null)
            {
                throw new ContaCorrenteJaExisteException("Conta corrente já existe.");
            }

            var conta = await _contaCorrenteRepositorio.CriarContaCorrenteAsync(contaCorrente, cancellationToken);

            if (conta == null)
            {
                throw new ErroParaAbrirContaCorrenteException("Ocorreu um erro ao abrir a conta corrente.");
            }

            var lancamentoInicial = await _lancamentoRepositorio.SalvarLancamentosAsync(new[]
            {
                new Lancamento().CriarLancamentoCredito(request.Valor, contaCorrente.IdentificadorConta)
            });

            if (!lancamentoInicial)
            {
                throw new LancamentosNaoRealizadosException("Um erro ocorreu ao tentar efetuar o lançamento inicial na conta.");
            }

            return(new CriarContaCorrenteCommandResult
            {
                IdentificadorConta = conta.IdentificadorConta
            });
        }