class Bank(Connection): def __init__(self): self.logCPF = None self.logNumber = None self.extract = Extract() Connection.__init__(self) sql = 'create table if not exists db_client (CPF integer primary key, Name varchar(45) not null, Surname varchar(45) not null)' self.execute(sql) self.commit() sql = 'create table if not exists db_account (Number integer primary key, Name varchar(45) not null, Surname varchar(45) not null, CPF integer, Balance real not null, Password varchar(45) not null, Limits real not null)' self.execute(sql) self.commit() def add_client(self, client): ''' DESCRIPTION: Essa função serve para adicionar cliente no banco e salvar num dicionario com o seu cpf ''' try: sql = 'insert into db_client (CPF, Name, Surname) VALUES (%s, %s, %s)' self.add_clients(sql, client) except Exception as error: print('Erro ao Inserir', error) # else: # self.commit() def get_client(self, cpf): ''' DESCRIPTION: Verificar se já existe algum cliente utilizando o cpf informado ''' sql = 'select * from db_client' self.execute(sql) for i in self.cursor: if cpf == str(i[0]): return True return False def add_account(self, account): ''' DESCRIPTION: adiciona uma conta no dicionario e já a vincula em um cliente ''' try: sql = 'insert into db_account (Number,Name, Surname, CPF, Balance, Password, Limits) VALUES (%s, %s, %s, %s, %s, %s, %s)' self.add_accounts(sql, account) except Exception as error: print('Erro ao Inserir', error) else: self.commit() def login(self, cpf, password): ''' DESCRIPTION: verifica se a senha e o cpf está vinculada ao banco ''' if self.get_client(cpf) is True: sql = f'select Password from db_account where CPF = {cpf}' self.execute(sql) bd_password = self.fetchall() password = md5(password.encode('utf-8')).hexdigest() if password == bd_password[0][0]: self.logCPF = int(cpf) sql = f'select Number from db_account where CPF = {cpf}' self.execute(sql) bd_number = self.fetchall() self.logNumber = bd_number[0][0] return True else: return False else: return False def get_account(self, number): ''' DESCRIPTION: verifica se o numero da conta já está sendo utilizado ''' sql = 'select * from db_account' self.execute(sql) for i in self.cursor: if int(number) == i[0]: return True return False def nameAndSurname(self): sql = f'select Name from db_account where CPF = {self.logCPF}' self.execute(sql) name = self.fetchall() sql = f'select Surname FROM db_account where CPF = {self.logCPF}' self.execute(sql) surname = self.fetchall() fullname = name[0][0].capitalize() + ' ' + surname[0][0].capitalize() return fullname def menuBalance(self): sql = f'select Balance from db_account where CPF = {self.logCPF}' self.execute(sql) balance = self.fetchall() balance = balance[0][0] return balance def withdraw(self, value): sql = f'select Balance from db_account where CPF = {self.logCPF}' self.execute(sql) balance = self.fetchall() balance = balance[0][0] sql = f'select Limits from db_account where CPF = {self.logCPF}' self.execute(sql) limits_account = self.fetchall() limits_account = limits_account[0][0] if float(value) < 0: return 'Negativo' elif float(value) > balance + limits_account: return 'Indisponível' else: date = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S') balance -= float(value) self.extract.add_extract('{} - Sacou {} em {}\n'.format(self.logCPF, value, date)) sql = f'UPDATE db_account set Balance = {balance} WHERE CPF = {self.logCPF}' self.execute(sql) self.commit() return 'True' def deposit(self, value): sql = f'select Balance from db_account where CPF = {self.logCPF}' self.execute(sql) balance = self.fetchall() balance = balance[0][0] if float(value) < 0: return 'Negativo' else: date = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S') balance += float(value) self.extract.add_extract(' - Depositou {} em {}\n'.format(value, date)) sql = f'update db_account set Balance = {balance} where CPF = {self.logCPF}' self.execute(sql) self.commit() return 'True' def transfer(self, number, value): account = self.get_account(int(number)) if account: sql = f'select Balance FROM db_account where CPF = {self.logCPF}' self.execute(sql) balance_origin = self.fetchall() balance_origin = balance_origin[0][0] if float(value) < 0: return 'Negativo' else: if float(value) < balance_origin: balance_origin -= float(value) sql = f'update db_account set Balance = {balance_origin} where CPF = {self.logCPF}' self.execute(sql) self.commit() sql = f'select Balance from db_account where Number = {int(number)}' self.execute(sql) balance_destiny = self.fetchall() balance_destiny = balance_destiny[0][0] balance_destiny += float(value) sql = f'UPDATE db_account set Balance = {balance_destiny} where Number = {int(number)}' self.execute(sql) self.commit() return 'True' else: return 'Inválido' else: return 'False' def extract(self): self.extract.display_extract(self.logCPF) def sairApp(self): self.commit()
class Account: _total_accounts = 0 __slots__ = [ '_number', '_holder', '_balance', '_limit', '_extract', '_password' ] def __init__(self, number, client, balance, password, limit=1000.0): ''' DESCRIPTION: Essa classe é utilizada a fim de cadastrar a conta que o cliente vai utilizar no banco. ''' self._number = number self._holder = client self._balance = balance self._limit = limit self._password = password self._extract = Extract() Account._total_accounts += 1 @property def number(self): return self._number @property def holder(self): return self._holder @property def balance(self): return self._balance @property def limit(self): return self._limit @property def password(self): return self._password @property def extract(self): return self._extract def withdraw(self, value): ''' :param value: float valor do tipo float :raise: aceita valores do tipo inteiro e flutuante :return: informa uma mensagem, avisando que a saque foi um sucesso. informa o restante do saldo presente na sua carteira após o termino da operação. ''' if value < 0: return 'Valor sacado não pode ser negativo!' elif value > self._balance + self._limit: return 'Valor indisponível para saque!' else: self._balance -= value date = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S') self._extract.add_extract(' - Sacou {} em {}\n'.format( value, date)) return 'Saque realizado com sucesso!\nSaldo restante = {:.2f}'.format( self._balance) def deposit(self, value): ''' :param value: float valor do tipo float :raise: aceita valores do tipo inteiro e flutuante :return: informa uma mensagem, avisando que o deposito foi um sucesso. informa o restante do saldo presente na sua carteira após o termino da operação. ''' if value < 0: return 'Valor depositado não pode ser negativo!' else: self._balance += value date = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S') self._extract.add_extract(' - Depositou {} em {}\n'.format( value, date)) return 'Deposito realizado com sucesso!\nSaldo da conta = {:.2f}'.format( self.balance) def transfer(self, destiny, value): ''' :param destiny: str valor do tipo str :param value: float valor do tipo float :raise: aceita valores de tipo str aceita valores do tipo inteiro e flutuante :return: informa uma mensagem, avisando que a transferencia foi um sucesso. ''' if value < 0: return 'Valor a ser transferido não pode ser negativo!' elif value > self._balance + self._limit: return 'Valor indisponível para transferencia!' else: self._balance -= value destiny._balance += value date = datetime.datetime.now().strftime('%d/%m/%Y %H:%M:%S') # self._extract.add_extract(' - Sacou {} em {}\n'.format(value, date)) self._extract.add_extract( ' - Transferiu {:.2f} para conta {} em {}\n'.format( value, destiny._number, date)) # destiny._extract.add_extract(' - Depositou {} em {}\n'.format(value, date)) destiny._extract.add_extract( ' - Recebeu {:.2f} por transferência da conta {} em {}\n'. format(value, self._number, date)) return 'Transferencia realizada com sucesso!' # contar a quantidade de contas @staticmethod def get_total_accounts(): return Account._total_accounts