Skip to content

Desafio V3 - POO #409

@Nanre-33

Description

@Nanre-33

from abc import ABC, abstractclassmethod
from datetime import datetime

===== Classe Cliente =====

class Cliente:
def init(self, nome, cpf, endereco):
self.nome = nome
self.cpf = cpf
self.endereco = endereco

===== Classe Conta =====

class Conta:
def init(self, numero, senha, cliente: Cliente):
self.numero = numero
self.senha = senha
self.cliente = cliente
self._saldo = 0.0
self.movimentacoes = []

def depositar(self, valor: float):
    if valor <= 0:
        print("Valor inválido para depósito.")
        return
    self._saldo += valor
    self.movimentacoes.append({"tipo": "Depósito", "valor": valor, "data": datetime.now().strftime("%d/%m/%Y %H:%M")})
    print(f"Depósito de R$ {valor:.2f} realizado com sucesso!")


def sacar(self, valor: float, limite=500, limite_diario=10):
    hoje = datetime.now().strftime("%d/%m/%Y")
    numero_saques = sum(1 for m in self.movimentacoes if m['tipo'] == 'Saque' and m['data'][:10] == hoje)

    if numero_saques >= limite_diario:
        print("Limite diário de saques atingido.")
        return
    if valor > limite:
        print("Valor excede o limite por saque.")
        return
    if valor > self.saldo:
        print("Saldo insuficiente.")
        return

    
    self._saldo -= valor
    self.movimentacoes.append({"tipo": "Saque", "valor": valor, "data": datetime.now().strftime("%d/%m/%Y %H:%M")})
    print(f"Saque de R$ {valor:.2f} realizado com sucesso!")

    return False

@property
def extrato(self):
    print(f"\nExtrato da conta {self.numero} - Titular: {self.cliente.nome}")
    if not self.movimentacoes:
        print("Nenhuma movimentação registrada.")
    else:
        for m in self.movimentacoes:
            print(f"{m['data']} - {m['tipo']}: R$ {m['valor']:.2f}")
    print(f"Saldo atual: R$ {self.saldo:.2f}\n")

@property
def saldo(self):
    return self._saldo

===== Gerenciador do Banco =====

class Banco:
def init(self):
self.clientes = {}
self.contas = {}

def criar_cliente(self):
    nome = input("Nome: ").strip()
    cpf = input("CPF: ").strip()
    
    if not cpf.isdigit() and cpf != 11:
        print('CPF errado')
        return
    endereco = input("Endereço: ").strip()

    if cpf in self.clientes:
        print("Cliente já cadastrado!")
        return

    cliente = Cliente(nome, cpf, endereco)
    self.clientes[cpf] = cliente
    print("Cliente cadastrado com sucesso!")

def criar_conta(self):
    cpf = input("Informe o CPF do cliente: ").strip()
    if cpf not in self.clientes:
        print("Cliente não encontrado. Cadastre o cliente primeiro.")
        return

    numero = input("Número da conta (5 dígitos): ").strip()
    if len(numero) != 5 or not numero.isdigit():
        print("Número da conta inválido.")
        return

    if numero in self.contas:
        print("Conta já existe!")
        return

    senha = input("Senha (4 dígitos): ").strip()
    if len(senha) != 4 or not senha.isdigit():
        print("Senha inválida.")
        return

    conta = Conta(numero, senha, self.clientes[cpf])
    self.contas[numero] = conta
    print(f"Conta {numero} criada com sucesso!")

def autenticar(self):
    numero = input("Número da conta: ").strip()
    senha = input("Senha: ").strip()

    conta = self.contas.get(numero)
    if conta and conta.senha == senha:
        print(f"Bem-vindo(a), {conta.cliente.nome}!")
        return conta
    else:
        print("Conta ou senha incorreta.")
        return None

def relatorio(self, tipo = None):
    print("\n=== Relatório Geral ===")
    for conta in self.contas.values():
        print(f"Conta: {conta.numero} | Titular: {conta.cliente.nome} | Saldo: R$ {conta.saldo:.2f}")
    print("========================\n")

===== Menu Principal =====

def main():
banco = Banco()

while True:
    print("\n=== MENU PRINCIPAL ===")
    print("1. Cadastrar Cliente")
    print("2. Criar Conta")
    print("3. Acessar Conta")
    print("4. Relatório Geral")
    print("0. Sair")

    opcao = input("Escolha: ").strip()

    if opcao == "1":
        banco.criar_cliente()
    elif opcao == "2":
        banco.criar_conta()
    elif opcao == "3":
        conta = banco.autenticar()
        if conta:
            while True:
                print("\n--- MENU CONTA ---")
                print("1. Depositar")
                print("2. Sacar")
                print("3. Extrato")
                print('4. Saldo')
                print("0. Voltar")
                sub = input("Escolha: ").strip()

                if sub == "1":
                    valor = float(input("Valor do depósito: "))
                    conta.depositar(valor)
                elif sub == "2":
                    valor = float(input("Valor do saque: "))
                    conta.sacar(valor)
                elif sub == "3":
                    conta.extrato()
                elif sub == '4':
                    print(f'Saldo atual: R$ {conta.saldo:.2f}')
                elif sub == "0":
                    break
                else:
                    print("Opção inválida!")
    elif opcao == "4":
            banco.relatorio()
    elif opcao == "0":
        print("Saindo...")
        break
    else:
        print("Opção inválida!")

if name == "main":
main()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions