MeowalsoMeow

bank_stage4

Aug 30th, 2021 (edited)
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.01 KB | None | 0 0
  1. # Write your code here
  2. import sqlite3
  3. from random import sample
  4.  
  5.  
  6. class BankingSystem:
  7. def __init__(self):
  8. self.database() # init database
  9. self.card_data = None # card_data is a list for storing logged in account's info
  10. # self.cards = {}
  11.  
  12. def menu(self):
  13. while True:
  14. try:
  15. print("1. Create an account\n2. Log into account\n0. Exit")
  16. self.to_1st_menu(input())()
  17. except KeyError:
  18. print('Unknown option.')
  19.  
  20. def to_1st_menu(self, choice):
  21. switcher = {
  22. '1': self.create_acc,
  23. '2': self.login,
  24. '0': self.end
  25. }
  26. return switcher[choice]
  27.  
  28. @staticmethod
  29. def database(card=None, pin=None, balance=None):
  30. with sqlite3.connect('card.s3db') as data:
  31. cursor = data.cursor()
  32. if not card:
  33. cursor.execute('''
  34. CREATE TABLE IF NOT EXISTS card(
  35. id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  36. number TEXT,
  37. pin TEXT,
  38. balance INTEGER
  39. );
  40. ''')
  41. else:
  42. cursor.execute('''
  43. INSERT into card(number, pin, balance)
  44. VALUES(?,?,?)
  45. ''', (card, pin, balance)) # use (?) for vars
  46.  
  47. @staticmethod
  48. def check_credentials(card):
  49. with sqlite3.connect('card.s3db') as data:
  50. cursor = data.cursor()
  51. cursor.execute('''
  52. SELECT number, pin, balance FROM card WHERE number = (?);
  53. ''', (card,)) # card is card number, use , to avoid incorrect number of bindings error
  54. return list(cursor.fetchone()) # fetchone returns tuple
  55.  
  56. def add_income(self):
  57. income = int(input('Enter income:'))
  58. # print(self.card_data) # ('4000001083457267', '7352', 0)
  59. # print(income)
  60. # print(type(self.card_data[2]))
  61. self.card_data[2] += income
  62. print('after adding income', self.card_data)
  63. with sqlite3.connect('card.s3db') as data:
  64. cursor = data.cursor()
  65. cursor.execute('''
  66. UPDATE card SET balance = (?) WHERE number = (?);
  67. ''', (self.card_data[2], self.card_data[0]))
  68. print('Income was added!')
  69.  
  70. def transfer(self):
  71. to_acc = input('Transfer\nEnter card number:')
  72. if BankingSystem.luhn_algorithm(to_acc) is False:
  73. print('Probably you made a mistake in the card number. Please try again!\n')
  74. return
  75. else:
  76. with sqlite3.connect('card.s3db') as data:
  77. cursor = data.cursor()
  78. cursor.execute('''
  79. SELECT balance FROM card WHERE number = (?);
  80. ''', (to_acc,))
  81. msg = cursor.fetchone()
  82. # print('msg', msg)
  83. if msg is None:
  84. # print('yes none')
  85. print('Such a card does not exist.\n')
  86. return
  87. else:
  88. money = int(input('Enter how much money you want to transfer:'))
  89. if self.card_data[2] < money:
  90. print('Not enough money!')
  91. else:
  92. self.card_data[2] -= money
  93. cursor.execute('''
  94. UPDATE card SET balance = (?) WHERE number = (?);
  95. ''', (self.card_data[2], self.card_data[0]))
  96. cursor.execute('''
  97. SELECT balance FROM card WHERE number = (?)
  98. ''', msg)
  99. to_balance = cursor.fetchone()
  100. to_balance += money
  101. cursor.execute('''
  102. UPDATE card SET balance = (?) WHERE number = (?);
  103. ''', self.card_data[2])
  104. cursor.execute('''
  105. UPDATE card SET balance = (?) WHERE number = (?);
  106. ''', msg)
  107.  
  108. def close_acc(self):
  109. with sqlite3.connect('card.s3db') as data:
  110. cursor = data.cursor()
  111. cursor.execute('''
  112. DELETE FROM card WHERE number = (?);
  113. ''', self.card_data[0])
  114. print('The account has been closed!\n')
  115.  
  116. @staticmethod
  117. def generate_nums():
  118. while True:
  119. random_card = '400000' + ''.join([str(n) for n in sample(range(9), 9)]) + '7'
  120. random_pin = ''.join([str(n) for n in sample(range(9), 4)])
  121. if BankingSystem.luhn_algorithm(random_card):
  122. yield random_card, random_pin
  123. else:
  124. continue
  125.  
  126. @staticmethod
  127. def luhn_algorithm(card_number: str) -> bool:
  128. number = list(map(int, card_number))[::-1]
  129. for index in range(1, len(number), 2):
  130. if number[index] < 5:
  131. number[index] = number[index] * 2
  132. else:
  133. number[index] = ((number[index] * 2) // 10) + ((number[index] * 2) % 10)
  134. return (sum(number) % 10) == 0
  135.  
  136. def create_acc(self):
  137. card, pin = next(self.generate_nums())
  138. # self.cards[card] = {'pin': pin, 'balance': 0}
  139. self.database(card, pin, 0)
  140. print('\nYour card has been created')
  141. print(f'Your card number:\n{card}')
  142. print(f'Your card PIN:\n{pin}\n')
  143.  
  144. def login(self):
  145. card = input('Enter your card number:\n')
  146. pin = input('Enter your PIN:\n')
  147. try:
  148. # if self.cards[card]['pin'] == pin:
  149. self.card_data = self.check_credentials(card)
  150. if self.card_data[1] == pin:
  151. print('You have successfully logged in!\n')
  152. self.account()
  153. else:
  154. print('Wrong card number or PIN\n')
  155. except (KeyError, TypeError):
  156. print('Wrong card number or PIN\n')
  157.  
  158. def account(self):
  159. while True:
  160. print('1. Balance\n2. Add income\n3. Do transfer\n4. Close account\n5. Log out\n0. Exit')
  161. choice = input()
  162. if choice == '1':
  163. self.card_data = self.check_credentials(card) # card_data is what sql command fetch one returned
  164. print(self.card_data[2])
  165. # print(f"\nBalance: {self.cards[card]['balance']}\n") # how to print query
  166. elif choice == '2':
  167. self.add_income()
  168. elif choice == '3':
  169. self.transfer()
  170. elif choice == '4':
  171. self.close_acc()
  172. elif choice == '5':
  173. self.card_data = None
  174. print('You have successfully logged out!\n')
  175. return
  176. elif choice == '0':
  177. print('Bye!')
  178. exit()
  179. else:
  180. print('Unknown option.\n')
  181.  
  182. @staticmethod
  183. def end():
  184. print('Bye!')
  185. exit()
  186.  
  187.  
  188. BankingSystem().menu()
  189.  
Add Comment
Please, Sign In to add comment