Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Desafio de Projeto 00 - MaOtg #257

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 166 additions & 0 deletions 00 - Fundamentos/Desafio de Projeto _ Sistema Bancário.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
'''
DESAFIO DE PROJETO - DIGITAL INNOVATION ONE - MaOtg
'''

# Importando biblioteca que melhora o espaçamento visual no terminal
import textwrap

def menu():
menu = """\n
================ MENU ================
[d]\tDepositar
[s]\tSacar
[e]\tExtrato
[nc]\tNova Conta
[lc]\tListar Contas
[nu]\tNovo Usuário
[q]\tSair
=> """
return input(textwrap.dedent(menu))

def sacar(*, saldo, valor, extrato, limite, numero_saques, limite_saques):
excedeu_saldo = valor > saldo
excedeu_limite = valor > limite
excedeu_saques = numero_saques >= limite_saques

if excedeu_saldo:
print("\n@@@ Operação falhou! Você não tem saldo suficiente. @@@")

elif excedeu_limite:
print("\n@@@ Operação falhou! O valor do saque excede o limite de 500 reais. @@@")

elif excedeu_saques:
print("\n@@@ Operação falhou! Número máximo de saques excedido. @@@")

elif valor > 0:
saldo -= valor
extrato += f"\nSaque:\t\tR$ {valor:.2f}\n"
numero_saques += 1
print("\n=== Saque realizado com sucesso! ===")

else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato

def depositar(saldo, valor, extrato, /):
if valor > 0:
saldo += valor
extrato += f"\nDepósito:\tR$ {valor:.2f}\n"
print("\n=== Depósito realizado com sucesso! ===")
else:
print("\n@@@ Operação falhou! O valor informado é inválido. @@@")

return saldo, extrato

def ver_extrato(saldo, /, *, extrato):
print("\n================ EXTRATO ================")
print("Não foram realizadas movimentações." if not extrato else extrato)
print(f"\nSaldo: R$ {saldo:.2f}")
print("==========================================")

def criar_usuario(usuarios):
cpf = input("\nInforme o CPF (somente números): ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
print("\n@@@ Já existe um usuário com esse CPF cadastrado! @@@")
return

nome = input("Informe o seu nome completo: ")
data_nascimento = input("Informe a sua data de nascimento (dd-mm-aaaa): ")
endereco = input("Informe o endereço (logradouro, nro - bairro - cidade/sigla estado): ")

usuarios.append({"nome": nome, "data_nascimento": data_nascimento, "cpf": cpf, "endereco": endereco})

print("\n=== Usuário criado com sucesso! ===")

def filtrar_usuario(cpf, usuarios):
usuarios_filtrados = [usuario for usuario in usuarios if usuario["cpf"] == cpf]
return usuarios_filtrados[0] if usuarios_filtrados else None

def criar_conta(agencia, numero_conta, usuarios):
cpf = input("Informe o CPF do usuário: ")
usuario = filtrar_usuario(cpf, usuarios)

if usuario:
print("\n=== Conta criada com sucesso! ===")
return {"agencia": agencia, "numero_conta": numero_conta, "usuario": usuario}

print("\n@@@ Usuário não encontrado, fluxo de criação de conta encerrado! @@@")

def listar_contas(contas):
if contas:
for conta in contas:
linha = f"""
Agência:\t{conta["agencia"]}
C/C:\t\t{conta["numero_conta"]}
Titular:\t{conta["usuario"]["nome"]}
"""
print("=" * 100)
print(textwrap.dedent(linha))
else:
print("\n@@@ Não há contas para listar. @@@")


# Função Principal
def main():
LIMITE_SAQUES = 3
AGENCIA = "0001"
saldo = 0
limite = 500
extrato = ""
numero_saques = 0
usuarios = []
contas = []

while True:
opcao = menu()

# Opção de Depositar
if opcao == "d":
valor = float(input("\nInforme o valor do depósito: "))

saldo, extrato = depositar(saldo, valor, extrato)

# Opção de Sacar
elif opcao == "s":
valor = float(input("\nInforme o valor do saque: "))

saldo, extrato = sacar(
saldo = saldo,
valor = valor,
extrato = extrato,
limite = limite,
numero_saques = numero_saques,
limite_saques = LIMITE_SAQUES
)

# Opção de Exibir extrato
elif opcao == "e":
ver_extrato(saldo, extrato = extrato)

# Opção de Criar novo usuário
elif opcao == "nu":
criar_usuario(usuarios)

# Opção de Criar nova conta
elif opcao == "nc":
numero_conta = len(contas) + 1
conta = criar_conta(AGENCIA, numero_conta, usuarios)

if conta:
contas.append(conta)

# Opção de Listar as contas existentes
elif opcao == "lc":
listar_contas(contas)

elif opcao == "q":
break

else:
print("@@@ Operação inválida, por favor selecione novamente a operação desejada (observe as letras). @@@")

# Chamando a função principal
main()
Loading