· 4 years ago · Jun 22, 2021, 03:24 PM
1import random
2import sqlite3
3
4
5# SQL Queries
6CREATE_ACCOUNTS_TABLE = "CREATE TABLE IF NOT EXISTS card (id INTEGER, number TEXT, pin TEXT, balance INTEGER DEFAULT 0);"
7INSERT_ACCOUNT_DETAILS = "INSERT INTO card (number, pin) VALUES (?, ?);"
8GET_ALL_ACCOUNTS = "SELECT * FROM card"
9CHECK_ACCOUNT_BY_NUMBER = "SELECT * FROM card WHERE number = ?;"
10GET_BALANCE = "SELECT balance FROM card WHERE number = ?;"
11UPDATE_FUNDS = "UPDATE card SET balance = ? WHERE number = ?;"
12ADD_FUNDS = "UPDATE card SET balance = (balance + ?) WHERE number = ?;"
13DELETE_ACCOUNT = "DELETE FROM card WHERE number = ?;"
14# DROP_TABLE = "DROP TABLE card"
15
16def connect():
17 return sqlite3.connect('card.s3db')
18
19
20def create_tables(connection):
21 with connection:
22 connection.execute(CREATE_ACCOUNTS_TABLE)
23
24
25def add_account(connection, number, pin):
26 with connection:
27 connection.execute(INSERT_ACCOUNT_DETAILS, (number, pin))
28
29
30def show_balance(connection, number):
31 with connection:
32 return connection.execute(GET_BALANCE, (number,)).fetchone()
33
34
35def update_funds(connection, balance, number):
36 with connection:
37 connection.execute(UPDATE_FUNDS, (balance, number))
38
39def add_funds(connection, balance, number):
40 with connection:
41 connection.execute(ADD_FUNDS, (balance, number))
42
43def get_all_accounts(connection):
44 with connection:
45 return connection.execute(GET_ALL_ACCOUNTS).fetchall()
46
47def check_account_exists(connection, number):
48 with connection:
49 return connection.execute(CHECK_ACCOUNT_BY_NUMBER, (number,)).fetchone()
50
51def delete_account(connection, number):
52 with connection:
53 connection.execute(DELETE_ACCOUNT, (number,))
54
55connection = connect()
56create_tables(connection)
57#a = get_all_accounts(connection)
58#print(a)
59# cur = connection.cursor()
60# cur.execute(DROP_TABLE)
61
62
63
64while True:
65 print("")
66 print("1. Create an account")
67 print("2. Log into an account")
68 print("0. Exit")
69 print("")
70 choose_option = int(input("Choose an option: "))
71
72 # create
73
74 if choose_option == 1:
75
76 class Account:
77 accounts = {}
78
79 def __init__(self, acc_num, acc_pin_num):
80 self.acc_num = acc_num
81 self.acc_pin_num = acc_pin_num
82 Account.accounts[self.acc_num] = self.acc_pin_num
83
84 test_account = Account(random.randint(100000000, 999999999), random.randint(1000,9999))
85
86 # Luhn Algorithm for Checksum (Last number on Card Number)
87
88 bank_id = 400000
89
90 acc_bin = str(bank_id) + str(test_account.acc_num)
91
92 acc_bin2 = []
93
94 for index, num in enumerate(acc_bin):
95 if index % 2 != 0:
96 acc_bin2.append(int(num))
97 else:
98 n2 = int(num) * 2
99 if n2 > 9:
100 n3 = n2 - 9
101 acc_bin2.append(int(n3))
102 else:
103 acc_bin2.append(int(n2))
104
105 checksum = 0
106
107 sum_accbin = sum(acc_bin2)
108 total_accbin = sum_accbin + checksum
109
110 while total_accbin % 10 != 0:
111 checksum += 1
112 total_accbin = sum_accbin + checksum
113
114 # CARD NUMBER
115 card_num = str(bank_id) + str(test_account.acc_num) + str(checksum)
116 # PIN NUMBER
117 pin_num = test_account.acc_pin_num
118 # ADD TO DATABASE
119 add_account(connection, card_num, pin_num)
120 connection.commit()
121
122 print("Your card has been created")
123 print("Your card number:")
124 print(card_num)
125 print("Your card PIN:")
126 print(pin_num)
127
128 # login
129
130 elif choose_option == 2:
131 login_card_num = input("Enter your card number:")
132 login_pin_num = int(input("Enter your PIN:"))
133
134 # ! this needs to change to check database instead, so can log in without choosing option 1 first
135 if login_card_num != card_num or login_pin_num != test_account.acc_pin_num:
136 print("Wrong card number or PIN!")
137
138 else:
139 print("You have successfully logged in!")
140 while True:
141 print("")
142 print("1. Balance")
143 print("2. Add income")
144 print("3. Do transfer")
145 print("4. Close account")
146 print("5. Log out")
147 print("0. Exit")
148 print("")
149
150 choose_option2 = int(input("Choose an option: "))
151
152 # show balance
153 if choose_option2 == 1:
154 balance = show_balance(connection, login_card_num)
155 connection.commit()
156 print(f'Balance: {balance}')
157
158 # add funds
159 elif choose_option2 == 2:
160 add_funds_input = int(input("Enter income:"))
161 add_funds(connection, add_funds_input, login_card_num)
162 connection.commit()
163 print("Income was added!")
164
165 # transfer
166 elif choose_option2 == 3:
167 enter_card_input = (input("Enter card number:"))
168
169 #luhn check
170
171 acc_bin3 = []
172
173 for index, num in enumerate(enter_card_input):
174 if index % 2 != 0:
175 acc_bin3.append(int(num))
176 else:
177 n2 = int(num) * 2
178 if n2 > 9:
179 n3 = n2 - 9
180 acc_bin3.append(int(n3))
181 else:
182 acc_bin3.append(int(n2))
183
184 sum_accbin = sum(acc_bin3)
185
186 if sum_accbin % 10 == 0:
187 if check_account_exists(connection, enter_card_input):
188 if enter_card_input == login_card_num:
189 print("You can't transfer money to the same account!")
190 else:
191 transfer_amt = int(input("Enter how much money you want to transfer:"))
192 balance = show_balance(connection, login_card_num)
193 connection.commit()
194 balance_sum = sum(balance)
195 if transfer_amt > balance_sum:
196 print("Not enough money!")
197 else:
198 new_balance = balance_sum - transfer_amt
199 transferee_balance = transfer_amt + sum(show_balance(connection, enter_card_input))
200 update_funds(connection, new_balance, login_card_num)
201 update_funds(connection, transferee_balance, enter_card_input)
202 connection.commit()
203 print("Success!")
204 else:
205 print("Such a card does not exist.")
206 else:
207 print("Probably you made mistake in card number. Please try again!")
208 # close account
209 elif choose_option2 == 4:
210 delete_account(connection, login_card_num)
211 print("The account has been closed!")
212 break
213 # logout
214 elif choose_option2 == 5:
215 print("You have successfully logged out!")
216 break
217 # exit
218 elif choose_option2 == 0:
219 print("Bye!")
220 exit()
221
222 # exit
223 elif choose_option == 0:
224 print("Bye!")
225 exit()
226