· 5 years ago · Jul 24, 2020, 03:18 PM
1from random import randint
2from sys import exit
3import sqlite3
4
5conn = sqlite3.connect('card.s3db')
6cur = conn.cursor()
7
8cur.execute("""
9CREATE TABLE IF NOT EXISTS card (
10 id INTEGER PRIMARY KEY,
11 number TEXT,
12 pin TEXT,
13 balance INTEGER DEFAULT 0
14);
15""")
16conn.commit()
17
18
19def validate_luhn(number):
20 number_sum = 0
21 for i in range(len(number)-1):
22 if (i + 1) % 2 != 0:
23 if (int(number[i]) * 2) > 9:
24 number_sum += (int(number[i]) * 2) - 9
25 else:
26 number_sum += int(number[i]) * 2
27 else:
28 number_sum += int(number[i])
29
30 number_sum += int(number[15])
31
32 if number_sum % 10 != 0:
33 print("Probably you made mistake in the card number. Please try again!\n")
34 return False
35 else:
36 return True
37
38
39def generate_number():
40 number = "400000"
41 number_sum = 0
42 pin = ""
43
44 for i in range(9):
45 number += str(randint(0, 9))
46
47 for i in range(len(number)):
48 if (i+1) % 2 != 0:
49 if (int(number[i]) * 2) > 9:
50 number_sum += (int(number[i]) * 2) - 9
51 else:
52 number_sum += int(number[i]) * 2
53 else:
54 number_sum += int(number[i])
55
56 if number_sum % 10 != 0:
57 number += str(10 - (number_sum % 10))
58 else:
59 number += "0"
60
61 for i in range(4):
62 pin += str(randint(0, 9))
63
64 cur.execute("""
65 INSERT INTO card (number, pin) VALUES (?, ?);
66 """, (number, pin))
67 conn.commit()
68
69 return number, pin
70
71
72def validate_login():
73 number_input = input("Enter your card number:\n")
74 pin_input = input("Enter your card pin:\n")
75
76 print(cur.execute("SELECT * FROM card WHERE number = ?", (number_input,)).fetchone())
77
78 cur.execute("SELECT number FROM card WHERE number = ?", (number_input,))
79 number = str(cur.fetchone()).strip("',)][('")
80
81 cur.execute("SELECT id FROM card WHERE number = ?", (number_input,))
82 id = str(cur.fetchone()).strip("',)][('")
83
84 cur.execute("SELECT pin FROM card WHERE pin = ? AND id = ?", (pin_input, id))
85 pin = str(cur.fetchone()).strip("',)][('")
86 conn.commit()
87
88 if number and pin:
89 print("You have successfully logged in!\n\n")
90
91 while True:
92 print(
93 "1. Balance",
94 "2. Add income",
95 "3. Do transfer",
96 "4. Close Account",
97 "5. Log out",
98 "0. Exit",
99 sep="\n"
100 )
101
102 action = input()
103
104 if action == "1":
105 balance = get_balance(number)
106 print("Balance: " + str(balance) + "\n")
107 elif action == "2":
108 amount = input("Enter income:\n")
109 add_income(number, amount)
110 print("Income was added!\n")
111 elif action == "3":
112 print("Transfer\n")
113 transfer_number = input("Enter card number:\n")
114 transfer(number, transfer_number)
115 elif action == "4":
116 close_account(number)
117 elif action == "5":
118 print("You have successfully logged out!\n\n")
119 break
120 elif action == "0":
121 print("Bye!")
122 conn.close()
123 exit()
124 else:
125 print("Wrong card number or PIN!\n")
126
127
128def get_balance(number):
129 cur.execute("SELECT balance FROM card WHERE number = ?", (number,))
130 balance = int(str(cur.fetchone()).strip("',)][('"))
131 conn.commit()
132 return balance
133
134
135def add_income(number, amount):
136 balance = get_balance(number) + amount
137 cur.execute("""
138 UPDATE card
139 SET balance = ?
140 WHERE number = ?
141 """, (balance, number))
142 conn.commit()
143
144
145def transfer(number, transfer_number):
146 transfer_number = cur.execute("SELECT number FROM card WHERE number = ?", (transfer_number,))
147 if validate_luhn(transfer_number):
148 if not transfer_number:
149 print("Probably you made mistake in the card nunmber. Please try again!\n")
150 elif number == transfer_number:
151 print("You can't transfer money to the same account!\n")
152 else:
153 sender_balance = get_balance(number)
154 receiver_balance = get_balance(transfer_number)
155 amount = input("Enter how much money you want to transfer:\n")
156 if amount > sender_balance:
157 print("Not enough money!\n")
158 else:
159 receiver_balance += amount
160 add_income(transfer_number, receiver_balance)
161
162
163def close_account(number):
164 cur.execute("DELETE FROM card WHERE number", (number,))
165 conn.commit()
166 print("The account has been close!\n")
167
168
169while True:
170 print(
171 "1. Create an account",
172 "2. Log into account",
173 "0. Exit",
174 sep="\n"
175 )
176
177 choice = int(input())
178
179 if choice == 1:
180 number, pin = generate_number()
181
182 print(
183 "Your card has been created",
184 "Your card number:",
185 number,
186 "Your card PIN:",
187 pin,
188 sep="\n"
189 )
190 elif choice == 2:
191 validate_login()
192 elif choice == 0:
193 conn.close()
194 break
195