Beispiel #1
0
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()
Beispiel #2
0
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