· 5 years ago · Jul 24, 2020, 03:34 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 == number_input and pin == pin_input:
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 = int(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
144def substract_income(number, amount):
145 balance = get_balance(number) - amount
146 cur.execute("""
147 UPDATE card
148 SET balance = ?
149 WHERE number = ?
150 """, (balance, number))
151 conn.commit()
152
153def transfer(number, transfer_number):
154 if validate_luhn(transfer_number):
155 transfer_number = str(cur.execute("SELECT number FROM card WHERE number = ?", (transfer_number,)).fetchone()).strip("',)][('")
156 if transfer_number == "None":
157 print("Such a card does not exist.\n")
158 elif number == transfer_number:
159 print("You can't transfer money to the same account!\n")
160 else:
161 sender_balance = get_balance(number)
162 receiver_balance = get_balance(transfer_number)
163 amount = int(input("Enter how much money you want to transfer:\n"))
164 if amount > sender_balance:
165 print("Not enough money!\n")
166 else:
167 receiver_balance += amount
168
169 add_income(transfer_number, receiver_balance)
170 substract_income(number, amount)
171 else:
172 print("Probably you made mistake in the card number. Please try again!")
173
174def close_account(number):
175 cur.execute("DELETE FROM card WHERE number = ?", (number,))
176 conn.commit()
177 print("The account has been close!\n")
178
179
180while True:
181 print(
182 "1. Create an account",
183 "2. Log into account",
184 "0. Exit",
185 sep="\n"
186 )
187
188 choice = int(input())
189
190 if choice == 1:
191 number, pin = generate_number()
192
193 print(
194 "Your card has been created",
195 "Your card number:",
196 number,
197 "Your card PIN:",
198 pin,
199 sep="\n"
200 )
201 elif choice == 2:
202 validate_login()
203 elif choice == 0:
204 conn.close()
205 break
206