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