public async Task <CriarLancamentoCommandResult> Handle(CriarLancamentoCommand request, CancellationToken cancellationToken)
        {
            var contaOrigem = await _contaCorrenteRepositorio.ObterContaPorIdAsync(request.IdentificadorContaOrigem, cancellationToken);

            if (contaOrigem == null)
            {
                throw new ContaCorrenteNaoEncontradaException("Conta origem não foi encontrada.");
            }

            var contaDestino = await _contaCorrenteRepositorio.ObterContaPorDadosBancariosAsync(
                request.AgenciaFavorecido,
                request.NumeroContaFavorecido,
                request.DigitoVerificadorFavorecido,
                request.NumeroDocumentoFavorecido,
                request.TipoContaFavorecido,
                cancellationToken);

            if (contaDestino == null)
            {
                throw new ContaCorrenteNaoEncontradaException("Conta destino não foi encontrada.");
            }

            if (contaOrigem.ToString() == contaDestino.ToString())
            {
                throw new ContaOrigemDeveSerDiferenteDaContaDestinoException("Conta origem deve ser diferente da conta destino.");
            }

            if (contaOrigem.Saldo <= request.ValorLancamento)
            {
                throw new ContaCorrenteSemSaldoParaEfetuarLancamento("Conta origem não tem saldo suficiente para realizar o lançamento.");
            }

            var autenticacaoBancaria = await _lancamentoServico.ExecutarTransacaoAsync(contaOrigem, contaDestino,
                                                                                       TipoLancamento.TransferenciaEntreContas, request.ValorLancamento, cancellationToken);

            return(new CriarLancamentoCommandResult
            {
                AuthenticacaoBancaria = autenticacaoBancaria,
                Valor = request.ValorLancamento,
                TipoTransacao = TipoLancamento.TransferenciaEntreContas,
                TipoConta = TipoConta.Corrente,
                NumeroDocumento = contaDestino.NumeroDocumento,
                ContaOrigem = contaOrigem.ToString(),
                ContaDestino = contaDestino.ToString(),
                ContaDestinoNome = contaDestino.NomeLegal,
                ContaOrigemNome = contaOrigem.NomeLegal,
                DataDaTransacao = DateTimeOffset.UtcNow
            });
        }
Ejemplo n.º 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
            });
        }