├── car_23964.ico ├── teste.py ├── README.md ├── Financeiro.py ├── Tecnicos.py ├── envio_sms.py ├── Marcas.py ├── Automoveis.py ├── envio_whatsapp.py ├── Fornecedores.py ├── Servicos.py ├── Pagamentos.py ├── Cadastros.py ├── Produtos.py ├── Relatorios.py ├── Estoque.py └── Clientes.py /car_23964.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafael-rfzorzi/Glacx2024/HEAD/car_23964.ico -------------------------------------------------------------------------------- /teste.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pandas as pd 3 | from reportlab.lib.pagesizes import A4 4 | from reportlab.pdfgen import canvas 5 | from tkinter import Tk, messagebox 6 | from PIL import Image 7 | 8 | # Function to create a PDF report 9 | def create_pdf(data, photos_folder, output_path): 10 | c = canvas.Canvas(output_path, pagesize=A4) 11 | 12 | # Set font and size for the report with support for Brazilian Portuguese characters 13 | c.setFont("Helvetica", 12) 14 | 15 | # Iterate through the data and add information to the PDF 16 | for index, row in data.iterrows(): 17 | name = row['NAME'] 18 | registration = row['REGISTRATION'] 19 | photo_filename = row['PHOTO'] 20 | 21 | # Draw information on the PDF with Brazilian Portuguese characters 22 | c.drawString(240, 700, f"Nome: {name}") 23 | c.drawString(240, 680, f"Registro: {registration}") 24 | 25 | # Load and draw the photo 26 | photo_path = os.path.join(photos_folder, photo_filename) 27 | if os.path.exists(photo_path): 28 | image = Image.open(photo_path) 29 | image_width, image_height = image.size 30 | c.drawInlineImage(photo_path, 100, 600, width=image_width / 4, height=image_height / 4) 31 | 32 | # Move to the next page for the next entry 33 | c.showPage() 34 | 35 | # Save the PDF 36 | c.save() 37 | 38 | # Function to show an alert screen 39 | def show_alert(): 40 | root = Tk() 41 | root.withdraw() # Hide the main window 42 | messagebox.showinfo("Success", "The process was completed successfully!") 43 | root.destroy() 44 | 45 | # Main script 46 | 47 | # Replace 'your_excel_file.xlsx' and 'output_report.pdf' with your actual file names 48 | excel_file = 'MDPDF.xlsx' 49 | output_pdf = 'output_report.pdf' 50 | photos_folder = '.' # Assuming images are in the root folder 51 | 52 | # Read Excel file into a DataFrame with proper encoding for Brazilian Portuguese characters 53 | #df = pd.read_excel(excel_file, encoding='utf-8') 54 | df = pd.read_excel(excel_file) 55 | 56 | # Generate the PDF report 57 | create_pdf(df, photos_folder, output_pdf) 58 | 59 | # Show the alert 60 | show_alert() 61 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Manual de utilização do GlacX Oficinas - versão 2.3 2 | 3 | 4 | 1- Primeiro Acesso: 5 | Ao acessar o sistema pela primeira vez após a instalação, você terá de fazer o cadastro de um e-mail válido que você tenha acesso. 6 | 7 | Clique no botão cadastre-se e insira seu e-mail e uma senha que irá lembrar, feito isso em até 5 minutos seu acesso será liberado gratuitamente por 15 dias. 8 | Feche o sistema e abra novamente apos realizar o cadastro e tente realizar o acesso com seu e-mail e senha. 9 | 10 | 2 - Tela Principal 11 | 12 | 13 | 2.1 - Na tela principal do sistema, mostra a tela de preenchimento da ordem de serviço(serviço realizado) ou orçamento(Servido orçado e não realizado). 14 | 15 | 16 | 2.2 - Ao clicar no botão “abrir/salvar” você pode iniciar um orçamento ou ordem de serviço, mesmo sem inserir o cliente ou automóvel, o ideal é que antes de iniciar o atendimento, você cadastre o cliente no sistema e insira o automóvel do cliente, assim pode iniciar o atendimento com estes dados inclusos. 17 | 18 | 19 | 20 | 21 | 22 | 23 | 3 - Cadastro de Clientes 24 | 25 | 26 | 3.1 - Ao acessar a tela de cadastro de clientes, do lado direito você vê a lista dos clientes já cadastrados, se houver, ao dar 2 cliques com o mouse o cadastro irá carregar na tela ao lado, abaixo do cadastro do cliente tem o cadastro dos veículos do cliente. 27 | 28 | 3.2 - Ao clicar em “Abrir O.S”, o sistema volta à tela principal com o cliente selecionado para iniciar um atendimento. 29 | 30 | 3.3 - Preenchendo o cadastro do cliente e clicando em “Novo”, um novo registro de cliente é adicionado. 31 | 32 | 3.4 - Ao carregar um cliente na tela, você pode adicionar abaixo quantos veículos seu cliente tiver. 33 | 34 | 35 | 36 | 37 | 38 | 39 | 4 - Cadastro de Fornecedores 40 | 41 | 4.1 - No cadastro de fornecedores você cadastra quais fornecedores você possui. 42 | 43 | 44 | 5 - Cadastro de Produtos(peças) 45 | 46 | No cadastro de produtos você cadastra as peças que você utiliza nas ordens de serviço. 47 | 48 | 49 | 50 | 6 - Cadastro de Serviços 51 | 52 | O cadastro de serviços já vem com 7 mil serviços da tabela temparia pré cadastrados, além disso você pode acrescentar os seus serviços personalizados. 53 | 54 | 7 - Cadastro de modelos de automóveis 55 | 56 | No cadastro de automóveis tem pré cadastro em torno de 700 automóveis fabricados no brasil, você também pode adicionar modelos que você não encontrar. 57 | 58 | 59 | 60 | 61 | 62 | 8 - Cadastro de marcas de produtos 63 | 64 | 9 - Cadastro de técnicos 65 | 66 | No cadastro de técnicos você pode incluir os profissionais que atendem na sua oficina. 67 | 10 - Adicionar pagamentos a Ordem de Serviço 68 | 69 | No cadastro de pagamentos você pode adicionar os pagamentos realizados pelo cliente na ordem de serviço e os pagamentos que ainda não foram pagos. 70 | 71 | 72 | 11 - Consulta receitas 73 | 74 | 12 - Consulta pagamentos 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 13 - Atualizar hora serviço 83 | 84 | -------------------------------------------------------------------------------- /Financeiro.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | today = date.today() 12 | 13 | class ConsFinan: 14 | def cadfinan(self): 15 | self.janelaFin = customtkinter.CTkToplevel() 16 | self.janelaFin.title("Receitas") 17 | self.janelaFin.geometry("795x270+120+200") 18 | self.janelaFin.configure(background="gray40") 19 | self.janelaFin.resizable(FALSE, FALSE) 20 | self.janelaFin.transient(self.window_one) 21 | self.janelaFin.focus_force() 22 | self.janelaFin.grab_set() 23 | 24 | descrCodprod = customtkinter.CTkLabel(self.janelaFin, text='Ano') 25 | descrCodprod.place(x=30, y=15) 26 | 27 | self.sel_lists_tps() 28 | 29 | self.entry5 = StringVar() 30 | self.entry5.set(today.year) 31 | self.entry5V = self.rows_ano_dscr 32 | 33 | self.entradaCodReceita = OptionMenu(self.janelaFin, self.entry5, *self.entry5V) 34 | self.entradaCodReceita.place(x=85, y=15) 35 | 36 | descrMes = customtkinter.CTkLabel(self.janelaFin, text='Mês') 37 | descrMes.place(x=30, y=45) 38 | 39 | self.entry6 = StringVar() 40 | mes = today.month - 1 41 | self.entry6.set(self.rows_meses_dscr[mes]) 42 | self.entry6V = self.rows_meses_dscr 43 | 44 | self.entradaReceita = OptionMenu(self.janelaFin, self.entry6, *self.entry6V) 45 | self.entradaReceita.place(x=85, y=45) 46 | 47 | ### Botao Carrega 48 | botaoAdd = customtkinter.CTkButton(self.janelaFin, text="Carregar", command=self.carrega_receita) 49 | botaoAdd.place(x=35, y=115) 50 | 51 | ### Botao limpa 52 | botaolimpa = customtkinter.CTkButton(self.janelaFin, text="Limpar", command=self.limpa_receita) 53 | botaolimpa.place(x=35, y=150) 54 | 55 | ### Widgets - Listar produtos ### 56 | self.listaServ = ttk.Treeview(self.janelaFin, height=10, 57 | column=("col1", "col2", "col3", "col4")) 58 | self.listaServ.heading("#0", text="") 59 | self.listaServ.heading("#1", text="Codigo") 60 | self.listaServ.heading("#2", text="Placa") 61 | self.listaServ.heading("#3", text="Dia") 62 | self.listaServ.heading("#4", text="Valor") 63 | 64 | self.listaServ.column("#0", width=0) 65 | self.listaServ.column("#1", width=70) 66 | self.listaServ.column("#2", width=140) 67 | self.listaServ.column("#3", width=130) 68 | self.listaServ.column("#4", width=60) 69 | 70 | # Cria barra de rolagem 71 | self.barra = ttk.Scrollbar(self.janelaFin, orient='vertical', command=self.listaServ.yview) 72 | 73 | # Adiciona barra de rolagem 74 | self.listaServ.configure(yscroll=self.barra.set) 75 | self.barra.place(x=775, y=15, height=222) 76 | self.listaServ.place(x=220, y=15, width=555) 77 | 78 | self.listaServ.bind("", self.OnDoubleClickFinan) 79 | 80 | self.listaServ2 = ttk.Treeview(self.janelaFin, height=1, column=("col1")) 81 | self.listaServ2.heading("#0", text="") 82 | self.listaServ2.heading("#1", text="Total do mês") 83 | 84 | self.listaServ2.column("#0", width=0) 85 | self.listaServ2.column("#1", width=120) 86 | 87 | self.listaServ2.place(x=45, y=195) 88 | self.janelaFin.mainloop() 89 | def OnDoubleClickFinan(self, event): 90 | #self.limpa_produto() 91 | self.listaServ.selection() 92 | for n in self.listaServ.selection(): 93 | col1, col2, col3, col4 = self.listaServ.item(n, 'values') 94 | self.carrega_produto() 95 | self.entradaCodprod.insert(END, col1) 96 | def carrega_receita(self): 97 | self.conecta_Glac() 98 | 99 | self.listaServ.delete(*self.listaServ.get_children()) 100 | self.listaServ2.delete(*self.listaServ2.get_children()) 101 | 102 | ano = self.entry5.get() 103 | mes = self.entry6.get() 104 | ano = str(ano.replace("(", "").replace(")", "").replace(",", "")) 105 | mes = str(mes.replace("(", "").replace(")", "").replace(",", "")) 106 | mes2 = '' 107 | if mes == "Janeiro": 108 | mes2 = '01' 109 | elif mes == "Fevereiro": 110 | mes2 = '02' 111 | elif mes == "Março": 112 | mes2 = '03' 113 | elif mes == "Abril": 114 | mes2 = '04' 115 | elif mes == "Maio": 116 | mes2 = '05' 117 | elif mes == "Junho": 118 | mes2 = '06' 119 | elif mes == "Julho": 120 | mes2 = '07' 121 | elif mes == "Agosto": 122 | mes2 = '08' 123 | elif mes == "Setembro": 124 | mes2 = '09' 125 | elif mes == "Outubro": 126 | mes2 = '10' 127 | elif mes == "Novembro": 128 | mes2 = '11' 129 | elif mes == "Dezembro": 130 | mes2 = '12' 131 | 132 | lista = self.cursor.execute("""select id_orc1, placa_orc, dia, 133 | (select (sum(total)) from orcamento2 where id_orc2 = id_orc1) from orcamento1 134 | where substr(dia, 7,4) = '%s' and substr(dia, 4,2) = '%s' 135 | and tipoOrc != 'Orçamento' order by dia asc; """ % (ano, mes2)) 136 | for i in lista: 137 | i = list(i) 138 | if i[3] == None: 139 | i[3] = float(0.00) 140 | print(i) 141 | 142 | self.listaServ.insert("", END, values=i) 143 | 144 | 145 | lista2 = self.cursor.execute("""SELECT sum(total) 146 | from orcamento1, orcamento2 WHERE substr(dia, 7,10) = '%s' and substr(dia, 4,2) = '%s' 147 | and tipoOrc == 'Ordem de Serviço' and id_orc2 = id_orc1; """ % (ano, mes2)) 148 | for i in lista2: 149 | self.listaServ2.insert("", END, values=i) 150 | self.desconecta_Glac() 151 | def limpa_receita(self): 152 | self.listaServ.delete(*self.listaServ.get_children()) 153 | self.listaServ2.delete(*self.listaServ2.get_children()) -------------------------------------------------------------------------------- /Tecnicos.py: -------------------------------------------------------------------------------- 1 | from tkWidgetsRfzorzi.widgets_Glac import * 2 | from tkinter import ttk 3 | from tkcalendar import * 4 | from tkinter import messagebox 5 | from tkinter import * 6 | from datetime import * 7 | import brazilcep 8 | from brazilcep import get_address_from_cep, WebService 9 | 10 | class CadTec: 11 | def cadtec(self): 12 | self.janelaTec = Toplevel() 13 | self.janelaTec.title("Tecnico") 14 | self.janelaTec.geometry("625x150+100+170") 15 | self.janelaTec.configure(background="#6F87B0") 16 | self.janelaTec.transient(self.window_one) 17 | self.janelaTec.focus_force() 18 | self.janelaTec.grab_set() 19 | self.janelaTec.resizable(FALSE, FALSE) 20 | 21 | ### Botao Novo Cliente 22 | botaoAdd = ButtonGlac(self.janelaTec, "Novo", self.add_servT) 23 | botaoAdd.place(x=25, y=105, width=80, height=35) 24 | 25 | ### Botao Altera dados do Cliente 26 | botaoMud = ButtonGlac(self.janelaTec, "Alterar", self.mud_servT) 27 | botaoMud.place(x=125, y=105, width=80, height=35) 28 | 29 | ### Botao deletar dados do Cliente 30 | botaoDel = ButtonGlac(self.janelaTec, "Apagar", self.del_servT) 31 | botaoDel.place(x=225, y=105, width=80, height=35) 32 | 33 | ## Botao limpa 34 | botaolimpa = ButtonGlac(self.janelaTec, "Limpar", self.limpa_servicoT) 35 | botaolimpa.place(x=220, y=15, width=90, height=35) 36 | 37 | ### Botao busca Cabeça 38 | botaobusca = ButtonGlac(self.janelaTec, '>>', self.busca_servicoT) 39 | botaobusca.place(x=280, y=50, width=30, height=25) 40 | 41 | ### Botao busca Carregar 42 | botaoCarregar = ButtonGlac(self.janelaTec, "Carregar", self.carrega_servicoT) 43 | botaoCarregar.place(x=130, y=15, width=90, height=35) 44 | 45 | descrCod = LabelGlac(self.janelaTec, "Codigo", '#4A71B2') 46 | descrCod.place(x=2, y=20, width=80, height=25) 47 | 48 | self.entradaCod = Entry(self.janelaTec) 49 | self.entradaCod.place(x=80, y=20, width=40, height=25) 50 | 51 | descrTec = LabelGlac(self.janelaTec, "Tecnico", '#4A71B2') 52 | descrTec.place(x=2, y=50, width=80, height=25) 53 | 54 | self.entradaTec = Entry(self.janelaTec) 55 | self.entradaTec.place(x=80, y=50, width=200, height=25) 56 | 57 | # Widgets - Listar tecnicos 58 | self.listaServ = ttk.Treeview(self.janelaTec, height=6, column=("col1", "col2")) 59 | self.listaServ.heading("#0", text="") 60 | self.listaServ.column("#0", width=0) 61 | self.listaServ.heading("#1", text="Codigo") 62 | self.listaServ.column("#1", width=55) 63 | self.listaServ.heading("#2", text="Tecnico") 64 | self.listaServ.column("#2", width=220) 65 | 66 | # Cria barra de rolagem 67 | self.barra = ttk.Scrollbar(self.janelaTec, orient='vertical', 68 | command=self.listaServ.yview) 69 | 70 | # Adiciona barra de rolagem 71 | self.listaServ.place(x=325, y=20, height=122) 72 | self.listaServ.configure(yscroll=self.barra.set) 73 | self.barra.place(x=600, y=21, height=122) 74 | self.listaServ.bind("", self.OnDoubleClickT) 75 | 76 | self.conecta_Glac() 77 | 78 | lista = self.cursor.execute("SELECT cod, tecnico FROM tecnico ORDER BY tecnico ASC; ") 79 | for i in lista: 80 | self.listaServ.insert("", END, values=i) 81 | 82 | self.desconecta_Glac() 83 | self.janelaTec.mainloop() 84 | def add_tecnicobind(self, event): 85 | self.codServ1.delete(0, END) 86 | 87 | self.listaServ.selection() 88 | for n in self.listaServ.selection(): 89 | col1, col2 = self.listaServ.item(n, 'values') 90 | self.entradaTecnico.insert(END, col2) 91 | 92 | self.listatec.destroy() 93 | def OnTec(self, *args): 94 | self.listaServ.yview(*args) 95 | def limpa_servicoT(self): 96 | self.entradaCod.delete(0, END) 97 | self.entradaTec.delete(0, END) 98 | def mud_servT(self): 99 | self.conecta_Glac() 100 | 101 | cod_sp = self.entradaCod.get() 102 | servprod = self.entradaTec.get() 103 | 104 | self.cursor.execute(""" 105 | UPDATE tecnico SET tecnico = ? WHERE cod = ?""", (servprod, cod_sp)) 106 | self.conn.commit() 107 | 108 | self.listaServ.delete(*self.listaServ.get_children()) 109 | lista = self.cursor.execute(""" 110 | SELECT * FROM tecnico ORDER BY tecnico ASC; 111 | """) 112 | for i in lista: 113 | self.listaServ.insert("", END, values=i) 114 | 115 | self.desconecta_Glac() 116 | def OnDoubleClickT(self, event): 117 | self.limpa_servicoT() 118 | self.listaServ.selection() 119 | 120 | for n in self.listaServ.selection(): 121 | col1, col2 = self.listaServ.item(n, 'values') 122 | self.entradaCod.insert(END, col1) 123 | 124 | self.carrega_servicoT() 125 | def del_servT(self): 126 | self.conecta_Glac() 127 | 128 | self.listaServ.delete(*self.listaServ.get_children()) 129 | cod_sp = self.entradaCod.get() 130 | self.cursor.execute(""" 131 | DELETE FROM tecnico WHERE cod = ? """, (cod_sp,)) 132 | self.conn.commit() 133 | 134 | lista = self.cursor.execute(""" 135 | SELECT cod, tecnico FROM tecnico ORDER BY tecnico ASC; 136 | """) 137 | for i in lista: 138 | self.listaServ.insert("", END, values=i) 139 | self.entradaCod.delete(0, END) 140 | self.entradaTec.delete(0, END) 141 | 142 | self.desconecta_Glac() 143 | def carrega_servicoT(self): 144 | cod_sp = self.entradaCod.get() 145 | self.conecta_Glac() 146 | 147 | sp = self.cursor 148 | 149 | self.entradaTec.delete(0, END) 150 | 151 | sp.execute("SELECT tecnico FROM tecnico WHERE cod = '%s'" % cod_sp) 152 | consultaserv = self.cursor.fetchall() 153 | for i in consultaserv: 154 | i = str(i); 155 | i = i.replace('(', ''); 156 | i = i.replace(')', ''); 157 | i = i.replace("'", ""); 158 | i = i.replace(',', ''); 159 | i = i.replace('{', ''); 160 | i = i.replace('}', '') 161 | self.entradaTec.insert(END, i) 162 | 163 | self.desconecta_Glac() 164 | def busca_servicoT(self): 165 | self.conecta_Glac() 166 | 167 | self.listaServ.delete(*self.listaServ.get_children()) 168 | 169 | self.entradaTec.insert(END, '%') 170 | servprod = self.entradaTec.get() 171 | servico = self.cursor 172 | 173 | servico.execute("""SELECT cod, tecnico FROM tecnico WHERE tecnico LIKE '%s' """ % servprod) 174 | buscaservico = self.cursor.fetchall() 175 | for i in buscaservico: 176 | self.listaServ.insert("", END, values=i) 177 | self.entradaCod.delete(0, END) 178 | self.entradaTec.delete(0, END) 179 | 180 | self.desconecta_Glac() 181 | def add_servT(self): 182 | self.conecta_Glac() 183 | 184 | self.listaServ.delete(*self.listaServ.get_children()) 185 | codinf = self.cursor.execute("""select MAX(cod) + 1 from tecnico """) 186 | for i in codinf: 187 | self.entradaCod.insert(END, i) 188 | 189 | servprod = self.entradaTec.get() 190 | cod_sp = self.entradaCod.get() 191 | 192 | self.cursor.execute(""" 193 | INSERT INTO tecnico (cod, tecnico) VALUES (?, ?)""", (cod_sp, servprod)) 194 | self.conn.commit() 195 | 196 | lista = self.cursor.execute(""" 197 | SELECT * FROM tecnico ORDER BY tecnico ASC; 198 | """) 199 | for i in lista: 200 | self.listaServ.insert("", END, values=i) 201 | self.entradaCod.delete(0, END) 202 | self.entradaTec.delete(0, END) 203 | 204 | self.desconecta_Glac() -------------------------------------------------------------------------------- /envio_sms.py: -------------------------------------------------------------------------------- 1 | import tkinter.messagebox 2 | from tkinter import * 3 | from tkcalendar import * 4 | import datetime 5 | import calendar 6 | import requests 7 | 8 | from tkinter import ttk 9 | 10 | class SMS_envio(): 11 | def sms_tela(self): 12 | self.janelaSms = Toplevel(self.window_one) 13 | self.janelaSms.title("Mensagens SMS") 14 | self.janelaSms.geometry("1000x750+70+30") 15 | self.janelaSms.resizable(FALSE, FALSE) 16 | 17 | self.janelaSms.transient(self.window_one) 18 | self.janelaSms.focus_force() 19 | self.janelaSms.grab_set() 20 | 21 | 22 | def busca_clienteW(): 23 | self.nome_entry.delete(*self.nome_entry.get_children()) 24 | 25 | self.conecta_Glac() 26 | self.lista1 = self.cursor.execute("""SELECT placa_orc, nome, fone1ddd, fone1 FROM orcamento1, clientes WHERE cod_cli = cliente_orc AND dia = '%s'; """ % (str(self.data_envio.get_date()))) 27 | 28 | for i in self.lista1: 29 | self.nome_entry.insert("", END, values=i) 30 | self.desconecta_Glac() 31 | 32 | def envia_mensagemSms(): 33 | import time 34 | from datetime import datetime 35 | 36 | self.conecta_Glac() 37 | self.lista1 = self.cursor.execute("""SELECT texto1, texto2, texto3, texto4 FROM config_sms; """) 38 | for i in self.lista1: 39 | texto1 = i[0] 40 | texto2 = i[1] 41 | texto3 = i[2] 42 | texto4 = i[3] 43 | self.lista3 = self.cursor.execute("""SELECT placa_orc, nome, fone1ddd, fone1, dia FROM orcamento1, clientes WHERE cod_cli = cliente_orc AND dia = '%s'; """ 44 | % (str(self.data_envio.get_date()))) 45 | for x in self.lista3: 46 | cliente = str(x[1]).split()[0] 47 | dia_agenda = str(x[4]) 48 | 49 | self.telefone = str(x[2]) + str(x[3]) 50 | self.telefone = self.telefone.replace("-", "") 51 | msg1 = str(texto2).replace("/", "").replace("(", "").replace(")", "").replace("'", "").replace( 52 | "{cliente}", cliente).replace("{dia_agenda}", dia_agenda) 53 | msg1 = msg1[:140] 54 | contatos = str(self.telefone) 55 | http_sms = str('http://api.facilitamovel.com.br/api/simpleSend.ft?user=' + texto1 56 | + '&password=' + texto3 + '&destinatario=' + contatos + "&msg=" + msg1 + texto4) 57 | 58 | requests.post(http_sms) 59 | #r = requests.post(http_sms) 60 | 61 | mensagem23.insert(0, dia_agenda + " - " + str(cliente) + " - Mensagem enviada") 62 | 63 | self.desconecta_Glac() 64 | 65 | def dataenvio(event): 66 | busca_clienteW() 67 | 68 | self.data_envio = Calendar(self.janelaSms, text="Código", locale="pt") 69 | self.data_envio.place(relx=0.05, rely=0.05, relwidth=0.3, relheight=0.27) 70 | self.data_envio.bind('<>', dataenvio) 71 | 72 | self.barracliente = ttk.Scrollbar(self.janelaSms, orient='vertical') # , command=self.OnVsbC) 73 | self.nome_entry = ttk.Treeview(self.janelaSms, height=6, yscrollcommand=self.barracliente.set, column=("col1", "col2", "col3", "col4")) 74 | 75 | self.nome_entry.heading("#0", text="") 76 | self.nome_entry.column("#0", width=-10) 77 | self.nome_entry.heading("#1", text="Placa") 78 | self.nome_entry.column("#1", width=30) 79 | self.nome_entry.heading("#2", text="Nome") 80 | self.nome_entry.column("#2", width=120) 81 | self.nome_entry.heading("#3", text="DDD") 82 | self.nome_entry.column("#3", width=15) 83 | self.nome_entry.heading("#4", text="Fone") 84 | self.nome_entry.column("#4", width=50) 85 | 86 | self.nome_entry.place(relx=0.03, rely=0.35, relwidth=0.45, relheight=0.6) 87 | 88 | label_msg = Label(self.janelaSms, text="Digite a mensagem") 89 | label_msg.place(relx=0.65, rely=0.05, relwidth=0.2, relheight=0.05) 90 | 91 | self.mensagem_entry = Text(self.janelaSms) 92 | self.mensagem_entry.place(relx=0.5, rely=0.1, relwidth=0.45, relheight=0.2) 93 | 94 | mensagem23 = Listbox(self.janelaSms, height=8) 95 | mensagem23.place(relx=0.5, rely=0.45, relwidth=0.45) 96 | 97 | salvar_bt = Button(self.janelaSms, text="Enviar", command=envia_mensagemSms) 98 | salvar_bt.place(relx=0.65, rely=0.7, relwidth=0.2) 99 | 100 | self.conecta_Glac() 101 | self.lista1 = self.cursor.execute("""SELECT texto1, texto2, texto3 FROM config_sms; """) 102 | for i in self.lista1: 103 | i = i[1] 104 | i = str(i) 105 | self.mensagem_entry.insert(END, i[:150].replace("/","").replace("(","").replace(")","").replace("'","")) 106 | self.desconecta_Glac() 107 | 108 | sair_bt = Button(self.janelaSms, text="Sair", command=self.janelaSms.destroy) 109 | sair_bt.place(relx=0.8, rely=0.8, relwidth=0.15) 110 | 111 | def sms_config(): 112 | def atualiza_infos(): 113 | self.conecta_Glac() 114 | self.cursor.execute(""" UPDATE config_sms SET texto1 = ?, texto2 = ?, texto3 = ?, texto4 = ? """, 115 | (self.user_entry.get(), self.sms_entry.get("1.0", END), self.senha_entry.get(), self.ha_entry.get())) 116 | self.conn.commit() 117 | self.desconecta_Glac() 118 | 119 | tkinter.messagebox.showinfo("Agenda ", "Dados alterados com sucesso") 120 | self.janelaSms.destroy() 121 | 122 | self.open_win_cli2 = "cadcli" 123 | self.janelasmsconfig = Toplevel(self.janelaSms) 124 | self.janelasmsconfig.title("Config SMS") 125 | self.janelasmsconfig.geometry("600x300+70+30") 126 | self.janelasmsconfig.resizable(FALSE, FALSE) 127 | self.janelasmsconfig.transient(self.janelaSms) 128 | self.janelasmsconfig.focus_force() 129 | # self.janelasmsconfig.grab_set() 130 | 131 | nome_frame = Label(self.janelasmsconfig, text="Texto a ser enviado") 132 | nome_frame.place(relx=0.05, rely=0, relwidth=0.7, relheight=0.1) 133 | 134 | self.sms_entry = Text(self.janelasmsconfig) 135 | self.sms_entry.place(relx=0.05, rely=0.1, relwidth=0.7, relheight=0.3) 136 | 137 | user_frame = Label(self.janelasmsconfig, text="Usuário:") 138 | user_frame.place(relx=0.05, rely=0.45, relwidth=0.2, relheight=0.1) 139 | 140 | self.user_entry = Entry(self.janelasmsconfig) 141 | self.user_entry.place(relx=0.25, rely=0.45, relwidth=0.4, relheight=0.1) 142 | 143 | senha_frame = Label(self.janelasmsconfig, text="Senha:") 144 | senha_frame.place(relx=0.05, rely=0.55, relwidth=0.2, relheight=0.1) 145 | 146 | self.senha_entry = Entry(self.janelasmsconfig, show="*") 147 | self.senha_entry.place(relx=0.25, rely=0.55, relwidth=0.4, relheight=0.1) 148 | 149 | ha_frame = Label(self.janelasmsconfig, text="Hash:") 150 | ha_frame.place(relx=0.05, rely=0.65, relwidth=0.2, relheight=0.1) 151 | 152 | self.ha_entry = Entry(self.janelasmsconfig) 153 | self.ha_entry.place(relx=0.25, rely=0.65, relwidth=0.4, relheight=0.1) 154 | 155 | self.conecta_Glac() 156 | self.lista1 = self.cursor.execute("""SELECT texto2, texto1, texto3, texto4 FROM config_sms; """) 157 | for i in self.lista1: 158 | self.sms_entry.insert(END, i[0]) 159 | self.user_entry.insert(END, i[1]) 160 | self.senha_entry.insert(END, i[2]) 161 | self.ha_entry.insert(END, i[3]) 162 | self.desconecta_Glac() 163 | 164 | salvar_bt = Button(self.janelasmsconfig, text="Atualiza infos", command=atualiza_infos) 165 | salvar_bt.place(relx=0.75, rely=0.1, relwidth=0.21, relheight=0.1) 166 | 167 | sair_bt = Button(self.janelasmsconfig, text="Sair", command=self.janelasmsconfig.destroy) 168 | sair_bt.place(relx=0.81, rely=0.7, relwidth=0.15, relheight=0.1) 169 | 170 | self.janelasmsconfig.mainloop() 171 | 172 | cfg_bt = Button(self.janelaSms, text="Configurar", command=sms_config) 173 | cfg_bt.place(relx=0.5, rely=0.8, relwidth=0.15) 174 | 175 | self.janelaSms.mainloop() -------------------------------------------------------------------------------- /Marcas.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | class CadMarcaProd: 12 | def cadmarcaprod(self): 13 | self.janelaM = customtkinter.CTkToplevel() 14 | self.janelaM.title("Marca dos Produtos") 15 | self.janelaM.geometry("870x200+30+250") 16 | self.janelaM.resizable(FALSE, FALSE) 17 | self.janelaM.transient(self.window_one) 18 | self.janelaM.focus_force() 19 | self.janelaM.grab_set() 20 | 21 | descrCod = customtkinter.CTkLabel(self.janelaM, text="Codigo") 22 | descrCod.place(x=5, y=20) 23 | 24 | self.entradaCod = customtkinter.CTkEntry(self.janelaM) 25 | self.entradaCod.place(x=85, y=20, relwidth=0.05) 26 | 27 | # Botao Carrega marca 28 | botaoAdd = ButtonGlac(self.janelaM, "Carregar", self.carrega_marca_prod) 29 | botaoAdd.place(x=145, y=15, width=130, height=30) 30 | 31 | ### Botao limpa automovel 32 | botaolimpa = ButtonGlac(self.janelaM, "Limpar", self.limpa_marca_prod) 33 | botaolimpa.place(x=275, y=15, width=80, height=30) 34 | 35 | descrMarca = customtkinter.CTkLabel(self.janelaM, text="Marca") 36 | descrMarca.place(x=5, y=50) 37 | 38 | self.entradaMarca = customtkinter.CTkEntry(self.janelaM) 39 | self.entradaMarca.place(x=85, y=50) 40 | 41 | ### Botao busca automovel 42 | botaobusca = ButtonGlac(self.janelaM, "Buscar", self.busca_marca_prod) 43 | botaobusca.place(x=285, y=45, width=70, height=30) 44 | 45 | descrDescricao = customtkinter.CTkLabel(self.janelaM, text="Descricao") 46 | descrDescricao.place(x=5, y=90) 47 | 48 | self.entradaDescricao = customtkinter.CTkEntry(self.janelaM) 49 | self.entradaDescricao.place(x=85, y=90) 50 | 51 | # Botao adicionar 52 | botaoAdd = ButtonGlac(self.janelaM, "Novo", self.add_marca_prod) 53 | botaoAdd.place(x=45, y=150, width=85, height=30) 54 | 55 | # botao mudar 56 | botaoMud = ButtonGlac(self.janelaM, "Alterar", self.mud_marca_prod) 57 | botaoMud.place(x=130, y=150, width=85, height=30) 58 | 59 | # botao deletar 60 | botaoDel = ButtonGlac(self.janelaM, " Apagar ", self.del_marca_prod) 61 | botaoDel.place(x=215, y=150, width=85, height=30) 62 | 63 | ### Widgets - Listar produtos ### 64 | self.listaServ = ttk.Treeview(self.janelaM, height=7, 65 | column=("col1", "col2", "col3")) 66 | self.listaServ.heading("#0", text="") 67 | self.listaServ.heading("#1", text="Codigo") 68 | self.listaServ.heading("#2", text="Marca") 69 | self.listaServ.heading("#3", text="Descricao") 70 | 71 | self.listaServ.column("#0", width=0) 72 | self.listaServ.column("#1", width=65) 73 | self.listaServ.column("#2", width=200) 74 | self.listaServ.column("#3", width=220) 75 | self.listaServ.place(x=360, y=20) 76 | 77 | self.conecta_Glac() 78 | 79 | # Cria barra de rolagem 80 | self.barra = ttk.Scrollbar(self.janelaM, orient='vertical', command=self.listaServ.yview) 81 | # Adiciona barra de rolagem 82 | self.listaServ.configure(yscroll=self.barra.set) 83 | self.barra.place(x=845, y=20, width=20, height=160) 84 | 85 | lista = self.cursor.execute("""SELECT cod_marca, marca, descricao 86 | FROM marcaprod ORDER BY marca ASC ;""") 87 | for i in lista: 88 | self.listaServ.insert("", END, values=i) 89 | 90 | self.listaServ.bind("", self.OnDoubleClickMarc) 91 | self.desconecta_Glac() 92 | self.janelaM.mainloop() 93 | def OnDoubleClickMarc(self, event): 94 | self.limpa_marca_prod() 95 | self.listaServ.selection() 96 | 97 | for n in self.listaServ.selection(): 98 | col1, col2, col3 = self.listaServ.item(n, 'values') 99 | self.entradaCod.insert(END, col1) 100 | 101 | self.carrega_marca_prod() 102 | def mud_marca_prod(self): 103 | self.conecta_Glac() 104 | 105 | cod_marca = self.entradaCod.get() 106 | marca = self.entradaMarca.get() 107 | descricao = self.entradaDescricao.get() 108 | 109 | self.cursor.execute(""" 110 | UPDATE marcaprod SET marca = ? WHERE cod_marca = ?""", (marca, cod_marca)) 111 | self.conn.commit() 112 | self.cursor.execute(""" 113 | UPDATE marcaprod SET descricao = ? WHERE cod_marca = ?""", (descricao, cod_marca)) 114 | self.conn.commit() 115 | 116 | self.listaServ.delete(*self.listaServ.get_children()) 117 | listacod = self.cursor.execute("""SELECT cod_marca, marca, descricao FROM marcaprod ORDER BY marca ASC ; 118 | """) 119 | for i in listacod: 120 | self.listaServ.insert("", END, values=i) 121 | 122 | self.desconecta_Glac() 123 | def carrega_marca_prod(self): 124 | cod_marca = self.entradaCod.get() 125 | self.conecta_Glac() 126 | 127 | marcaprod = self.cursor 128 | 129 | self.entradaMarca.delete(0, END) 130 | self.entradaDescricao.delete(0, END) 131 | 132 | marcaprod.execute("SELECT marca FROM marcaprod WHERE cod_marca = '%s'" % cod_marca) 133 | consultamarcaprod = self.cursor.fetchall() 134 | for i in consultamarcaprod: 135 | i = str(i); 136 | i = i.replace('(', ''); 137 | i = i.replace(')', ''); 138 | i = i.replace("'", ""); 139 | i = i.replace(',', ''); 140 | i = i.replace('{', ''); 141 | i = i.replace('}', '') 142 | self.entradaMarca.insert(END, i) 143 | 144 | descricao = self.cursor 145 | descricao.execute("SELECT descricao FROM marcaprod WHERE cod_marca = '%s'" % cod_marca) 146 | consultadescricao = self.cursor.fetchall() 147 | for i in consultadescricao: 148 | i = str(i); 149 | i = i.replace('(', ''); 150 | i = i.replace(')', ''); 151 | i = i.replace("'", ""); 152 | i = i.replace(',', ''); 153 | i = i.replace('{', ''); 154 | i = i.replace('}', '') 155 | self.entradaDescricao.insert(END, i) 156 | 157 | self.desconecta_Glac() 158 | def del_marca_prod(self): 159 | 160 | conn = sqlite3.connect("glac.db") 161 | cursor = self.conn.cursor() 162 | cod_marca = self.entradaCod.get() 163 | self.cursor.execute(""" 164 | DELETE FROM marcaprod WHERE cod_marca=?""", (cod_marca,)) 165 | conn.commit() 166 | self.listaServ.delete(*self.listaServ.get_children()) 167 | lista = self.cursor.execute(""" 168 | SELECT cod_marca, marca, descricao FROM marcaprod ORDER BY marca ASC ; 169 | """) 170 | for i in lista: 171 | self.listaServ.insert("", END, values=i) 172 | conn.close() 173 | def limpa_marca_prod(self): 174 | self.entradaCod.delete(0, END) 175 | self.entradaMarca.delete(0, END) 176 | self.entradaDescricao.delete(0, END) 177 | def add_marca_prod(self): 178 | self.conecta_Glac() 179 | 180 | cod_marca = self.entradaCod.get() 181 | marca = self.entradaMarca.get() 182 | descricao = self.entradaDescricao.get() 183 | self.listaServ.delete(*self.listaServ.get_children()) 184 | self.cursor.execute(""" 185 | INSERT INTO marcaprod ( marca, descricao) 186 | VALUES ( ?, ?)""", (marca, descricao)) 187 | self.conn.commit() 188 | lista = self.cursor.execute(""" 189 | SELECT cod_marca, marca, descricao 190 | FROM marcaprod ORDER BY marca ASC ; 191 | """) 192 | for i in lista: 193 | self.listaServ.insert("", END, values=i) 194 | 195 | self.desconecta_Glac() 196 | def busca_marca_prod(self): 197 | self.listaServ.delete(*self.listaServ.get_children()) 198 | self.entradaMarca.insert(END, '%') 199 | self.conecta_Glac() 200 | marca = self.entradaMarca.get() 201 | marcap = self.cursor 202 | 203 | marcap.execute("SELECT * FROM marcaprod " 204 | "WHERE marca LIKE '%s'" % marca) 205 | buscamarca = self.cursor.fetchall() 206 | for i in buscamarca: 207 | self.listaServ.insert("", END, values=i) 208 | self.entradaMarca.delete(0, END) 209 | 210 | self.desconecta_Glac() -------------------------------------------------------------------------------- /Automoveis.py: -------------------------------------------------------------------------------- 1 | from tkWidgetsRfzorzi.widgets_Glac import * 2 | from tkinter import ttk 3 | from tkinter import messagebox 4 | from tkinter import * 5 | from datetime import * 6 | import customtkinter 7 | 8 | class CadAuto: 9 | def cadaut(self): 10 | self.janelaAut = customtkinter.CTkToplevel() 11 | self.janelaAut.title('Glac - Cadastro de Veiculos') 12 | self.janelaAut.geometry("780x240+100+200") 13 | self.janelaAut.configure(background="#6F87B0") 14 | self.janelaAut.resizable(FALSE, FALSE) 15 | self.janelaAut.transient(self.window_one) 16 | self.janelaAut.focus_force() 17 | self.janelaAut.grab_set() 18 | 19 | # Label do codigo 20 | descrCod_aut = customtkinter.CTkLabel(self.janelaAut, text="Codigo") 21 | descrCod_aut.place(relx=0.01, rely=0.1, relwidth=0.1, relheight=0.1) 22 | 23 | #### entrada do codigo 24 | self.entradaCod_autA = customtkinter.CTkEntry(self.janelaAut) 25 | self.entradaCod_autA.configure(validate="key", validatecommand=self.vcmd4) 26 | self.entradaCod_autA.place(relx=0.1, rely=0.1, relwidth=0.05, relheight=0.1) 27 | 28 | # descrição do veiculo 29 | descrAut = customtkinter.CTkLabel(self.janelaAut, text="Automovel") 30 | descrAut.place(relx=0.01, rely=0.3, relwidth=0.1, relheight=0.1) 31 | 32 | self.entradaAutA = customtkinter.CTkEntry(self.janelaAut) 33 | self.entradaAutA.place(relx=0.1, rely=0.3, relwidth=0.25, relheight=0.1) 34 | 35 | # entry da marca 36 | self.entradaMarcaA = customtkinter.CTkEntry(self.janelaAut) 37 | self.entradaMarcaA.place(relx=0.1, rely=0.5, relwidth=0.25, relheight=0.1) 38 | 39 | self.entradaMarca2A = Entry() 40 | 41 | # botão busca 42 | botaoBuscaAut = customtkinter.CTkButton(self.janelaAut, text="Buscar", command=self.busca_automovelA) 43 | botaoBuscaAut.place(relx=0.35, rely=0.28, relwidth=0.1, relheight=0.14) 44 | 45 | # botao limpa 46 | botaoLimpaAut = customtkinter.CTkButton(self.janelaAut, text="Limpar", command=self.limpa_automovelA) 47 | botaoLimpaAut.place(relx=0.35, rely=0.08, relwidth=0.1, relheight=0.14) 48 | 49 | # botao marca 50 | botaoMarcaAut = customtkinter.CTkButton(self.janelaAut, text="Marca", command=self.busca_autoA) 51 | botaoMarcaAut.place(relx=0.01, rely=0.48, relwidth=0.09, relheight=0.14) 52 | 53 | # 54 | botaoNovoAut = customtkinter.CTkButton(self.janelaAut, text="Novo", command=self.add_automovelA) 55 | botaoNovoAut.place(x=30, y=180, relwidth=0.09, relheight=0.14) 56 | # 57 | botaoAlterarAut = customtkinter.CTkButton(self.janelaAut, text="Alterar", command=self.mud_automovelA) 58 | botaoAlterarAut.place(x=130, y=180, relwidth=0.09, relheight=0.14) 59 | # 60 | botaoApagarAut = customtkinter.CTkButton(self.janelaAut, text="Apagar", command=self.del_automovelA) 61 | botaoApagarAut.place(x=230, y=180, relwidth=0.09, relheight=0.14) 62 | 63 | # Cria barra de rolagem 64 | self.barra = ttk.Scrollbar(self.janelaAut, orient='vertical', command=self.OnVsbA) 65 | 66 | # Widgets - Listar veiculos 67 | self.listaServ = ttk.Treeview(self.janelaAut, height=8, column=("col1", "col2", "col3")) 68 | self.listaServ.heading("#0", text="") 69 | self.listaServ.heading("#1", text="Codigo") 70 | self.listaServ.heading("#2", text="Automovel") 71 | self.listaServ.heading("#3", text="Marca") 72 | 73 | self.listaServ.column("#0", width=0) 74 | self.listaServ.column("#1", width=45) 75 | self.listaServ.column("#2", width=180) 76 | self.listaServ.column("#3", width=170) 77 | self.listaServ.configure(yscroll=self.barra.set) 78 | self.listaServ.place(x=365, y=5, height=225) 79 | 80 | # Adiciona barra de rolagem 81 | self.barra.place(x=760, y=5, height=225) 82 | self.busca_automovelA() 83 | self.listaServ.bind("", self.OnDoubleClickA) 84 | self.janelaAut.mainloop() 85 | def variaveisA(self): 86 | self.cod_aut = self.entradaCod_autA.get() 87 | self.automovel = self.entradaAutA.get() 88 | self.montad = self.entradaMarca2A.get() 89 | def add_automovelA(self): 90 | self.variaveisA() 91 | self.conecta_Glac() 92 | if self.montad == '': 93 | msg = "É necessário escolher a marca do " 94 | msg += " automovel a ser cadastrado." 95 | messagebox.showinfo("GLAC - Automovel", msg) 96 | self.desconecta_Glac() 97 | else: 98 | self.cursor.execute(""" 99 | INSERT INTO automoveis ( automovel, montad) 100 | VALUES ( ?, ?)""", (self.automovel, self.montad)) 101 | self.conn.commit() 102 | self.desconecta_Glac() 103 | self.limpa_automovelA() 104 | self.busca_automovelA() 105 | msg = self.m_msgAutAdd 106 | msg += "" 107 | messagebox.showinfo("GLAC - Automovel", msg) 108 | def mud_automovelA(self): 109 | self.variaveisA() 110 | self.conecta_Glac() 111 | 112 | self.cursor.execute("""UPDATE automoveis 113 | SET automovel = ?, montad = ? WHERE cod_aut = ?""", 114 | (self.automovel, self.montad, self.cod_aut)) 115 | self.conn.commit() 116 | self.desconecta_Glac() 117 | self.busca_automovelA() 118 | 119 | msg = self.m_msgAutAlt 120 | messagebox.showinfo("GLAC - Altera Automovel", msg) 121 | def del_automovelA(self): 122 | self.variaveisA() 123 | self.conecta_Glac() 124 | 125 | self.cursor.execute(""" DELETE FROM automoveis WHERE cod_aut=?;""", (self.cod_aut,)) 126 | self.conn.commit() 127 | 128 | self.listaServ.delete(*self.listaServ.get_children()) 129 | lista = self.cursor 130 | self.cursor.execute("""SELECT automoveis.cod_aut, automoveis.automovel, 131 | montadora.marca FROM automoveis, montadora WHERE montadora.cod = automoveis.montad 132 | ORDER BY automovel ASC;""") 133 | for i in lista: 134 | self.listaServ.insert("", END, values=i) 135 | 136 | self.desconecta_Glac() 137 | self.limpa_automovelA() 138 | msg = self.m_msgAutDel 139 | messagebox.showinfo("GLAC - Altera Automovel", msg) 140 | def carrega_automovelA(self): 141 | cod_aut = self.entradaCod_autA.get() 142 | self.conecta_Glac() 143 | 144 | self.entradaAutA.delete('0', 'end') 145 | self.entradaMarcaA.delete('0', 'end') 146 | self.entradaMarca2A.delete('0', 'end') 147 | 148 | self.cursor.execute("""SELECT automovel, marca, montad 149 | FROM automoveis, montadora 150 | WHERE montadora.cod = automoveis.montad AND cod_aut = '%s'""" % cod_aut) 151 | consultaautomovel = self.cursor.fetchall() 152 | for i in consultaautomovel: 153 | self.entradaAutA.insert(0, i[0]) 154 | self.entradaMarcaA.insert(0, i[1]) 155 | self.entradaMarca2A.insert(0, i[2]) 156 | self.desconecta_Glac() 157 | def busca_automovelA(self): 158 | self.listaServ.delete(*self.listaServ.get_children()) 159 | self.conecta_Glac() 160 | 161 | self.entradaAutA.insert(0, '%') 162 | autom = self.entradaAutA.get() 163 | 164 | lista = self.cursor.execute("""SELECT automoveis.cod_aut, 165 | automoveis.automovel, montadora.marca FROM automoveis, montadora 166 | WHERE montadora.cod = automoveis.montad AND automovel LIKE '%s' 167 | ORDER BY automovel ASC; """ %autom) 168 | for i in lista: 169 | self.listaServ.insert("", 0, values=i) 170 | self.limpa_automovelA() 171 | self.desconecta_Glac() 172 | def OnDoubleClickA(self, event): 173 | self.limpa_automovelA() 174 | self.listaServ.selection() 175 | 176 | for n in self.listaServ.selection(): 177 | col1, col2, col3 = self.listaServ.item(n, 'values') 178 | self.entradaCod_autA.insert(0, col1) 179 | self.carrega_automovelA() 180 | def OnVsbA(self, *args): 181 | self.listaServ.yview(*args) 182 | def add_autobindA(self, event): 183 | self.entradaMarcaA.delete('0', 'end') 184 | self.entradaMarca2A.delete('0', 'end') 185 | for n in self.listaTec1.selection(): 186 | col1, col2 = self.listaTec1.item(n, 'values') 187 | self.entradaMarca2A.insert(0, col1) 188 | self.entradaMarcaA.insert(0, col2) 189 | self.listatec.destroy() 190 | def limpa_automovelA(self): 191 | self.entradaCod_autA.delete('0', 'end') 192 | self.entradaAutA.delete('0', 'end') 193 | self.entradaMarcaA.delete('0', 'end') 194 | self.entradaMarca2A.delete('0', 'end') 195 | def busca_autoA(self): 196 | # Widgets - 197 | self.entradaMarcaA.insert(0, '%') 198 | veicAuto = self.entradaMarcaA.get() 199 | 200 | self.listatec = Toplevel() 201 | self.listatec.title(" GLAC ") 202 | self.listatec.configure(background='gray75') 203 | self.listatec.geometry("320x220+100+100") 204 | self.listatec.resizable(FALSE, FALSE) 205 | self.listatec.transient(self.janelaAut) 206 | self.listatec.focus_force() 207 | self.listatec.grab_set() 208 | 209 | ### Widgets - 210 | self.listaTec1 = ttk.Treeview(self.listatec, height=5, column=("col1", "col2")) 211 | self.listaTec1.heading("#0", text="") 212 | self.listaTec1.heading("#1", text="Codigo") 213 | self.listaTec1.heading("#2", text='Marca') 214 | 215 | self.listaTec1.column("#0", width=0) 216 | self.listaTec1.column("#1", width=60) 217 | self.listaTec1.column("#2", width=200) 218 | 219 | # Adiciona barra de rolagem 220 | self.listaTec1.place(relx=0.02, rely=0.02, relwidth=0.96, relheight=0.96) 221 | # Binding da listbox 222 | self.listaTec1.bind('', self.add_autobindA) 223 | self.conecta_Glac() 224 | 225 | buscaservico = self.cursor.execute("""SELECT cod, marca FROM montadora 226 | WHERE marca LIKE '%s' ORDER BY marca ASC""" % veicAuto) 227 | 228 | for i in buscaservico: 229 | self.listaTec1.insert("", END, values=i) 230 | self.entradaMarcaA.delete('0', 'end') 231 | self.entradaMarca2A.delete('0', 'end') 232 | self.desconecta_Glac() -------------------------------------------------------------------------------- /envio_whatsapp.py: -------------------------------------------------------------------------------- 1 | import webbrowser 2 | from tkinter import * 3 | from tkcalendar import * 4 | import datetime 5 | import calendar 6 | import pyautogui as pg 7 | from tkinter import ttk 8 | import pyautogui 9 | from tkinter import messagebox 10 | import sqlite3 11 | 12 | class Whats_envio(): 13 | def __init__(self): 14 | pass 15 | def whats_tela(self): 16 | self.janelaSms = Toplevel(self.window_one) 17 | self.janelaSms.title("Mensagens Whatsapp") 18 | self.janelaSms.geometry("1000x750+70+30") 19 | self.janelaSms.resizable(FALSE, FALSE) 20 | 21 | self.janelaSms.transient(self.window_one) 22 | self.janelaSms.focus_force() 23 | self.janelaSms.grab_set() 24 | 25 | label_principal = Label(self.janelaSms, text="Mensagem Whatsapp") 26 | label_principal.place(relx=0.3, rely=0, relwidth=0.4, relheight=0.05) 27 | 28 | nome_frame = Label(self.janelaSms, text="Selecione a Data") 29 | nome_frame.place(relx=0.05, rely=0.05, relwidth=0.2, relheight=0.05) 30 | 31 | def busca_clienteWhats(): 32 | self.nome_entry.delete(*self.nome_entry.get_children()) 33 | 34 | self.conecta_Glac() 35 | self.lista1 = self.cursor.execute( 36 | """SELECT placa_orc, nome, fone1ddd, fone1 FROM orcamento1, clientes WHERE cod_cli = cliente_orc AND dia = '%s'; """ % ( 37 | str(self.data_envio.get_date()))) 38 | 39 | for i in self.lista1: 40 | self.nome_entry.insert("", END, values=i) 41 | self.desconecta_Glac() 42 | 43 | def envia_mensagemWhats(): 44 | import time 45 | from datetime import datetime 46 | 47 | self.conecta_Glac() 48 | self.lista1 = self.cursor.execute("""SELECT tabx, taby, intervalo1, intervalo2, 49 | x_campotexto, y_campotexto FROM whats_bot WHERE id_whats = 1; """) 50 | for i in self.lista1: 51 | tabx = i[0] 52 | taby = i[1] 53 | intervalo1 = i[2] 54 | intervalo2 = i[3] 55 | xtexto = i[4] 56 | ytexto = i[5] 57 | self.desconecta_Glac() 58 | 59 | 60 | self.conecta_Glac() 61 | self.lista3 = self.cursor.execute( 62 | """SELECT placa_orc, nome, fone1ddd, fone1, dia FROM orcamento1, clientes WHERE cod_cli = cliente_orc AND dia = '%s'; """ 63 | % (str(self.data_envio.get_date()))) 64 | for x in self.lista3: 65 | cliente = str(x[1]).split()[0] 66 | dia_agenda = str(x[4]) 67 | 68 | self.telefone = str(x[2]) + str(x[3]) 69 | self.telefone = self.telefone.replace("-", "") 70 | contatos = "+55" + str(self.telefone) 71 | mensagem = self.mensagem_entry.get("1.0", END) 72 | mensagem = str(mensagem).replace("{cliente}", cliente).replace("{dia_agenda}", dia_agenda) 73 | webbrowser.open_new(url=f"https://web.whatsapp.com/send?phone={contatos}&text={mensagem}") 74 | time.sleep(intervalo1) 75 | pg.moveTo(xtexto, ytexto) 76 | pg.leftClick() 77 | pg.press("enter") 78 | time.sleep(intervalo2) 79 | pg.moveTo(tabx, taby) 80 | pg.leftClick() 81 | pyautogui.keyDown('alt') 82 | time.sleep(.2) 83 | pyautogui.press('tab') 84 | time.sleep(.2) 85 | pyautogui.keyUp('alt') 86 | 87 | messagebox.showinfo("Agenda", "Mensagens enviadas") 88 | 89 | self.desconecta_Glac() 90 | 91 | def dataenvio(event): 92 | busca_clienteWhats() 93 | 94 | self.data_envio = Calendar(self.janelaSms, text="Código", locale="pt") 95 | self.data_envio.place(relx=0.05, rely=0, relwidth=0.3, relheight=0.22) 96 | self.data_envio.bind('<>', dataenvio) 97 | 98 | self.barracliente = ttk.Scrollbar(self.janelaSms, orient='vertical') # , command=self.OnVsbC) 99 | self.nome_entry = ttk.Treeview(self.janelaSms, height=6, 100 | yscrollcommand=self.barracliente.set, column=("col1", "col2", "col3", "col4")) 101 | 102 | self.nome_entry.heading("#0", text="") 103 | self.nome_entry.column("#0", width=-10) 104 | self.nome_entry.heading("#1", text="Hora") 105 | self.nome_entry.column("#1", width=30) 106 | self.nome_entry.heading("#2", text="Nome") 107 | self.nome_entry.column("#2", width=70) 108 | self.nome_entry.heading("#3", text="DDD") 109 | self.nome_entry.column("#3", width=15) 110 | self.nome_entry.heading("#4", text="Fone") 111 | self.nome_entry.column("#4", width=70) 112 | 113 | self.nome_entry.place(relx=0.03, rely=0.25, relwidth=0.34, relheight=0.7) 114 | # self.listaServ.configure(yscroll=self.barracliente.set) 115 | # self.barracliente.place(relx=0.75, rely=0.25, relheight=0.75) 116 | 117 | 118 | label_msg = Label(self.janelaSms, text="Digite a mensagem") 119 | label_msg.place(relx=0.55, rely=0.1, relwidth=0.2, relheight=0.05) 120 | 121 | self.mensagem_entry = Text(self.janelaSms) 122 | self.mensagem_entry.place(relx=0.4, rely=0.15, relwidth=0.5, relheight=0.4) 123 | 124 | self.conecta_Glac() 125 | self.lista1 = self.cursor.execute("""SELECT texto1, texto2, texto3 FROM config_sms; """) 126 | for i in self.lista1: 127 | i = i[1] 128 | i = str(i) 129 | self.mensagem_entry.insert(END, i.replace("/", "").replace("(", "").replace(")", "").replace("'", "")) 130 | self.desconecta_Glac() 131 | 132 | salvar_bt = Button(self.janelaSms, text="Enviar", command=envia_mensagemWhats) 133 | salvar_bt.place(relx=0.55, rely=0.6, relwidth=0.2) 134 | 135 | self.avisoframe = Frame(self.janelaSms) 136 | 137 | sair_bt = Button(self.janelaSms, text="Sair", command=self.janelaSms.destroy) 138 | sair_bt.place(relx=0.7, rely=0.8, relwidth=0.2) 139 | 140 | def sms_config(): 141 | def atualiza_infos(): 142 | self.conecta_Glac() 143 | self.cursor.execute(""" UPDATE whats_bot SET tabx = ?, taby = ?, intervalo1 = ?, intervalo2 = ?, 144 | x_campotexto = ?, y_campotexto = ?""", 145 | (self.tabx_entry.get(), self.taby_entry.get(), self.intervalo1_entry.get(), self.intervalo2_entry.get(), self.xtexto_entry.get(), self.ytexto_entry.get())) 146 | self.conn.commit() 147 | self.desconecta_Glac() 148 | 149 | 150 | messagebox.showinfo("Agenda ", "Dados alterados com sucesso") 151 | self.janelaSms.destroy() 152 | 153 | self.open_win_cli2 = "cadcli" 154 | self.janelasmsconfig = Toplevel(self.janelaSms) 155 | self.janelasmsconfig.title("Config Robô") 156 | self.janelasmsconfig.geometry("600x300+70+30") 157 | self.janelasmsconfig.resizable(FALSE, FALSE) 158 | self.janelasmsconfig.transient(self.janelaSms) 159 | self.janelasmsconfig.focus_force() 160 | # self.janelasmsconfig.grab_set() 161 | 162 | Aba_frame = Label(self.janelasmsconfig, text="Coordenadas para fechar aba", bg="gray55") 163 | Aba_frame.place(relx=0.05, rely=0.1, relwidth=0.35, relheight=0.1) 164 | 165 | tabx_frame = Label(self.janelasmsconfig, text="X") 166 | tabx_frame.place(relx=0.1, rely=0.2, relwidth=0.1, relheight=0.1) 167 | 168 | self.tabx_entry = Entry(self.janelasmsconfig) 169 | self.tabx_entry.place(relx=0.1, rely=0.3, relwidth=0.1, relheight=0.1) 170 | 171 | taby_frame = Label(self.janelasmsconfig, text="Y") 172 | taby_frame.place(relx=0.25, rely=0.2, relwidth=0.1, relheight=0.1) 173 | 174 | self.taby_entry = Entry(self.janelasmsconfig) 175 | self.taby_entry.place(relx=0.25, rely=0.3, relwidth=0.1, relheight=0.1) 176 | 177 | intervalos_frame = Label(self.janelasmsconfig, text="Intervalos", bg="gray55") 178 | intervalos_frame.place(relx=0.45, rely=0.1, relwidth=0.35, relheight=0.1) 179 | 180 | intervalo1_frame = Label(self.janelasmsconfig, text="Intervalo 1") 181 | intervalo1_frame.place(relx=0.5, rely=0.2, relwidth=0.1, relheight=0.1) 182 | 183 | self.intervalo1_entry = Entry(self.janelasmsconfig) 184 | self.intervalo1_entry.place(relx=0.5, rely=0.3, relwidth=0.1, relheight=0.1) 185 | 186 | intervalo2_frame = Label(self.janelasmsconfig, text="Intervalo 2") 187 | intervalo2_frame.place(relx=0.65, rely=0.2, relwidth=0.1, relheight=0.1) 188 | 189 | self.intervalo2_entry = Entry(self.janelasmsconfig) 190 | self.intervalo2_entry.place(relx=0.65, rely=0.3, relwidth=0.1, relheight=0.1) 191 | 192 | campo_frame = Label(self.janelasmsconfig, text="Coordenadas para campo texto", bg="gray55") 193 | campo_frame.place(relx=0.05, rely=0.5, relwidth=0.35, relheight=0.1) 194 | 195 | xtexto_frame = Label(self.janelasmsconfig, text="X") 196 | xtexto_frame.place(relx=0.1, rely=0.6, relwidth=0.1, relheight=0.1) 197 | 198 | self.xtexto_entry = Entry(self.janelasmsconfig) 199 | self.xtexto_entry.place(relx=0.1, rely=0.7, relwidth=0.1, relheight=0.1) 200 | 201 | ytexto_frame = Label(self.janelasmsconfig, text="Y") 202 | ytexto_frame.place(relx=0.25, rely=0.6, relwidth=0.1, relheight=0.1) 203 | 204 | self.ytexto_entry = Entry(self.janelasmsconfig) 205 | self.ytexto_entry.place(relx=0.25, rely=0.7, relwidth=0.1, relheight=0.1) 206 | 207 | self.conecta_Glac() 208 | self.lista1 = self.cursor.execute("""SELECT tabx, taby, intervalo1, intervalo2, 209 | x_campotexto, y_campotexto FROM whats_bot WHERE id_whats = 1; """) 210 | for i in self.lista1: 211 | self.tabx_entry.insert(END, i[0]) 212 | self.taby_entry.insert(END, i[1]) 213 | self.intervalo1_entry.insert(END, i[2]) 214 | self.intervalo2_entry.insert(END, i[3]) 215 | self.xtexto_entry.insert(END, i[4]) 216 | self.ytexto_entry.insert(END, i[5]) 217 | self.desconecta_Glac() 218 | 219 | salvar_bt = Button(self.janelasmsconfig, text="Atualiza infos", command=atualiza_infos) 220 | salvar_bt.place(relx=0.5, rely=0.6, relwidth=0.21, relheight=0.1) 221 | 222 | sair_bt = Button(self.janelasmsconfig, text="Sair", command=self.janelasmsconfig.destroy) 223 | sair_bt.place(relx=0.5, rely=0.78, relwidth=0.15, relheight=0.1) 224 | 225 | self.janelasmsconfig.mainloop() 226 | 227 | cfg_bt = Button(self.janelaSms, text="Configurar Robô", command=sms_config) 228 | cfg_bt.place(relx=0.4, rely=0.8, relwidth=0.2) 229 | 230 | 231 | self.janelaSms.mainloop() 232 | -------------------------------------------------------------------------------- /Fornecedores.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | class CadForn: 12 | def cadforn(self): 13 | self.win_for = customtkinter.CTkToplevel() 14 | self.win_for.title("Fornecedores") 15 | self.win_for.configure(background="#6F87B0") 16 | self.win_for.geometry("705x270+100+250") 17 | self.win_for.resizable(FALSE, FALSE) 18 | self.win_for.transient(self.window_one) 19 | self.win_for.focus_force() 20 | self.open_win_cli = "cadfor" 21 | 22 | dscr_cd_for = customtkinter.CTkLabel(self.win_for, text="Codigo") 23 | dscr_cd_for.place(relx=0.01, rely=0.03, relwidth=0.1, relheight=0.07) 24 | 25 | self.entr_cd_for = customtkinter.CTkEntry(self.win_for) 26 | self.entr_cd_for.place(relx=0.11, rely=0.03, relwidth=0.05, relheight=0.07) 27 | 28 | # Fornecedor 29 | dscr_for = customtkinter.CTkLabel(self.win_for, text="Fornecedor") 30 | dscr_for.place(relx=0.01, rely=0.13, relwidth=0.1, relheight=0.07) 31 | 32 | self.entr_for = customtkinter.CTkEntry(self.win_for) 33 | self.entr_for.place(relx=0.11, rely=0.13, relwidth=0.27, relheight=0.07) 34 | 35 | # Fone 36 | dscr_fone = customtkinter.CTkLabel(self.win_for, text="Fone...") 37 | dscr_fone.place(relx=0.01, rely=0.23, relwidth=0.1, relheight=0.07) 38 | 39 | self.entr_fone = customtkinter.CTkEntry(self.win_for) 40 | self.entr_fone.place(relx=0.11, rely=0.23, relwidth=0.1, relheight=0.07) 41 | 42 | self.cnpj_mat_str = StringVar() 43 | self.cnpj_mat_strV = {"CNPJ", "CPF"} 44 | self.cnpj_mat_str.set("CNPJ") 45 | self.cnpj_mat_lb = OptionMenu(self.win_for, self.cnpj_mat_str, *self.cnpj_mat_strV) 46 | self.cnpj_mat_lb.place(relx=0.22, rely=0.23, relwidth=0.1, relheight=0.07) 47 | 48 | self.entr_cnpj = customtkinter.CTkEntry(self.win_for) 49 | self.entr_cnpj.configure(validate="key") 50 | self.entr_cnpj.bind("", self.format_cpf_cnpj) 51 | self.entr_cnpj.place(relx=0.32, rely=0.23, relwidth=0.16, relheight=0.07) 52 | 53 | self.entr_cep = customtkinter.CTkEntry(self.win_for) 54 | self.entr_cep.place(relx=0.11, rely=0.33, relwidth=0.1, relheight=0.07) 55 | 56 | dscr_end = customtkinter.CTkLabel(self.win_for, text="Endereco") 57 | dscr_end.place(relx=0.01, rely=0.43, relwidth=0.1, relheight=0.07) 58 | 59 | self.entr_end = customtkinter.CTkEntry(self.win_for) 60 | self.entr_end.place(relx=0.11, rely=0.43, relwidth=0.35, relheight=0.07) 61 | 62 | dscr_mun = customtkinter.CTkLabel(self.win_for, text="Cidade") 63 | dscr_mun.place(relx=0.01, rely=0.53, relwidth=0.1, relheight=0.07) 64 | 65 | self.entr_mun = customtkinter.CTkEntry(self.win_for) 66 | self.entr_mun.place(relx=0.11, rely=0.53, relwidth=0.35, relheight=0.07) 67 | 68 | dscr_obs = customtkinter.CTkLabel(self.win_for, text="Observacao") 69 | dscr_obs.place(relx=0.01, rely=0.63, relwidth=0.15, relheight=0.07) 70 | 71 | self.entr_dscr = customtkinter.CTkEntry(self.win_for) 72 | self.entr_dscr.place(relx=0.16, rely=0.63, relwidth=0.3, relheight=0.07) 73 | 74 | bt_ld_f = ButtonGlac(self.win_for, "Carregar", self.carrega_fornecedor) 75 | bt_ld_f.place(relx=0.17, rely=0, relwidth=0.11, relheight=0.13) 76 | 77 | bt_cl_f = ButtonGlac(self.win_for, "Limpar", self.limpa_fornecedor) 78 | bt_cl_f.place(relx=0.28, rely=0, relwidth=0.11, relheight=0.13) 79 | 80 | bt_busc_for = ButtonGlac(self.win_for, "Buscar", self.busca_fornecedor) 81 | bt_busc_for.place(relx=0.39, rely=0.11, relwidth=0.11, relheight=0.12) 82 | 83 | bt_cep_for = ButtonGlac(self.win_for, "Cep", self.cepForn) 84 | bt_cep_for.place(relx=0.01, rely=0.31, relwidth=0.1, relheight=0.11) 85 | 86 | bt_nv_for = ButtonGlac(self.win_for, "Novo", self.add_fornec) 87 | bt_nv_for.place(relx=0.1, rely=0.8, relwidth=0.1, relheight=0.13) 88 | 89 | bt_alt_for = ButtonGlac(self.win_for, "Alterar", self.mud_fornec) 90 | bt_alt_for.place(relx=0.2, rely=0.8, relwidth=0.1, relheight=0.13) 91 | 92 | bt_del_for = ButtonGlac(self.win_for, "Apagar", self.del_fornec) 93 | bt_del_for.place(relx=0.3, rely=0.8, relwidth=0.1, relheight=0.13) 94 | 95 | # Widgets - Listar 96 | self.list_g = ttk.Treeview(self.win_for, height=12, column=("col1", "col2", "col3", "col4")) 97 | self.list_g.heading("#0", text="") 98 | self.list_g.column("#0", width=0) 99 | self.list_g.heading("#1", text="Codigo") 100 | self.list_g.column("#1", width=40) 101 | self.list_g.heading("#2", text="Fornecedores") 102 | self.list_g.column("#2", width=120) 103 | self.list_g.heading("#3", text="Fone") 104 | self.list_g.column("#3", width=70) 105 | self.list_g.heading("#4", text="Cidade") 106 | self.list_g.column("#4", width=100) 107 | 108 | # Cria barra de rolagem 109 | self.barra = ttk.Scrollbar(self.win_for, orient='vertical', command=self.list_g.yview) 110 | 111 | # Adiciona barra de rolagem 112 | self.list_g.configure(yscroll=self.barra.set) 113 | self.barra.place(x=685, y=12, height=245) 114 | self.list_g.place(x=355, y=12, height=245) 115 | self.list_g.bind("", self.OnDoubleClickForn) 116 | 117 | self.list_fornec() 118 | def list_fornec(self): 119 | self.conecta_Glac() 120 | lista = self.cursor.execute("""SELECT cod_forn, fornecedor, fone, municipio 121 | FROM fornecedores ORDER BY fornecedor ASC;""") 122 | 123 | rows = self.cursor.fetchall() 124 | for row in rows: 125 | self.list_g.insert("", END, values=row) 126 | 127 | self.desconecta_Glac() 128 | 129 | def var_fornec(self): 130 | self.cod_forn = self.entr_cd_for.get() 131 | self.fornecedor = self.entr_for.get() 132 | self.fone = self.entr_fone.get() 133 | self.cnpj = self.entr_cnpj.get() 134 | self.cep = self.entr_cep.get() 135 | self.endereco = self.entr_end.get() 136 | self.municipio = self.entr_mun.get() 137 | self.descricao = self.entr_dscr.get() 138 | 139 | def OnDoubleClickForn(self, event): 140 | self.limpa_fornecedor() 141 | self.list_g.selection() 142 | 143 | for n in self.list_g.selection(): 144 | col1, col2, col3, col4 = self.list_g.item(n, 'values') 145 | self.entr_cd_for.insert(END, col1) 146 | self.carrega_fornecedor() 147 | 148 | def mud_fornec(self): 149 | self.var_fornec() 150 | self.conecta_Glac() 151 | self.cursor.execute("""UPDATE fornecedores SET 152 | fornecedor = ?, fone = ?, cnpj = ?, cep = ?, endereco = ?, municipio = ?, 153 | descricao = ? WHERE cod_forn = ?""", 154 | (self.fornecedor, self.fone, self.cnpj, self.cep, self.endereco, self.municipio, 155 | self.descricao, self.cod_forn)) 156 | self.conn.commit() 157 | self.list_g.delete(*self.list_g.get_children()) 158 | self.desconecta_Glac() 159 | 160 | self.list_fornec() 161 | msg = "Dados do fornecedor alterados com sucesso" 162 | messagebox.showinfo("GLAC ", msg) 163 | 164 | def limpa_fornecedor(self): 165 | self.entr_cd_for.delete(0, END) 166 | self.entr_for.delete(0, END) 167 | self.entr_fone.delete(0, END) 168 | self.entr_cnpj.delete(0, END) 169 | self.entr_cep.delete(0, END) 170 | self.entr_end.delete(0, END) 171 | self.entr_mun.delete(0, END) 172 | self.entr_dscr.delete(0, END) 173 | 174 | def del_fornec(self): 175 | self.conecta_Glac() 176 | 177 | cod_forn = self.entr_cd_for.get() 178 | self.cursor.execute("""DELETE FROM fornecedores WHERE cod_forn=?""", (cod_forn,)) 179 | self.conn.commit() 180 | self.list_g.delete(*self.list_g.get_children()) 181 | self.desconecta_Glac() 182 | 183 | self.list_fornec() 184 | msg = "Fornecedor excluido com sucesso. :(" 185 | messagebox.showinfo("GLAC ", msg) 186 | 187 | def carrega_fornecedor(self): 188 | self.conecta_Glac() 189 | cod_forn = self.entr_cd_for.get() 190 | 191 | self.limpa_fornecedor() 192 | self.cursor.execute("""SELECT fornecedor, fone, cnpj, cep, endereco, municipio, descricao 193 | FROM fornecedores WHERE cod_forn = '%s'""" % cod_forn) 194 | consultafornec = self.cursor.fetchall() 195 | for i in consultafornec: 196 | self.entr_cd_for.insert(END, cod_forn) 197 | self.entr_for.insert(END, i[0]) 198 | self.entr_fone.insert(END, i[1]) 199 | self.entr_cnpj.insert(END, i[2]) 200 | self.entr_cep.insert(END, i[3]) 201 | self.entr_end.insert(END, i[4]) 202 | self.entr_mun.insert(END, i[5]) 203 | self.entr_dscr.insert(END, i[6]) 204 | self.desconecta_Glac() 205 | 206 | def cepForn(self): 207 | self.entr_end.delete(0, END) 208 | self.entr_mun.delete(0, END) 209 | try: 210 | self.cep = self.entr_cep.get() 211 | endereco = get_address_from_cep(self.cep, webservice=WebService.APICEP) 212 | 213 | self.entr_end.insert(END, endereco['logradouro']) 214 | self.entr_end.insert(END, ' - ') 215 | self.entr_end.insert(END, endereco['bairro']) 216 | 217 | self.entr_mun.insert(END, endereco['cidade']) 218 | self.entr_mun.insert(END, ' - ') 219 | self.entr_mun.insert(END, endereco['uf']) 220 | except: 221 | msg = "Cep não encontrado" 222 | messagebox.showinfo("GLAC ", msg) 223 | 224 | def busca_fornecedor(self): 225 | self.conecta_Glac() 226 | 227 | self.entr_for.insert(END, '%') 228 | self.list_g.delete(*self.list_g.get_children()) 229 | fornecedor = self.entr_for.get() 230 | 231 | lista = self.cursor.execute("""SELECT cod_forn, fornecedor, fone, municipio 232 | FROM fornecedores WHERE fornecedor LIKE '%s' ORDER BY fornecedor ASC;""" % fornecedor) 233 | rows = self.cursor.fetchall() 234 | for row in rows: 235 | self.list_g.insert("", END, values=row) 236 | self.entr_for.delete(0, END) 237 | self.desconecta_Glac() 238 | 239 | def add_fornec(self): 240 | self.conecta_Glac() 241 | self.list_g.delete(*self.list_g.get_children()) 242 | self.var_fornec() 243 | 244 | self.cursor.execute("""INSERT INTO fornecedores 245 | (fornecedor, fone, cnpj, cep, endereco, municipio, descricao) 246 | VALUES ( ?, ?, ?, ?, ?, ?, ?)""", 247 | (self.fornecedor, self.fone, self.cnpj, self.cep, self.endereco, 248 | self.municipio, self.descricao)) 249 | self.conn.commit() 250 | self.desconecta_Glac() 251 | 252 | self.list_fornec() 253 | msg = "Novo fornecedor incluido com sucesso" 254 | messagebox.showinfo("GLAC ", msg) -------------------------------------------------------------------------------- /Servicos.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | class CadServ: 12 | def cadserv(self): 13 | self.janelaServ = customtkinter.CTkToplevel() 14 | self.janelaServ.title("Serviços") 15 | self.janelaServ.geometry("960x380+10+130") 16 | self.janelaServ.resizable(FALSE, FALSE) 17 | self.janelaServ.transient(self.window_one) 18 | self.janelaServ.focus_force() 19 | 20 | descrCod = customtkinter.CTkLabel(self.janelaServ, text="Codigo") 21 | descrCod.place(x=10, y=15) 22 | 23 | self.entradaCod = customtkinter.CTkEntry(self.janelaServ) 24 | self.entradaCod.place(x=80, y=15, relwidth=0.05) 25 | 26 | ### Botao Carrega servico 27 | botaoAdd = ButtonGlac(self.janelaServ, "Carregar", self.carrega_servicoS) 28 | botaoAdd.place(x=145, y=15, width=130, height=35) 29 | 30 | ### Botao limpa servico 31 | botaolimpa = ButtonGlac(self.janelaServ, "Limpar", self.limpa_servicoS) 32 | botaolimpa.place(x=275, y=15, width=70, height=35) 33 | 34 | descrServ = customtkinter.CTkLabel(self.janelaServ, text="Serviços") 35 | descrServ.place(x=10, y=60) 36 | 37 | self.entradaServ = customtkinter.CTkEntry(self.janelaServ) 38 | self.entradaServ.place(x=80, y=60, relwidth=0.35) 39 | 40 | ### Botao busca SERVICO 41 | botaolimpa = ButtonGlac(self.janelaServ, "Buscar", self.busca_servicoS) 42 | botaolimpa.place(x=345, y=15, width=70, height=35) 43 | 44 | descrHor = customtkinter.CTkLabel(self.janelaServ, text="Horas") 45 | descrHor.place(x=6, y=110) 46 | 47 | self.entradaHor = customtkinter.CTkEntry(self.janelaServ) 48 | self.entradaHor.place(x=80, y=110, relwidth=0.04) 49 | 50 | descrCustohora = customtkinter.CTkLabel(self.janelaServ, text="Custo") 51 | descrCustohora.place(x=140, y=110) 52 | 53 | self.entradaCustohora = customtkinter.CTkEntry(self.janelaServ) 54 | self.entradaCustohora.place(x=210, y=110, relwidth=0.04) 55 | 56 | descrValorhora = customtkinter.CTkLabel(self.janelaServ, text="Valor") 57 | descrValorhora.place(x=270, y=110) 58 | 59 | self.entradaValorhora = customtkinter.CTkEntry(self.janelaServ) 60 | self.entradaValorhora.place(x=335, y=110, relwidth=0.04) 61 | 62 | descrTipoServ = customtkinter.CTkLabel(self.janelaServ, text="Tipo") 63 | descrTipoServ.place(x=445, y=15) 64 | 65 | self.entradaTipoServ = customtkinter.CTkEntry(self.janelaServ) 66 | self.entradaTipoServ.place(x=525, y=15, relwidth=0.25) 67 | 68 | descrSistemaServ = customtkinter.CTkLabel(self.janelaServ, text="Sistema") 69 | descrSistemaServ.place(x=445, y=45) 70 | 71 | self.entradaSistemaServ = customtkinter.CTkEntry(self.janelaServ) 72 | self.entradaSistemaServ.place(x=525, y=45, relwidth=0.25) 73 | 74 | descrDescricao = customtkinter.CTkLabel(self.janelaServ, text="Marca") 75 | descrDescricao.place(x=445, y=75) 76 | 77 | self.entradaDescricao = customtkinter.CTkEntry(self.janelaServ) 78 | self.entradaDescricao.place(x=525, y=75, relwidth=0.25) 79 | 80 | descrVeic = ButtonGlac(self.janelaServ, "Veiculo", self.busca_serv_veicS) 81 | descrVeic.place(x=445, y=105, width=80, height=35) 82 | 83 | self.entradaVeic = customtkinter.CTkEntry(self.janelaServ) 84 | self.entradaVeic.place(x=525, y=105, relwidth=0.25) 85 | 86 | botaoAdd = ButtonGlac(self.janelaServ, "Novo", self.add_servS) 87 | botaoAdd.place(x=800, y=20, width=90, height=35) 88 | 89 | botaoMudServ = ButtonGlac(self.janelaServ, "Alterar", self.mud_servS) 90 | botaoMudServ.place(x=800, y=55, width=90, height=35) 91 | 92 | botaoDel = ButtonGlac(self.janelaServ, "Apagar", self.del_servS) 93 | botaoDel.place(x=800, y=90, width=90, height=35) 94 | 95 | ### Widgets - Listar veiculos 96 | self.listaServ = ttk.Treeview(self.janelaServ, height=10, 97 | column=("col1", "col2", "col3", "col4", "col5", "col6", 98 | "col7", "col8", "col9")) 99 | self.listaServ.heading("#0", text="") 100 | self.listaServ.heading("#1", text="Codigo") 101 | self.listaServ.heading("#2", text="Serviços") 102 | self.listaServ.heading("#3", text="Horas") 103 | self.listaServ.heading("#4", text="Custo") 104 | self.listaServ.heading("#5", text="Valor") 105 | self.listaServ.heading("#6", text="Marca") 106 | self.listaServ.heading("#7", text="Veiculo") 107 | self.listaServ.heading("#8", text="Tipo") 108 | self.listaServ.heading("#9", text="Sistema") 109 | 110 | self.listaServ.column("#0", width=0) 111 | self.listaServ.column("#1", width=60) 112 | self.listaServ.column("#2", width=230) 113 | self.listaServ.column("#3", width=45) 114 | self.listaServ.column("#4", width=57) 115 | self.listaServ.column("#5", width=55) 116 | self.listaServ.column("#6", width=100) 117 | self.listaServ.column("#7", width=145) 118 | self.listaServ.column("#8", width=110) 119 | self.listaServ.column("#9", width=145) 120 | 121 | # Cria barra de rolagem 122 | self.barra = ttk.Scrollbar(self.janelaServ, orient='vertical', command=self.listaServ.yview) 123 | 124 | # Adiciona barra de rolagem 125 | self.listaServ.configure(yscroll=self.barra.set) 126 | self.barra.place(x=935, y=150, height=225) 127 | 128 | self.conecta_Glac() 129 | 130 | lista = self.cursor.execute("""SELECT cod_sp, servprod, hor, custo , valor, 131 | descricao, id_marcaprod, tiposerv, sistemaserv FROM servprod 132 | WHERE sp = "s" ORDER BY servprod ASC; """) 133 | for i in lista: 134 | self.listaServ.insert("", END, values=i) 135 | self.listaServ.place(x=-10, y=150) 136 | self.listaServ.bind("", self.OnDoubleClickS) 137 | self.desconecta_Glac() 138 | 139 | self.janelaServ.mainloop() 140 | def OnDoubleClickS(self, event): 141 | self.limpa_servicoS() 142 | self.listaServ.selection() 143 | for n in self.listaServ.selection(): 144 | col1, col2, col3, col4, col5, col6, col7, col8, col9 = self.listaServ.item(n, 'values') 145 | self.entradaCod.insert(END, col1) 146 | self.carrega_servicoS() 147 | def mud_servS(self): 148 | cod_sp = self.entradaCod.get() 149 | servprod = self.entradaServ.get() 150 | hor = self.entradaHor.get() 151 | custo = self.entradaCustohora.get() 152 | valor = self.entradaValorhora.get() 153 | tiposerv = self.entradaTipoServ.get() 154 | sistemaserv = self.entradaSistemaServ.get() 155 | descricao = self.entradaDescricao.get() 156 | veic = self.entradaVeic.get() 157 | 158 | self.conecta_Glac() 159 | self.cursor.execute("""UPDATE servprod 160 | SET servprod = ?, hor = ?, custo = ?, valor = ?, tiposerv = ?, sistemaserv = ?, 161 | descricao = ?, id_marcaprod = ? 162 | WHERE cod_sp = ?""", (servprod, hor, custo, valor, tiposerv, sistemaserv, 163 | descricao, veic, cod_sp)) 164 | self.conn.commit() 165 | 166 | self.listaServ.delete(*self.listaServ.get_children()) 167 | lista = self.cursor.execute("""SELECT cod_sp, servprod, hor, custo , valor, 168 | descricao, id_marcaprod, tiposerv, sistemaserv FROM servprod 169 | WHERE sp = "S" ORDER BY servprod ASC; """) 170 | for i in lista: 171 | self.listaServ.insert("", END, values=i) 172 | self.desconecta_Glac() 173 | def limpa_servicoS(self): 174 | self.entradaCod.delete(0, END) 175 | self.entradaServ.delete(0, END) 176 | self.entradaHor.delete(0, END) 177 | self.entradaCustohora.delete(0, END) 178 | self.entradaValorhora.delete(0, END) 179 | self.entradaTipoServ.delete(0, END) 180 | self.entradaSistemaServ.delete(0, END) 181 | self.entradaDescricao.delete(0, END) 182 | self.entradaVeic.delete(0, END) 183 | def del_servS(self): 184 | self.conecta_Glac() 185 | cod_sp = self.entradaCod.get() 186 | self.listaServ.delete(*self.listaServ.get_children()) 187 | self.cursor.execute("""DELETE FROM servprod WHERE cod_sp=?""", (cod_sp,)) 188 | self.conn.commit() 189 | lista = self.cursor.execute("""SELECT cod_sp, servprod, hor, custo , valor, 190 | descricao, tiposerv, sistemaserv FROM servprod 191 | WHERE sp = "S" ORDER BY cod_sp DESC;""") 192 | for i in lista: 193 | self.listaServ.insert("", END, values=i) 194 | self.desconecta_Glac() 195 | def carrega_servicoS(self): 196 | cod_sp = self.entradaCod.get() 197 | self.conecta_Glac() 198 | 199 | self.entradaServ.delete(0, END) 200 | self.entradaDescricao.delete(0, END) 201 | self.entradaHor.delete(0, END) 202 | self.entradaCustohora.delete(0, END) 203 | self.entradaValorhora.delete(0, END) 204 | self.entradaTipoServ.delete(0, END) 205 | self.entradaSistemaServ.delete(0, END) 206 | self.entradaVeic.delete(0, END) 207 | 208 | self.cursor.execute("""SELECT servprod, hor, custo, valor, tiposerv, sistemaserv, 209 | descricao, id_marcaprod FROM servprod WHERE cod_sp = '%s'""" % cod_sp) 210 | consultaserv = self.cursor.fetchall() 211 | for i in consultaserv: 212 | self.entradaServ.insert(END, i[0]) 213 | self.entradaHor.insert(END, i[1]) 214 | self.entradaCustohora.insert(END, i[2]) 215 | self.entradaValorhora.insert(END, i[3]) 216 | self.entradaTipoServ.insert(END, i[4]) 217 | self.entradaSistemaServ.insert(END, i[5]) 218 | self.entradaDescricao.insert(END, i[6]) 219 | self.entradaVeic.insert(END, i[7]) 220 | 221 | self.desconecta_Glac() 222 | def busca_serv_veicS(self): 223 | self.listaServ.delete(*self.listaServ.get_children()) 224 | self.entradaVeic.insert(END, '%') 225 | veic = self.entradaVeic.get() 226 | 227 | self.conecta_Glac() 228 | self.cursor.execute("""SELECT cod_sp, servprod, hor, custo, valor, descricao, id_marcaprod, 229 | tiposerv, sistemaserv FROM servprod WHERE id_marcaprod LIKE '%s' """ % veic) 230 | buscaservico = self.cursor.fetchall() 231 | for i in buscaservico: 232 | self.listaServ.insert("", END, values=i) 233 | self.entradaVeic.delete(0, END) 234 | self.desconecta_Glac() 235 | def busca_servicoS(self): 236 | self.listaServ.delete(*self.listaServ.get_children()) 237 | self.entradaServ.insert(END, '%') 238 | self.conecta_Glac() 239 | 240 | servprod = self.entradaServ.get() 241 | self.cursor.execute("""SELECT cod_sp, servprod, hor, custo, valor, descricao, 242 | id_marcaprod, tiposerv, sistemaserv FROM servprod 243 | WHERE servprod LIKE '%s' """ % servprod) 244 | buscaservico = self.cursor.fetchall() 245 | for i in buscaservico: 246 | self.listaServ.insert("", END, values=i) 247 | self.entradaServ.delete(0, END) 248 | 249 | self.desconecta_Glac() 250 | def add_servS(self): 251 | self.listaServ.delete(*self.listaServ.get_children()) 252 | cod_sp = self.entradaCod.get() 253 | servprod = self.entradaServ.get() 254 | hor = self.entradaHor.get() 255 | custo = self.entradaCustohora.get() 256 | valor = self.entradaValorhora.get() 257 | tiposerv = self.entradaTipoServ.get() 258 | sistemaserv = self.entradaSistemaServ.get() 259 | descricao = self.entradaDescricao.get() 260 | veic = self.entradaVeic.get() 261 | id_marcaprod = self.entradaDescricao.get() 262 | 263 | self.conecta_Glac() 264 | self.cursor.execute("""INSERT INTO servprod ( servprod, hor, custo, valor, tiposerv, 265 | sistemaserv, sp, descricao, id_marcaprod) VALUES ( ?, ?, ?, ?, ?, ?, "S", ?, ?)""", 266 | (servprod, hor, custo, valor, tiposerv, sistemaserv, descricao, id_marcaprod)) 267 | self.conn.commit() 268 | lista = self.cursor.execute("""SELECT cod_sp, servprod, hor, custo , valor, 269 | descricao , id_marcaprod, tiposerv, sistemaserv FROM servprod 270 | WHERE sp = "S" ORDER BY cod_sp DESC; """) 271 | for i in lista: 272 | self.listaServ.insert("", END, values=i) 273 | 274 | self.desconecta_Glac() -------------------------------------------------------------------------------- /Pagamentos.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | today = date.today() 12 | 13 | class CadPagamento: 14 | def consultapag(self): 15 | self.sel_lists_tps() 16 | self.janelaPagOrc = customtkinter.CTkToplevel() 17 | self.janelaPagOrc.title("GlacX - Consulta de pagamentos") 18 | self.janelaPagOrc.geometry("790x435+120+130") 19 | self.janelaPagOrc.resizable(FALSE, FALSE) 20 | self.janelaPagOrc.transient(self.window_one) 21 | self.janelaPagOrc.focus_force() 22 | self.janelaPagOrc.grab_set() 23 | 24 | ### Lista de pagamentos 25 | self.listaPag = ttk.Treeview(self.janelaPagOrc, height=10, 26 | column=("col1", "col2", "col3", "col4", "col5")) 27 | self.listaPag.heading("#0", text="") 28 | self.listaPag.column("#0", width=0) 29 | self.listaPag.heading("#1", text='O.S') 30 | self.listaPag.column("#1", width=60) 31 | self.listaPag.heading("#2", text="Tipo") 32 | self.listaPag.column("#2", width=220) 33 | self.listaPag.heading("#3", text="Valor") 34 | self.listaPag.column("#3", width=120) 35 | self.listaPag.heading("#4", text="Data") 36 | self.listaPag.column("#4", width=180) 37 | self.listaPag.heading("#5", text="Pago") 38 | self.listaPag.column("#5", width=110) 39 | 40 | self.listaPag.place(relx=0.02, rely=0.3, relwidth=0.94) 41 | 42 | # Cria barra de rolagem 43 | self.barraMov = ttk.Scrollbar(self.janelaPagOrc, orient='vertical', command=self.listaPag.yview) 44 | self.barraMov.place(relx=0.96, rely=0.305, relwidth=0.02, height=221) 45 | 46 | self.listaPag.bind("" , self.OnDoubleClickpag) 47 | self.listaPag.configure(yscroll=self.barraMov.set) 48 | 49 | ### Label do saldo a ser pago 50 | labelValor = customtkinter.CTkLabel(self.janelaPagOrc, text="Valor Total") 51 | labelValor.place(x=630, y=375) 52 | 53 | labelCifrao = customtkinter.CTkLabel(self.janelaPagOrc, text="R$") 54 | labelCifrao.place(x=600, y=395) 55 | 56 | #### Entry do saldo a ser pago 57 | self.entryValorDevido = customtkinter.CTkEntry(self.janelaPagOrc) 58 | self.entryValorDevido.configure(validate="key") 59 | self.entryValorDevido.place(x=620, y=395, relwidth=0.1) 60 | 61 | #### Listbox do tipo de pagamento 62 | self.listtipopag = StringVar() 63 | self.listtipopag.set(self.tipos_pag[0]) 64 | self.popupMenu = OptionMenu(self.janelaPagOrc, self.listtipopag, *self.tipos_pag) 65 | self.popupMenu.place(relx=0.04, rely=0.08, relwidth=0.15, height=20) 66 | 67 | tipoPag = customtkinter.CTkLabel(self.janelaPagOrc, text="Tipo Pagamento") 68 | tipoPag.place(relx=0.04, rely=0.03, relwidth=0.15) 69 | 70 | #### Entry data 71 | meslabel = customtkinter.CTkLabel(self.janelaPagOrc, text='Mês') 72 | meslabel.place(relx=0.2, rely=0.03, relwidth=0.12) 73 | self.mesvar = StringVar() 74 | self.mesesV = self.rows_meses_dscr 75 | mes = today.month - 1 76 | self.mesvar.set(self.rows_meses_dscr[mes]) 77 | self.popupMenu = OptionMenu(self.janelaPagOrc, self.mesvar, *self.mesesV) 78 | self.popupMenu.place(relx=0.2, rely=0.08, relwidth=0.12, height=20) 79 | 80 | anolabel = customtkinter.CTkLabel(self.janelaPagOrc, text='Ano') 81 | anolabel.place(relx=0.33, rely=0.03, relwidth=0.08) 82 | self.anovar = StringVar() 83 | self.anosV = self.rows_ano_dscr 84 | self.anovar.set(today.year) 85 | self.popupMenu = OptionMenu(self.janelaPagOrc, self.anovar, *self.anosV) 86 | self.popupMenu.place(relx=0.33, rely=0.08, relwidth=0.08, height=20) 87 | 88 | ### Pago? 89 | pagolabel = customtkinter.CTkLabel(self.janelaPagOrc, text="Pago") 90 | pagolabel.place(relx=0.43, rely=0.03) 91 | self.entry7 = StringVar() 92 | self.entry7V = {"Sim", "Nao"} 93 | self.entry7V = sorted(self.entry7V) 94 | self.entry7.set("Sim") 95 | 96 | self.popupMenu = OptionMenu(self.janelaPagOrc, self.entry7, *self.entry7V) 97 | self.popupMenu.place(relx=0.43, rely=0.08, width=80, height=20) 98 | 99 | #### Button Inserir Registro 100 | btinserir1 = customtkinter.CTkButton(self.janelaPagOrc, 101 | text="Consulta competência/Tipo/Pago? ", command=self.carregaConsulta) 102 | btinserir1.place(relx=0.57, rely=0.04) 103 | 104 | #### Entry data 105 | self.mesvar2 = StringVar() 106 | self.mesesV2 = self.rows_meses_dscr 107 | mes = today.month - 1 108 | self.mesvar2.set(self.rows_meses_dscr[mes]) 109 | self.popupMenu2 = OptionMenu(self.janelaPagOrc, self.mesvar2, *self.mesesV2) 110 | self.popupMenu2.place(relx=0.04, rely=0.2, relwidth=0.15, height=20) 111 | mesValor2Label = customtkinter.CTkLabel(self.janelaPagOrc, text='Mês') 112 | mesValor2Label.place(relx=0.04, rely=0.15, relwidth=0.15) 113 | 114 | self.anovar2 = StringVar() 115 | self.anovar2.set(today.year) 116 | self.popupMenu2 = OptionMenu(self.janelaPagOrc, self.anovar2, *self.rows_ano_dscr) 117 | self.popupMenu2.place(relx=0.2, rely=0.2, relwidth=0.12, height=20) 118 | anoValor2label= customtkinter.CTkLabel(self.janelaPagOrc, text="Ano") 119 | anoValor2label.place(relx=0.2, rely=0.15, relwidth=0.12) 120 | 121 | # Pago? 122 | self.entry72 = StringVar() 123 | self.entry72.set(self.sim_nao[1]) 124 | self.popupMenu2 = OptionMenu(self.janelaPagOrc, self.entry72, *self.sim_nao) 125 | self.popupMenu2.place(relx=0.33, rely=0.2, relwidth=0.08, height=20) 126 | 127 | pagoValor2 = customtkinter.CTkLabel(self.janelaPagOrc, text="Pago") 128 | pagoValor2.place(relx=0.33, rely=0.15, relwidth=0.08) 129 | 130 | #### Button Inserir Registro 131 | btinserir = customtkinter.CTkButton(self.janelaPagOrc, text="Consulta Competência Pago", command=self.carregaConsulta2) 132 | btinserir.place(relx=0.57, rely=0.16) 133 | 134 | self.janelaPagOrc.mainloop() 135 | def add_pag(self): 136 | ordem = self.listaNumOrc.get() 137 | tipopag = self.listtipopag.get() 138 | valortotal = self.entryValorTotal.get() 139 | valordeduzir = self.entryValor.get() 140 | 141 | dia = self.data_forma_pag.get() 142 | pago = "Não" 143 | 144 | self.conecta_Glac() 145 | self.cursor.execute(""" INSERT INTO formapag 146 | ( ordem, tipopag, valorpagar, valordeduzir, dia, pago) 147 | VALUES ( ?, ?, ?, ?, ?, ?)""", (ordem, tipopag, valortotal, 148 | valordeduzir, dia, "Sim")) 149 | self.conn.commit() 150 | self.desconecta_Glac() 151 | 152 | self.sel_pag_ordem() 153 | 154 | msg = "Pagamento incluido com sucesso" 155 | messagebox.showinfo("GLAC - Pagamentos", msg) 156 | self.sel_pag_ordem() 157 | def mud_pag(self): 158 | self.conecta_Glac() 159 | tipopag = self.entry2.get() 160 | valor = self.entry3.get() 161 | diaA = self.entry4.get() 162 | pago = self.entry7.get() 163 | idA = self.entry9.get() 164 | 165 | self.cursor.execute("""UPDATE formapag SET tipopag = ?, valordeduzir = ?, dia = ?, 166 | pago = ? WHERE id = ? """, (tipopag, valor, diaA, pago, idA)) 167 | self.conn.commit() 168 | 169 | self.desconecta_Glac() 170 | self.janPag2.destroy() 171 | self.sel_pag_ordem() 172 | def carregaConsulta(self): 173 | self.conecta_Glac() 174 | 175 | tipopag = self.listtipopag.get() 176 | valor = self.entryValorDevido.get() 177 | 178 | mes = self.mesvar.get() 179 | ano = self.anovar.get() 180 | pago = self.entry7.get() 181 | 182 | ano = str(ano.replace("(", "").replace(")", "").replace(",", "")) 183 | mes = str(mes.replace("(", "").replace(")", "").replace(",", "")) 184 | mes2 = '' 185 | if mes == "Janeiro": 186 | mes2 = '01' 187 | elif mes == "Fevereiro": 188 | mes2 = '02' 189 | elif mes == "Março": 190 | mes2 = '03' 191 | elif mes == "Abril": 192 | mes2 = '04' 193 | elif mes == "Maio": 194 | mes2 = '05' 195 | elif mes == "Junho": 196 | mes2 = '06' 197 | elif mes == "Julho": 198 | mes2 = '07' 199 | elif mes == "Agosto": 200 | mes2 = '08' 201 | elif mes == "Setembro": 202 | mes2 = '09' 203 | elif mes == "Outubro": 204 | mes2 = '10' 205 | elif mes == "Novembro": 206 | mes2 = '11' 207 | elif mes == "Dezembro": 208 | mes2 = '12' 209 | 210 | self.listaPag.delete(*self.listaPag.get_children()) 211 | lista = self.cursor.execute(""" 212 | SELECT ordem, tipopag, valordeduzir, dia, pago 213 | FROM formapag WHERE tipopag = ? AND substr(dia, 4,2) = ? AND substr(dia, 7,10) = ? 214 | AND pago = ? ORDER BY id ASC; """, (tipopag, mes2, ano, pago)) 215 | for i in lista: 216 | print(i) 217 | self.listaPag.insert("", END, values=i) 218 | self.entryValorDevido.delete(0, END) 219 | 220 | lista2 = self.cursor.execute("""SELECT SUM(valordeduzir) 221 | FROM formapag WHERE tipopag = ? AND substr(dia, 4,2) = ? AND substr(dia, 7,10) = ? 222 | AND pago = ? ORDER BY id ASC; """, (tipopag, mes2, ano, pago)) 223 | for i in lista2: 224 | print(i) 225 | if i == '': 226 | self.entryValorDevido.insert(END, "0.00") 227 | else: 228 | self.entryValorDevido.insert(END, i) 229 | self.desconecta_Glac() 230 | def carregaConsulta2(self): 231 | mes = self.mesvar2.get() 232 | ano = self.anovar2.get() 233 | pago = self.entry72.get() 234 | 235 | print(ano) 236 | print(mes) 237 | 238 | mes2 = '' 239 | if mes == "Janeiro": 240 | mes2 = '01' 241 | elif mes == "Fevereiro": 242 | mes2 = '02' 243 | elif mes == "Março": 244 | mes2 = '03' 245 | elif mes == "Abril": 246 | mes2 = '04' 247 | elif mes == "Maio": 248 | mes2 = '05' 249 | elif mes == "Junho": 250 | mes2 = '06' 251 | elif mes == "Julho": 252 | mes2 = '07' 253 | elif mes == "Agosto": 254 | mes2 = '08' 255 | elif mes == "Setembro": 256 | mes2 = '09' 257 | elif mes == "Outubro": 258 | mes2 = '10' 259 | elif mes == "Novembro": 260 | mes2 = '11' 261 | elif mes == "Dezembro": 262 | mes2 = '12' 263 | 264 | self.conecta_Glac() 265 | self.listaPag.delete(*self.listaPag.get_children()) 266 | 267 | lista = self.cursor.execute(""" 268 | SELECT ordem, tipopag, valordeduzir, dia, pago 269 | FROM formapag WHERE substr(dia, 4,2) = ? AND substr(dia, 7, 4) = ? 270 | AND pago = ? ORDER BY id ASC; """, (mes2, ano, pago)) 271 | for i in lista: 272 | self.listaPag.insert("", END, values=i) 273 | 274 | self.entryValorDevido.delete(0, END) 275 | 276 | lista2 = self.cursor.execute(""" 277 | SELECT SUM(valordeduzir) 278 | FROM formapag WHERE substr(dia, 4,2) = ? AND substr(dia, 7, 4) = ? 279 | AND pago = ? ORDER BY id ASC; """, (mes2, ano, pago)) 280 | for i in lista2: 281 | print(i) 282 | i = str(i) 283 | i = i.replace("(", "").replace(")","").replace(",","") 284 | self.entryValorDevido.insert(END, i) 285 | self.desconecta_Glac() 286 | def sel_pag_ordem(self): 287 | valortotal1 = self.entryValorTotal.get() 288 | 289 | numAt = self.listaNumOrc.get() 290 | self.entryNumAtend.insert(END, numAt) 291 | self.listaPag.delete(*self.listaPag.get_children()) 292 | self.conecta_Glac() 293 | lista = self.cursor.execute("""SELECT ordem, tipopag, valorpagar, valordeduzir, 294 | dia, pago, id FROM formapag WHERE ordem = '%s' ORDER BY id ASC; """ % numAt) 295 | for i in lista: 296 | self.listaPag.insert("", END, values=i) 297 | 298 | informe = self.cursor.execute("""SELECT SUM(valordeduzir) FROM formapag 299 | WHERE ordem = '%s' AND pago = 'Sim' ORDER BY id ASC; """ % numAt) 300 | for i in informe: 301 | soma = float(i[0]) 302 | soma = f'{i[0]:.2f}' 303 | self.entryValorInform.delete(0, END) 304 | self.entryValorInform.insert(END, soma) 305 | valor_devido = float(valortotal1) - float(soma) 306 | valor_devido = float(valor_devido) 307 | self.entryValorDevido.delete(0, END) 308 | self.entryValorDevido.insert(END, f'{valor_devido:.2f}') 309 | 310 | self.desconecta_Glac() -------------------------------------------------------------------------------- /Cadastros.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | class Cads(): 12 | def cademp(self): 13 | self.janelaEmp = customtkinter.CTkToplevel() 14 | self.janelaEmp.title('Glacx - Cadastro da empresa') 15 | self.janelaEmp.configure(background="gray20") 16 | self.janelaEmp.geometry("410x250+250+250") 17 | self.janelaEmp.resizable(FALSE, FALSE) 18 | self.janelaEmp.transient(self.window_one) 19 | self.janelaEmp.focus_force() 20 | self.janelaEmp.grab_set() 21 | 22 | descrNomeServ = customtkinter.CTkLabel(self.janelaEmp, text="Estabelecimento") 23 | descrNomeServ.place(relx=0.2, rely=0.05, relwidth=0.6) 24 | 25 | self.entradaCod_emp = customtkinter.CTkEntry(self.janelaEmp) 26 | 27 | # Descrição e Entrada Nome 28 | descrNome = customtkinter.CTkLabel(self.janelaEmp, text="Nome") 29 | descrNome.place(x=10, y=53, width=80) 30 | 31 | self.entradaNome_emp = Listbox(self.janelaEmp, height=1) 32 | self.entradaNome_emp.place(x=85, y=53, width=300) 33 | 34 | # Descrição e Entrada Enedereco 35 | descrEndereco = LabelGlac(self.janelaEmp, "Endereco") 36 | descrEndereco.place(x=10, y=83, width=80) 37 | 38 | self.entradaEndereco_emp = Listbox(self.janelaEmp, height=1) 39 | self.entradaEndereco_emp.place(x=85, y=83, width=300) 40 | 41 | # Descrição e Entrada Bairro 42 | descrBairro = LabelGlac(self.janelaEmp, "Bairro") 43 | descrBairro.place(x=10, y=103, width=80) 44 | 45 | self.entradaBairro_emp = Listbox(self.janelaEmp, height=1) 46 | self.entradaBairro_emp.place(x=85, y=103, width=300) 47 | 48 | # Descrição e Entrada Municipio 49 | descrMunicipio = LabelGlac(self.janelaEmp, "Cidade") 50 | descrMunicipio.place(x=10, y=123, width=80) 51 | 52 | self.entradaMunicipio_emp = Listbox(self.janelaEmp, height=1) 53 | self.entradaMunicipio_emp.place(x=85, y=123, width=220) 54 | 55 | # Descrição e Entrada UF 56 | descrUf = LabelGlac(self.janelaEmp, "Uf") 57 | descrUf.place(x=315, y=123, width=30) 58 | 59 | self.entradaUf_emp = Listbox(self.janelaEmp, height=1) 60 | self.entradaUf_emp.place(x=350, y=123, width=30) 61 | 62 | # Descrição e Entrada Fone 63 | descrFone = LabelGlac(self.janelaEmp, "Fone") 64 | descrFone.place(x=10, y=143, width=80) 65 | 66 | self.entradaFone_emp = Listbox(self.janelaEmp, height=1) 67 | self.entradaFone_emp.place(x=85, y=143, width=140) 68 | 69 | # Descrição e Entrada Cep 70 | descrCep = LabelGlac(self.janelaEmp, "Cep") 71 | descrCep.place(x=230, y=143, width=40) 72 | 73 | self.entradaCep_emp = Listbox(self.janelaEmp, height=1) 74 | self.entradaCep_emp.place(x=270, y=143, width=115) 75 | 76 | # Descrição e Entrada Cpf 77 | descrCpf = LabelGlac(self.janelaEmp, "Cnpj") 78 | descrCpf.place(x=10, y=163, width=80) 79 | 80 | self.entradaCpf_emp = Listbox(self.janelaEmp, height=1) 81 | self.entradaCpf_emp.place(x=85, y=163, width=140) 82 | 83 | # Descrição e Entrada Rg 84 | descrRg = LabelGlac(self.janelaEmp, "Cpf") 85 | descrRg.place(x=230, y=163, width=40) 86 | 87 | self.entradaRg_emp = Listbox(self.janelaEmp, height=1) 88 | self.entradaRg_emp.place(x=270, y=163, width=115) 89 | 90 | # Descrição e Entrada Obs 91 | descrObs = LabelGlac(self.janelaEmp, "Obs") 92 | descrObs.place(x=10, y=193, width=80) 93 | 94 | self.entradaObs_emp = Listbox(self.janelaEmp, height=1) 95 | self.entradaObs_emp.place(x=85, y=193, width=300) 96 | 97 | self.conecta_Glac() 98 | 99 | lista = self.cursor.execute("""SELECT cod_emp FROM empresa; """) 100 | for i in lista: 101 | self.entradaCod_emp.insert(i, END) 102 | 103 | self.desconecta_Glac() 104 | 105 | self.carrega_empresa() 106 | self.janelaEmp.mainloop() 107 | def busca_fornecE(self): 108 | self.conecta_Glac() 109 | ### Widgets - Listar tecnicos ### 110 | self.entradaFornec.insert(END, '%') 111 | veicAuto = self.entradaFornec.get() 112 | 113 | self.listatec = Tk() 114 | self.listatec.title("Fornecedores - GLAC ") 115 | self.listatec.configure(background='gray75') 116 | self.listatec.geometry("310x240+150+180") 117 | self.listatec.resizable(FALSE, FALSE) 118 | 119 | ########## 120 | self.listatec1 = ttk.Treeview(self.listatec, height=10, column=("col1", "col2")) 121 | self.listatec1.heading("#0", text="") 122 | self.listatec1.heading("#1", text="Cod") 123 | self.listatec1.heading("#2", text="Fornecedor") 124 | 125 | self.listatec1.column("#0", width=0) 126 | self.listatec1.column("#1", width=60) 127 | self.listatec1.column("#2", width=220) 128 | 129 | # Cria barra de rolagem 130 | self.barra = ttk.Scrollbar(self.listatec, orient='vertical', 131 | command=self.listatec1.yview) 132 | 133 | # Adiciona barra de rolagem 134 | self.listatec1.configure(yscroll=self.barra.set) 135 | self.barra.place(x=280, y=12, width=25, height=220) 136 | 137 | self.listatec1.place(x=5, y=5) 138 | 139 | self.cursor.execute("""SELECT cod_forn, fornecedor 140 | FROM fornecedores ORDER BY fornecedor ASC""") 141 | 142 | rows = self.cursor.fetchall() 143 | for row in rows: 144 | self.listatec1.insert("", END, values=row) 145 | 146 | # Binding da listbox 147 | self.listatec1.bind('', self.add_autobind) 148 | 149 | self.entradaFornec.delete(0, END) 150 | self.entradaIdFornec.delete(0, END) 151 | self.desconecta_Glac() 152 | def busca_marcaE(self): 153 | self.conecta_Glac() 154 | ### Widgets - Listar tecnicos ### 155 | 156 | self.entradaMarcaprod.insert(END, '%') 157 | 158 | veicAuto = self.entradaMarcaprod.get() 159 | 160 | self.listatec = Tk() 161 | self.listatec.title("Marcas - GLAC ") 162 | self.listatec.geometry("310x240+150+180") 163 | self.listatec.resizable(FALSE, FALSE) 164 | 165 | ########## 166 | self.listatec1 = ttk.Treeview(self.listatec, height=10, 167 | column=("col1", "col2")) 168 | self.listatec1.heading("#0", text="") 169 | self.listatec1.heading("#1", text="Cod") 170 | self.listatec1.heading("#2", text="Marca") 171 | 172 | self.listatec1.column("#0", width=0) 173 | self.listatec1.column("#1", width=60) 174 | self.listatec1.column("#2", width=220) 175 | 176 | # Cria barra de rolagem 177 | self.barra = ttk.Scrollbar(self.listatec, orient='vertical', 178 | command=self.listatec1.yview) 179 | 180 | # Adiciona barra de rolagem 181 | self.listatec1.configure(yscroll=self.barra.set) 182 | self.barra.place(x=280, y=6, width=30, height=225) 183 | 184 | self.listatec1.place(x=5, y=5) 185 | 186 | self.cursor.execute(""" 187 | SELECT cod_marca, marca FROM marcaprod ORDER BY marca ASC""") 188 | 189 | rows = self.cursor.fetchall() 190 | for row in rows: 191 | self.listatec1.insert("", END, values=row) 192 | 193 | # Binding da listbox 194 | self.listatec1.bind('', self.add_autobind2) 195 | 196 | self.entradaMarcaprod.delete(0, END) 197 | self.entradaIdMarcaprod.delete(0, END) 198 | self.desconecta_Glac() 199 | def pagaOrdem(self): 200 | self.sel_lists_tps() 201 | self.janelaPagOrc = Toplevel(self.window_one) 202 | self.janelaPagOrc.title("GlacX - Formas de Pagamento") 203 | self.janelaPagOrc.geometry("800x420+100+150") 204 | self.janelaPagOrc.resizable(FALSE, FALSE) 205 | self.janelaPagOrc.transient(self.window_one) 206 | self.janelaPagOrc.focus_force() 207 | 208 | 209 | ### Frame Moldura 210 | frame3 = GradientFrame(self.janelaPagOrc) 211 | frame3.configure(background='gray50') 212 | frame3.place(relwidth=1, relheight=1) 213 | 214 | # Label do numero de atendimento 215 | labelNumAtend = LabelGlac(self.janelaPagOrc, "NumAtend") 216 | labelNumAtend.place(relx=0.03, rely=0.01, relwidth=0.17, height=20) 217 | 218 | # Entry do numero de atendimento 219 | self.entryNumAtend = Listbox(self.janelaPagOrc, height=1) 220 | self.entryNumAtend.configure(bg='lightgray', font=('Verdana', '8', 'bold')) 221 | self.entryNumAtend.place(relx=0.17, rely=0.01, width=80, height=20) 222 | 223 | # Label do valor total 224 | labelValorTotal = LabelGlac(frame3, "Valor Total") 225 | labelValorTotal.place(relx=0.03, rely=0.06, relwidth=0.17, height=20) 226 | 227 | # Entry do valor total 228 | self.text = self.entradatotal.get() 229 | self.text = self.text.replace("R$","").replace("(","").replace(")","") 230 | self.text = float(self.text) 231 | self.text = f'{self.text:.2f}' 232 | self.entryValorTotal = Entry(frame3) 233 | self.entryValorTotal.place(relx=0.17, rely=0.06, width=80, height=20) 234 | self.entryValorTotal.insert(END, self.text) 235 | 236 | ### Label do valor a ser inserido 237 | labelValor = LabelGlac(frame3, "Valor") 238 | labelValor.place(relx=0.475, rely=0.01, width=80, height=20) 239 | labelCifrao = LabelGlac(frame3, "R$") 240 | labelCifrao.place(relx=0.475, rely=0.05, width=20, height=25) 241 | 242 | #### Entry do valor a ser inserido 243 | self.entryValor = Entry(frame3) 244 | self.entryValor.configure(validate='key') 245 | self.entryValor.place(relx=0.5, rely=0.06, width=60, height=20) 246 | self.entryValor.insert(END, f'{00.00:.2f}') 247 | 248 | # Listbox do tipo de pagamento 249 | self.listtipopag = StringVar() 250 | self.listtipopag.set("Dinheiro") 251 | 252 | self.popupMenu = OptionMenu(frame3, self.listtipopag, *self.tipos_pag) 253 | self.popupMenu.place(relx=0.588, rely=0.06, width=100, height=22) 254 | 255 | tipopaglabel = LabelGlac(frame3, "Tipo Pagamento") 256 | tipopaglabel.place(relx=0.588, rely=0.01, width=100, height=20) 257 | 258 | #### Data frame 259 | framedata = LabelGlac(frame3, 'Data') 260 | framedata.place(relx=0.72, rely=0.01, width=100, height=20) 261 | self.data_forma_pag = DateEntry(frame3, locale='pt_BR') 262 | self.data_forma_pag.place(relx=0.72, rely=0.06, width=100, height=22) 263 | 264 | #### Button Inserir Registro 265 | btinserir3 = ButtonGlac(frame3, "Inserir", self.add_pag) 266 | btinserir3.place(relx=0.86, rely=0.04, width=90, height=35) 267 | 268 | ### Lista de pagamentos 269 | self.listaPag = ttk.Treeview(frame3, height=14, 270 | column=("col1", "col2", "col3", "col4", "col5", "col6", "col7")) 271 | self.listaPag.heading("#0", text="") 272 | self.listaPag.column("#0", width=0) 273 | self.listaPag.heading("#1", text='O.S') 274 | self.listaPag.column("#1", width=50) 275 | self.listaPag.heading("#2", text="Tipo") 276 | self.listaPag.column("#2", width=130) 277 | self.listaPag.heading("#3", text="Valor Pagamento") 278 | self.listaPag.column("#3", width=160) 279 | self.listaPag.heading("#4", text="ValorDeduzir") 280 | self.listaPag.column("#4", width=140) 281 | self.listaPag.heading("#5", text="Data") 282 | self.listaPag.column("#5", width=100) 283 | self.listaPag.heading("#6", text="Pago") 284 | self.listaPag.column("#6", width=78) 285 | self.listaPag.heading("#7", text="") 286 | self.listaPag.column("#7", width=78) 287 | self.listaPag.place(relx=0.03, rely=0.12) 288 | 289 | # Cria barra de rolagem 290 | self.barraMov = ttk.Scrollbar(frame3, orient='vertical', command=self.listaPag.yview) 291 | self.barraMov.place(relx=0.952, rely=0.124, width=20, height=300) 292 | 293 | self.listaPag.bind("", self.OnDoubleClickpag) 294 | self.listaPag.configure(yscroll=self.barraMov.set) 295 | 296 | ### Label do saldo a ser pago 297 | labelValor = LabelGlac(frame3, "ValorDevido") 298 | labelValor.place(x=640, y=365, width=100, height=25) 299 | labelCifrao = LabelGlac(frame3, "R$") 300 | labelCifrao.place(x=640, y=385, width=30, height=25) 301 | 302 | #### Entry do saldo a ser pago 303 | self.entryValorDevido = Entry(frame3) 304 | self.entryValorDevido.configure(validate="key") 305 | self.entryValorDevido.place(x=670, y=385, width=70, height=25) 306 | 307 | ### Label do saldo ja pago 308 | labelValor2 = LabelGlac(frame3, "Valor Pago") 309 | labelValor2.place(x=500, y=365, width=100, height=25) 310 | labelCifrao2 = LabelGlac(frame3, "R$") 311 | labelCifrao2.place(x=500, y=385, width=30, height=25) 312 | 313 | #### Entry do saldo ja pago 314 | self.entryValorInform = Entry(frame3) 315 | self.entryValorInform.configure(validate="key") 316 | self.entryValorInform.place(x=530, y=385, width=70, height=25) 317 | self.sel_pag_ordem() 318 | 319 | self.janelaPagOrc.mainloop() 320 | def OnDoubleClickpag(self, event): 321 | self.listaPag.selection() 322 | self.janPag2 = Toplevel() 323 | self.janPag2.title("GlacX") 324 | self.janPag2.geometry("590x60+170+300") 325 | self.janPag2.configure(background='gray55') 326 | self.janPag2.resizable(FALSE, FALSE) 327 | self.janPag2.transient(self.janelaPagOrc) 328 | self.janPag2.focus_force() 329 | self.janPag2.grab_set() 330 | 331 | ### Frame Moldura 332 | frame3 = GradientFrame(self.janPag2).place(relwidth=1, relheight=1) 333 | 334 | ## Entry NUm Atend 335 | label1 = LabelGlac(self.janPag2, "Nº O.S") 336 | label1.place(x=5, y=8, width=50, height=25) 337 | 338 | self.entry1 = Listbox(self.janPag2, width=8, height=1) 339 | self.entry1.place(x=5, y=30, width=50, height=25) 340 | 341 | #### Listbox do tipo de pagamento 342 | labelTipopag2 = LabelGlac(self.janPag2, "Tipo de Pagamento") 343 | labelTipopag2.place(x=65, y=8, width=130, height=25) 344 | 345 | self.entry2 = StringVar() 346 | self.entry2V = {"Debito", "Credito", "Dinheiro", "Boleto", 347 | "ChequePre", "ChequeVista", "Crediario", "Promissoria", 348 | "Desconto", "Avista"} 349 | self.entry2V = sorted(self.entry2V) 350 | self.popupMenu = OptionMenu(self.janPag2, self.entry2, *self.entry2V) 351 | self.popupMenu.place(x=65, y=30, width=130, height=25) 352 | 353 | #### Valor da parcela 354 | label1 = LabelGlac(self.janPag2, "Valor") 355 | label1.place(x=205, y=8, width=80, height=25) 356 | 357 | self.entry3 = Entry(self.janPag2) 358 | self.entry3.place(x=205, y=30, width=80, height=25) 359 | 360 | ### dia 361 | label1 = LabelGlac(self.janPag2, "Data/Pagam") 362 | label1.place(x=295, y=8, width=120, height=25) 363 | 364 | self.entry4 = DateEntry(self.janPag2, locale='pt_BR') 365 | self.entry4.place(x=295, y=30, width=120, height=25) 366 | 367 | ### Pago? 368 | label1 = LabelGlac(self.janPag2, "Pago") 369 | label1.place(x=425, y=8, width=65, height=25) 370 | 371 | self.entry7 = StringVar() 372 | self.entry7V = {"Sim", "Nao"} 373 | self.entry7V = sorted(self.entry7V) 374 | self.entry7.set("Sim") 375 | self.popupMenu = OptionMenu(self.janPag2, self.entry7, *self.entry7V) 376 | self.popupMenu.place(x=425, y=30, width=65, height=25) 377 | 378 | ### Alterar registro 379 | button5 = ButtonGlac(self.janPag2, "Alterar", self.mud_pag) 380 | button5.place(x=500, y=25, height=33) 381 | 382 | self.entry9 = Entry(self.janPag2) 383 | 384 | for n in self.listaPag.selection(): 385 | col1, col2, col3, col4, col5, col6, col7 = self.listaPag.item(n, 'values') 386 | self.entry1.insert(END, col1) 387 | self.entry2.set(col2) 388 | self.entry3.insert(END, col4) 389 | self.entry4.delete(0, END) 390 | self.entry4.insert(END, col5) 391 | self.entry7.set(col6) 392 | self.entry9.insert(END, col7) 393 | 394 | self.janPag2.mainloop() 395 | def procedServ(self): 396 | ### Widgets - Listar Orçamentos ### 397 | self.listaOrc = Toplevel() 398 | self.listaOrc.title(" GLAC ") 399 | self.listaOrc.geometry("300x100+110+100") 400 | self.listaOrc.configure(background="gray50") 401 | self.listaOrc.resizable(FALSE, FALSE) 402 | self.listaOrc.transient(self.window_one) 403 | self.listaOrc.focus_force() 404 | self.listaOrc.grab_set() 405 | 406 | frame_win = GradientFrame(self.listaOrc).place(relwidth=1, relheight=1) 407 | 408 | MensLabel = LabelGlac(self.listaOrc, "Atualizar valor hora") 409 | MensLabel.place(relx=0.1, rely=0.1, relwidt=0.8) 410 | 411 | self.listaNomeO = Entry(self.listaOrc) 412 | self.listaNomeO.place(relx=0.2, rely=0.6, width=80, height=27) 413 | 414 | botaoBuscaNome = ButtonGlac(self.listaOrc, "Atualizar", self.procedServF) 415 | botaoBuscaNome.place(relx=0.5, rely=0.6, height=35) 416 | def procedServF(self): 417 | valorServ = self.listaNomeO.get() 418 | Serv = 's' 419 | self.conecta_Glac() 420 | self.cursor.execute("""UPDATE servprod SET valor = ? WHERE sp = ?""", (valorServ, Serv)) 421 | self.conn.commit() 422 | 423 | self.desconecta_Glac() 424 | msg = "Valor atualizado com sucesso.\n " 425 | messagebox.showinfo("GLAC", msg) 426 | self.listaOrc.destroy() -------------------------------------------------------------------------------- /Produtos.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | class CadProd: 12 | def cadprod(self): 13 | self.janelaProd = customtkinter.CTkToplevel() 14 | self.janelaProd.title("Produtos") 15 | self.janelaProd.geometry("860x240+65+180") 16 | self.janelaProd.resizable(FALSE, FALSE) 17 | self.janelaProd.transient(self.window_one) 18 | self.janelaProd.focus_force() 19 | 20 | descrCodprod = customtkinter.CTkLabel(self.janelaProd, text="Codigo") 21 | descrCodprod.place(x=10, y=5) 22 | 23 | self.entradaCodprod = customtkinter.CTkEntry(self.janelaProd) 24 | self.entradaCodprod.place(x=80, y=5, relwidth=0.07) 25 | 26 | descrProd = customtkinter.CTkLabel(self.janelaProd, text="Produtos") 27 | descrProd.place(x=10, y=33) 28 | 29 | self.entradaProd = customtkinter.CTkEntry(self.janelaProd) 30 | self.entradaProd.place(x=80, y=33, relwidth=0.22) 31 | 32 | botaoAdd = ButtonGlac(self.janelaProd, "Carregar", self.carrega_produtoP) 33 | botaoAdd.place(x=150, y=2, width=115, height=31) 34 | 35 | botaolimpa = ButtonGlac(self.janelaProd, "Limpar", self.limpa_produtoP) 36 | botaolimpa.place(x=285, y=2, width=70, height=31) 37 | 38 | botaolimpa = ButtonGlac(self.janelaProd, "Buscar", self.busca_produtoP) 39 | botaolimpa.place(x=285, y=32, width=70, height=30) 40 | 41 | descrIdMarcaprod = ButtonGlac(self.janelaProd, "Marca", self.busca_marcaP) 42 | descrIdMarcaprod.place(x=2, y=60, width=100, height=30) 43 | 44 | self.entradaIdMarcaprod = customtkinter.CTkEntry(self.janelaProd) 45 | 46 | self.entradaMarcaprod = customtkinter.CTkEntry(self.janelaProd) 47 | self.entradaMarcaprod.place(x=105, y=62, relwidth=0.25) 48 | 49 | descrIdFornec = ButtonGlac(self.janelaProd, "Fornecedor", self.busca_fornecP) 50 | descrIdFornec.place(x=2, y=90, width=100, height=30) 51 | 52 | self.entradaIdFornec = Entry(self.janelaProd) 53 | 54 | self.entradaFornec = customtkinter.CTkEntry(self.janelaProd) 55 | self.entradaFornec.place(x=105, y=93, relwidth=0.25) 56 | 57 | self.descrCusto = customtkinter.CTkLabel(self.janelaProd, text="Custo") 58 | self.descrCusto.place(x=10, y=122) 59 | 60 | self.entradaCusto = customtkinter.CTkEntry(self.janelaProd) 61 | self.entradaCusto.configure(validate="key", validatecommand=self.vcmd8float) 62 | self.entradaCusto.place(x=83, y=122, relwidth=0.1) 63 | 64 | descrValor = customtkinter.CTkLabel(self.janelaProd, text="Valor") 65 | descrValor.place(x=180, y=122) 66 | 67 | self.entradaValor = customtkinter.CTkEntry(self.janelaProd) 68 | self.entradaValor.configure(validate="key", validatecommand=self.vcmd8float) 69 | self.entradaValor.place(x=240, y=123, relwidth=0.1) 70 | 71 | descrDescricao = customtkinter.CTkLabel(self.janelaProd, text="Descrição") 72 | descrDescricao.place(x=10, y=150) 73 | 74 | self.entradaDescricao = customtkinter.CTkEntry(self.janelaProd) 75 | self.entradaDescricao.place(x=83, y=153, relwidth=0.27) 76 | 77 | botaoAdd = ButtonGlac(self.janelaProd, "Novo", self.add_produtoP) 78 | botaoAdd.place(x=50, y=190, width=80, height=35) 79 | 80 | botaoMudServ = ButtonGlac(self.janelaProd, "Alterar", self.mud_produtoP) 81 | botaoMudServ.place(x=150, y=190, width=80, height=35) 82 | 83 | botaoDel = ButtonGlac(self.janelaProd, "Apagar", self.del_produtoP) 84 | botaoDel.place(x=250, y=190, width=80, height=35) 85 | 86 | ### Widgets - Listar produtos ### 87 | self.listaServ = ttk.Treeview(self.janelaProd, 88 | height=10, column=("col1", "col2", "col3", "col4", "col5", "col6")) 89 | self.listaServ.heading("#0", text="") 90 | self.listaServ.column("#0", width=0) 91 | self.listaServ.heading("#1", text="Codigo") 92 | self.listaServ.column("#1", width=60) 93 | self.listaServ.heading("#2", text="Produtos") 94 | self.listaServ.column("#2", width=220) 95 | self.listaServ.heading("#3", text="") 96 | self.listaServ.column("#3", width=25) 97 | self.listaServ.heading("#4", text="Custo") 98 | self.listaServ.column("#4", width=70) 99 | self.listaServ.heading("#5", text="") 100 | self.listaServ.column("#5", width=25) 101 | self.listaServ.heading("#6", text="Valor") 102 | self.listaServ.column("#6", width=80) 103 | 104 | self.conecta_Glac() 105 | 106 | # Cria barra de rolagem 107 | self.barra = ttk.Scrollbar(self.janelaProd, orient='vertical', command=self.listaServ.yview) 108 | # Adiciona barra de rolagem 109 | self.listaServ.configure(yscroll=self.barra.set) 110 | self.barra.place(x=840, y=5, height=220) 111 | 112 | lista = self.cursor.execute("""SELECT cod_sp, servprod, "R$", custo, "R$", valor 113 | FROM servprod WHERE sp = "P" ORDER BY servprod ASC ; """) 114 | for i in lista: 115 | self.listaServ.insert("", END, values=i) 116 | self.listaServ.place(x=360, y=5) 117 | self.listaServ.bind("", self.OnDoubleClickP) 118 | self.desconecta_Glac() 119 | self.janelaProd.mainloop() 120 | def add_produtoP(self): 121 | cod_sp = self.entradaCodprod.get() 122 | servprod = self.entradaProd.get() 123 | id_marcaprod = self.entradaIdMarcaprod.get() 124 | id_fornec = self.entradaIdFornec.get() 125 | custo = self.entradaCusto.get() 126 | valor = self.entradaValor.get() 127 | descricao = self.entradaDescricao.get() 128 | tipser = 'Peça' 129 | hora = '1' 130 | 131 | self.conecta_Glac() 132 | self.cursor.execute("""INSERT INTO servprod ( servprod, id_marcaprod, id_fornec, 133 | custo, valor, sp, descricao, tiposerv, hor) VALUES ( ?, ?, ?, ?, ?, "P", ?, ?, ?)""", 134 | (servprod, id_marcaprod, id_fornec, custo, valor, descricao, tipser, hora)) 135 | self.conn.commit() 136 | self.listaServ.delete(*self.listaServ.get_children()) 137 | 138 | lista = self.cursor.execute("""SELECT cod_sp, servprod, "R$", custo, "R$", valor 139 | FROM servprod WHERE sp = "P" AND servprod LIKE '%s' 140 | ORDER BY servprod ASC;""" % servprod) 141 | for i in lista: 142 | self.listaServ.insert("", END, values=i) 143 | self.desconecta_Glac() 144 | msg = "Novo produto incluido com sucesso" 145 | messagebox.showinfo("GLAC ", msg) 146 | def busca_produtoP(self): 147 | self.conecta_Glac() 148 | self.listaServ.delete(*self.listaServ.get_children()) 149 | self.entradaProd.insert(END, '%') 150 | servprod = self.entradaProd.get() 151 | lista = self.cursor.execute("""SELECT cod_sp, servprod, "R$", custo, "R$", valor 152 | FROM servprod WHERE sp = "P" AND servprod LIKE '%s' 153 | ORDER BY servprod ASC;""" % servprod) 154 | for i in lista: 155 | self.listaServ.insert("", END, values=i) 156 | self.entradaProd.delete(0, END) 157 | self.desconecta_Glac() 158 | def busca_marcaP(self): 159 | def add_autobind(event): 160 | listaServ1.selection() 161 | for n in listaServ1.selection(): 162 | col1, col2 = listaServ1.item(n, 'values') 163 | self.entradaIdMarcaprod.insert(0, col1) 164 | self.entradaMarcaprod.insert(0, col2) 165 | listatec.destroy() 166 | 167 | def OnTec(*args): 168 | listaServ1.yview(*args) 169 | 170 | # Widgets - Listar tecnicos 171 | self.entradaMarcaprod.insert(END, '%') 172 | veicAuto = self.entradaMarcaprod.get() 173 | 174 | listatec = Tk() 175 | listatec.title("Marcas - GLAC ") 176 | listatec.geometry("315x235") 177 | listatec.resizable(TRUE, TRUE) 178 | 179 | ### Widgets - Listar produtos ### 180 | listaServ1 = ttk.Treeview(listatec, height=10, column=("col1", "col2")) 181 | listaServ1.heading("#0", text="") 182 | listaServ1.column("#0", width=0) 183 | listaServ1.heading("#1", text=self.m_Codigo) 184 | listaServ1.column("#1", width=60) 185 | listaServ1.heading("#2", text="Marca") 186 | listaServ1.column("#2", width=220) 187 | 188 | listaServ1.place(x=10, y=5) 189 | listaServ1.bind("", add_autobind) 190 | 191 | # Cria barra de rolagem 192 | barra12 = Scrollbar(listatec, orient='vertical', command=OnTec) 193 | barra12.place(x=292, y=6, width=20, height=220) 194 | listaServ1.configure(yscroll=barra12.set) 195 | 196 | 197 | self.conecta_Glac() 198 | self.cursor.execute("""SELECT cod_marca, marca FROM marcaprod 199 | WHERE cod_marca LIKE '%s' ORDER BY marca ASC""" % veicAuto) 200 | buscaservico = self.cursor.fetchall() 201 | for i in buscaservico: 202 | listaServ1.insert("", END, values=i) 203 | self.desconecta_Glac() 204 | 205 | self.entradaMarcaprod.delete(0, END) 206 | self.entradaIdMarcaprod.delete(0, END) 207 | def busca_fornecP(self): 208 | def add_autobind(event): 209 | listaServ1.selection() 210 | for n in listaServ1.selection(): 211 | col1, col2 = listaServ1.item(n, 'values') 212 | self.entradaIdFornec.insert(0, col1) 213 | self.entradaFornec.insert(0, col2) 214 | listatec.destroy() 215 | def OnTec(*args): 216 | listaServ1.yview(*args) 217 | ### Widgets - Listar tecnicos ### 218 | self.entradaFornec.insert(END, '%') 219 | veicAuto = self.entradaFornec.get() 220 | 221 | listatec = Tk() 222 | listatec.title("Fornecedores - GLAC ") 223 | listatec.geometry("310x240") 224 | listatec.resizable(TRUE, TRUE) 225 | 226 | ### Widgets - Listar produtos ### 227 | listaServ1 = ttk.Treeview(listatec, height=10, column=("col1", "col2")) 228 | listaServ1.heading("#0", text="") 229 | listaServ1.column("#0", width=0) 230 | listaServ1.heading("#1", text=self.m_Codigo) 231 | listaServ1.column("#1", width=60) 232 | listaServ1.heading("#2", text="Marca") 233 | listaServ1.column("#2", width=220) 234 | 235 | listaServ1.place(x=10, y=5) 236 | listaServ1.bind("", add_autobind) 237 | 238 | # Cria barra de rolagem 239 | barra12 = Scrollbar(listatec, orient='vertical', command=OnTec) 240 | barra12.place(x=292, y=6, width=20, height=220) 241 | listaServ1.configure(yscroll=barra12.set) 242 | 243 | self.conecta_Glac() 244 | self.cursor.execute("""SELECT cod_forn, fornecedor FROM fornecedores WHERE fornecedor 245 | LIKE '%s' ORDER BY fornecedor ASC""" % veicAuto) 246 | buscaservico = self.cursor.fetchall() 247 | for i in buscaservico: 248 | listaServ1.insert("", END, values=i) 249 | self.desconecta_Glac() 250 | 251 | self.entradaFornec.delete(0, END) 252 | self.entradaIdFornec.delete(0, END) 253 | def carrega_produtoP(self): 254 | self.conecta_Glac() 255 | 256 | cod_sp = self.entradaCodprod.get() 257 | prod = self.cursor 258 | 259 | self.entradaProd.delete(0, END) 260 | self.entradaIdMarcaprod.delete(0, END) 261 | self.entradaIdFornec.delete(0, END) 262 | self.entradaCusto.delete(0, END) 263 | self.entradaValor.delete(0, END) 264 | self.entradaDescricao.delete(0, END) 265 | self.entradaMarcaprod.delete(0, END) 266 | self.entradaFornec.delete(0, END) 267 | 268 | prod.execute("SELECT servprod FROM servprod WHERE cod_sp = '%s'" % cod_sp) 269 | consultaprod = self.cursor.fetchall() 270 | for i in consultaprod: 271 | i = str(i); 272 | i = i.replace('(', ''); 273 | i = i.replace(')', ''); 274 | i = i.replace("'", ""); 275 | i = i.replace(',', ''); 276 | i = i.replace('{', ''); 277 | i = i.replace('}', '') 278 | self.entradaProd.insert(END, i) 279 | 280 | idmarca = self.cursor 281 | idmarca.execute("SELECT id_marcaprod FROM servprod WHERE cod_sp = '%s'" % cod_sp) 282 | consultaidmarca = self.cursor.fetchall() 283 | for i in consultaidmarca: 284 | i = str(i); 285 | i = i.replace('(', ''); 286 | i = i.replace(')', ''); 287 | i = i.replace("'", ""); 288 | i = i.replace(',', ''); 289 | i = i.replace('{', ''); 290 | i = i.replace('}', '') 291 | self.entradaIdMarcaprod.insert(END, i) 292 | 293 | mm = self.entradaIdMarcaprod.get() 294 | marca = self.cursor 295 | marca.execute("SELECT marca FROM marcaprod WHERE cod_marca = '%s'" % mm) 296 | consultaidmarca = self.cursor.fetchall() 297 | for i in consultaidmarca: 298 | i = str(i); 299 | i = i.replace('(', ''); 300 | i = i.replace(')', ''); 301 | i = i.replace("'", ""); 302 | i = i.replace(',', ''); 303 | i = i.replace('{', ''); 304 | i = i.replace('}', '') 305 | self.entradaMarcaprod.insert(END, i) 306 | 307 | idfornec = self.cursor 308 | idfornec.execute("SELECT id_fornec FROM servprod WHERE cod_sp = '%s'" % cod_sp) 309 | consultaidfornec = self.cursor.fetchall() 310 | for i in consultaidfornec: 311 | self.entradaIdFornec.insert(END, i) 312 | 313 | ff = self.entradaIdFornec.get() 314 | fornec = self.cursor 315 | fornec.execute("SELECT fornecedor FROM fornecedores WHERE cod_forn = '%s'" % ff) 316 | consultaidfornec = self.cursor.fetchall() 317 | for i in consultaidfornec: 318 | i = str(i); 319 | i = i.replace('(', ''); 320 | i = i.replace(')', ''); 321 | i = i.replace("'", ""); 322 | i = i.replace(',', ''); 323 | i = i.replace('{', ''); 324 | i = i.replace('}', '') 325 | self.entradaFornec.insert(END, i) 326 | 327 | custo = self.cursor 328 | custo.execute("SELECT custo FROM servprod WHERE cod_sp = '%s'" % cod_sp) 329 | consultacusto = self.cursor.fetchall() 330 | for i in consultacusto: 331 | self.entradaCusto.insert(END, i) 332 | 333 | valor = self.cursor 334 | valor.execute("SELECT valor FROM servprod WHERE cod_sp = '%s'" % cod_sp) 335 | consultavalor = self.cursor.fetchall() 336 | for i in consultavalor: 337 | self.entradaValor.insert(END, i) 338 | 339 | descrprod = self.cursor 340 | descrprod.execute("SELECT descricao FROM servprod WHERE cod_sp = '%s'" % cod_sp) 341 | consultadescrprod = self.cursor.fetchall() 342 | for i in consultadescrprod: 343 | i = str(i); 344 | i = i.replace('(', ''); 345 | i = i.replace(')', ''); 346 | i = i.replace("'", ""); 347 | i = i.replace(',', ''); 348 | i = i.replace('{', ''); 349 | i = i.replace('}', '') 350 | self.entradaDescricao.insert(END, i) 351 | 352 | self.desconecta_Glac() 353 | def del_produtoP(self): 354 | self.conecta_Glac() 355 | 356 | cod_sp = self.entradaCodprod.get() 357 | self.cursor.execute(""" 358 | DELETE FROM servprod WHERE cod_sp=?""", (cod_sp,)) 359 | self.conn.commit() 360 | self.listaServ.delete(*self.listaServ.get_children()) 361 | lista = self.cursor.execute(""" 362 | SELECT cod_sp, servprod, "R$", custo, "R$", valor FROM servprod 363 | WHERE sp = "P" ORDER BY servprod ASC; 364 | """) 365 | for i in lista: 366 | self.listaServ.insert("", END, values=i) 367 | 368 | self.desconecta_Glac() 369 | msg = "Produto excluido com sucesso" 370 | msg += "" 371 | messagebox.showinfo("GLAC ", msg) 372 | def limpa_produtoP(self): 373 | self.conecta_Glac() 374 | 375 | self.entradaProd.delete(0, END) 376 | self.entradaIdMarcaprod.delete(0, END) 377 | self.entradaIdFornec.delete(0, END) 378 | self.entradaCusto.delete(0, END) 379 | self.entradaValor.delete(0, END) 380 | self.entradaDescricao.delete(0, END) 381 | self.entradaIdMarcaprod.delete(0, END) 382 | self.entradaMarcaprod.delete(0, END) 383 | self.entradaIdFornec.delete(0, END) 384 | self.entradaFornec.delete(0, END) 385 | self.entradaCodprod.delete(0, END) 386 | 387 | self.desconecta_Glac() 388 | def mud_produtoP(self): 389 | self.conecta_Glac() 390 | 391 | cod_sp = self.entradaCodprod.get() 392 | servprod = self.entradaProd.get() 393 | id_marcaprod = self.entradaIdMarcaprod.get() 394 | id_fornec = self.entradaIdFornec.get() 395 | custo = self.entradaCusto.get() 396 | valor = self.entradaValor.get() 397 | descricao = self.entradaDescricao.get() 398 | tipser = 'Peça' 399 | hora = '1' 400 | 401 | self.cursor.execute(""" 402 | UPDATE servprod SET servprod = ? WHERE cod_sp = ?""", (servprod, cod_sp)) 403 | self.conn.commit() 404 | self.cursor.execute(""" 405 | UPDATE servprod SET tiposerv = ? WHERE cod_sp = ?""", (tipser, cod_sp)) 406 | self.conn.commit() 407 | self.cursor.execute(""" 408 | UPDATE servprod SET hor = ? WHERE cod_sp = ?""", (hora, cod_sp)) 409 | self.conn.commit() 410 | self.cursor.execute(""" 411 | UPDATE servprod SET id_marcaprod = ? WHERE cod_sp = ?""", (id_marcaprod, cod_sp)) 412 | self.conn.commit() 413 | self.cursor.execute(""" 414 | UPDATE servprod SET id_fornec = ? WHERE cod_sp = ?""", (id_fornec, cod_sp)) 415 | self.conn.commit() 416 | self.cursor.execute(""" 417 | UPDATE servprod SET custo = ? WHERE cod_sp = ?""", (custo, cod_sp)) 418 | self.conn.commit() 419 | self.cursor.execute(""" 420 | UPDATE servprod SET valor = ? WHERE cod_sp = ?""", (valor, cod_sp)) 421 | self.conn.commit() 422 | self.cursor.execute(""" 423 | UPDATE servprod SET descricao = ? WHERE cod_sp = ?""", (descricao, cod_sp)) 424 | self.conn.commit() 425 | self.listaServ.delete(*self.listaServ.get_children()) 426 | lista = self.cursor.execute(""" 427 | SELECT cod_sp, servprod, "R$", custo, "R$", valor FROM servprod 428 | WHERE sp = "P" ORDER BY servprod ASC; 429 | """) 430 | for i in lista: 431 | self.listaServ.insert("", END, values=i) 432 | 433 | self.desconecta_Glac() 434 | msg = "Produto alterado com sucesso" 435 | msg += "" 436 | messagebox.showinfo("GLAC ", msg) 437 | def OnDoubleClickP(self, event): 438 | self.limpa_produtoP() 439 | self.listaServ.selection() 440 | 441 | for n in self.listaServ.selection(): 442 | col1, col2, col3, col4, col5, col6 = self.listaServ.item(n, 'values') 443 | self.entradaCodprod.insert(END, col1) 444 | 445 | self.carrega_produtoP() -------------------------------------------------------------------------------- /Relatorios.py: -------------------------------------------------------------------------------- 1 | import reportlab.lib.colors 2 | from reportlab.pdfgen import canvas 3 | from reportlab.lib.colors import lightslategray, lightgrey, aliceblue, grey, whitesmoke 4 | import webbrowser 5 | from tkinter import Toplevel 6 | from tkinter import ttk 7 | from tkinter import * 8 | from pdf2image import convert_from_path 9 | 10 | class PrintRel(): 11 | def Gerador_front(self): 12 | self.win_make_reports = Toplevel() 13 | self.win_make_reports.title("Gerador de Relatorios") 14 | self.win_make_reports.geometry("850x570+120+200") 15 | self.win_make_reports.configure(background="#37586B") 16 | self.win_make_reports.resizable(False, False) 17 | self.win_make_reports.transient(self.window_one) 18 | self.win_make_reports.focus_force() 19 | self.win_make_reports.grab_set() 20 | 21 | self.entry5 = StringVar() 22 | self.entry5.set("Valores a receber") 23 | self.entry5V = ["Valores a receber", "Lista de Clientes", "Imprime orçamento"] 24 | 25 | self.entrada = OptionMenu(self.win_make_reports, self.entry5, *self.entry5V) 26 | self.entrada.place(x=85, y=15, width=200, height=30) 27 | 28 | ### Botao Carrega 29 | botaoAdd = Button(self.win_make_reports, text="Carregar") 30 | botaoAdd.place(x=300, y=15, width=130, height=30) 31 | 32 | self.win_make_reports.mainloop() 33 | def VarRel(self): 34 | self.dados_login() 35 | sh = self.gc.open_by_key(self.planilha_login_code) 36 | ws = sh.worksheet('Página1') 37 | 38 | nome_oficina = str("F" + str(self.linha_senha)) 39 | rua = str("G" + str(self.linha_senha)) 40 | bairro = str("I" + str(self.linha_senha)) 41 | municipio = str("J" + str(self.linha_senha)) 42 | telefone = str("H" + str(self.linha_senha)) 43 | 44 | self.nome_oficina2 = ws.acell(nome_oficina).value 45 | self.rua2 = ws.acell(rua).value 46 | self.bairro2 = ws.acell(bairro).value 47 | self.municipio2 = ws.acell(municipio).value 48 | self.telefone2 = ws.acell(telefone).value 49 | 50 | self.dia_Rr = self.entradaDataorc.get() 51 | 52 | self.lista1_rR = self.listaCol2a.get() 53 | self.colquanrt1_R = self.listaCol3a.get() 54 | self.colunitr1_R = self.listaCol4a.get() 55 | self.coltotral1_R = self.listaCol5a.get() 56 | def Cabecalho(self): 57 | self.c.setFillColor(grey) 58 | self.c.setFont("Helvetica-Bold", 12) 59 | self.c.drawString(220, 830, self.nome_oficina2) 60 | self.c.setFont("Helvetica", 11) 61 | self.c.drawString(220, 810, self.rua2 + " " + self.bairro2) 62 | self.c.drawString(220, 790, self.municipio2 + " " + "Telefone: " + self.telefone2 + " " + "Tecnico:" + self.entradaTecnico.get()) 63 | 64 | self.c.setFont("Helvetica", 8) 65 | self.c.drawString(400, 10, "RfZorzi Sistemas - https://www.rfzorzi.com") 66 | 67 | self.c.setFont("Helvetica-Bold", 24) 68 | #### MOLDURA E TITULOS DO RELATORIO 69 | try: 70 | self.c.drawInlineImage("logoempresa.jpg", 17, 770, 200, 70) 71 | except: 72 | self.c.drawString(220, 790, 'Seu Logo') 73 | 74 | self.linha = self.c 75 | self.linha.setFillColor(whitesmoke) 76 | # moldura 77 | self.linha.rect(15, 665, 570, 68, fill=True, stroke=False) 78 | self.linha.rect(15, 600, 570, 55, fill=True, stroke=False) 79 | 80 | self.linha.setFillColor(lightgrey) 81 | self.linha.rect(17, 711, 566, 1, fill=True, stroke=False) 82 | self.linha.rect(17, 696, 566, 1, fill=True, stroke=False) 83 | self.linha.rect(17, 681, 566, 1, fill=True, stroke=False) 84 | self.linha.rect(17, 615, 566, 1, fill=True, stroke=False) 85 | self.linha.rect(17, 630, 566, 1, fill=True, stroke=False) 86 | self.linha.setFillColor(whitesmoke) 87 | 88 | self.c.setFillColor(lightslategray) 89 | self.c.setFont("Helvetica-Bold", 12) 90 | 91 | self.c.drawString(15, 755, 'Entrada: ' + self.listInicio.get()) 92 | self.c.drawString(480, 755, 'Saida: ' + self.listFim.get()) 93 | 94 | self.c.drawString(240, 720, "Dados Do Cliente") 95 | self.c.setFont("Helvetica-Bold", 10) 96 | self.c.drawString(16, 700, "Nome:") 97 | self.c.drawString(320, 700, "Fone:") 98 | self.c.drawString(435, 700, "Cpf / Cnpj:") 99 | self.c.drawString(16, 685, "Endereco:") 100 | self.c.drawString(16, 671, "Cidade:") 101 | self.c.drawString(540, 671, "Uf:") 102 | 103 | self.c.setFont("Helvetica-Bold", 12) 104 | self.c.drawString(240, 640, "Dados Do Veículo") 105 | 106 | self.c.setFont("Helvetica-Bold", 10) 107 | self.c.drawString(16, 620, "Placa:") 108 | self.c.drawString(120, 620, "Veiculo:") 109 | self.c.drawString(475, 620, "Cor:") 110 | self.c.drawString(16, 605, "Combustivel:") 111 | self.c.drawString(475, 605, "Km:") 112 | 113 | self.c.setFont("Helvetica", 10) 114 | self.c.drawString(50, 700, self.listNome.get()) 115 | self.c.drawString(355, 700, self.listFone.get()) 116 | self.c.drawString(490, 700, self.listCpf.get()) 117 | self.c.drawString(70, 685, self.listEndereco.get()) 118 | 119 | self.c.drawString(70, 671, self.listMunicipio.get()) 120 | self.c.drawString(560, 671, self.listUf.get()) 121 | 122 | # DADOS DO AUTOMOVEL 123 | self.c.drawString(55, 620, self.placa.get()) 124 | self.c.drawString(165, 620, self.listMarca.get()) 125 | self.c.drawString(260, 620, self.listAut.get()) 126 | self.c.drawString(500, 620, self.listCor.get()) 127 | self.c.drawString(100, 605, self.listCombustivel.get()) 128 | self.c.drawString(500, 605, self.entradaObs.get()) 129 | self.c.setFont("Helvetica", 12) 130 | 131 | # VARIAVEIS DO RODAPE DO RELATORIO - DADOS DA EMPRESA 132 | 133 | def PrintOrc(self): 134 | try: 135 | webbrowser.open("file:///c:/glacx/Orcamento.pdf") 136 | except: 137 | webbrowser.open("file:///home/rfz/Orcamento.pdf") 138 | def imprime_orc(self): 139 | self.VarRel() 140 | # Gerar Relatorio de orçamento 141 | try: 142 | self.c = canvas.Canvas("c:\glacx\Orcamento.pdf") 143 | except: 144 | self.c = canvas.Canvas("file:///home/rfz/Orcamento.pdf") 145 | 146 | self.linha = self.c 147 | self.linha.setFillColor(whitesmoke) 148 | self.linha.rect(15, 540, 570, 47, fill=True, stroke=False) 149 | self.linha.rect(15, 490, 570, 47, fill=True, stroke=False) 150 | 151 | self.Cabecalho() 152 | 153 | self.linha.setFillColor(grey) 154 | self.c.drawString(15, 475, "Produtos / Servicos") 155 | 156 | self.c.setFont("Helvetica", 12) 157 | 158 | self.c.setFillColor(lightslategray) 159 | self.c.drawString(230, 755, self.Tipvar.get() + " Nº " + self.listaNumOrc.get()) 160 | 161 | self.c.setFont("Helvetica", 9) 162 | 163 | #### TEXTO DE DESCRICAO DOS PROBLEMAS 164 | self.descp1 = self.area1.get('1.0', 'end-1c') 165 | self.c.drawString(40, 560, self.descp1[0:125]) 166 | self.c.drawString(20, 545, self.descp1[125:259]) 167 | self.c.drawString(40, 510, self.area3.get('1.0', 'end-1c')[0:125]) 168 | self.c.drawString(20, 495, self.area3.get('1.0', 'end-1c')[125:259]) 169 | 170 | self.c.setFont("Helvetica-Bold", 10) 171 | self.c.drawString(15, 575, "Problemas relatados pelo cliente") 172 | self.c.drawString(15, 525, "Serviços realizados") 173 | 174 | 175 | self.c.setFont("Helvetica-Bold", 9) 176 | self.c.drawString(17, 462, "Item") 177 | self.c.drawString(200, 462, "Descricao") 178 | self.c.drawString(482, 462, "Quant") 179 | self.c.drawString(425, 462, "Valor Unit") 180 | self.c.drawString(525, 462, "Total Unit") 181 | 182 | self.c.setFont("Helvetica", 8) 183 | 184 | # DESCRIÇÃO DOS ITENS DO ORÇAMENTO 185 | self.conecta_Glac() 186 | 187 | self.cursor.execute("""SELECT ordem_item, desc_item, "R$", valor, quant, "R$", total 188 | FROM orcamento2 WHERE id_orc2 = '%s' """ % self.listaNumOrc.get()) 189 | rows = self.cursor.fetchall() 190 | 191 | self.linha.rect(13, 470, 570, 0.5, fill=True, stroke=False) 192 | self.linha.rect(13, 460, 570, 0.5, fill=True, stroke=False) 193 | self.linha.rect(13, 460, 1, 10, fill=True, stroke=False) 194 | self.linha.rect(40, 460, 1, 10, fill=True, stroke=False) 195 | self.linha.rect(420, 460, 1, 10, fill=True, stroke=False) 196 | self.linha.rect(475, 460, 1, 10, fill=True, stroke=False) 197 | self.linha.rect(515, 460, 1, 10, fill=True, stroke=False) 198 | self.linha.rect(583, 460, 1, 10, fill=True, stroke=False) 199 | x = 462 200 | linhaItem = 460 201 | for row in rows: 202 | row = list(row) 203 | x -= 10 204 | self.c.drawString(25, x, str(row[0])) 205 | self.c.drawString(45, x, str(row[1])) 206 | self.c.drawString(430, x, str(row[2:4]).replace("[","").replace("]","").replace("'","").replace(",","")) 207 | self.c.drawString(480, x, str(row[4])) 208 | self.c.drawString(520, x, str(row[5:7]).replace("[","").replace("]","").replace("'","").replace(",","")) 209 | linhaItem -= 10 210 | self.linha.rect(13, linhaItem, 570, 0.5, fill=True, stroke=False) 211 | self.linha.rect(13, linhaItem, 1, 10, fill=True, stroke=False) 212 | self.linha.rect(40, linhaItem, 1, 10, fill=True, stroke=False) 213 | self.linha.rect(420, linhaItem, 1, 10, fill=True, stroke=False) 214 | self.linha.rect(475, linhaItem, 1, 10, fill=True, stroke=False) 215 | self.linha.rect(515, linhaItem, 1, 10, fill=True, stroke=False) 216 | self.linha.rect(583, linhaItem, 1, 10, fill=True, stroke=False) 217 | linhaItem -= 10 218 | self.c.drawString(500, linhaItem, "Total:" + "R$" + self.entradatotal.get()) 219 | 220 | self.desconecta_Glac() 221 | 222 | self.c.showPage() 223 | 224 | self.c.save() 225 | self.PrintOrc() 226 | def PrintVist(self): 227 | webbrowser.open("file:///c:/glacx/Vistoria.pdf") 228 | def imprime_vist(self): 229 | self.VarRel() 230 | self.c = canvas.Canvas("c:\glacx\Vistoria.pdf") 231 | 232 | self.c.setFont("Helvetica-Bold", 16) 233 | self.c.drawString(200, 755, "Vistoria do Veiculo" + "Nº " + self.listaNumOrc.get()) 234 | 235 | self.linha = self.c 236 | self.linha.setFillColor(lightgrey) 237 | self.linha.rect(35, 538, 530, 20, fill=True, stroke=False) 238 | self.linha.rect(35, 498, 530, 20, fill=True, stroke=False) 239 | self.linha.rect(35, 458, 530, 20, fill=True, stroke=False) 240 | self.linha.rect(35, 418, 530, 20, fill=True, stroke=False) 241 | self.linha.rect(35, 378, 530, 20, fill=True, stroke=False) 242 | self.linha.rect(35, 338, 530, 20, fill=True, stroke=False) 243 | self.linha.rect(35, 298, 530, 20, fill=True, stroke=False) 244 | self.linha.rect(35, 258, 530, 20, fill=True, stroke=False) 245 | self.linha.rect(35, 218, 530, 20, fill=True, stroke=False) 246 | 247 | self.Cabecalho() 248 | self.c.setFont("Helvetica", 16) 249 | self.c.drawString(17, 568, "Itens Vistoriados") 250 | 251 | # Vistoria variaveis 252 | self.codVist_R = self.listaNumOrc.get() 253 | self.tanque_R = self.are1.get() 254 | self.odometro_R = self.are2.get() 255 | self.radio_R = self.are3.get() 256 | self.calota_R = self.are4.get() 257 | self.triangulo_R = self.are5.get() 258 | self.macaco_R = self.are6.get() 259 | self.estepe_R = self.are7.get() 260 | self.obs1_R = self.are8.get() 261 | self.obs2_R = self.are9.get() 262 | 263 | self.c.setFont("Helvetica-Bold", 14) 264 | # 265 | self.c.drawString(35, 540, "Tanque") 266 | self.c.drawString(35, 500, "Odometro") 267 | self.c.drawString(35, 460, 'Obs 1:') 268 | self.c.drawString(35, 420, 'Obs 2:') 269 | self.c.drawString(35, 380, 'Obs 3:') 270 | self.c.drawString(35, 340, 'Obs 4:') 271 | self.c.drawString(35, 300, 'Obs 5:') 272 | self.c.drawString(35, 260, 'Obs 6:') 273 | self.c.drawString(35, 220, 'Obs 7:') 274 | 275 | self.c.drawString(250, 540, self.tanque_R) 276 | self.c.drawString(200, 500, self.odometro_R) 277 | self.c.drawString(100, 460, self.radio_R) 278 | self.c.drawString(100, 420, self.calota_R) 279 | self.c.drawString(100, 380, self.triangulo_R) 280 | self.c.drawString(100, 340, self.macaco_R) 281 | self.c.drawString(100, 300, self.estepe_R) 282 | self.c.drawString(100, 260, self.obs1_R) 283 | self.c.drawString(100, 220, self.obs2_R) 284 | 285 | self.c.setFont("Helvetica-Bold", 12) 286 | self.c.drawString(35, 200, "Confirmo que deixei o veiculo nas condições descritas:") 287 | self.c.drawString(35, 170, "Assinatura:") 288 | 289 | # MOLDURAS DO RELATORIO 290 | self.c.rect(13, 155, 2, 427, fill=True, stroke=False) 291 | self.c.rect(14, 155, 572, 2, fill=True, stroke=False) 292 | self.c.rect(585, 155, 2, 427, fill=True, stroke=False) 293 | self.c.rect(13, 582, 572, 2, fill=True, stroke=False) 294 | 295 | self.c.save() 296 | 297 | self.PrintVist() 298 | def Print_lista_clientes(self): 299 | webbrowser.open("file:///c:/glacx/ListaClientes.pdf") 300 | def Imprime_lista_clientes(self): 301 | self.VarRel() 302 | # Gerar Relatorio de orçamento 303 | self.c = canvas.Canvas("c:\glacx\ListaClientes.pdf") 304 | self.c.setFont("Helvetica-Bold", 24) 305 | try: 306 | self.c.drawInlineImage("logoempresa.jpg", 150, 770, 300, 70) 307 | except: 308 | self.c.drawString(220, 790, "SeuLogo") 309 | self.c.setFont("Helvetica-Bold", 14) 310 | 311 | self.c.drawString(250, 750, "Lista de Clientes") 312 | self.c.setFont("Helvetica", 12) 313 | 314 | self.linha = self.c 315 | self.linha.setFillColor(lightgrey) 316 | 317 | self.c.setFillColor(lightslategray) 318 | 319 | # MOLDURAS DO RELATORIO 320 | 321 | self.c.setFont("Helvetica", 10) 322 | 323 | self.c.setFont("Helvetica-Bold", 9) 324 | self.c.drawString(17, 712, "Codigo") 325 | self.c.drawString(70, 712, "Nome") 326 | self.c.drawString(240, 712, "Telefone") 327 | self.c.drawString(310, 712, "Endereço") 328 | self.linha.rect(13, 710, 560, 0.5, fill=True, stroke=False) 329 | self.linha.rect(13, 725, 560, 0.5, fill=True, stroke=False) 330 | self.linha.rect(13, 710, 1, 15, fill=True, stroke=False) 331 | self.linha.rect(55, 710, 1, 15, fill=True, stroke=False) 332 | self.linha.rect(230, 710, 1, 15, fill=True, stroke=False) 333 | self.linha.rect(300, 710, 1, 15, fill=True, stroke=False) 334 | self.linha.rect(583, 710, 1, 15, fill=True, stroke=False) 335 | 336 | 337 | self.c.setFont("Helvetica", 8) 338 | 339 | # DESCRIÇÃO 340 | self.conecta_Glac() 341 | 342 | self.cursor.execute("""SELECT cod_cli, SUBSTR(nome, 1, 35), fone1ddd, SUBSTR(fone1, 1, 10), 343 | SUBSTR(endereco, 1, 30), SUBSTR(numcasa, 1, 4), SUBSTR(municipio, 1, 20) 344 | FROM clientes ORDER BY nome ASC; """) 345 | rows = self.cursor.fetchall() 346 | x = 712 347 | linhaItem = 710 348 | for row in rows: 349 | row = list(row) 350 | x -= 12 351 | row2 = str(row[2]).replace("[", "").replace(",", "") 352 | row3 = str(row[3]).replace("[", "").replace(",", "") 353 | row4 = str(row[4]).replace("[", "").replace(",", "") 354 | row5 = str(row[5]).replace("[", "").replace(",", "") 355 | row6 = str(row[6]).replace("[", "").replace(",", "") 356 | 357 | self.c.drawString(25, x, str(row[0])) 358 | self.c.drawString(64, x, str(row[1])) 359 | self.c.drawString(240, x, row2 + row3) 360 | self.c.drawString(304, x, row4 + " - " + row5 + " - " + row6) 361 | linhaItem -= 12 362 | self.linha.rect(13, linhaItem, 570, 0.5, fill=True, stroke=False) 363 | self.linha.rect(13, linhaItem, 1, 12, fill=True, stroke=False) 364 | self.linha.rect(55, linhaItem, 1, 12, fill=True, stroke=False) 365 | self.linha.rect(230, linhaItem, 1, 12, fill=True, stroke=False) 366 | self.linha.rect(300, linhaItem, 1, 12, fill=True, stroke=False) 367 | self.linha.rect(583, linhaItem, 1, 12, fill=True, stroke=False) 368 | 369 | self.desconecta_Glac() 370 | 371 | self.c.setFont("Helvetica", 12) 372 | 373 | self.c.showPage() 374 | self.c.save() 375 | self.Print_lista_clientes() 376 | def Print_valores_a_receber(self): 377 | webbrowser.open("file:///c:/glacx/Valoresareceber.pdf") 378 | def Imprime_valores_a_receber(self): 379 | self.VarRel() 380 | # Gerar Relatorio de orçamento 381 | self.c = canvas.Canvas("c:\glacx\Valoresareceber.pdf") 382 | self.c.setFont("Helvetica-Bold", 24) 383 | try: 384 | self.c.drawInlineImage("logoempresa.jpg", 150, 770, 300, 70) 385 | except: 386 | self.c.drawString(220, 790, "SeuLogo") 387 | self.c.setFont("Helvetica-Bold", 14) 388 | 389 | self.c.drawString(250, 750, "Valores a receber") 390 | self.c.setFont("Helvetica", 12) 391 | 392 | self.linha = self.c 393 | self.linha.setFillColor(lightgrey) 394 | 395 | self.c.setFillColor(lightslategray) 396 | 397 | # MOLDURAS DO RELATORIO 398 | 399 | self.c.setFont("Helvetica", 10) 400 | 401 | self.c.setFont("Helvetica-Bold", 9) 402 | self.c.drawString(25, 712, "Nome") 403 | self.c.drawString(170, 712, "Numero O.S") 404 | self.c.drawString(230, 712, "Tipo de pagamento") 405 | self.c.drawString(330, 712, "Valor total") 406 | self.c.drawString(410, 712, "Valor pago") 407 | self.c.drawString(490, 712, "Valor a receber") 408 | 409 | self.linha.rect(13, 710, 560, 0.5, fill=True, stroke=False) 410 | self.linha.rect(13, 725, 560, 0.5, fill=True, stroke=False) 411 | self.linha.rect(11, 710, 1, 15, fill=True, stroke=False) 412 | self.linha.rect(168, 710, 1, 15, fill=True, stroke=False) 413 | self.linha.rect(228, 710, 1, 15, fill=True, stroke=False) 414 | self.linha.rect(328, 710, 1, 15, fill=True, stroke=False) 415 | self.linha.rect(408, 710, 1, 15, fill=True, stroke=False) 416 | self.linha.rect(488, 710, 1, 15, fill=True, stroke=False) 417 | self.linha.rect(573, 710, 1, 15, fill=True, stroke=False) 418 | 419 | self.c.setFont("Helvetica", 8) 420 | 421 | # Nome 422 | self.conecta_Glac() 423 | 424 | self.cursor.execute("""select distinct nome, SUBSTR(id_orc1, 1, 10), SUBSTR(tipopag, 1, 30), totalizador, 425 | (select sum(valordeduzir) from formapag where id_orc1 = ordem ), 426 | totalizador - (select sum(valordeduzir) from formapag where id_orc1 = ordem ) 427 | from clientes, orcamento1, formapag 428 | where cod_cli = cliente_orc and id_orc1 = ordem 429 | order by nome asc; """) 430 | rows = self.cursor.fetchall() 431 | x = 712 432 | linhaItem = 710 433 | for row in rows: 434 | row = list(row) 435 | row1 = row[0].replace('(', '').replace(',)', '').replace("'", "").replace(")", "") 436 | row3 = row[2].replace('(', '').replace(',)', '').replace("'", "").replace(")", "") 437 | x -= 12 438 | self.c.drawString(25, x, row1[0:25]) 439 | self.c.drawString(170, x, row[1]) 440 | self.c.drawString(230, x, row3) 441 | self.c.drawString(330, x, "R$" + str(row[3])) 442 | self.c.drawString(410, x, "R$" + str(row[4])) 443 | self.c.drawString(490, x, "R$" + str("{:.2f}".format(round(row[5], 2)))) 444 | linhaItem -= 12 445 | self.linha.rect(13, linhaItem, 560, 0.5, fill=True, stroke=False) 446 | self.linha.rect(11, linhaItem, 1, 15, fill=True, stroke=False) 447 | self.linha.rect(168, linhaItem, 1, 15, fill=True, stroke=False) 448 | self.linha.rect(228, linhaItem, 1, 15, fill=True, stroke=False) 449 | self.linha.rect(328, linhaItem, 1, 15, fill=True, stroke=False) 450 | self.linha.rect(408, linhaItem, 1, 15, fill=True, stroke=False) 451 | self.linha.rect(488, linhaItem, 1, 15, fill=True, stroke=False) 452 | self.linha.rect(573, linhaItem, 1, 15, fill=True, stroke=False) 453 | self.desconecta_Glac() 454 | 455 | 456 | self.c.setFont("Helvetica", 12) 457 | 458 | self.c.showPage() 459 | self.c.save() 460 | self.Print_valores_a_receber() 461 | 462 | def Print_lista_clientes_aniversariantes(self): 463 | pass 464 | def Imprime_lista_clientes_aniversariantes(self): 465 | pass 466 | def Print_clientesXveiculos(self): 467 | pass 468 | def Imprime_clientesXveiculos(self): 469 | pass 470 | def Print_ordens_por_cliente(self): 471 | pass 472 | def Imprime_ordens_por_cliente(self): 473 | pass 474 | def Print_servicos_mais_realizados(self): 475 | pass 476 | def Imprime_servicos_mais_realizados(self): 477 | pass -------------------------------------------------------------------------------- /Estoque.py: -------------------------------------------------------------------------------- 1 | from tkWidgetsRfzorzi.widgets_Glac import * 2 | from tkinter import ttk 3 | from tkcalendar import * 4 | from tkinter import messagebox 5 | from tkinter import * 6 | from datetime import * 7 | import brazilcep 8 | from brazilcep import get_address_from_cep, WebService 9 | 10 | class CadEstoque: 11 | def cadest(self): 12 | self.janelaEst = Toplevel() 13 | self.janelaEst.title(self.m_Estoque) 14 | self.janelaEst.geometry("790x355+100+150") 15 | self.janelaEst.configure(background="gray50") 16 | self.janelaEst.resizable(FALSE, FALSE) 17 | self.janelaEst.transient(self.janela) 18 | self.janelaEst.focus_force() 19 | self.janelaEst.grab_set() 20 | 21 | self.conecta_Glac() 22 | abas = ttk.Notebook(self.janelaEst) 23 | self.frame_aba1 = Frame(abas) 24 | self.frame_aba1.configure(background="gray40") 25 | self.frame_aba2 = Frame(abas) 26 | self.frame_aba2.configure(background="gray40") 27 | frame_aba1 = self.frame_aba1 28 | frame_aba2 = self.frame_aba2 29 | 30 | label1 = Label(frame_aba1).pack(padx=390, pady=155) 31 | label2 = Label(frame_aba2).pack(padx=390, pady=155) 32 | 33 | abas.add(frame_aba1, text=self.m_Cadastro + ' ' + self.m_Produtos) 34 | abas.add(frame_aba2, text=self.m_MovimentaEst) 35 | abas.place(x=0, y=0) 36 | 37 | frameProb = GradientFrame(frame_aba1) 38 | frameProb.place(x=0, y=0, relwidth=1, relheight=1) 39 | 40 | descrCodprod = LabelGlac(frame_aba1, self.m_Codigo) 41 | descrCodprod.place(x=2, y=15, width=80, height=25) 42 | 43 | ## Label produtos 44 | descrProd = LabelGlac(frame_aba1, self.m_Produtos) 45 | descrProd.place(x=2, y=45, width=80, height=25) 46 | 47 | ### Botao Carrega 48 | botaoAdd = ButtonGlac(frame_aba1, self.m_Carregar, self.carrega_produtoE) 49 | botaoAdd.place(x=140, y=5, width=90, height=35) 50 | 51 | ### Botao limpa 52 | botaolimpa = ButtonGlac(frame_aba1, self.m_Limpar, self.limpa_produtoE) 53 | botaolimpa.place(x=260, y=5, width=70, height=35) 54 | 55 | ### Botao busca 56 | botaoBusca = ButtonGlac(frame_aba1, self.m_Buscar, self.busca_produtoE) 57 | botaoBusca.place(x=260, y=40, width=70, height=33) 58 | 59 | ### Botao Marca Produto 60 | descrIdMarcaprod = ButtonGlac(frame_aba1, self.m_Marca, self.busca_marcaE) 61 | descrIdMarcaprod.place(x=2, y=70, width=98, height=35) 62 | 63 | ## Entry codigo 64 | self.entradaCodprod = Entry(frame_aba1) 65 | self.entradaCodprod.configure(validate="key", validatecommand=self.vcmd6) 66 | self.entradaCodprod.place(x=80, y=15, width=60, height=25) 67 | 68 | ## Entry descrição Produto 69 | self.entradaProd = Entry(frame_aba1) 70 | self.entradaProd.place(x=80, y=45, width=180, height=25) 71 | 72 | self.entradaIdMarcaprod = Entry(frame_aba1) 73 | # widget oculto, sem place 74 | 75 | self.entradaMarcaprod = Entry(frame_aba1) 76 | self.entradaMarcaprod.place(x=100, y=75, width=230, height=25) 77 | 78 | descrIdFornec = ButtonGlac(frame_aba1, self.m_Fornecedor, self.busca_fornecE) 79 | descrIdFornec.place(x=2, y=102, width=98, height=33) 80 | 81 | self.entradaIdFornec = Entry(frame_aba1) 82 | 83 | self.entradaFornec = Entry(frame_aba1) 84 | self.entradaFornec.place(x=100, y=105, width=230, height=25) 85 | 86 | descrCusto = LabelGlac(frame_aba1, self.m_Custo_R) 87 | descrCusto.place(x=2, y=135, width=85, height=25) 88 | 89 | self.entradaCusto = Entry(frame_aba1) 90 | self.entradaCusto.configure(validate="key", validatecommand=self.vcmd8float) 91 | self.entradaCusto.place(x=87, y=135, width=80, height=25) 92 | 93 | descrValor = LabelGlac(frame_aba1, self.m_Valor_R) 94 | descrValor.place(x=162, y=135, width=85, height=25) 95 | 96 | self.entradaValor = Entry(frame_aba1) 97 | self.entradaValor.configure(validate="key", validatecommand=self.vcmd8float) 98 | self.entradaValor.place(x=247, y=135, width=82, height=25) 99 | 100 | descrDescricao = LabelGlac(frame_aba1, self.m_Descricao) 101 | descrDescricao.place(x=16, y=175, width=312, height=25) 102 | 103 | self.entradaDescricao = Entry(frame_aba1) 104 | self.entradaDescricao.place(x=16, y=195, width=312, height=25) 105 | 106 | botaoAdd = ButtonGlac(frame_aba1, self.m_Novo, self.add_produtoE) 107 | botaoAdd.place(x=30, y=270, width=80, height=35) 108 | 109 | botaoMudServ = ButtonGlac(frame_aba1, self.m_Alterar, self.mud_produtoE) 110 | botaoMudServ.place(x=130, y=270, width=80, height=35) 111 | 112 | botaoDel = ButtonGlac(frame_aba1, self.m_Apagar, self.del_produtoE) 113 | botaoDel.place(x=230, y=270, width=80, height=35) 114 | 115 | ### Widgets - Listar produtos ### 116 | self.listaServ = ttk.Treeview(frame_aba1, height=10, 117 | column=("col1", "col2", "col3", "col4", "col5", "col6")) 118 | self.listaServ.heading("#0", text="") 119 | self.listaServ.heading("#1", text=self.m_Codigo) 120 | self.listaServ.heading("#2", text=self.m_Produtos) 121 | self.listaServ.heading("#3", text="") 122 | self.listaServ.heading("#4", text=self.m_Custo_R) 123 | self.listaServ.heading("#5", text="") 124 | self.listaServ.heading("#6", text=self.m_Valor_R) 125 | 126 | self.listaServ.column("#0", width=0) 127 | self.listaServ.column("#1", width=60) 128 | self.listaServ.column("#2", width=140) 129 | self.listaServ.column("#3", width=25) 130 | self.listaServ.column("#4", width=65) 131 | self.listaServ.column("#5", width=25) 132 | self.listaServ.column("#6", width=85) 133 | 134 | # Cria barra de rolagem 135 | self.barra = ttk.Scrollbar(frame_aba1, orient='vertical', command=self.listaServ.yview) 136 | # Adiciona barra de rolagem 137 | self.listaServ.configure(yscroll=self.barra.set) 138 | self.barra.place(x=755, y=17, height=300) 139 | 140 | lista = self.cursor.execute("""SELECT cod_sp, servprod, "R$", custo, "R$", valor 141 | FROM servprod WHERE sp = "P" ORDER BY servprod ASC ; """) 142 | for i in lista: 143 | self.listaServ.insert("", END, values=i) 144 | self.listaServ.place(x=340, y=15, width=418, height=300) 145 | self.listaServ.bind("", self.OnDoubleClickE) 146 | 147 | # Cabeçalho dos itens_orc 1 A 10 - Aba 2 148 | frameItens = GradientFrame(frame_aba2) 149 | frameItens.place(x=0, y=0, relwidth=1, relheight=1) 150 | 151 | # Produto 152 | produto_aba2label = LabelGlac(frame_aba2, self.m_Produtos) 153 | produto_aba2label.place(x=10, y=2, width=180, height=20) 154 | 155 | self.codproduto2 = Entry(frame_aba2) 156 | 157 | self.produto_aba2 = Entry(frame_aba2) 158 | self.produto_aba2.place(x=10, y=20, width=180, height=25) 159 | 160 | #### Entrada 161 | quant_aba2label = LabelGlac(frame_aba2, self.m_Entrada) 162 | quant_aba2label.place(x=10, y=50, width=80, height=25) 163 | 164 | self.quant_aba2 = Entry(frame_aba2) 165 | self.quant_aba2.configure(validate="key", validatecommand=self.vcmd8float) 166 | self.quant_aba2.place(x=90, y=50, width=100, height=25) 167 | self.quant_aba2.insert(END, 0) 168 | 169 | #### Saida 170 | saida_aba2label = LabelGlac(frame_aba2, self.m_Saida) 171 | saida_aba2label.place(x=10, y=80, width=80, height=25) 172 | 173 | self.saida_aba2 = Entry(frame_aba2) 174 | self.saida_aba2.configure(validate="key", validatecommand=self.vcmd8float) 175 | self.saida_aba2.place(x=90, y=80, width=100, height=25) 176 | self.saida_aba2.insert(0, 0) 177 | 178 | #### Custo 179 | custo_aba2label = LabelGlac(frame_aba2, self.m_Custo_R) 180 | custo_aba2label.place(x=10, y=110, width=80, height=25) 181 | 182 | self.custo_aba2 = Entry(frame_aba2) 183 | self.custo_aba2.configure(validate="key", validatecommand=self.vcmd8float) 184 | self.custo_aba2.place(x=90, y=110, width=100, height=25) 185 | 186 | #### Data 187 | data_aba2label = LabelGlac(frame_aba2, self.m_Data + self.m_Pontinhos + self.m_DataMasc) 188 | data_aba2label.place(x=10, y=140, width=180, height=25) 189 | 190 | self.dia_aba2 = DateEntry(frame_aba2, locale='pt_BR') 191 | self.dia_aba2.place(x=90, y=140, height=25) 192 | 193 | #### Lote 194 | lote_aba2label = LabelGlac(frame_aba2, self.m_Lote) 195 | lote_aba2label.place(x=10, y=170, width=80, height=25) 196 | 197 | self.lote_aba2 = Entry(frame_aba2) 198 | self.lote_aba2.place(x=90, y=170, width=100, height=25) 199 | 200 | #### Validade 201 | valid_aba2label = LabelGlac(frame_aba2, self.m_Validade) 202 | valid_aba2label.place(x=10, y=200, width=80, height=25) 203 | 204 | self.diaV_aba2 = DateEntry(frame_aba2, locale='pt_BR') 205 | self.diaV_aba2.place(x=90, y=200, height=25) 206 | 207 | darEntrada = ButtonGlac(frame_aba2, self.m_InserirRegistro, self.add_movE) 208 | darEntrada.place(x=40, y=280, width=140, height=35) 209 | 210 | quantestlabel = LabelGlac(frame_aba2, self.m_Quant + ' ' + self.m_Estoque) 211 | quantestlabel.place(x=430, y=290, width=150, height=25) 212 | 213 | self.quantest = Entry(frame_aba2) 214 | self.quantest.place(x=580, y=290, width=100, height=25) 215 | 216 | ### Widgets - Listar produtos ### 217 | self.listaMov = ttk.Treeview(frame_aba2, height=10, 218 | column=("col1", "col2", "col3", "col4", "col5", "col6", "col7")) 219 | self.listaMov.heading("#0", text="") 220 | self.listaMov.heading("#1", text=self.m_Lote) 221 | self.listaMov.heading("#2", text="Entr") 222 | self.listaMov.heading("#3", text="Said") 223 | self.listaMov.heading("#4", text="Custo") 224 | self.listaMov.heading("#5", text=self.m_Data) 225 | self.listaMov.heading("#6", text="Forn") 226 | self.listaMov.heading("#7", text=self.m_Validade) 227 | 228 | self.listaMov.column("#0", width=1) 229 | self.listaMov.column("#1", width=65) 230 | self.listaMov.column("#2", width=60) 231 | self.listaMov.column("#3", width=60) 232 | self.listaMov.column("#4", width=60) 233 | self.listaMov.column("#5", width=110) 234 | self.listaMov.column("#6", width=80) 235 | self.listaMov.column("#7", width=110) 236 | 237 | # Cria barra de rolagem 238 | self.barraMov = ttk.Scrollbar(frame_aba2, orient='vertical', command=self.listaMov.yview) 239 | 240 | # Adiciona barra de rolagem 241 | self.listaMov.configure(yscroll=self.barraMov.set) 242 | self.barraMov.place(x=755, y=20, height=220) 243 | 244 | # Adiciona barra de rolagem 245 | self.listaMov.place(x=210, y=20) 246 | self.listaMov.bind("", self.OnDoubleClickE) 247 | 248 | self.desconecta_Glac() 249 | self.janelaEst.mainloop() 250 | def add_movE(self): 251 | self.conecta_Glac() 252 | 253 | cod2 = self.codproduto2.get() 254 | prod2 = self.produto_aba2.get() 255 | dia = self.dia_aba2.get() 256 | lote = self.lote_aba2.get() 257 | diaV = self.diaV_aba2.get() 258 | quant = self.quant_aba2.get() 259 | custo = self.custo_aba2.get() 260 | fornecedor = self.entradaIdFornec.get() 261 | saida = self.saida_aba2.get() 262 | self.listaMov.delete(*self.listaMov.get_children()) 263 | 264 | self.cursor.execute("""INSERT INTO movim_prod ( cod_p, entrada, custo, dia, 265 | lote, diaV, fornecedor, saida) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?)""", 266 | (cod2, quant, custo, dia, lote, diaV, fornecedor, saida)) 267 | self.conn.commit() 268 | 269 | msg = "Movimentação realizada.\n " 270 | msg += "" 271 | messagebox.showinfo("GLAC - Estoque", msg) 272 | 273 | lista1 = self.cursor.execute("""SELECT lote, entrada, saida, custo, dia, 274 | fornecedores.fornecedor, diaV FROM movim_prod, fornecedores 275 | WHERE cod_p = '%s' and movim_prod.fornecedor = fornecedores.cod_forn 276 | ORDER BY id ASC; """ % cod2) 277 | for i in lista1: 278 | self.listaMov.insert("", END, values=i) 279 | 280 | self.quantest.delete(0, END) 281 | 282 | lista2 = self.cursor.execute("""select Sum(entrada) - Sum(saida) 283 | from movim_prod where cod_p = '%s'""" % cod2) 284 | consultalista2 = self.cursor.fetchall() 285 | for i in consultalista2: 286 | self.quantest.insert(END, i) 287 | 288 | self.desconecta_Glac() 289 | def add_produtoE(self): 290 | self.conecta_Glac() 291 | cod_sp = self.entradaCodprod.get() 292 | servprod = self.entradaProd.get() 293 | id_marcaprod = self.entradaIdMarcaprod.get() 294 | id_fornec = self.entradaIdFornec.get() 295 | custo = self.entradaCusto.get() 296 | valor = self.entradaValor.get() 297 | descricao = self.entradaDescricao.get() 298 | 299 | self.cursor.execute(""" 300 | INSERT INTO servprod ( servprod, id_marcaprod, id_fornec, custo, valor, sp, descricao) 301 | VALUES ( ?, ?, ?, ?, ?, "P", ?)""", 302 | (servprod, id_marcaprod, id_fornec, custo, valor, descricao)) 303 | self.conn.commit() 304 | self.listaServ.delete(*self.listaServ.get_children()) 305 | lista = self.cursor.execute(""" 306 | SELECT cod_sp, servprod, "R$", custo, "R$", valor FROM servprod 307 | WHERE sp = "P" AND servprod LIKE '%s' ORDER BY servprod ASC; 308 | """ % servprod) 309 | for i in lista: 310 | self.listaServ.insert("", END, values=i) 311 | self.desconecta_Glac() 312 | def OnDoubleClickE(self, event): 313 | self.limpa_produtoE() 314 | self.listaServ.selection() 315 | for n in self.listaServ.selection(): 316 | col1, col2, col3, col4, col5, col6 = self.listaServ.item(n, 'values') 317 | self.entradaCodprod.insert(END, col1) 318 | self.carrega_produtoE() 319 | def mud_produtoE(self): 320 | self.conecta_Glac() 321 | 322 | cod_sp = self.entradaCodprod.get() 323 | servprod = self.entradaProd.get() 324 | id_marcaprod = self.entradaIdMarcaprod.get() 325 | id_fornec = self.entradaIdFornec.get() 326 | custo = self.entradaCusto.get() 327 | valor = self.entradaValor.get() 328 | descricao = self.entradaDescricao.get() 329 | self.cursor.execute("""UPDATE servprod SET servprod = ?, id_marcaprod = ?, 330 | id_fornec = ?, custo = ?, valor = ?, descricao = ? WHERE cod_sp = ?""", 331 | (servprod, id_marcaprod, id_fornec, custo, valor, descricao, cod_sp)) 332 | self.conn.commit() 333 | 334 | self.listaServ.delete(*self.listaServ.get_children()) 335 | lista = self.cursor.execute("""SELECT cod_sp, servprod, "R$", custo, "R$", valor 336 | FROM servprod WHERE sp = "P" ORDER BY servprod ASC; """) 337 | for i in lista: 338 | self.listaServ.insert("", END, values=i) 339 | self.desconecta_Glac() 340 | def limpa_produtoE(self): 341 | self.entradaProd.delete(0, END) 342 | self.entradaIdMarcaprod.delete(0, END) 343 | self.entradaIdFornec.delete(0, END) 344 | self.entradaCusto.delete(0, END) 345 | self.entradaValor.delete(0, END) 346 | self.entradaDescricao.delete(0, END) 347 | self.entradaMarcaprod.delete(0, END) 348 | self.entradaIdFornec.delete(0, END) 349 | self.entradaFornec.delete(0, END) 350 | self.entradaCodprod.delete(0, END) 351 | self.codproduto2.delete(0, END) 352 | self.produto_aba2.delete(0, END) 353 | self.custo_aba2.delete(0, END) 354 | def del_produtoE(self): 355 | self.conecta_Glac() 356 | cod_sp = self.entradaCodprod.get() 357 | self.cursor.execute("""DELETE FROM servprod WHERE cod_sp=?""", (cod_sp,)) 358 | conn.commit() 359 | self.listaServ.delete(*self.listaServ.get_children()) 360 | lista = self.cursor.execute("""SELECT cod_sp, servprod, "R$", custo, "R$", valor 361 | FROM servprod WHERE sp = "P" ORDER BY servprod ASC; """) 362 | for i in lista: 363 | self.listaServ.insert("", END, values=i) 364 | self.desconecta_Glac() 365 | def carrega_produtoE(self): 366 | self.conecta_Glac() 367 | cod_sp = self.entradaCodprod.get() 368 | prod = self.cursor 369 | cod2 = self.codproduto2.get() 370 | 371 | self.entradaProd.delete(0, END) 372 | self.entradaIdMarcaprod.delete(0, END) 373 | self.entradaIdFornec.delete(0, END) 374 | self.entradaCusto.delete(0, END) 375 | self.entradaValor.delete(0, END) 376 | self.entradaDescricao.delete(0, END) 377 | self.entradaMarcaprod.delete(0, END) 378 | self.entradaFornec.delete(0, END) 379 | self.codproduto2.delete(0, END) 380 | self.produto_aba2.delete(0, END) 381 | self.custo_aba2.delete(0, END) 382 | self.quantest.delete(0, END) 383 | self.listaMov.delete(*self.listaMov.get_children()) 384 | 385 | self.codproduto2.insert(END, cod_sp) 386 | self.cursor.execute("""SELECT servprod, id_marcaprod, marca, id_fornec, custo, 387 | valor, servprod.descricao 388 | FROM servprod, marcaprod WHERE cod_marca = id_marcaprod AND cod_sp = '%s'""" % cod_sp) 389 | consultaprod = self.cursor.fetchall() 390 | for i in consultaprod: 391 | self.entradaProd.insert(END, i[0]) 392 | self.produto_aba2.insert(END, i[0]) 393 | self.entradaIdMarcaprod.insert(END, i[1]) 394 | self.entradaMarcaprod.insert(END, i[2]) 395 | self.entradaIdFornec.insert(END, i[3]) 396 | self.entradaCusto.insert(END, i[4]) 397 | self.custo_aba2.insert(END, i[4]) 398 | self.entradaValor.insert(END, i[5]) 399 | self.entradaDescricao.insert(END, i[6]) 400 | 401 | ff = self.entradaIdFornec.get() 402 | self.cursor.execute("SELECT fornecedor FROM fornecedores WHERE cod_forn = '%s'" % ff) 403 | consultaidfornec = self.cursor.fetchall() 404 | for i in consultaidfornec: 405 | self.entradaFornec.insert(END, i[0]) 406 | 407 | self.cursor.execute("""SELECT lote, entrada, saida, custo, dia, 408 | fornecedor, diaV FROM movim_prod WHERE cod_p = '%s' ORDER BY id ASC; """ % cod_sp) 409 | listam = self.cursor.fetchall() 410 | for i in listam: 411 | self.listaMov.insert("", END, values=i) 412 | 413 | lista2 = self.cursor.execute("""select Sum(entrada) - Sum(saida) 414 | from movim_prod where cod_p = '%s'""" % cod_sp) 415 | consultalista2 = self.cursor.fetchall() 416 | for i in consultalista2: 417 | self.quantest.insert(END, i) 418 | def busca_produtoE(self): 419 | self.listaServ.delete(*self.listaServ.get_children()) 420 | self.entradaProd.insert(END, '%') 421 | servprod = self.entradaProd.get() 422 | 423 | self.conecta_Glac() 424 | 425 | lista = self.cursor.execute(""" 426 | SELECT cod_sp, servprod, "R$", custo, "R$", valor FROM servprod 427 | WHERE sp = "P" AND servprod LIKE '%s' ORDER BY servprod ASC; 428 | """ % servprod) 429 | for i in lista: 430 | self.listaServ.insert("", END, values=i) 431 | self.entradaProd.delete(0, END) 432 | 433 | self.desconecta_Glac() 434 | def add_movF(self): 435 | self.conecta_Glac() 436 | cursor = self.conn.cursor() 437 | cod2 = self.codproduto2.get() 438 | prod2 = self.produto_aba2.get() 439 | dia = self.dia_aba2.get() 440 | lote = self.lote_aba2.get() 441 | diaV = self.diaV_aba2.get() 442 | quant = self.quant_aba2.get() 443 | custo = self.custo_aba2.get() 444 | fornecedor = self.entradaIdFornec.get() 445 | saida = self.saida_aba2.get() 446 | self.listaMov.delete(*self.listaMov.get_children()) 447 | 448 | self.cursor.execute("""INSERT INTO movim_prod ( cod_p, entrada, custo, dia, 449 | lote, diaV, fornecedor, saida) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?)""", 450 | (cod2, quant, custo, dia, lote, diaV, fornecedor, saida)) 451 | conn.commit() 452 | 453 | msg = "Movimentação realizada.\n " 454 | msg += "" 455 | messagebox.showinfo("GLAC - Estoque", msg) 456 | 457 | lista1 = self.cursor.execute("""SELECT lote, entrada, saida, custo, dia, 458 | fornecedores.fornecedor, diaV, mesV, anoV 459 | FROM movim_prod WHERE cod_p = '%s' 460 | INNER JOIN movim_prod.fornecedor = fornecedores.cod_forn ORDER BY id ASC; """ % cod2) 461 | for i in lista1: 462 | self.listaMov.insert("", END, values=i) 463 | 464 | self.quantest.delete(0, END) 465 | 466 | self.cursor.execute("""select Sum(entrada) - Sum(saida) 467 | from movim_prod where cod_p = '%s'""" % cod2) 468 | consultalista2 = cursor.fetchall() 469 | for i in consultalista2: 470 | self.quantest.insert(END, i) 471 | self.desconecta_Glac() 472 | def add_autobind(self, event): 473 | self.listatec1.selection() 474 | 475 | for n in self.listatec1.selection(): 476 | col1, col2 = self.listatec1.item(n, 'values') 477 | self.entradaFornec.insert(END, col2) 478 | self.entradaIdFornec.insert(END, col1) 479 | 480 | self.listatec.destroy() 481 | def OnTec(self, *args): 482 | self.listatec1.yview(*args) 483 | def add_autobind2(self, event): 484 | self.listatec1.selection() 485 | for n in self.listatec1.selection(): 486 | col1, col2 = self.listatec1.item(n, 'values') 487 | self.entradaMarcaprod.insert(END, col2) 488 | self.entradaIdMarcaprod.insert(END, col1) 489 | 490 | self.listatec.destroy() -------------------------------------------------------------------------------- /Clientes.py: -------------------------------------------------------------------------------- 1 | import customtkinter 2 | from tkWidgetsRfzorzi.widgets_Glac import * 3 | from tkinter import ttk 4 | from tkcalendar import * 5 | from tkinter import messagebox 6 | from tkinter import * 7 | from datetime import * 8 | import brazilcep 9 | from brazilcep import get_address_from_cep, WebService 10 | 11 | class CadCli: 12 | def customer_registration(self): 13 | self.open_win_cli = "cadcli" 14 | self.janelaCli = customtkinter.CTkToplevel(self.window_one) 15 | self.janelaCli.title("Cadastro de Clientes") 16 | self.janelaCli.configure(background='#456E96') 17 | self.janelaCli.geometry("890x670+70+30") 18 | self.janelaCli.resizable(FALSE, FALSE) 19 | self.janelaCli.minsize(width=820, height=650) 20 | self.janelaCli.transient(self.window_one) 21 | self.janelaCli.focus_force() 22 | self.janelaCli.configure(bg='#37586B') 23 | 24 | tit_cli = customtkinter.CTkLabel(self.janelaCli, text="Cadastro do Cliente") 25 | tit_cli.place(relx=0.01, rely=0.02, relwidth=0.65, relheight=0.03) 26 | 27 | tit_cli = customtkinter.CTkLabel(self.janelaCli, text="Pesquisa Cliente") 28 | tit_cli.place(relx=0.67, rely=0.02, relwidth=0.32, relheight=0.03) 29 | 30 | framecli = customtkinter.CTkFrame(self.janelaCli, border_color="#7f5af0", 31 | corner_radius=12, border_width=2) 32 | framecli.place(relx=0.01, rely=0.05, relwidth=0.65, relheight=0.93) 33 | 34 | framelistcli = customtkinter.CTkFrame(self.janelaCli, border_color="#7f5af0", 35 | corner_radius=12, border_width=2) 36 | framelistcli.place(relx=0.67, rely=0.05, relwidth=0.32, relheight=0.93) 37 | 38 | tituloVeiculos = customtkinter.CTkLabel(self.janelaCli, text="Veiculos do Cliente") 39 | tituloVeiculos.place(relx=0.03, rely=0.56, relwidth=0.61, relheight=0.03) 40 | 41 | # 'Entry Código' 42 | self.PesquisaCliente = customtkinter.CTkEntry(self.janelaCli) 43 | self.PesquisaCliente.place(relx=0.73, rely=0.1, relwidth=0.2, relheight=0.03) 44 | 45 | # Botao busca Cabeça 46 | botaobusca = customtkinter.CTkButton(self.janelaCli, text=u'\u2315', command=self.busca_clienteC) 47 | botaobusca.place(relx=0.69, rely=0.09, relwidth=0.04, relheight=0.05) 48 | 49 | 50 | # 'Label Codigo' 51 | codPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Codigo") 52 | codPeLabel.place(relx=0.02, rely=0.07, relwidth=0.05, relheight=0.03) 53 | 54 | # 'Entry Código' 55 | self.codPeEntry = customtkinter.CTkEntry(self.janelaCli) 56 | self.codPeEntry.configure(validate="key", validatecommand=self.vcmd8) 57 | self.codPeEntry.place(relx=0.02, rely=0.1, relwidth=0.05, relheight=0.03) 58 | 59 | # 'Label Data de Nascimento' 60 | nascPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Nasc") 61 | nascPeLabel.place(relx=0.38, rely=0.15, relwidth=0.1, relheight=0.03) 62 | 63 | # 'Entry Dia' 64 | self.nascDiaPeEntry = DateEntry(self.janelaCli, locale="pt_BR", fg='gray45') 65 | self.nascDiaPeEntry.place(relx=0.38, rely=0.18, relwidth=0.1, relheight=0.03) 66 | 67 | # 'Label Cpf' 68 | self.cnpj_mat_str = StringVar() 69 | self.cnpj_mat_strV = {"CNPJ", "CPF"} 70 | self.cnpj_mat_str.set("CNPJ") 71 | self.cnpj_mat_lb = OptionMenu(self.janelaCli, self.cnpj_mat_str, *self.cnpj_mat_strV) 72 | self.cnpj_mat_lb.place(relx=0.49, rely=0.15, relwidth=0.16, relheight=0.03) 73 | 74 | self.cnpj_mat_ent = customtkinter.CTkEntry(self.janelaCli) 75 | self.cnpj_mat_ent.configure(validate="key") 76 | self.cnpj_mat_ent.bind("", self.format_cpf_cnpj) 77 | self.cnpj_mat_ent.place(relx=0.49, rely=0.18, relwidth=0.16, relheight=0.03) 78 | 79 | # 'Label Nome do Cliente' 80 | nomePeLabel = customtkinter.CTkLabel(self.janelaCli, text="Nome") 81 | nomePeLabel.place(relx=0.02, rely=0.15, relwidth=0.35, relheight=0.03) 82 | 83 | # 'Entry Nome Do Cliente' 84 | self.nomePeEntry = customtkinter.CTkEntry(self.janelaCli) 85 | self.nomePeEntry.place(relx=0.02, rely=0.18, relwidth=0.35, relheight=0.03) 86 | 87 | # 'Label Logradouro' 88 | logradPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Endereco") 89 | logradPeLabel.place(relx=0.02, rely=0.23, relwidth=0.35, relheight=0.03) 90 | 91 | # 'Entry Logradouro' 92 | self.logradPeEntry = customtkinter.CTkEntry(self.janelaCli) 93 | self.logradPeEntry.place(relx=0.02, rely=0.26, relwidth=0.35, relheight=0.03) 94 | 95 | # 'Label Numero' 96 | numPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Numero") 97 | numPeLabel.place(relx=0.38, rely=0.23, relwidth=0.06, relheight=0.03) 98 | 99 | # 'Entry Numero' 100 | self.numPeEntry = customtkinter.CTkEntry(self.janelaCli) 101 | self.numPeEntry.place(relx=0.38, rely=0.26, relwidth=0.06, relheight=0.03) 102 | 103 | # 'Label Complemento' 104 | complemPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Complemento") 105 | complemPeLabel.place(relx=0.45, rely=0.23, relwidth=0.2, relheight=0.03) 106 | 107 | # 'Entry Complemento' 108 | self.complemPeEntry = customtkinter.CTkEntry(self.janelaCli) 109 | self.complemPeEntry.place(relx=0.45, rely=0.26, relwidth=0.2, relheight=0.03) 110 | 111 | # 'Label Cep' 112 | cepPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Cep") 113 | # cepPeLabel.place(relx=0.02, rely=0.4, relwidth=0.11, relheight=0.02) 114 | 115 | # 'Botao Cep' 116 | cepPeBt = customtkinter.CTkButton(self.janelaCli, text='Cep', command=self.cep) 117 | cepPeBt.place(relx=0.02, rely=0.3, relwidth=0.1, relheight=0.04) 118 | 119 | # 'Entry Cep' 120 | self.cepPeEntry = customtkinter.CTkEntry(self.janelaCli) 121 | self.cepPeEntry.configure(validate="key", validatecommand=self.vcmd8) 122 | self.cepPeEntry.place(relx=0.02, rely=0.34, relwidth=0.1, relheight=0.03) 123 | 124 | # 'Label Bairro' 125 | bairroPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Bairro") 126 | bairroPeLabel.place(relx=0.13, rely=0.31, relwidth=0.2, relheight=0.03) 127 | 128 | # 'Entry Bairro' 129 | self.bairroPeEntry = customtkinter.CTkEntry(self.janelaCli) 130 | self.bairroPeEntry.place(relx=0.13, rely=0.34, relwidth=0.2, relheight=0.03) 131 | 132 | # 'Label Municipio' 133 | cidadePeLabel = customtkinter.CTkLabel(self.janelaCli, text="Cidade") 134 | cidadePeLabel.place(relx=0.34, rely=0.31, relwidth=0.25, relheight=0.03) 135 | 136 | # 'Entry Municipio' 137 | self.cidadePeEntry = customtkinter.CTkEntry(self.janelaCli) 138 | self.cidadePeEntry.place(relx=0.34, rely=0.34, relwidth=0.25, relheight=0.03) 139 | 140 | # 'Label UF' 141 | ufPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Uf") 142 | ufPeLabel.place(relx=0.61, rely=0.31, relwidth=0.04, relheight=0.03) 143 | 144 | # 'Entry UF' 145 | self.ufPeEntry = customtkinter.CTkEntry(self.janelaCli) 146 | self.ufPeEntry.place(relx=0.61, rely=0.34, relwidth=0.04, relheight=0.03) 147 | 148 | # 'Label Fone' 149 | fone1Pelabel = customtkinter.CTkLabel(self.janelaCli, text='Telefone Principal') 150 | fone1Pelabel.place(relx=0.02, rely=0.39, relwidth=0.13, relheight=0.03) 151 | 152 | # 'Entry Fone 1' 153 | self.fone1PeEntry = customtkinter.CTkEntry(self.janelaCli) 154 | self.fone1PeEntry.configure(validatecommand=self.vcmd2, validate="key") 155 | self.fone1PeEntry.place(relx=0.02, rely=0.42, relwidth=0.03, relheight=0.03) 156 | 157 | self.fone1PeEntry2 = customtkinter.CTkEntry(self.janelaCli) 158 | self.fone1PeEntry2.configure(validatecommand=self.vcmd12, validate="key") 159 | self.fone1PeEntry2.place(relx=0.05, rely=0.42, relwidth=0.1, relheight=0.03) 160 | 161 | # 'Label Fone 2' 162 | fone2Pelabel = customtkinter.CTkLabel(self.janelaCli, text='Telefone Secundário') 163 | fone2Pelabel.place(relx=0.16, rely=0.39, relwidth=0.13, relheight=0.03) 164 | 165 | # 'Entry Fone 2' 166 | self.fone2PeEntry = customtkinter.CTkEntry(self.janelaCli) 167 | self.fone2PeEntry.configure(validate="key", validatecommand=self.vcmd2) 168 | self.fone2PeEntry.place(relx=0.16, rely=0.42, relwidth=0.03, relheight=0.03) 169 | 170 | self.fone2PeEntry2 = customtkinter.CTkEntry(self.janelaCli) 171 | self.fone2PeEntry2.configure(validate="key", validatecommand=self.vcmd12) 172 | self.fone2PeEntry2.place(relx=0.19, rely=0.42, relwidth=0.1, relheight=0.03) 173 | 174 | # 'Entry RG' 175 | self.rgPeEntry = Entry(self.janelaCli) 176 | 177 | # 'Label Obs' 178 | obsPeLabel = customtkinter.CTkLabel(self.janelaCli, text="Obs") 179 | obsPeLabel.place(relx=0.3, rely=0.39, relwidth=0.17, relheight=0.03) 180 | 181 | # 'Entry Obs' 182 | self.obsPeEntry = customtkinter.CTkEntry(self.janelaCli) 183 | self.obsPeEntry.place(relx=0.3, rely=0.42, relwidth=0.17, relheight=0.03) 184 | 185 | # 'Label E-mail' 186 | emailPeLabel = customtkinter.CTkLabel(self.janelaCli, text='E-mail') 187 | emailPeLabel.place(relx=0.48, rely=0.39, relwidth=0.17, relheight=0.03) 188 | 189 | # 'Entry E-mail' 190 | self.emailPeEntry = customtkinter.CTkEntry(self.janelaCli) 191 | self.emailPeEntry.place(relx=0.48, rely=0.42, relwidth=0.17, relheight=0.03) 192 | 193 | 194 | 195 | # 'Botao Abrir atendimento 196 | botaoOpen = customtkinter.CTkButton(self.janelaCli, text="Abre O.S", command=self.carrega_cliente3, corner_radius=12) 197 | botaoOpen.place(relx=0.02, rely=0.5, relwidth=0.09, relheight=0.04) 198 | # 'Botao Novo Cliente' 199 | botaoAdd = customtkinter.CTkButton(self.janelaCli, text="Novo", command=self.add_clienteC, corner_radius=12) 200 | botaoAdd.place(relx=0.12, rely=0.5, relwidth=0.08, relheight=0.04) 201 | # Botao Altera dados do Cliente 202 | botaoMud = customtkinter.CTkButton(self.janelaCli, text="Alterar", command=self.mud_clienteC, corner_radius=12) 203 | botaoMud.place(relx=0.2, rely=0.5, relwidth=0.08, relheight=0.04) 204 | # Botao deletar dados do Cliente 205 | botaoDel = customtkinter.CTkButton(self.janelaCli, text="Apagar", command=self.deletar_window_c, corner_radius=12) 206 | botaoDel.place(relx=0.28, rely=0.5, relwidth=0.08, relheight=0.04) 207 | # Botao limpa 208 | botaolimpa = customtkinter.CTkButton(self.janelaCli, text="Fechar", command=self.limpa_clienteC, corner_radius=12) 209 | botaolimpa.place(relx=0.37, rely=0.5, relwidth=0.08, relheight=0.04) 210 | 211 | self.barracliente = ttk.Scrollbar(framelistcli, orient='vertical', command=self.OnVsbC) 212 | self.listaServ = ttk.Treeview(framelistcli, height=6, 213 | yscrollcommand=self.barracliente.set, column=("col1", "col2")) 214 | 215 | self.listaServ.heading("#0", text="") 216 | self.listaServ.column("#0", width=1) 217 | self.listaServ.heading("#1", text="Codigo") 218 | self.listaServ.column("#1", width=40) 219 | self.listaServ.heading("#2", text="Nome") 220 | self.listaServ.column("#2", width=185) 221 | 222 | self.listaServ.place(relx=0.05, rely=0.15, relwidth=0.85, relheight=0.75) 223 | self.listaServ.configure(yscroll=self.barracliente.set) 224 | self.barracliente.place(relx=0.9, rely=0.15, relheight=0.75) 225 | 226 | self.listaServ.bind("", self.OnDoubleClickC) 227 | self.list_cadcli() 228 | 229 | # Moldura veiculos 230 | self.entradaVeiculo2 = customtkinter.CTkEntry(self.janelaCli) 231 | self.entradaMontadora2 = customtkinter.CTkEntry(self.janelaCli) 232 | self.codEquipEntry = customtkinter.CTkEntry(self.janelaCli) 233 | self.fabrModeloEquipEntry = customtkinter.CTkEntry(self.janelaCli) 234 | self.nomeIdEquipEntry = customtkinter.CTkEntry(self.janelaCli) 235 | 236 | serialEquipLabel = customtkinter.CTkLabel(self.janelaCli, text="Placa") 237 | serialEquipLabel.place(relx=0.03, rely=0.6, relwidth=0.09, relheight=0.04) 238 | 239 | self.serialEquipEntry = customtkinter.CTkEntry(self.janelaCli) 240 | self.serialEquipEntry.place(relx=0.03, rely=0.64, relwidth=0.09, relheight=0.04) 241 | 242 | ##### Veiculo 243 | descrVeiculo = customtkinter.CTkButton(self.janelaCli, text="Veiculo", command=self.busca_auto_c) 244 | descrVeiculo.place(relx=0.13, rely=0.6, relwidth=0.13, relheight=0.04) 245 | self.nomeEquipEntry = customtkinter.CTkEntry(self.janelaCli) 246 | self.nomeEquipEntry.place(relx=0.13, rely=0.64, relwidth=0.13, relheight=0.04) 247 | 248 | marcaEquipLabel = customtkinter.CTkLabel(self.janelaCli, text="Marca") 249 | marcaEquipLabel.place(relx=0.27, rely=0.6, relwidth=0.11, relheight=0.04) 250 | 251 | self.marcaEquipEntry = customtkinter.CTkEntry(self.janelaCli) 252 | self.marcaIdEquipEntry = customtkinter.CTkEntry(self.janelaCli) 253 | self.marcaEquipEntry.place(relx=0.27, rely=0.64, relwidth=0.11, relheight=0.04) 254 | 255 | corEquipLabel = customtkinter.CTkLabel(self.janelaCli, text="Cor") 256 | corEquipLabel.place(relx=0.39, rely=0.6, relwidth=0.09, relheight=0.04) 257 | 258 | self.corvar = StringVar(self.janelaCli) 259 | self.coresV = {"Branco", "Amarelo", "Verde", 260 | "Bege", "Azul", "Laranja", 261 | "Vermelho", "Verde", "Cinza", 262 | "Preto", "Marrom", "Bordo", 263 | "Prata", "Grafite", "Dourado", 264 | "Outro"} 265 | 266 | self.corvar.set("Branco") 267 | 268 | self.popupMenu = OptionMenu(self.janelaCli, self.corvar, *self.coresV) 269 | self.popupMenu.place(relx=0.39, rely=0.64, relwidth=0.09, relheight=0.04) 270 | 271 | combEquipLabel = customtkinter.CTkLabel(self.janelaCli, text="Combustivel") 272 | combEquipLabel.place(relx=0.49, rely=0.6, relwidth=0.1, relheight=0.04) 273 | 274 | self.combvar = StringVar() 275 | self.combV = {"Gasolina", "Alcool", "Diesel", 276 | "Flex", "Gasolina_e_Gas", "Alcool_e_Gas", 277 | "Flex_e_Gas"} 278 | self.combvar.set("Gasolina") 279 | 280 | self.popupMenu = OptionMenu(self.janelaCli, self.combvar, *self.combV) 281 | self.popupMenu.place(relx=0.49, rely=0.64, relwidth=0.1, relheight=0.04) 282 | 283 | # Label Ano 284 | fab_ano_eq_lb = customtkinter.CTkLabel(self.janelaCli, text="Ano") 285 | fab_ano_eq_lb.place(relx=0.6, rely=0.6, relwidth=0.05, relheight=0.04) 286 | # Entry Ano 287 | self.fabrAnoEquipEntry = customtkinter.CTkEntry(self.janelaCli) 288 | self.fabrAnoEquipEntry.place(relx=0.6, rely=0.64, relwidth=0.05, relheight=0.04) 289 | 290 | # Botoes automoveis 291 | botaoAdd2 = customtkinter.CTkButton(self.janelaCli, text="Novo", command=self.add_veiculoC 292 | ,corner_radius=12) 293 | botaoAdd2.place(relx=0.02, rely=0.92, relwidth=0.07, relheight=0.04) 294 | 295 | botaoMud2 = customtkinter.CTkButton(self.janelaCli, text="Alterar", command=self.mud_autoC 296 | ,corner_radius=12) 297 | botaoMud2.place(relx=0.1, rely=0.92, relwidth=0.07, relheight=0.04) 298 | 299 | botaoDel2 = customtkinter.CTkButton(self.janelaCli, text="Apagar", command=self.deletar_window_placa_c 300 | ,corner_radius=12) 301 | botaoDel2.place(relx=0.18, rely=0.92, relwidth=0.07, relheight=0.04) 302 | 303 | self.listaPlaca = ttk.Treeview(self.janelaCli, height=5, 304 | column=("col1", "col2", "col3", "col4", "col5", "col6")) 305 | self.listaPlaca.heading("#0", text="") 306 | self.listaPlaca.column("#0", width=0) 307 | self.listaPlaca.heading("#1", text="Placa") 308 | self.listaPlaca.column("#1", width=60) 309 | self.listaPlaca.heading("#2", text="Veiculo") 310 | self.listaPlaca.column("#2", width=100) 311 | self.listaPlaca.heading("#3", text="Montadora") 312 | self.listaPlaca.column("#3", width=100) 313 | self.listaPlaca.heading("#4", text="Cor") 314 | self.listaPlaca.column("#4", width=80) 315 | self.listaPlaca.heading("#5", text="Combustivel") 316 | self.listaPlaca.column("#5", width=80) 317 | self.listaPlaca.heading("#6", text="Ano") 318 | self.listaPlaca.column("#6", width=60) 319 | 320 | # Cria barra de rolagem 321 | self.barra = Scrollbar(self.janelaCli, orient='vertical', command=self.listaPlaca.yview) 322 | # Adiciona barra de rolagem 323 | self.listaPlaca.configure(yscroll=self.barra.set) 324 | self.barra.place(relx=0.63, rely=0.703, relwidth=0.02, relheight=0.2) 325 | 326 | self.listaPlaca.place(relx=0.02, rely=0.7, relwidth=0.62, relheight=0.2) 327 | # Binding da listbox 328 | self.listaPlaca.bind('', self.bind_autoC) 329 | 330 | framecli = GradientFrame(self.janelaCli, "gray10", "gray10") 331 | framecli.place(relx=0, rely=0, relwidth=0.01, relheight=1) 332 | 333 | self.janelaCli.mainloop() 334 | def list_cadcli(self): 335 | self.conecta_Glac() 336 | self.lista1 = self.cursor.execute("""SELECT cod_cli, nome 337 | FROM clientes ORDER BY nome ASC; """) 338 | for i in self.lista1: 339 | self.listaServ.insert("", END, values=i) 340 | self.desconecta_Glac() 341 | def add_autobindC(self, event): 342 | # codServ1.delete(0, END) 343 | self.nomeEquipEntry.delete(0, END) 344 | self.entradaVeiculo2.delete(0, END) 345 | self.marcaEquipEntry.delete(0, END) 346 | self.entradaMontadora2.delete(0, END) 347 | self.listatec1.selection() 348 | for n in self.listatec1.selection(): 349 | col1, col2, col3 = self.listatec1.item(n, 'values') 350 | self.nomeEquipEntry.insert(END, col2) 351 | self.marcaEquipEntry.insert(END, col3) 352 | self.entradaVeiculo2.insert(END, col1) 353 | 354 | cod = self.entradaVeiculo2.get() 355 | 356 | self.conecta_Glac() 357 | 358 | self.cursor.execute( 359 | """SELECT montad FROM automoveis WHERE cod_aut LIKE '%s'""" % cod) 360 | addservico1cod = self.cursor.fetchall() 361 | for i in addservico1cod: 362 | self.marcaEquipEntry.insert(END, i) 363 | 364 | self.desconecta_Glac() 365 | self.listatec.destroy() 366 | def add_clienteC(self): 367 | self.conecta_Glac() 368 | self.listaServ.delete(*self.listaServ.get_children()) 369 | self.variaveisCliente() 370 | self.variaveisVeiculo() 371 | 372 | self.cursor.execute("""INSERT INTO clientes 373 | (nome, nascdia, endereco, numcasa, complemento, bairro, 374 | municipio, uf, fone1ddd, fone1, fone2ddd, fone2, cep, cpf, email, obs) 375 | VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", 376 | (self.cadcli_nome, self.cadcli_nascdia, 377 | self.cadcli_endereco, self.cadcli_numcasa, self.cadcli_complemento, 378 | self.cadcli_bairro, self.cadcli_municipio, self.cadcli_uf, self.cadcli_fone1ddd, 379 | self.cadcli_fone1, self.cadcli_fone2ddd, self.cadcli_fone2, self.cadcli_cep, 380 | self.cadcli_cpf, self.cadcli_email, self.cadcli_obs)) 381 | self.conn.commit() 382 | 383 | msg = "Cadastro de cliente salvo" 384 | msg += "" 385 | messagebox.showinfo("GLAC ", msg) 386 | self.limpa_clienteC() 387 | self.desconecta_Glac() 388 | 389 | self.list_cadcli() 390 | def add_veiculoC(self): 391 | self.variaveisCliente() 392 | self.variaveisVeiculo() 393 | 394 | cod_cli = self.codPeEntry.get() 395 | motor = '0' 396 | self.conecta_Glac() 397 | self.cursor.execute("""INSERT INTO frota ( idcliente, placa, veiculo, montadora, 398 | ano, combust, cor) VALUES ( ?, ?, ?, ?, ?, ?, ?)""", 399 | (self.cadcli_cod, self.cadcli_placa, self.cadcli_montadora, self.cadcli_veiculo, 400 | self.cadcli_ano, self.cadcli_combust, self.cadcli_cor)) 401 | self.conn.commit() 402 | 403 | self.serialEquipEntry.delete(0, END) 404 | self.nomeEquipEntry.delete(0, END) 405 | self.entradaVeiculo2.delete(0, END) 406 | self.marcaEquipEntry.delete(0, END) 407 | self.entradaMontadora2.delete(0, END) 408 | self.fabrAnoEquipEntry.delete(0, END) 409 | self.listaPlaca.delete(*self.listaPlaca.get_children()) 410 | 411 | self.cursor.execute("""SELECT placa, veiculo , montadora, cor, combust, ano 412 | FROM frota WHERE frota.idcliente = '%s' """ % cod_cli) 413 | rows = self.cursor.fetchall() 414 | for row in rows: 415 | self.listaPlaca.insert("", END, values=row) 416 | 417 | self.desconecta_Glac() 418 | msg = self.m_msgAutAdd 419 | messagebox.showinfo("GLAC ", msg) 420 | def busca_clienteC(self): 421 | self.conecta_Glac() 422 | self.listaServ.delete(*self.listaServ.get_children()) 423 | 424 | self.PesquisaCliente.insert(END, '%') 425 | nome = self.PesquisaCliente.get() 426 | self.cursor.execute("""SELECT cod_cli, nome FROM clientes 427 | WHERE nome LIKE '%s' ORDER BY nome ASC""" % nome) 428 | buscanomecli = self.cursor.fetchall() 429 | for i in buscanomecli: 430 | self.listaServ.insert("", END, values=i) 431 | 432 | self.limpa_clienteC() 433 | self.desconecta_Glac() 434 | def bind_autoC(self, event): 435 | # codServ1.delete(0, END) 436 | global col1, col3, col2 437 | self.limpa_entryautoC() 438 | self.listaPlaca.selection() 439 | 440 | for n in self.listaPlaca.selection(): 441 | col1, col2, col3, col4, col5, col6 = self.listaPlaca.item(n, 'values') 442 | 443 | self.serialEquipEntry.insert(END, col1) 444 | self.nomeEquipEntry.insert(END, col3) 445 | self.marcaEquipEntry.insert(END, col2) 446 | self.entradaVeiculo2.insert(END, 0) 447 | self.codEquipEntry.insert(END, 0) 448 | self.corvar.set(col4) 449 | self.combvar.set(col5) 450 | self.fabrAnoEquipEntry.insert(END, col6) 451 | def carrega_clienteC(self): 452 | cod_cli = self.codPeEntry.get() 453 | self.limpa_clienteC2() 454 | self.conecta_Glac() 455 | 456 | self.cursor.execute("""SELECT UPPER(nome), nascdia, numcasa, UPPER(complemento), 457 | UPPER(email), UPPER(endereco), UPPER(bairro), UPPER(municipio), UPPER(uf), 458 | fone1ddd, fone1, fone2ddd, fone2, cep, cpf, rg, UPPER(obs) 459 | FROM clientes WHERE cod_cli = '%s'""" % cod_cli) 460 | consultacli = self.cursor.fetchall() 461 | for i in consultacli: 462 | self.nomePeEntry.insert(END, i[0]) 463 | self.nascDiaPeEntry.insert(END, i[1]) 464 | self.numPeEntry.insert(END, i[2]) 465 | self.complemPeEntry.insert(END, i[3]) 466 | self.emailPeEntry.insert(END, i[4]) 467 | self.logradPeEntry.insert(END, i[5]) 468 | self.bairroPeEntry.insert(END, i[6]) 469 | self.cidadePeEntry.insert(END, i[7]) 470 | self.ufPeEntry.insert(END, i[8]) 471 | self.fone1PeEntry.insert(END, i[9]) 472 | self.fone1PeEntry2.insert(END, i[10]) 473 | self.fone2PeEntry.insert(END, i[11]) 474 | self.fone2PeEntry2.insert(END, i[12]) 475 | self.cepPeEntry.insert(END, i[13]) 476 | self.cnpj_mat_ent.insert(END, i[14]) 477 | self.obsPeEntry.insert(END, i[16]) 478 | 479 | self.cursor.execute("""SELECT placa, veiculo , montadora, cor, combust, ano 480 | FROM frota WHERE frota.idcliente = '%s' """ % cod_cli) 481 | rows = self.cursor.fetchall() 482 | for row in rows: 483 | self.listaPlaca.insert("", END, values=row) 484 | self.desconecta_Glac() 485 | def OnVsbC(self, *args): 486 | self.listaServ.yview(*args) 487 | def OnMouseWheelC(self, event): 488 | self.listaServ.yview("scroll", event.delta, "units") 489 | return "break" 490 | def OnDoubleClickC(self, *args): 491 | self.limpa_clienteC() 492 | self.listaServ.selection() 493 | 494 | for n in self.listaServ.selection(): 495 | col1, col2 = self.listaServ.item(n, 'values') 496 | self.codPeEntry.insert(END, col1) 497 | 498 | self.carrega_clienteC() 499 | def mud_autoC(self): 500 | self.variaveisCliente() 501 | self.variaveisVeiculo() 502 | 503 | cod_cli = self.codPeEntry.get() 504 | self.conecta_Glac() 505 | 506 | self.cursor.execute(""" UPDATE frota SET veiculo = ?, ano = ?, placa = ?, 507 | idcliente = ?, combust = ?, montadora = ?, cor = ? WHERE placa = ? AND idcliente = ?""", 508 | (self.cadcli_veiculo, self.cadcli_ano, self.cadcli_placa, cod_cli, 509 | self.cadcli_combust, self.cadcli_montadora, 510 | self.cadcli_cor, self.cadcli_placa, cod_cli)) 511 | self.conn.commit() 512 | 513 | self.serialEquipEntry.delete(0, END) 514 | self.nomeEquipEntry.delete(0, END) 515 | self.entradaVeiculo2.delete(0, END) 516 | self.marcaEquipEntry.delete(0, END) 517 | self.entradaMontadora2.delete(0, END) 518 | self.fabrAnoEquipEntry.delete(0, END) 519 | self.listaPlaca.delete(*self.listaPlaca.get_children()) 520 | 521 | self.cursor.execute("""SELECT placa, veiculo , montadora, cor, combust, ano 522 | FROM frota WHERE frota.idcliente = '%s' """ % cod_cli) 523 | rows = self.cursor.fetchall() 524 | for row in rows: 525 | self.listaPlaca.insert("", END, values=row) 526 | 527 | self.desconecta_Glac() 528 | msg = self.m_msgVeiculoAlt 529 | msg += "" 530 | messagebox.showinfo("GLAC ", msg) 531 | self.carrega_clienteC() 532 | def mud_clienteC(self): 533 | self.listaServ.delete(*self.listaServ.get_children()) 534 | self.conecta_Glac() 535 | 536 | self.variaveisCliente() 537 | self.variaveisVeiculo() 538 | 539 | self.cursor.execute("""UPDATE clientes SET nome = ?, endereco = ?, bairro = ?, 540 | municipio = ?, uf = ?, cep = ?, cpf = ?, obs = ?, email = ?, fone1ddd = ?, 541 | fone1 = ?, fone2ddd = ?, fone2 = ?, complemento = ?, numcasa = ?, nascdia = ? 542 | WHERE cod_cli = ?""",(self.cadcli_nome, self.cadcli_endereco, self.cadcli_bairro, 543 | self.cadcli_municipio, self.cadcli_uf, self.cadcli_cep, self.cadcli_cpf, 544 | self.cadcli_obs, self.cadcli_email, self.cadcli_fone1ddd, 545 | self.cadcli_fone1, self.cadcli_fone2ddd, self.cadcli_fone2, self.cadcli_complemento, 546 | self.cadcli_numcasa, self.cadcli_nascdia, self.cadcli_cod)) 547 | 548 | self.conn.commit() 549 | self.desconecta_Glac() 550 | 551 | self.list_cadcli() 552 | msg = "Dados alterados com sucesso" 553 | msg += "" 554 | messagebox.showinfo("GLAC - Clientes", msg) 555 | def limpa_entryautoC(self): 556 | self.serialEquipEntry.delete(0, END) 557 | self.nomeEquipEntry.delete(0, END) 558 | self.marcaEquipEntry.delete(0, END) 559 | self.fabrAnoEquipEntry.delete(0, END) 560 | def limpa_clienteC(self): 561 | self.codPeEntry.delete(0, END) 562 | self.limpa_clienteC2() 563 | def limpa_clienteC2(self): 564 | self.nomePeEntry.delete(0, END) 565 | self.nascDiaPeEntry.delete(0, END) 566 | self.logradPeEntry.delete(0, END) 567 | self.numPeEntry.delete(0, END) 568 | self.complemPeEntry.delete(0, END) 569 | self.bairroPeEntry.delete(0, END) 570 | self.cidadePeEntry.delete(0, END) 571 | self.ufPeEntry.delete(0, END) 572 | self.fone1PeEntry.delete(0, END) 573 | self.fone1PeEntry2.delete(0, END) 574 | self.fone2PeEntry.delete(0, END) 575 | self.fone2PeEntry2.delete(0, END) 576 | self.cepPeEntry.delete(0, END) 577 | self.cnpj_mat_ent.delete(0, END) 578 | self.obsPeEntry.delete(0, END) 579 | self.emailPeEntry.delete(0, END) 580 | self.listaPlaca.delete(*self.listaPlaca.get_children()) 581 | 582 | self.limpa_entryautoC() 583 | def del_clienteC(self): 584 | cod_cli = self.codPeEntry.get() 585 | 586 | self.conecta_Glac() 587 | self.cursor.execute("""DELETE FROM frota WHERE idcliente=?""", (cod_cli,)) 588 | self.conn.commit() 589 | 590 | self.cursor.execute("""DELETE FROM clientes WHERE cod_cli=?""", (cod_cli,)) 591 | self.conn.commit() 592 | 593 | self.listaServ.delete(*self.listaServ.get_children()) 594 | self.listaPlaca.delete(*self.listaPlaca.get_children()) 595 | 596 | self.desconecta_Glac() 597 | self.list_cadcli() 598 | 599 | self.listaPlaca.delete(*self.listaPlaca.get_children()) 600 | self.limpa_clienteC() 601 | def del_placaC(self): 602 | self.listaPlaca.delete(*self.listaPlaca.get_children()) 603 | cod_cli = self.codPeEntry.get() 604 | placa = self.serialEquipEntry.get() 605 | self.conecta_Glac() 606 | self.cursor.execute("""DELETE FROM frota 607 | WHERE placa =? AND idcliente = ?""", (placa, cod_cli)) 608 | self.conn.commit() 609 | self.listaPlaca.delete(*self.listaPlaca.get_children()) 610 | self.cursor.execute("""SELECT placa, veiculo , montadora, cor, combust, ano 611 | FROM frota WHERE frota.idcliente = '%s' """ % cod_cli) 612 | rows = self.cursor.fetchall() 613 | for row in rows: 614 | self.listaPlaca.insert("", END, values=row) 615 | self.desconecta_Glac() 616 | self.limpa_entryautoC() 617 | self.listatec.destroy() 618 | def variaveisCliente(self): 619 | self.cadcli_cod = self.codPeEntry.get() 620 | self.cadcli_nome = self.nomePeEntry.get() 621 | self.cadcli_nascdia = self.nascDiaPeEntry.get() 622 | self.cadcli_endereco = self.logradPeEntry.get() 623 | self.cadcli_numcasa = self.numPeEntry.get() 624 | self.cadcli_complemento = self.complemPeEntry.get() 625 | self.cadcli_bairro = self.bairroPeEntry.get() 626 | self.cadcli_municipio = self.cidadePeEntry.get() 627 | self.cadcli_uf = self.ufPeEntry.get() 628 | self.cadcli_fone1ddd = self.fone1PeEntry.get() 629 | self.cadcli_fone1 = self.fone1PeEntry2.get() 630 | self.cadcli_fone2ddd = self.fone2PeEntry.get() 631 | self.cadcli_fone2 = self.fone2PeEntry2.get() 632 | self.cadcli_cep = self.cepPeEntry.get() 633 | self.cadcli_cpf = self.cnpj_mat_ent.get() 634 | self.cadcli_email = self.emailPeEntry.get() 635 | self.cadcli_obs = self.obsPeEntry.get() 636 | def variaveisVeiculo(self): 637 | self.cadcli_veiculoId = self.codEquipEntry.get() 638 | self.cadcli_MontadoraId = self.entradaMontadora2.get() 639 | self.cadcli_veiculo = self.nomeEquipEntry.get() 640 | self.cadcli_ano = self.fabrAnoEquipEntry.get() 641 | self.cadcli_placa = self.serialEquipEntry.get() 642 | self.cadcli_montadora = self.marcaEquipEntry.get() 643 | self.cadcli_combust = self.combvar.get() 644 | self.cadcli_cor = self.corvar.get() 645 | def cep(self): 646 | self.logradPeEntry.delete(0, END) 647 | self.bairroPeEntry.delete(0, END) 648 | self.cidadePeEntry.delete(0, END) 649 | self.ufPeEntry.delete(0, END) 650 | 651 | cep = str(self.cepPeEntry.get()) 652 | cep = cep[0:5] + "-" + cep[5:] 653 | cep = str(cep) 654 | try: 655 | endcep = brazilcep.get_address_from_cep(cep, webservice=WebService.APICEP) 656 | 657 | self.logradPeEntry.insert(END, endcep['street']) 658 | self.bairroPeEntry.insert(END, endcep['district']) 659 | self.cidadePeEntry.insert(END, endcep['city']) 660 | self.ufPeEntry.insert(END, endcep['uf']) 661 | 662 | except: 663 | messagebox.showinfo('Mensagem', 'Houve um erro ao procurar este CEP!!') 664 | def busca_auto_c(self, *args): 665 | # Widgets - Listar tecnicos # 666 | self.nomeEquipEntry.insert(END, '%') 667 | 668 | veicAuto = self.nomeEquipEntry.get() 669 | 670 | self.listatec = Toplevel() 671 | self.listatec.title(" GLAC ") 672 | self.listatec.configure(background='gray75') 673 | self.listatec.geometry("405x235+100+150") 674 | self.listatec.resizable(FALSE, FALSE) 675 | self.listatec.transient(self.janelaCli) 676 | self.listatec.focus_force() 677 | self.listatec.grab_set() 678 | ########## 679 | self.listatec1 = ttk.Treeview(self.listatec, height=10, 680 | column=("col1", "col2", "col3")) 681 | self.listatec1.heading("#0", text="") 682 | self.listatec1.heading("#1", text='Cod') 683 | self.listatec1.heading("#2", text="Automovel") 684 | self.listatec1.heading("#3", text="Marca") 685 | 686 | self.listatec1.column("#0", width=0) 687 | self.listatec1.column("#1", width=40) 688 | self.listatec1.column("#2", width=180) 689 | self.listatec1.column("#3", width=150) 690 | 691 | # Cria barra de rolagem 692 | self.barra = ttk.Scrollbar(self.listatec, orient='vertical', 693 | command=self.listatec1.yview) 694 | 695 | # Adiciona barra de rolagem 696 | self.listatec1.configure(yscroll=self.barra.set) 697 | self.barra.place(x=377, y=6, height=220) 698 | self.listatec1.place(x=5, y=5) 699 | self.conecta_Glac() 700 | self.cursor.execute("""SELECT cod_aut, automovel, marca 701 | FROM automoveis, montadora WHERE montadora.cod = automoveis.montad 702 | AND automovel LIKE '%s' ORDER BY automovel ASC""" % veicAuto) 703 | rows = self.cursor.fetchall() 704 | for row in rows: 705 | self.listatec1.insert("", END, values=row) 706 | self.listatec1.bind('', self.add_autobindC) 707 | self.desconecta_Glac() 708 | def deletar_window_c(self): 709 | res = messagebox.askquestion('Deletar cliente', 'Deseja realmente deletar este registro?') 710 | if res == 'no': 711 | res = '' 712 | else: 713 | self.del_clienteC() 714 | messagebox.showinfo('Mensagem', 'Registro deletado com sucesso!!') 715 | def deletar_window_placa_c(self): 716 | res = messagebox.askquestion('Deletar veiculo', 'Deseja realmente deletar este registro?') 717 | if res == 'no': 718 | res = '' 719 | else: 720 | self.del_placaC() 721 | messagebox.showinfo('Mensagem', 'Registro deletado com sucesso!!') --------------------------------------------------------------------------------