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
            });
        }
        public async Task <ObterSaldoContaCorrenteCommandResult> Handle(ObterSaldoContaCorrenteCommand request, CancellationToken cancellationToken)
        {
            if (request.IdentificadorConta == default)
            {
                throw new ClienteNaoAutenticadoException("Você precisa se autenticar para visualizar seu saldo.");
            }

            var contaCorrente = await
                                _contaCorrenteRepositorio.ObterContaPorIdAsync(request.IdentificadorConta, cancellationToken);

            return(new ObterSaldoContaCorrenteCommandResult
            {
                Saldo = contaCorrente.Saldo,
                SaldoFormatado = contaCorrente.Saldo.ToString("C", CultureInfo.CreateSpecificCulture("pt-BR"))
            });
        }