-
Notifications
You must be signed in to change notification settings - Fork 0
/
q1_JoaoTenorio.py
121 lines (100 loc) · 4.83 KB
/
q1_JoaoTenorio.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# Autor: João Pedro Rodrigues Tenório
# Matrícula: 1810518
# Disciplina: Programação Funcional
# Avaliação: AV2
import os
os.system('cls')
class Customer:
def __init__(self, user):
self.user = lambda: user
def initiate_transaction(self, amount, payment_method):
transaction = lambda: Transaction(self.user())
return transaction().create_transaction(amount, payment_method)
class User:
def __init__(self, username, password, name, balance):
self.username = lambda: username
self.password = lambda: password
self.name = lambda: name
self.balance = lambda: balance
def verify_login(self, entered_username, entered_password):
return lambda: self.username() == entered_username and self.password() == entered_password
def debit_balance(self, amount):
check_balance = lambda balance, amt: balance - amt if balance >= amt else balance
update_balance = lambda: (lambda new_balance: setattr(self, 'balance', lambda: new_balance))(check_balance(self.balance(), amount))
update_balance()
return lambda: self.balance() != amount
class Transaction:
def __init__(self, user):
self.status = lambda: 'open'
self.user = lambda: user
def create_transaction(self, amount, payment_method):
payment_methods = {
'dinheiro': lambda: Cashier(self).receive_cash(amount),
'transferência': lambda: Cashier(self).process_transfer(amount),
'crédito': lambda: Cashier(self).process_credit(amount)
}
return payment_methods[payment_method]() if payment_method in payment_methods else lambda: False()
def close_transaction(self):
print("Transação completa.")
self.status = lambda: 'closed'
def cancel_transaction(self):
print("Transação cancelada.")
self.status = lambda: 'cancelled'
class Cashier:
def __init__(self, transaction):
self.transaction = lambda: transaction
def receive_cash(self, amount):
cash_flow = lambda: (
print("Dinheiro Recebido"),
print("Recibo de Pagamento Impresso"),
print("Entregando Recibo de Pagamento"),
self.transaction().close_transaction(),
True
) if self.transaction().user().debit_balance(amount)() else (
self.transaction().cancel_transaction(),
False
)
return cash_flow()[4]
def process_transfer(self, amount):
print("Providenciando detalhes do depósito bancário")
process = lambda: (print("Transação completa."), True) if self.bank_confirmation() else (print("Transação cancelada."), False)
return process()[1]
def process_credit(self, amount):
print("Requisitando detalhes da conta de crédito")
process = lambda: (print("Transação completa."), True) if self.bank_confirmation() else (print("Transação cancelada."), False)
return process()[1]
def bank_confirmation(self):
get_response = lambda: input("O pagamento foi confirmado pelo banco? (sim/não): ").lower()
return get_response() == "sim"
def system_login(users):
credentials = lambda: (input("Digite o usuário: "), input("Digite a senha: "))
entered_credentials = lambda: credentials()
check_login = lambda user, creds: user.verify_login(creds[0], creds[1])()
valid_users = lambda creds: [user for user in users if check_login(user, creds)]
result = lambda v_users: v_users[0] if v_users else print("Falha no login. Por favor, verifique seu usuário e senha.") or None
return result(valid_users(entered_credentials()))
def main():
users = [
User(username="tenorio", password="12345", name="João Tenório", balance=1000),
User(username="samuel", password="54321", name="Samuel Lincoln", balance=500),
User(username="lucas", password="123", name="Lucas", balance=100)
]
print("Bem-vindo ao Sistema de Pagamentos")
logged_user = system_login(users)
if logged_user:
print(f"Login bem-sucedido! Bem-vindo(a) {logged_user.name()}. Seu saldo é {logged_user.balance()}.")
successful_transaction = False
while not successful_transaction:
amount = float(input("Digite o valor da transação: "))
if amount > logged_user.balance():
print("Saldo insuficiente para realizar a transação.")
continue
payment_method = input("Escolha o método de pagamento (dinheiro, transferência, crédito): ").lower()
customer = Customer(logged_user)
successful_transaction = customer.initiate_transaction(amount, payment_method)
if not successful_transaction:
print("Erro na transação, tente novamente.")
else:
print("Erro de autenticação.")
if __name__ == "__main__":
main()