public async Task <OperacaoArgument> EfetuaLancamento(ContaArgument contaOrigem, ContaArgument contaDestino, TipoOperacao tipoOperacao, decimal valor) { ContaArgument origem = new ContaArgument(); ContaArgument destino = new ContaArgument(); if (contaOrigem.Agencia == contaDestino.Agencia && contaOrigem.ContaNumero == contaDestino.ContaNumero) { throw new ArgumentException("Agencia de origem não pode ser a mesma de destino"); } if (tipoOperacao == TipoOperacao.Credito) { origem = await _contaService.Creditar(contaOrigem, valor); destino = await _contaService.Debitar(contaDestino, valor); } if (tipoOperacao == TipoOperacao.Debito) { origem = await _contaService.Debitar(contaOrigem, valor); destino = await _contaService.Creditar(contaDestino, valor); } var operacao = new Operacao { ContaOrigem = Mapper.Map <Conta>(origem), ContaDestino = Mapper.Map <Conta>(destino), DataRegistroOperacao = DateTime.Now, Tipo = tipoOperacao }; await _lancamentoRepository.RegistraLancamento(operacao); return(Mapper.Map <OperacaoArgument>(operacao)); }