Tarefa 8 - Operações bancárias

Prazo de entrega recomendado:

Nesta tarefa, vamos exercitar a utilização de coleções de dados. Para isso, será necessário abstrair objetos e escolher uma representação adequada para os dados.


Um banco acaba de contratar você e deseja renovar o sistema bancário para separar as operações básicas de sua lógica de negócio das interfaces de usuário. Assim, as suas diversas formas de interação com os clientes (caixa-eletrônico, internet e aplicativo) podem acessar o mesmo conjunto de operações bancárias de uma maneira uniforme.

1. Representação em memória

Nesta etapa, sua responsabilidade é decidir sobre como representar as contas de usuário na memória para implementar algumas operações bancárias fundamentais sobre o conjunto de contas bancárias e sobre as movimentações financeiras de uma conta bancária. Como você já aprendeu, para fazer isso, é necessário estudar quais operações serão realizadas sobre os conjuntos de dados. Essas operações estão descritas nos próximos itens do enunciado.

Primeiro, você precisa descobrir quais dados devem ser armazenados para representar uma conta e cada uma das movimentações de uma conta. Depois, você deve definir como será representada as duas abstrações principais: conta e movimentação. Escolha uma representação que achar mais adequada para cada abstração (uma classe, um dicionário, ou uma tupla) e especifique quais campos e tipos armazenam cada dado associado.

Faça um desenho da representação em memória de sua estrutura de dados. O seu desenho deve exemplificar como está armazenada a coleção de contas e o conjunto de movimentações de cada conta. A sua resposta deve estar em uma imagem contas.png ou contas.jpg contendo o desenho da memória, que pode ser elaborado no computador ou pode ser uma fotografia. Certifique-se de deixar claro na imagem se você está utilizando classe, dicionário ou tupla em cada abstração. Deixe claro também quais campos representam cada um dos dados associados a um elemento.

2. Operações básicas

As operações sobre as contas devem estar implementadas em um arquivo contas.py. No seu repositório, já há um arquivo de exemplo com stubs de funções de exemplo que realizam algumas operações. Você deve adaptar esse arquivo de forma adequada para a sua representação dos dados. Se tiver escolhido representar suas abstrações como classes, você pode converter funções em métodos. Além das funções sugeridas, você deve adicionar outras operações sobre as contas bancárias que forem necessárias.

a) Criar conta bancária

O módulo é responsável por criar uma nova conta. As contas são identificadas por um único elemento: o número da conta.

b) Realizar movimentação financeira

O módulo deve ser capaz de realizar uma movimentação financeira, que pode ser um depósito, um saque, um pagamento, etc. Cada movimentação tem uma data, que é o dia em que ocorreu (e.g., representado por uma tupla com os valores do ano, mês e dia); um valor, que é um número real positivo ou negativo dependendo do tipo de movimentação; e uma descricao, que é um texto explicando a movimentação.

Suponha que o banco não permita que contas tenham saldo negativo, assim essa operação é realizada apenas quando o saldo resultante após a movimentação for positivo. Além disso, não é possível registrar movimentações retroativas, isso é, a data não pode ser anterior à última movimentação.

c) Consultar o saldo

Deve ser possível descobrir o saldo atual de uma conta.

3. Interface de teste

Embora o banco implementará diversos tipos de interação com os clientes, num primeiro momento, para fins de teste, será criada apenas uma interface de linha de comando, que recebe comandos a partir da entrada padrão e mostra os resultados na tela. Assim, você não precisa guardar as informações ao sair do programa.

Crie um programa interativo interface.py que recebe uma sequência de operações. Cada operação contém uma linha com o nome da ação a ser executada e é opcionalmente seguida de uma ou mais linhas com os parâmetros da ação correspondente. As operações estão descritas em seguida.

a) Abrir uma nova conta

Para uma linha com a ação abrir, a próxima linha possui um número de conta. Se uma conta com esse número já existir, deve-se mostrar Número de conta já existe. Do contrário, deve-se mostrar Conta aberta com sucesso.

b) Depositar

Para uma linha com a ação depositar, a próxima linha possui um número de conta, o valor do depósito, uma data completa no formato DD/MM/AAAA e a descrição da operação, que é um texto arbitrário. Deve-se contabilizar o depósito e mostrar Depósito realizado com sucesso.

c) Sacar

Para uma linha com a ação sacar, a próxima linha possui um número de conta, o valor do saque, uma data completa e a descrição da operação. Deve-se contabilizar o saque e mostrar Saque realizado com sucesso. Caso o saldo da conta não seja suficiente, o programa deve mostrar Saldo insuficiente.

d) Consultar saldo

Para uma linha com a ação saldo, a próxima linha possui um número de conta. Deve-se computar o saldo e mostrar O saldo da conta é R$ <saldo>, onde saldo deve ter duas casas decimais.

e) Emitir extrato

Para uma linha com a ação extrato, a próxima linha possui um número de conta e uma data de início. O programa deve mostrar o extrato das movimentações da conta a partir desta data e mostrar uma sequência de linhas com as movimentações em ordem de realização. Para cada movimentação, devem-se mostrar três linhas:

<movimento> de valor R$ <valor> realizado em <dia>/<mes>/<ano>
Descrição adicional: <descricao>
Saldo após movimentação: R$ <saldo_apos>

onde <movimento> deve ser Depósito ou Saque dependendo do tipo de movimentação, <valor> é valor absoluto da movimentação e <saldo_apos> corresponde ao saldo da conta logo após a movimentação.

f) Fechar conta

Para uma linha com a ação fechar, a próxima linha possui um número de conta. Uma conta só pode ser fechada se tiver saldo zero. Se esse não for o caso, deve-se mostrar A conta não pode ser fechada. Do contrário, deve-se mostrar Conta fechada com sucesso.

g) Sair do programa

Para uma linha com a ação sair, o programa deve terminar em seguida.

Controle de erros

Durante a execução das ações podem ocorrer alguns erros. Se o número da conta sendo consultada não existir, deve-se cancelar a operação atual e mostrar uma mensagem de erro Esta conta não existe. Ainda, quando uma movimentação tiver uma data retroativa à última movimentação naquela conta, então deve-se mostrar a mensagem Movimentação tem data retroativa.

Entrada

  1. Operações básicas:

    abrir
    999
    depositar
    999 100.00 10/01/2021 Primeiro depósito
    depositar
    999 105.00 01/10/2021 Segundo depósito
    saldo
    999
    sacar
    999 180.00 03/11/2021 Pagamento
    abrir
    123
    saldo
    123
    sair
    
  2. Operações arbitrárias:

    abrir
    111
    depositar
    111 500.00 10/10/2021 Depósito num. 2
    depositar
    111 150.00 09/10/2021 Depósito num. 1
    sacar
    111 151.00 12/12/2021 Pagamento
    saldo
    1111
    sacar
    111 500.00 12/12/2021 Transferência PIX
    extrato
    111 01/03/2021
    sacar
    111 349.00 31/12/2021 Último saque
    fechar
    111
    saldo
    111
    sair
    

Saída

  1. Operações básicas:

    Conta aberta com sucesso
    Depósito realizado com sucesso
    Depósito realizado com sucesso
    O saldo da conta é R$ 205.00
    Saque realizado com sucesso
    Conta aberta com sucesso
    O saldo da conta é R$ 0.00
    
  2. Operações arbitrárias:

    Conta aberta com sucesso
    Depósito realizado com sucesso
    Movimentação tem data retroativa
    Saque realizado com sucesso
    Esta conta não existe
    Saldo insuficiente
    Depósito de valor R$ 500.00 realizado em 10/10/2021
    Descrição adicional: Depósito num. 2
    Saldo após movimentação: R$ 500.00
    Saque de valor R$ 151.00 realizado em 12/12/2021
    Descrição adicional: Pagamento
    Saldo após movimentação: R$ 349.00
    Saque realizado com sucesso
    Conta fechada com sucesso
    Esta conta não existe
    

Dicas

Correção

Esta tarefa será avaliada pelo corretor automático e por um monitor, mas sem apresentação do aluno. As questões 1 e 2 serão corrigidas apenas pelo monitor. Para passar na tarefa, você precisa resolver corretamente as questões 1 e 2 e passar pelo menos nos casos de teste básicos. Os casos de teste não arbitrários não possuem erros. Lembre-se de que seu programa deverá estar organizado em funções adequadamente, cada uma com uma responsabilidade bem definida. Crie uma função principal e não execute instruções no nível global. Não serão aceitos programas desorganizados ou ilegíveis.

A pasta da tarefa no seu repositório vem inicialmente com um arquivo nao_corrigir.txt que serve para indicar que você ainda está trabalhando nesta tarefa. Você pode realizar quantos pushes quanto forem necessários. O monitor só irá corrigir sua tarefa quando esse arquivo for removido do repositório.