public ContaCorrente(Guid clienteId, NumeroAgencia numeroAgencia, NumeroConta numeroConta, DigitoConta digitoConta)
 {
     this.Id            = Guid.NewGuid();
     this.ClienteId     = clienteId;
     this.NumeroAgencia = numeroAgencia;
     this.NumeroConta   = numeroConta;
     this.DigitoConta   = digitoConta;
     this.transacoes    = new LancamentoCollection();
 }
        public static ContaCorrente Carregar(Guid id, Guid clienteId, NumeroAgencia numeroAgencia, NumeroConta numeroConta, DigitoConta digitoConta, LancamentoCollection transacoes)
        {
            var conta = new ContaCorrente();

            conta.NumeroAgencia = numeroAgencia;
            conta.NumeroConta   = numeroConta;
            conta.DigitoConta   = digitoConta;
            conta.Id            = id;
            conta.ClienteId     = clienteId;
            conta.transacoes    = transacoes;
            return(conta);
        }
        public async Task <TransferirResult> Execute(NumeroAgencia numeroAgenciaOrigem, NumeroConta numeroContaOrigem, DigitoConta digitoContaOrigem, NumeroAgencia numeroAgenciaDestino, NumeroConta numeroContaDestino, DigitoConta digitoContaDestino, Valor valor)
        {
            if (valor <= 0)
            {
                throw new ValorInvalidoException();
            }

            var contaDebito = await this.contaRepository.Obter(numeroAgenciaOrigem, numeroContaOrigem, digitoContaOrigem);

            if (contaDebito == null)
            {
                throw new ContaNaoEncontradaException(numeroAgenciaOrigem, numeroContaOrigem, digitoContaOrigem);
            }

            if (contaDebito.ClienteId != usuarioAutenticado.Id)
            {
                throw new UsuarioLogadoNaoEhDonoDaContaException(contaDebito.Id);
            }

            var contaCredito = await this.contaRepository.Obter(numeroAgenciaDestino, numeroContaDestino, digitoContaDestino);

            if (contaCredito == null)
            {
                throw new ContaNaoEncontradaException(numeroAgenciaDestino, numeroContaDestino, digitoContaDestino);
            }


            if (contaCredito.Id == contaDebito.Id)
            {
                throw new ContaCreditoIgualContaDebitoException();
            }

            contaDebito.Debitar(valor);

            Guid transacaoId = Guid.NewGuid();

            Debito debito = contaDebito.ObterUltimaTransacao() as Debito;

            debito.AtrelarTransacao(transacaoId);

            await this.contaRepository.SalvarTransacao(contaDebito, debito);

            contaCredito.Creditar(valor);

            Credito credito = contaCredito.ObterUltimaTransacao() as Credito;

            credito.AtrelarTransacao(debito.TransacaoId);

            await this.contaRepository.SalvarTransacao(contaCredito, credito);

            return(new TransferirResult(valor, transacaoId, credito.DataTransacao, contaCredito, contaDebito));
        }
示例#4
0
        public void NaoDeveConseguirCriarUmNumeroAgenciaCasoOValorInformadoForNullOuBranco()
        {
            NumeroAgenciaNaoInformadoException ex = Assert.Throws <NumeroAgenciaNaoInformadoException>(() =>
            {
                NumeroAgencia numeroAgencia = new NumeroAgencia(null);
            });

            Assert.Equal("Número da agência é obrigatório.", ex.Message);

            ex = Assert.Throws <NumeroAgenciaNaoInformadoException>(() =>
            {
                NumeroAgencia numeroAgencia = new NumeroAgencia(String.Empty);
            });

            Assert.Equal("Número da agência é obrigatório.", ex.Message);
        }
        private void AbrirConta(Context context, Guid clienteId, Guid contaId, Cpf cpf, Nome nome, Senha senha, NumeroAgencia numeroAgencia, NumeroConta numeroConta, DigitoConta digitoConta, Valor saldoInicial)
        {
            context.Clientes.Add(new Cliente()
            {
                Cpf   = cpf,
                Nome  = nome,
                Senha = new SenhaCriptografada(senha),
                Id    = clienteId
            });

            context.Contas.Add(new ContaCorrente()
            {
                ClienteId     = clienteId,
                DigitoConta   = digitoConta,
                Id            = contaId,
                NumeroAgencia = numeroAgencia,
                NumeroConta   = numeroConta
            });

            context.Creditos.Add(new Credito()
            {
                ContaId       = contaId,
                DataTransacao = DateTime.UtcNow,
                TransacaoId   = Guid.NewGuid(),
                Id            = Guid.NewGuid(),
                Valor         = saldoInicial
            });
        }
示例#6
0
        public async Task <AbrirContaResult> Execute(Nome nomeCliente, Cpf cpfCliente, NumeroAgencia numeroAgencia)
        {
            Cliente cliente = await this.clienteRepository.ObterPorCpf(cpfCliente);

            if (cliente != null)
            {
                throw new ClienteJaPossuiContaException(cliente.Nome);
            }

            cliente = new Cliente(nomeCliente, cpfCliente);

            await this.clienteRepository.Salvar(cliente);

            NumeroConta numeroConta = DateTime.Now.Ticks.ToString();        //geração de um novo número de conta
            DigitoConta digitoConta = (new Random()).Next(1, 9).ToString(); //geração do digito verificador

            ContaCorrente conta = new ContaCorrente(cliente.Id, numeroAgencia, numeroConta, digitoConta);

            await this.contaRepository.Salvar(conta);

            return(new AbrirContaResult()
            {
                Cliente = cliente,
                Conta = conta
            });
        }
示例#7
0
        public void DeveConseguirCriarUmNumerAgencia()
        {
            NumeroAgencia numeroAgencia = new NumeroAgencia("123");

            Assert.Equal("123", numeroAgencia.ToString());
        }