trilha-python-dio
trilha-python-dio copied to clipboard
Desafio Banco POO 3.0
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()