Projeto de Cadastro de empresas
Sou iniciante e entusiasta em programação, nunca fiz curso ou algo parecido, sou apenas um autodidata, estou criando o meu primeiro projeto, é um sistema de cadastro de clientes que busca os dados da API da receita federal(cartão CNPJ) utilizando linguagem py(versão 3.11) e banco de dados sqlite3, já criei a interface no QT, já converti para ui_main.py, escrevi o main_py a database.py, e o ui_funtions.py, pois esse sistema é integrado para buscar informações do CNPJ da API da receita federal através de uma QTablewidget,(tab_company) na primeira tela é digitado o CNPJ, e através da API os dados da empresa são retornados automaticamente para campos criados no QTablewidget (optei por escolher para que o código busque campos específicos do cartão CNPJ e não todos, configurei main.py e ui_funtions.py para isto). Ao clicar no botão cadastrar da interface(pushButton_5) automaticamente essas informações são jogadas para uma tabela QTablewidget(tab_company) onde possui três botões: Gerar Excel, Alterar, Excluir, eu no momento estou trabalhando na opção: Alterar, chamando uma função update_company mas travei neste passo pois ocorre que, quando faço uma alteração em qualquer dado de uma empresa cadastrada e clico em alterar é retornada a msg box: Dados alterados com sucesso! OK, porém quando vou verificar na base de dados nada foi alterado, já exclui a base e criei uma nova porém o problema persiste, já peguei o arquivo da base(system.db) e joguei em um visualizador Sqlite e os dados permanecem sem as alterações que fiz nos testes. Já adicionei linhas de depuração porém no console não é retornado nenhum erro, já fiz os testes de conexão com banco de dados e ela abre e fecha com sucesso conforme mostrado no console, já verifiquei se há exceções ao atualizar o banco de dados porém o console também não retorna erros, algum dos colegas poderia me ajudar a resolver este mistério? Vou compartilhar aqui a parte do código main.py que estou trabalhando no momento caso seja necessário posso postar também database.py e ui_funtions.py, segue parte do main.py:
Main.py
Main.py
def update_company(self):
# Verifique se algum item está selecionado na tabela
selected_items = self.tab_company.selectedItems()
if not selected_items or len(selected_items) < 12:
msg = QMessageBox()
msg.setIcon(QMessageBox.Warning)
msg.setText("Selecione uma empresa para atualizar.")
msg.exec()
return
# Obtenha os dados da linha selecionada
selected_row = [selected_items[i].text() for i in range(12)]
# Defina o campo de tributação como vazio (ou qualquer valor padrão que desejar)
selected_row.append("") # Você pode definir um valor padrão aqui
try:
print("Antes de atualizar no banco de dados")
# ATUALIZAR DADOS NO BANCO
db = Data_base()
db.connect()
db.update_company(tuple(selected_row))
db.close_connection()
print("Após atualizar no banco de dados")
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("Dados atualizados com sucesso!")
msg.exec()
# Limpa a tabela completamente
self.tab_company.clearContents()
# Recarrega os dados da tabela
self.buscar_empresas()
except Exception as e:
print(f"Erro ao atualizar dados no banco de dados: ")
Wanderlan
Curtidas 0
Respostas
Wanderlan
04/10/2023
esse é meu database.py
import sqlite3
class Data_base:
def __init__(self, name=''system.db'') -> None:
self.name = name
def connect(self):
try:
print("Abrindo conexão com o banco de dados...")
self.connection = sqlite3.connect(self.name)
print("Conexão aberta com sucesso!")
except Exception as e:
print(f"Erro ao abrir a conexão com o banco de dados: ")
def close_connection(self):
try:
print("Fechando conexão com o banco de dados...")
self.connection.close()
print("Conexão fechada com sucesso!")
except Exception as e:
print(f"Erro ao fechar a conexão com o banco de dados: ")
def create_table_company(self):
cursor = self.connection.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS Empresa (
CNPJ TEXT PRIMARY KEY,
NOME TEXT,
LOGRADOURO TEXT,
NUMERO TEXT,
COMPLEMENTO TEXT,
BAIRRO TEXT,
CEP TEXT,
MUNICIPIO TEXT,
UF TEXT,
TELEFONE TEXT,
EMAIL TEXT,
TRIBUTACAO TEXT
)
""")
def register_company(self, fullDataSet):
campos_tabela = (''CNPJ'', ''NOME'', ''LOGRADOURO'', ''NUMERO'', ''COMPLEMENTO'', ''BAIRRO'', ''CEP'', ''MUNICIPIO'',
''UF'', ''TELEFONE'', ''EMAIL'', ''TRIBUTACAO'')
qntd = "?,?,?,?,?,?,?,?,?,?,?,?"
cursor = self.connection.cursor()
try:
cursor.execute(f"""INSERT INTO Empresa ({", ".join(campos_tabela)})
VALUES()""", fullDataSet)
self.connection.commit() # Certifique-se de realizar o commit após a inserção.
print("Registro inserido com sucesso!")
return "OK"
except Exception as e:
print(f"Erro ao inserir registro: ")
return "Erro"
def select_all_companies(self):
try:
cursor = self.connection.cursor()
cursor.execute("SELECT * FROM Empresa ORDER BY NOME")
empresas = cursor.fetchall()
print("Dados recuperados com sucesso!")
return empresas
except Exception as e:
print(f"Erro ao recuperar dados: ")
return None
def delete_company(self, id):
try:
cursor = self.connection.cursor()
cursor.execute(f"DELETE FROM Empresa WHERE CNPJ = '''' ")
self.connection.commit()
return "Cadastro de empresa excluído com sucesso!"
except:
return "Erro ao excluir registro!"
def update_company(self, fullDataSet):
cursor = self.connection.cursor()
cursor.execute(f"""UPDATE Empresa SET
CNPJ = ?,
NOME = ?,
LOGRADOURO = ?,
NUMERO = ?,
COMPLEMENTO = ?,
BAIRRO = ?,
CEP = ?,
MUNICIPIO = ?,
UF = ?,
TELEFONE = ?,
EMAIL = ?,
TRIBUTACAO = ?
WHERE CNPJ = ?""", fullDataSet)
self.connection.commit()
GOSTEI 0
Wanderlan
04/10/2023
este é o main.py completo
from PySide6.QtCore import Qt, QEasingCurve, QPropertyAnimation
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import (
QApplication,
QMainWindow,
QStyleFactory,
QMessageBox,
QTableWidgetItem
)
from ui_main import Ui_MainWindow
import sys
from ui_funtions import consulta_cnpj
from database import Data_base
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
self.setWindowTitle("ATRIBUT - Sistema de cadastro")
appIcon = QIcon() # Use QtGui.QIcon()
self.setWindowIcon(appIcon)
# TOGGLE BUTTON
self.btn_toggle.clicked.connect(self.leftMenu)
# PÁGINAS DO SISTEMA
self.btn_home.clicked.connect(lambda: self.Pages.setCurrentWidget(self.pg_home))
# Botão à esquerda (navegar para a página de cadastro)
self.btn_cadastrar.clicked.connect(lambda: self.Pages.setCurrentWidget(self.pg_cadastrar))
# Botão inferior (cadastrar a empresa)
self.pushButton_5.clicked.connect(self.cadastrar_empresas) # Nome corrigido
self.btn_alterar.clicked.connect(self.update_company)
self.buscar_empresas()
self.btn_sobre.clicked.connect(lambda: self.Pages.setCurrentWidget(self.pg_sobre))
self.btn_contatos.clicked.connect(lambda: self.Pages.setCurrentWidget(self.pg_contatos))
# PREENCHER AUTOMATICAMENTE OS DADOS DO CNPJ
self.txt_cnpj.editingFinished.connect(self.consult_api)
def leftMenu(self):
width = self.left_menu.width()
if width == 9:
newWidth = 200
else:
newWidth = 9
self.animation = QPropertyAnimation(self.left_menu, b"maximumWidth")
self.animation.setDuration(500)
self.animation.setStartValue(width)
self.animation.setEndValue(newWidth)
self.animation.setEasingCurve(QEasingCurve.InOutQuart)
self.animation.start()
def consult_api(self):
campos = consulta_cnpj(self.txt_cnpj.text())
# Organize os dados corretamente
self.txt_cnpj.setText(campos[0]) # CNPJ
self.txt_nome.setText(campos[1]) # Nome da empresa
self.txt_logradouro.setText(campos[2]) # Logradouro
self.txt_numero.setText(campos[3]) # Número do estabelecimento
self.txt_complemento.setText(campos[4]) # Complemento do endereço
self.txt_bairro.setText(campos[5]) # Bairro da empresa
self.txt_municipio.setText(campos[6]) # Município
self.txt_uf.setText(campos[7]) # UF
self.txt_cep.setText(campos[8].replace('.', '').replace('-', '')) # CEP
self.txt_telefone.setText(campos[9].replace('(', '').replace('-', '').replace(')', '')) # Telefone
self.txt_email.setText(campos[10]) # Email
self.txt_tributacao.setText("") # Deixe o campo de Tributação em branco
def cadastrar_empresas(self):
db = Data_base()
db.connect()
# Verifique se o campo de tributação foi preenchido corretamente
tributacao = self.txt_tributacao.text().strip().lower() # Converte para minúsculas
tributacao_valida = tributacao in ["mei", "simples nacional", "imune", "isenta", "lucro presumido", "lucro real"]
if not tributacao_valida:
msg = QMessageBox()
msg.setIcon(QMessageBox.Warning)
msg.setWindowTitle("Erro de Tributação")
msg.setText("Informe o regime de tributação!\\nOpções válidas: MEI, SIMPLES NACIONAL, IMUNE, ISENTA, LUCRO PRESUMIDO, LUCRO REAL")
msg.exec()
db.close_connection()
return
# Organize os dados na ordem correta das colunas
fullDataSet = (
self.txt_cnpj.text(),
self.txt_nome.text(),
self.txt_logradouro.text(),
self.txt_numero.text(),
self.txt_complemento.text(),
self.txt_bairro.text(),
self.txt_cep.text(),
self.txt_municipio.text(),
self.txt_uf.text(),
self.txt_telefone.text().strip(),
self.txt_email.text(),
tributacao, # Use a tributação validada aqui
)
# CADASTRAR NO BANCO DE DADOS
resp = db.register_company(fullDataSet)
self.buscar_empresas()
if resp == "OK":
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setWindowTitle("Cadastro realizado")
msg.setText("Cadastro realizado com sucesso")
msg.exec()
db.close_connection()
return
else:
msg = QMessageBox()
msg.setIcon(QMessageBox.Critical)
msg.setWindowTitle("Erro")
msg.setText("Erro ao cadastrar, verifique se as informações foram preenchidas corretamente!")
msg.exec()
db.close_connection()
return
def buscar_empresas(self):
db = Data_base()
db.connect()
result = db.select_all_companies()
self.tab_company.clearContents()
self.tab_company.setRowCount(len(result))
for row, text in enumerate(result):
for column, data in enumerate(text):
self.tab_company.setItem(row, column, QTableWidgetItem(str(data)))
db.close_connection()
def update_company(self):
# Verifique se algum item está selecionado na tabela
selected_items = self.tab_company.selectedItems()
if not selected_items or len(selected_items) < 12:
msg = QMessageBox()
msg.setIcon(QMessageBox.Warning)
msg.setText("Selecione uma empresa para atualizar.")
msg.exec()
return
# Obtenha os dados da linha selecionada
selected_row = [selected_items[i].text() for i in range(12)]
# Defina o campo de tributação como vazio (ou qualquer valor padrão que desejar)
selected_row.append("") # Você pode definir um valor padrão aqui
try:
print("Antes de atualizar no banco de dados")
# ATUALIZAR DADOS NO BANCO
db = Data_base()
db.connect()
db.update_company(tuple(selected_row))
db.close_connection()
print("Após atualizar no banco de dados")
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("Dados atualizados com sucesso!")
msg.exec()
# Limpa a tabela completamente
self.tab_company.clearContents()
# Recarrega os dados da tabela
self.buscar_empresas()
except Exception as e:
print(f"Erro ao atualizar dados no banco de dados: ")
if __name__ == "__main__":
db = Data_base()
db.connect()
db.create_table_company()
db.close_connection()
app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create("WindowsVista"))
window = MainWindow()
window.show()
sys.exit(app.exec())
GOSTEI 0
Wanderlan
04/10/2023
e este é meu ui_funtions.py
import requests
import json
def consulta_cnpj(cnpj):
url = f"https://www.receitaws.com.br/v1/cnpj/"
querystring = {"token": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "cnpj": cnpj, "plugin": "RF"}
response = requests.get(url, params=querystring)
if response.status_code == 200:
resp = json.loads(response.text)
# Mapeie os dados da API para os campos corretos
return (
resp.get('cnpj', ''),
resp.get('nome', ''),
resp.get('logradouro', ''),
resp.get('numero', ''),
resp.get('complemento', ''),
resp.get('bairro', ''),
resp.get('municipio', ''),
resp.get('uf', ''),
resp.get('cep', '').replace('.', '').replace('-', ''),
resp.get('telefone', '').replace('(', '').replace('-', '').replace(')', ''),
resp.get('email', ''),
""
)
else:
print(f"Erro ao consultar CNPJ: Código de status {response.status_code}")
return None
GOSTEI 0
Nomad
04/10/2023
Me parece que na update_company, vc esqueceu de comitar as alterações.
GOSTEI 0