· 4 years ago · Aug 30, 2021, 08:08 AM
1import random
2import sqlite3
3
4def new_cart_number():
5 x = "400000" + str(random.randint(0, 999999999)).zfill(9) # 15 digits in a string
6 check_luhn_sum = 0 # Luhn of 15 digits to find digit_16
7 for i in range(15): # 0,1,...,14
8 n = int(x[i])
9 if i % 2 == 0:
10 n *= 2
11 if n > 9: n -= 9
12 check_luhn_sum += n
13 digit_16 = (10 - (check_luhn_sum % 10)) % 10 # no comments
14 return x + str(digit_16)
15
16def creat_an_account():
17 card_number = new_cart_number()
18 pin = str(random.randint(0, 9999)).zfill(4)
19 row = (int(card_number), card_number, pin, 0)
20 cur.execute('INSERT INTO card VALUES (?, ?, ?, ?);', row)
21 con.commit()
22 print("Your card has been created")
23 print("Your card number:")
24 print(card_number)
25 print("Your card PIN:")
26 print(pin)
27
28def do_transfer(card_number):
29 cur.execute(f'SELECT balance FROM card WHERE number={card_number};')
30 b = cur.fetchone() ###
31 balance = b[0] ###
32 print('Transfer')
33 card_to_transfer = input('Enter card number:')
34 if card_to_transfer == card_number:
35 print("You can't transfer money to the same account!")
36 return
37 check_luhn_sum = 0 # Luhn of 15 digits to find digit_16
38 for i in range(15): # 0,1,...,14
39 n = int(card_to_transfer[i])
40 if i % 2 == 0:
41 n *= 2
42 if n > 9: n -= 9
43 check_luhn_sum += n
44 if int(card_to_transfer[15]) != (10 - (check_luhn_sum % 10)) % 10:
45 print('Probably you made a mistake in the card number. Please try again!')
46 return
47 cur.execute(f'SELECT number FROM card WHERE number={card_to_transfer};')
48 if cur.fetchone()[0] == None:
49 print('Such a card does not exist.')
50 return
51 transfer_sum = int(input('Enter how much money you want to transfer:')
52 if balance >= transfer_sum:
53 cur.execute(f'SELECT balance FROM card WHERE number={card_to_transfer};')
54 b = cur.fetchone() ###
55 balance_to_transfer = b[0] ###
56 cur.execute(f'UPDATE card SET balance={balance - transfer_sum} WHERE number={card_number};')
57 cur.execute(f'UPDATE card SET balance={balance_to_transfer + transfer_sum} WHERE number={card_to_transfer};')
58 con.commit()
59 print("Success!")
60 else:
61 print('Not enough money!')
62
63def log_into_account():
64 card_number = input("Enter your card number:")
65 pin = input("Enter your PIN:")
66 cur.execute(f'SELECT number, pin FROM card WHERE number={card_number};')
67 card_and_pin = cur.fetchone()
68 con.commit()
69 if (card_number, pin) == card_and_pin:
70 logged = True
71 print("You have successfully logged in!")
72 print("")
73 while logged:
74 print("1. Balance")
75 print('2. Add income')
76 print('3. Do transfer')
77 print('4. Close account')
78 print("5. Log out")
79 print("0. Exit")
80 user_input = int(input())
81 if user_input == 1:
82 cur.execute(f'SELECT balance FROM card WHERE number={card_number};')
83 print('Balance: ', cur.fetchone()[0])
84 elif user_input == 2:
85 income = int(input('Enter income:'))
86 cur.execute(f'SELECT balance FROM card WHERE number={card_number};')
87 balance = cur.fetchone()[0]
88 cur.execute(f'UPDATE card SET balance={balance + income} WHERE number={card_number};')
89 con.commit()
90 print('Income was added!')
91 elif user_input == 3:
92 do_transfer(card_number)
93 elif user_input == 4:
94 cur.execute(f'DELETE FROM card WHERE number={card_number};')
95 con.commit()
96 logged = False
97 elif user_input == 5:
98 logged = False
99 print("You have successfully logged out!")
100 else:
101 print("Bye!")
102 cur.close()
103 con.close()
104 exit()
105 else:
106 print("Wrong card number or PIN!")
107
108random.seed()
109con = sqlite3.connect('card.s3db')
110cur = con.cursor()
111cur.execute("CREATE TABLE IF NOT EXISTS card (id INTEGER, number TEXT, pin TEXT, balance INTEGER DEFAULT 0);")
112con.commit()
113while True:
114 print("1. Create an account")
115 print("2. Log into account")
116 print("0. Exit")
117 user_input = int(input())
118 if user_input == 1:
119 creat_an_account()
120 elif user_input == 2:
121 log_into_account()
122 else:
123 print("Bye!")
124 cur.close()
125 con.close()
126 exit()
127
128