public bool Deposito(int idAgencia, int conta, decimal valor, out string mensagemErro)
        {
            mensagemErro = "";

            var agencia = AgenciaRepository.GetById(idAgencia);

            if (agencia == null)
            {
                mensagemErro = "Agência inválida!";
                return(false);
            }

            var contaCorrente = ContaRepository.GetById(idAgencia, conta);

            if (contaCorrente == null)
            {
                mensagemErro = "Conta inválida!";
                return(false);
            }

            if (valor <= 0)
            {
                mensagemErro = "Valor do depósito deve ser maior do que 0!";
                return(false);
            }

            contaCorrente.Saldo = contaCorrente.Saldo + valor;

            var extrato = new Extrato()
            {
                DataRegistro = DateTime.Today,
                AgenciaId    = idAgencia,
                ContaId      = conta,
                Valor        = valor,
                Saldo        = contaCorrente.Saldo,
                Descricao    = "Depósito"
            };

            try
            {
                using (var transaction = new TransactionScope())
                {
                    ContaRepository.Save(contaCorrente);
                    ExtratoRepository.Save(extrato);
                    transaction.Complete();
                }
            }
            catch (Exception)
            {
                // incluir isso em um log...
                mensagemErro = "Ocorreu um erro ao fazer o depósito!";
                return(false);
            }
            return(true);
        }
        public bool Saque(int idAgencia, int conta, decimal valor, out string mensagemErro)
        {
            mensagemErro = "";

            var agencia = AgenciaRepository.GetById(idAgencia);

            if (agencia == null)
            {
                mensagemErro = "Agência inválida!";
                return(false);
            }

            var contaCorrente = ContaRepository.GetById(idAgencia, conta);

            if (contaCorrente == null)
            {
                mensagemErro = "Conta inválida!";
                return(false);
            }

            if (valor <= 0)
            {
                mensagemErro = "O valor do saque precisa ser maior que zero!";
                return(false);
            }

            if (valor > contaCorrente.Saldo)
            {
                mensagemErro = "O valor do saque precisa ser menor ou igual ao saldo da conta!";
                return(false);
            }

            contaCorrente.Saldo = contaCorrente.Saldo - valor;

            var extrato = new Extrato()
            {
                DataRegistro = DateTime.Now,
                AgenciaId    = idAgencia,
                ContaId      = conta,
                Valor        = valor * -1,
                Saldo        = contaCorrente.Saldo,
                Descricao    = "Saque"
            };

            try
            {
                using (var transaction = new TransactionScope())
                {
                    ContaRepository.Save(contaCorrente);
                    ExtratoRepository.Save(extrato);
                    transaction.Complete();
                }
            }
            catch (Exception)
            {
                // incluir isso em um log...
                mensagemErro = "Ocorreu um erro ao fazer o saque!";
                return(false);
            }
            return(true);
        }
        public bool Transferencia(int agenciaOrigem, int contaOrigem, decimal valor, int agenciaDestino, int contaDestino, out string mensagemErro)
        {
            mensagemErro = "";

            var agOrigem = AgenciaRepository.GetById(agenciaOrigem);

            if (agOrigem == null)
            {
                mensagemErro = "Agência de origem inválida!";
                return(false);
            }

            var contaCorrenteOrigem = ContaRepository.GetById(agenciaOrigem, contaOrigem);

            if (contaCorrenteOrigem == null)
            {
                mensagemErro = "Conta de origem inválida!";
                return(false);
            }

            if (valor <= 0)
            {
                mensagemErro = "O valo deve ser maior do que zero!";
                return(false);
            }

            if (valor > contaCorrenteOrigem.Saldo)
            {
                mensagemErro = "O valor do saque precisa ser menor ou igual ao saldo da conta!";
                return(false);
            }

            var agDestino = AgenciaRepository.GetById(agenciaDestino);

            if (agDestino == null)
            {
                mensagemErro = "Agência de destino inválida!";
                return(false);
            }

            var contaCorrenteDestino = ContaRepository.GetById(agenciaDestino, contaDestino);

            if (contaCorrenteDestino == null)
            {
                mensagemErro = "Conta de destino inválida!";
                return(false);
            }

            contaCorrenteOrigem.Saldo = contaCorrenteOrigem.Saldo - valor;

            var extratoOrigem = new Extrato()
            {
                DataRegistro = DateTime.Now,
                AgenciaId    = agenciaOrigem,
                ContaId      = contaCorrenteOrigem.Id,
                Valor        = valor * -1,
                Saldo        = contaCorrenteDestino.Saldo,
                Descricao    = $"Transferência para Ag {agenciaDestino} Cc {contaCorrenteDestino} ",
            };

            contaCorrenteDestino.Saldo = contaCorrenteDestino.Saldo + valor;

            var extratoDestino = new Extrato()
            {
                DataRegistro = DateTime.Now,
                AgenciaId    = agenciaDestino,
                ContaId      = contaCorrenteDestino.Id,
                Valor        = valor,
                Saldo        = contaCorrenteDestino.Saldo,
                Descricao    = $"Transferência de Ag {agenciaOrigem} Cc {contaCorrenteOrigem} ",
            };

            try
            {
                using (var transaction = new TransactionScope())
                {
                    ContaRepository.Save(contaCorrenteOrigem);
                    ExtratoRepository.Save(extratoOrigem);
                    ExtratoRepository.Save(extratoDestino);
                    transaction.Complete();
                }
            }
            catch (Exception)
            {
                mensagemErro = "Ocorreu um problema ao fazer a tranferência!";
                return(false);
            }

            return(true);
        }