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