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