· 5 years ago · Aug 09, 2020, 06:00 PM
1import random
2import string
3import sqlite3
4
5# DB connection and create
6conn = sqlite3.connect('card.s3db')
7cur = conn.cursor()
8cur.execute("""
9CREATE TABLE IF NOT EXISTS
10 card(
11 id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
12 number TEXT NOT NULL,
13 pin TEXT NOT NULL,
14 balance INTEGER DEFAULT 0
15)""")
16conn.commit()
17
18
19def close_account(number):
20 cur.execute(f'''
21DELETE FROM card
22WHERE number = {number}
23''')
24 conn.commit()
25
26
27def luhn(bank_identifier):
28 digit_sum = 0
29 for i in range(len(bank_identifier)):
30 if i % 2 == 0:
31 i = int(bank_identifier[i]) * 2
32 if i >= 10:
33 digit_sum += i - 9
34 else:
35 digit_sum += i
36 else:
37 digit_sum += int(bank_identifier[i])
38 last_digit = (digit_sum // 10) * 10 + 10 - digit_sum
39 if last_digit == 10:
40 last_digit = 0
41 return last_digit
42
43
44def check_balance(number):
45 balance = cur.execute(f'''
46SELECT balance
47FROM card
48WHERE number = "{number}";''')
49 conn.commit()
50 return balance.fetchall()[0][0]
51
52
53def add_income(money, number):
54 cur.execute(f'''
55UPDATE card
56SET balance = ({int(check_balance(number)) + int(money)})
57WHERE number = {number}''')
58 conn.commit()
59
60
61def do_transfer():
62
63 def check_availability(number):
64 cur.execute(f'SELECT number FROM card WHERE number = {number}')
65 conn.commit()
66 result = len(cur.fetchall())
67 return result == 0
68
69 print('Transfer')
70 recipient_card = input('Enter card number:')
71 if str(luhn(recipient_card[:-1])) != recipient_card[-1]:
72 print('Probably you made mistake in the card number. Please try again!')
73 elif user_card_number == recipient_card:
74 print("You can't transfer money to the same account!")
75 elif check_availability(recipient_card):
76 print('Such a card does not exist.')
77 else:
78 money = input('Enter how much money you want to transfer:')
79 if int(money) > int(check_balance(user_card_number)):
80 print('Not enough money!')
81 else:
82 add_income(money, recipient_card)
83 add_income(- int(money), user_card_number )
84 print('Success!\n')
85
86
87class CreditCard:
88
89 def __init__(self):
90 bank_identifier = '400000' + ''.join(random.choice(string.digits) for x in range(9))
91 self.card_number = bank_identifier + str(luhn(bank_identifier))
92 self.pin = ''.join(random.choice(string.digits) for x in range(4))
93 cur.execute(f"INSERT INTO card (number, pin) VALUES ('{self.card_number}', '{self.pin}')")
94 conn.commit()
95 print('Your card has been created')
96 print(f'''Your card number: \n{self.card_number} \nYour card PIN: \n{self.pin}\n''')
97
98
99while True:
100 print('1. Create an account \n2. Log into account \n0. Exit')
101 move = input()
102 if move == '1':
103 new_card = CreditCard()
104 elif move == '2':
105 print('Enter your card number:')
106 user_card_number = input()
107 print('Enter your PIN:')
108 user_pin = input()
109
110 cur.execute(f'SELECT number, pin FROM card WHERE number = "{user_card_number}"')
111 db_result = cur.fetchall()
112 conn.commit()
113
114 if len(db_result) > 0:
115 if user_pin in db_result[0][1] and user_card_number in db_result[0][0]:
116 print('You have successfully logged in')
117 while True:
118 print('1. Balance \n2. Add income \n3. Do transfer \n4. Close account \n5. Log out \n0. Exit')
119 move = input()
120 if move == '1':
121 print(f'Balance: {check_balance(user_card_number)} \n')
122 elif move == '2':
123 income = int(input('Enter income:\n'))
124 add_income(income, user_card_number)
125 print('Income was added!\n')
126 elif move == '3':
127 do_transfer()
128 elif move == '4':
129 close_account(user_card_number)
130 print('The account has been closed! \n')
131 break
132 elif move == '5':
133 print('You have successfully logged out! \n')
134 break
135 else:
136 print('Bye!')
137 exit()
138 else:
139 print('Wrong card number or PIN! \n')
140 else:
141 print('Wrong card number or PIN! \n')
142 else:
143 print('Bye!')
144 exit()
145