trilha-python-dio
trilha-python-dio copied to clipboard
sistema bancário aprimorado!
from datetime import datetime, timedelta
class ContaBancaria: def init(self, numero, titular, senha): self.numero = numero self.titular = titular self.saldo = 0 self.limite_saque = 500 self.limite_transferencia = 1000 self.extrato = "" self.numero_saques = 0 self.limite_saques = 3 self.limite_diario_saques = 1000 self.saques_dia = 0 self.historico_transacoes = [] self.senha = senha self.ultimo_reset_diario = datetime.now()
def autenticar(self, senha):
return self.senha == senha
def resetar_limites_diarios(self):
agora = datetime.now()
if agora - self.ultimo_reset_diario > timedelta(days=1):
self.saques_dia = 0
self.numero_saques = 0
self.ultimo_reset_diario = agora
def registrar_transacao(self, tipo, valor):
transacao = {
"tipo": tipo,
"valor": valor,
"data": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.historico_transacoes.append(transacao)
def depositar(self, valor):
self.resetar_limites_diarios()
if valor > 0:
self.saldo += valor
self.extrato += f"Depósito: R$ {valor:.2f}\n"
self.registrar_transacao("Depósito", valor)
return f"Depósito de {valor:.2f} concluído :)"
else:
return "Operação falhou :(. O valor informado é inválido."
def sacar(self, valor):
self.resetar_limites_diarios()
if valor <= 0:
return "Operação falhou :(. O valor informado é inválido."
elif valor > self.saldo:
return "Operação falhou :(. Você não tem saldo suficiente."
elif valor > self.limite_saque:
return "Operação falhou :(. O valor do saque excede o limite."
elif self.numero_saques >= self.limite_saques:
return "Operação falhou :(. Número máximo de saques excedido."
elif self.saques_dia + valor > self.limite_diario_saques:
return "Operação falhou :(. Você excedeu o limite diário de saques."
else:
self.saldo -= valor
self.extrato += f"Saque: R$ {valor:.2f}\n"
self.numero_saques += 1
self.saques_dia += valor
self.registrar_transacao("Saque", valor)
return f"Saque de {valor:.2f} realizado com sucesso."
def exibir_extrato(self):
extrato = "\n EXTRATO \n"
extrato += "Não foram realizadas movimentações." if not self.extrato else self.extrato
extrato += f"\nSaldo: R$ {self.saldo:.2f}\n "
return extrato
def exibir_historico_transacoes(self):
historico = "\n HISTÓRICO DE TRANSAÇÕES \n"
if not self.historico_transacoes:
historico += "Não foram realizadas transações."
else:
for transacao in self.historico_transacoes:
historico += f"{transacao['data']} - {transacao['tipo']}: R$ {transacao['valor']:.2f}\n"
historico += " "
return historico
def transferir(self, valor, conta_destino):
self.resetar_limites_diarios()
if valor <= 0:
return "Operação falhou :(. O valor informado é inválido."
elif valor > self.saldo:
return "Operação falhou :(. Você não tem saldo suficiente."
elif valor > self.limite_transferencia:
return "Operação falhou :(. O valor da transferência excede o limite."
else:
self.saldo -= valor
conta_destino.saldo += valor
self.extrato += f"Transferência: R$ {valor:.2f} para conta {conta_destino.numero}\n"
conta_destino.extrato += f"Transferência: R$ {valor:.2f} da conta {self.numero}\n"
self.registrar_transacao("Transferência Enviada", valor)
conta_destino.registrar_transacao("Transferência Recebida", valor)
return f"Transferência de {valor:.2f} para conta {conta_destino.numero} realizada com sucesso."
Gerenciamento de contas
contas = {}
def criar_conta(numero, titular, senha): if numero in contas: return "Número de conta já existente. Tente outro número." else: contas[numero] = ContaBancaria(numero, titular, senha) return f"Conta {numero} criada com sucesso para {titular}."
def selecionar_conta(numero, senha): conta = contas.get(numero) if conta and conta.autenticar(senha): return conta else: return None
Menus
menu_principal = """ [c] Criar Conta [s] Selecionar Conta [S] Sair
"""
menu_conta = """ [d] Depositar [s] Sacar [e] Extrato [h] Histórico de Transações [t] Transferir [S] Sair
"""
Loop principal do sistema
while True: opcao = input(menu_principal)
if opcao == "c":
numero = input("Informe o número da conta: ")
titular = input("Informe o nome do titular: ")
senha = input("Crie uma senha: ")
print(criar_conta(numero, titular, senha))
elif opcao == "s":
numero = input("Informe o número da conta: ")
senha = input("Informe a senha: ")
conta = selecionar_conta(numero, senha)
if conta:
while True:
opcao_conta = input(menu_conta)
if opcao_conta == "d":
valor = float(input("Informe o valor do depósito: "))
print(conta.depositar(valor))
elif opcao_conta == "s":
valor = float(input("Informe o valor do saque: "))
print(conta.sacar(valor))
elif opcao_conta == "e":
print(conta.exibir_extrato())
elif opcao_conta == "h":
print(conta.exibir_historico_transacoes())
elif opcao_conta == "t":
valor = float(input("Informe o valor da transferência: "))
numero_destino = input("Informe o número da conta destino: ")
conta_destino = contas.get(numero_destino)
if conta_destino:
print(conta.transferir(valor, conta_destino))
else:
print("Conta destino não encontrada.")
elif opcao_conta == "S":
break
else:
print("Operação Inválida. Selecione a operação desejada.")
elif opcao == "S":
break
else:
print("Operação Inválida. Selecione a operação desejada.")