
# Exercícios de Classe
Vamos montar um sistema de conta corrente digital. Permitindo funcionalidades como depósito, transferência, saque e criação de correntistas.
### Instruções;
1. Bancos podem ser representados também por códigos gerados pelo Banco Central. Os códigos dos bancos mais famosos estão relacionados abaixo:
| Código | Nome do Banco |
| ---- | ---- |
| 001 | Banco do Brasil S.A. |
| 033 | Banco Santander (Brasil) S.A. |
| 104 | Caixa Econômica Federal |
| 237 | Banco Bradesco S.A. |
| 341 | Banco Itaú S.A. |
| 356 | Banco Real S.A. (antigo) |
| 389 | Banco Mercantil do Brasil S.A. |
| 399 | HSBC Bank Brasil S.A. |
| 422 | Banco Safra S.A. |
| 453 | Banco Rural S.A. |
| 633 | Banco Rendimento S.A. |
| 652 | Itaú Unibanco Holding S.A. |
| 745 | Banco Citibank S.A. |
2. Uma correntista possui os seguintes dados:
| Dados | Tipo | Descrição |
| -------- | -------- | -------- |
| Nome do Correntista | string | Nome completo de uma pessoa física |
| CPF do Correntista | string, formato **000.000.000-00** | Número do CPF de uma pessoa física |
| Códido do Banco | string, formato **000** | Número do código do banco representado em string |
| Agência | string, formato **(0000-0)** | número da agência representado em forma de string |
| Conta corrente | string, formato **000000-0** | número da conta corrente representado em forma de string |
| Saldo | number | valor em **centavos** do saldo
### Grupo 1. Funções de Suporte
Esse grupo são exercícios de funçoes de suporte, chamamos elas de `helpers`, essas funções ajudam a gente a transformar informações a depender da nossa necessidade. Futuramente vamos utilizar cada uma dessas funções em nossos códigos de funcionalidade.
1. Crie uma função que receba um código de três digitos e retorne o nome do banco, o nome retornado não deve conter as palavras `S.A.`, `(antigo)`, `(Brasil)`, `Holding`. Leia as instruções para entender como os códigos de bancos são representados.
| Entrada | Saída |
| -------- | -------- |
| 652 | Itaú Unibanco |
| 237 | Banco Bradesco |
| 033 | Banco Santander |
2. Crie uma função que remova quaisquer caracteres que não seja número dentro de uma string. O retorno deve ser uma **string**.
| Entrada | Saída |
| -------- | -------- |
| 190.012.840-35 | 19001284035 |
| 1234-5 | 12345 |
| 123456-3 | 1234563 |
3. Cria uma função que receba uma string de 11 digitos que represente um CPF apenas em números e formate para o formato a seguir: `190.012.840-35`
| Entrada | Saída |
| -------- | -------- |
| 19001284035 | 190.012.840-35 |
4. Crie uma função que receba uma string de 5 digitos que represente o número da agência em string e formate para o formato a seguir: `1234-5`
| Entrada | Saída |
| -------- | -------- |
| 12345 | 1234-5 |
5. Crie uma função que receba uma string de 7 digitos que represente o número da conta corrente em string e formate para o formato a seguir: `123456-3`
| Entrada | Saída |
| -------- | -------- |
| 1234563 | 123456-3 |
6. Adicione todas as funções criadas neste grupo em um módulo, `helpers.js`. Exporte todas as funções desse módulo. Caso você tenha esquecido como módulos funcionam, reassista a [`aula #15, vídeo 7 e 8 de back-end`](https://drive.google.com/drive/folders/1Zg_FUbxVXNs0aCRNn9Ti3V-Ac0GcxXtM).
### Grupo 2. Funções de Funcionalidade
#### Obtenção de um correntista
1. Sabendo dos dados presentes em um correntista, represente uma forma de armazenar um correntista ou mais correntistas em javascript. Leia as instruções no início deste documento para entender quais dados precisam existir.
2. Crie uma função que percorra uma lista de correntistas a partir de um CPF e retorne o objeto deste correntista caso exista, do contrário, imprima uma mensagem ao usuário dizendo `Não existe CPF cadastrado.`
| Entrada | Saída | Situação |
| -------- | -------- | ----- |
| 10203040400 | Objeto referente ao correntista | Em caso de CPF existente |
| 10020030044 | 'Não existe CPF cadastrado' | Em caso de CPF inexistente
#### Criação de novo correntista
3. Crie uma função que adicione um novo correntista a uma lista de correntista, salve essas informações em uma variável. Lembre-se que o `CPF` armazenado deve ser apenas uma string com apenas números, utiliza a função criada no grupo 1 para remover caracteres não-numéricos de uma string. Observação: **Não devemos permitir tenha-se mais de um correntista com os mesmos dados.**
# Exercícios de Casa
#### Atualização de um correntista
5. Crie uma função que receba três argumentos, o primeiro é o CPF do correntista que se quer atualizar, o segundo argumento é o nome da propriedade que se quer atualizar, e o último argumento é o valor dessa propriedade. Se você achar um correntista a partir do CPF, você deve atualizar o valor da propriedade desejada na lista de correntistas sem alterar sua ordem. **Você não pode permitir que o saldo nem o banco seja atualizado por meio dessa função**. Dica: você pode utilizar a função de obter um correntista para facilitar sua pesquisa.
#### Remoção de um correntista
6. Crie uma função que remova um correntista a partir de seu CPF da lista de correntistas.
#### Deposito para um correntista
7. Crie uma função que a partir de um `CPF` de um correntista, você consiga depositar um valor na conta deste correntista. O valor adicionado é em `centavos`, não em reais.
#### Transferência entre correntistas de um mesmo banco
8. Crie uma função que transfira dinheiro entre dois correntistas, o primeiro argumento é o cpf do correntista em que o dinheiro saírá. O segundo argumento é o cpf do correntista em que o dinheiro entrará. Lembre-se: se o primeiro correntista não tiver saldo para transferir, uma mensagem de erro deve ser impressa e a transação não deve acontecer.
#### Transferência entre correntistas de bancos diferentes
9. Nosso programa não lidou com a possibilidade de uma mesma pessoa (portador de um único `CPF`) tivesse contas em mais de um banco. Reescreva nossas funções anteriores para além do CPF, o código do banco também seja necessário para fazer depositos e tranferências. Isso significa também que a obtenção de um correntista pode retornar não apenas um registro mas vários
#### Saque de uma conta de um correntista
10. Crie uma nova função que a partir de um CPF e de um código de banco, permita que um saque seja feito. Se o valor desejado de saque for maior do que o saldo atual do correntista, impeça que a movimentação seja feita.
#### Registro de Movimentações Financeiras
11. Percebemos agora que nosso banco digital não lidou bem com o registro de informações. No momento, não sabemos quando existiu uma transação de entrada de dinheiro nem saída, então dinheiros podem sumir das contas sem sabermos quando isso ocorreu. Um registro de entrada e saída de uma conta corrente pode existir alguns dados como: `tipo` podendo ser uma `entrada` ou `saída`, uma data referente a quando aconteceu o evento, podemos guardar em forma de texto (`dd/mm/aaaa`). O valor que foi transferido, como `valor`. Crie uma lista que contenham objetos que representem esses registros. Toda vez que existir uma nova movimentação adicione um registro nessa lista.
#### Extrato de Movimentações Financeiras
12. Crie uma função para buscar um extrato de um correntista a partir do seu cpf e de seu código do banco, além disso, especifique uma quantidade de registros a serem listados.
13. Parece que nosso código não lida com a situação de registrar os casos em que um correntista tentou fazer uma transferência e não conseguiu por falta de saldo. Altere nosso código para toda vez que acontecer este erro, um registro seja adicionado a lista, adicione um nova propriedade aos registros referente a `sucesso` de uma transferência ou não.
14. Crie uma nova função que chame a função de gerar extrato, esta função deve imprimir as informações no seguinte formato:
```
|| ${nome_do_banco} ||
Extrato bancário do ${nome_do_usuario}, CPF ${numero_do_cpf}
Agência ${numero_da_agencia} - Conta Corrente ${numero_da_conta_corrente}
---------------------------------------------
|| Movimentações ||
---------------------------------------------
Tipo | Data da Ocorrência | Valor movimentado
---------------------------------------------
Saída | 26-08-2020 | R$ 50,00
Entrada | 24-08-2020 | R$ 175,00
.
.
.
```
Observação: todos os valores devem ser formatados para ter suas devidas pontuações: nome do banco, número da agência, número da conta corrente, número de cpf.
15. Crie uma nova função que utiliza função da questão anterior e salve cada nova execução em um novo arquivo. Dica: O primeiro argumento de `writeFile` pode ser um caminho `/pasta/nome_do_arquivo`, você pode a toda nova execução mudar o `nome_do_arquivo` definindo o nome do arquivo como `${cpf_do_correntista}_${Math.random()}.txt`.