trilha-python-dio icon indicating copy to clipboard operation
trilha-python-dio copied to clipboard

Desafio Banco POO 3.0

Open cleytonkauffmann opened this issue 10 months ago • 0 comments

import random from datetime import datetime

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

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

class Conta: def init(self, cliente): self.cliente = cliente self.agencia = random.randint(100, 999) self.numero = random.randint(10000000, 99999999) self.saldo = 0 self.saques_feitos = 0 self.saques_diarios = 0 self.extrato = []

def depositar(self, valor):
    self.saldo += valor
    self.extrato.append(f"Depósito de R${valor:.2f}")
    print("Depósito realizado com sucesso!")

def sacar(self, valor):
    if self.saques_feitos < 3 and self.saques_diarios < 3 and valor <= 500 and valor <= self.saldo:
        self.saldo -= valor
        self.saques_feitos += 1
        self.saques_diarios += 1
        self.extrato.append(f"Saque de R${valor:.2f}")
        print("Saque realizado com sucesso!")
        print(f"Você tem {3 - self.saques_diarios} saques disponíveis hoje.")
    elif self.saques_diarios >= 3:
        print("Você atingiu o limite de saque diário. Tente novamente amanhã!")
    else:
        print("Saldo insuficiente para realizar o saque.")

def gerar_extrato(self):
    print("\n" + "=" * 20 + " EXTRATO " + "=" * 20 + "\n")
    print(f"Agência: {self.agencia} | Conta: {self.numero}\n")
    print("Operações:")
    for operacao in self.extrato:
        print(operacao)
    print("\n" + "=" * 46 + "\n")
    print(f"Saldo atual: R${self.saldo:.2f}")
    print("=" * 46)

def reiniciar_saques_diarios(self):
    self.saques_diarios = 0

class ContaCorrente(Conta): def init(self, cliente): super().init(cliente) self.limite_cheque_especial = 5000

class Historico: def init(self): self.transacoes = []

def registrar_transacao(self, transacao):
    self.transacoes.append(transacao)

def mostrar_historico(self):
    for transacao in self.transacoes:
        print(transacao)

class Transacao: def init(self, valor): self.valor = valor self.data = datetime.now()

class Saque(Transacao): def str(self): return f"Saque de R${self.valor:.2f} em {self.data}"

class Deposito(Transacao): def str(self): return f"Depósito de R${self.valor:.2f} em {self.data}"

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

def cadastrar_cliente(self, nome, cpf, data_nascimento, rua, bairro, cidade, estado):
    endereco = {
        "rua": rua,
        "bairro": bairro,
        "cidade": cidade,
        "estado": estado
    }

    if cpf not in self.clientes:
        cliente = PessoaFisica(nome, cpf, data_nascimento, endereco)
        self.clientes[cpf] = cliente
        conta = ContaCorrente(cliente)
        print(f"Parabéns {nome}, sua conta foi criada com sucesso!")
        print("Segue os dados de sua conta:")
        print(f"Agência: {conta.agencia} | Conta: {conta.numero}")
        self.clientes[cpf].conta = conta
        self.contas.append(conta)
    else:
        print("CPF já cadastrado.")

def buscar_conta(self, cpf):
    if cpf in self.clientes:
        return self.clientes[cpf].conta
    else:
        print("Cliente não encontrado.")

def listar_contas(self):
    print("\n" + "=" * 20 + " LISTA DE CONTAS " + "=" * 20 + "\n")
    for conta in self.contas:
        print(f"Agência: {conta.agencia} | Conta: {conta.numero} | Cliente: {conta.cliente.nome}")
    print("=" * 50)

def main(): banco = Banco()

while True:
    print("\n" + "=" * 20 + " MENU " + "=" * 20 + "\n")
    print(" " * 18 + "1. Cadastrar Cliente")
    print(" " * 18 + "2. Depositar")
    print(" " * 18 + "3. Sacar")
    print(" " * 18 + "4. Extrato")
    print(" " * 18 + "5. Listar Contas")
    print(" " * 18 + "0. Sair")
    print("\n" + "=" * 46 + "\n")

    opcao = input("Escolha uma opção: ")

    if opcao == "1":
        nome = input("Digite o nome do cliente: ")
        data_nascimento = input("Digite a data de nascimento do cliente (formato: DD/MM/AAAA): ")
        cpf = input("Digite o CPF do cliente: ")
        rua = input("Digite o nome da rua: ")
        bairro = input("Digite o nome do bairro: ")
        cidade = input("Digite o nome da cidade: ")
        estado = input("Digite o nome do estado: ")

        # Validando data de nascimento
        try:
            data_nascimento = datetime.strptime(data_nascimento, "%d/%m/%Y")
        except ValueError:
            print("Data de nascimento inválida. Use o formato DD/MM/AAAA.")
            continue

        banco.cadastrar_cliente(nome, cpf, data_nascimento, rua, bairro, cidade, estado)
    elif opcao == "2":
        cpf = input("Digite o CPF do cliente: ")
        conta = banco.buscar_conta(cpf)
        if conta:
            valor = float(input("Digite o valor a ser depositado: "))
            conta.depositar(valor)
            conta.reiniciar_saques_diarios()
        else:
            print("Cliente não encontrado.")
    elif opcao == "3":
        cpf = input("Digite o CPF do cliente: ")
        conta = banco.buscar_conta(cpf)
        if conta:
            valor = float(input("Digite o valor a ser sacado: "))
            conta.sacar(valor)
        else:
            print("Cliente não encontrado.")
    elif opcao == "4":
        cpf = input("Digite o CPF do cliente: ")
        conta = banco.buscar_conta(cpf)
        if conta:
            conta.gerar_extrato()
        else:
            print("Cliente não encontrado.")
    elif opcao == "5":
        banco.listar_contas()
    elif opcao == "0":
        print("Obrigado por utilizar nosso Sistema...Banco Kauffmann Agradece!!!")
        break
    else:
        print("Opção inválida. Tente novamente.")

if name == "main": main()

cleytonkauffmann avatar Apr 19 '24 03:04 cleytonkauffmann