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