public async Task <Params.Operacao> EfetuaLancamento(Params.ContaCorrente contaOrigem, Params.ContaCorrente contaDestino, OperacaoTipo tipoOperacao, decimal valor)
        {
            Params.ContaCorrente origem  = new Params.ContaCorrente();
            Params.ContaCorrente destino = new Params.ContaCorrente();

            if (contaOrigem.Agencia == contaDestino.Agencia && contaOrigem.Conta == contaDestino.Conta)
            {
                throw new ArgumentException("Conta de origem e destino são as mesmas. Operação não realizada");
            }

            if (!await _contaService.ExisteSaldoParaTransacao(contaOrigem, valor))
            {
                throw new ArgumentException("Conta de origem não tem saldo suficiente para a transação. Operação não realizada");
            }

            if (tipoOperacao == OperacaoTipo.Credito)
            {
                origem = await _contaService.Credito(contaOrigem, valor);

                destino = await _contaService.Debito(contaDestino, valor);
            }

            if (tipoOperacao == OperacaoTipo.Debito)
            {
                origem = await _contaService.Debito(contaOrigem, valor);

                destino = await _contaService.Credito(contaDestino, valor);
            }

            var operacao = new Entities.Operacao
            {
                ContaOrigem          = Mapper.Map <Entities.ContaCorrente>(origem),
                ContaDestino         = Mapper.Map <Entities.ContaCorrente>(destino),
                DataRegistroOperacao = DateTime.Now,
                ValorTransacao       = valor,
                Tipo = tipoOperacao
            };

            await _lancamentoRepository.RegistrarLancamento(operacao);

            return(Mapper.Map <Params.Operacao>(operacao));
        }