cadastrarOrcamento.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. from tkinter import *
  2. import tkinter as tk
  3. from tkinter import ttk
  4. import TabOrc as orc
  5. class cadastrar_orcamento():
  6. def __init__(self):
  7. self.janelaCad_Orc = Tk()
  8. self.janelaCad_Orc.state('zoomed')
  9. self.janelaCad_Orc.title('Automativo Soluções')
  10. self.janelaCad_Orc.geometry('1200x600')
  11. self.janelaCad_Orc.configure(bg="#484848")
  12. #self.janelaCad_Orc.minsize(1200, 650)
  13. #self.janelaCad_Orc.maxsize(1200, 650)
  14. # ===========| SEÇÕES & FRAMES |============== #
  15. self.frameTop = Frame(self.janelaCad_Orc, bg="#484848")
  16. self.frameMid = Frame(self.janelaCad_Orc, bg="#484848")
  17. self.secaoCliente = LabelFrame(
  18. self.frameTop, text=' Dados do Cliente ', bg="#484848", fg="white")
  19. self.secaoCadastro = LabelFrame(
  20. self.frameTop, text=' Cadastrar Orçamento ', bg="#484848", fg="white")
  21. self.secaoPesqCliente = LabelFrame(
  22. self.secaoCliente, text=' Pesquisar Cliente ', bg="#484848", fg="white")
  23. self.secaoOrcamento = LabelFrame(
  24. self.janelaCad_Orc, text=' Orçamentos cadastrados ', bg="#484848", fg="white")
  25. self.secaoPesqOrca = LabelFrame(
  26. self.secaoOrcamento, text=' Pesquisar Orçamento ', bg="#484848", fg="white")
  27. self.sub1 = Frame(self.secaoCadastro, bg="#484848")
  28. self.sub2 = Frame(self.secaoCadastro, bg="#484848")
  29. self.sub3 = Frame(self.sub2, bg="#484848")
  30. self.rodape = Frame(self.janelaCad_Orc, bg="#484848")
  31. self.frameTop.pack()
  32. self.frameMid.pack()
  33. self.secaoCliente.pack(side='left', expand='yes',
  34. padx=10, pady=10, anchor='w')
  35. self.secaoCadastro.pack(side='left', fill='both',
  36. expand='yes', padx=10, pady=10)
  37. self.secaoPesqCliente.pack(fill='both', expand='yes', padx=10, pady=10)
  38. self.secaoOrcamento.pack(fill='both', expand='yes')
  39. self.secaoPesqOrca.pack(
  40. fill='both', side='bottom', expand='no', padx=10, pady=10)
  41. self.sub1.pack(side='left')
  42. self.sub2.pack(side='left')
  43. self.sub3.grid(row=2, rowspan=5, column=0,
  44. columnspan=3, padx=10)
  45. self.rodape.pack(fill='both', expand='yes', padx=20)
  46. ### ============| SEÇÃO CLIENTE |============== ###
  47. # ==============| TREEVIEW CLIENTE |================ #
  48. self.header1 = ('#', 'nome', 'carro', 'cpf')
  49. self.trvClient = ttk.Treeview(
  50. self.secaoCliente, selectmode='browse', columns=self.header1, show='headings')
  51. self.trvClient.column('#', width=30, anchor='center')
  52. self.trvClient.column('nome', anchor='center')
  53. self.trvClient.column('carro', anchor='center')
  54. self.trvClient.column('cpf', anchor='center')
  55. self.trvClient.heading('#', text='#')
  56. self.trvClient.heading('nome', text='Nome')
  57. self.trvClient.heading('carro', text='Carro')
  58. self.trvClient.heading('cpf', text='CPF')
  59. self.trvClient.bind('<Double 1>', self.pegar_linha1)
  60. self.trvClient.pack(fill='both')
  61. self.listarClientes()
  62. # ============| CAMPO PESQUISAR CLIENTE |========== #
  63. self.pesqClient = Label(self.secaoPesqCliente,
  64. text='Pesquisa-cliente:', bg="#484848", fg="white")
  65. self.keyClient = Entry(self.secaoPesqCliente,
  66. textvariable='txtPesquisaCliente', bg="#484848", fg="white")
  67. self.pesqClient.pack(side='left', padx=10, pady=6)
  68. self.keyClient.pack(side='left', padx=10, pady=6)
  69. # ===============| BOTÕES |================= #
  70. self.btnPesqClient = Button(
  71. self.secaoPesqCliente, text='Pesquisar', bg="#484848", fg="white", command=self.pesquisar_cliente)
  72. self.btnMostrarCliente = Button(
  73. self.secaoPesqCliente, text='Mostrar Clientes', bg="#484848", fg="white", command=self.listarClientes)
  74. self.btnPesqClient.pack(side='left', padx=10, pady=6, ipadx=40)
  75. self.btnMostrarCliente.pack(side='left', padx=10, pady=6, ipadx=40)
  76. ### =========| SEÇÃO CADASTRO |=========== ###
  77. # ============| CAMPOS DE DADO (SUB-1) |=============#
  78. self.lblCliente = Label(
  79. self.sub1, text='Cliente:', bg="#484848", fg="white")
  80. self.lblCarro = Label(self.sub1, text='Carro:',
  81. bg="#484848", fg="white")
  82. self.lblCPF_Client = Label(
  83. self.sub1, text='CPF Cliente:', bg="#484848", fg="white")
  84. self.lblMecanico = Label(
  85. self.sub1, text='Mecânico:', bg="#484848", fg="white")
  86. self.lblCPF_Mec = Label(
  87. self.sub1, text='CPF Mec.:', bg="#484848", fg="white")
  88. self.lblCliente.grid_columnconfigure(0, minsize=10)
  89. self.lblCliente.grid(row=0, column=0, padx=1, pady=6, sticky='e')
  90. self.lblCarro.grid(row=1, column=0, padx=1, pady=6, sticky='e')
  91. self.lblCPF_Client.grid(row=2, column=0, padx=1, pady=6, sticky='e')
  92. self.lblMecanico.grid(row=3, column=0, padx=1, pady=6, sticky='e')
  93. self.lblCPF_Mec.grid(row=4, column=0, padx=1, pady=6, sticky='e')
  94. self.entNomeClient = Entry(
  95. self.sub1, textvariable='txtCliente', state='readonly')
  96. self.entClient_CPF = Entry(
  97. self.sub1, textvariable='txtCPF_cliente', state='readonly')
  98. self.entCarro = Entry(
  99. self.sub1, textvariable='txtCarro', state='readonly')
  100. self.entNomeMec = Entry(
  101. self.sub1, textvariable='txtNomeMecanico')
  102. self.entMEC_CPF = Entry(
  103. self.sub1, textvariable='txtCPF_mec')
  104. # ===================================================================================
  105. # ===================================================================================
  106. # ===================================================================================
  107. # ===================================================================================
  108. # ===================================================================================
  109. # ===================================================================================
  110. #self.entNomeMec.insert(INSERT, 'KELVIN ')
  111. #self.entMEC_CPF.insert(INSERT, '34567891234')
  112. # self.entNomeMec.configure(state='readonly')
  113. # self.entMEC_CPF.configure(state='readonly')
  114. self.entNomeClient.grid(row=0, column=1, padx=1, pady=6)
  115. self.entClient_CPF.grid(row=1, column=1, padx=1, pady=6)
  116. self.entCarro.grid(row=2, column=1, padx=1, pady=6)
  117. self.entNomeMec.grid(row=3, column=1, padx=1, pady=6)
  118. self.entMEC_CPF.grid(row=4, column=1, padx=1, pady=6)
  119. # ==================================| (SUB-2) |=============================================== #
  120. txtServico = StringVar()
  121. txtValor = StringVar()
  122. self.lblServico = Label(
  123. self.sub2, text='Serviço/Peça', bg="#484848", fg="white")
  124. self.lblValor = Label(self.sub2, text='Valor(R$)',
  125. bg="#484848", fg="white")
  126. self.entServico = Entry(self.sub2, textvariable=txtServico)
  127. self.entValor = Entry(self.sub2, textvariable=txtValor)
  128. self.lblServico.grid(row=0, column=0, padx=10, pady=3)
  129. self.lblValor.grid(row=0, column=1, padx=10, pady=3)
  130. self.entServico.grid(row=1, column=0, padx=10, pady=3)
  131. self.entValor.grid(row=1, column=1, padx=10, pady=3)
  132. self.entValor.bind('<Return>', self.adicionar)
  133. # ===============| BOTÕES |================== #
  134. self.btnAlterar = Button(
  135. self.sub1, text='Alterar', command=self.alterar, bg="#484848", fg="white")
  136. self.btnLimpar = Button(
  137. self.sub1, text='Limpar', command=self.limpar_Cadastro_Cliente, bg="#484848", fg="white")
  138. self.btnCadastrar = Button(
  139. self.sub1, text='Cadastrar', command=self.cadastrar_orc, bg="#484848", fg="white")
  140. self.btnAlterar.grid(column=0, columnspan=2, padx=10, pady=6, ipadx=40)
  141. self.btnLimpar.grid(column=0, columnspan=2, padx=10, pady=6, ipadx=40)
  142. self.btnCadastrar.grid(column=0, columnspan=2,
  143. padx=10, pady=6, ipadx=35)
  144. self.btnAlterar.bind("<Enter>", self.hoverIn3)
  145. self.btnAlterar.bind("<Leave>", self.hoverOut)
  146. self.btnLimpar.bind("<Enter>", self.hoverIn2)
  147. self.btnLimpar.bind("<Leave>", self.hoverOut)
  148. self.btnCadastrar.bind("<Enter>", self.hoverIn)
  149. self.btnCadastrar.bind("<Leave>", self.hoverOut)
  150. self.btnAdd = Button(self.sub2, text='Adicionar',
  151. command=self.adicionar_serv, bg="#484848", fg="white")
  152. self.btnAdd.grid(row=1, column=2, padx=5, pady=6, ipadx=20)
  153. # ==============| TREEVIEW CADASTRO (SUB-3) |================= #
  154. self.header2 = ('#', 'item', 'valor')
  155. self.trvCadastro = ttk.Treeview(
  156. self.sub3, selectmode='browse', columns=self.header2, show='headings')
  157. self.trvCadastro.column('#', width=30, anchor='center')
  158. self.trvCadastro.column('item', anchor='w')
  159. self.trvCadastro.column('valor', anchor='center')
  160. self.trvCadastro.heading('#', text='#')
  161. self.trvCadastro.heading('item', text='Item')
  162. self.trvCadastro.heading('valor', text='Valor')
  163. self.trvCadastro.bind('<Double 1>', self.pegar_linha2)
  164. self.trvCadastro.grid()
  165. self.total = 0
  166. self.valorTotal = Label(
  167. self.sub3, text=f'Valor Total: R${self.total:.2f}', bg="#484848", fg="white")
  168. self.valorTotal.grid(sticky='se')
  169. ### =================| SEÇÃO ORCAMENTOS CADASTRADOS |================== ###
  170. # ========================| TREEVIEW ORCAMENTOS |========================== #
  171. self.header3 = ('#', 'nome', 'carro', 'valor', 'descricao')
  172. self.trv_Orcam = ttk.Treeview(
  173. self.secaoOrcamento, selectmode='browse', columns=self.header3, show='headings', height=6)
  174. self.trv_Orcam.column('#', width=10, anchor='center')
  175. self.trv_Orcam.column('nome', anchor='center')
  176. self.trv_Orcam.column('carro', anchor='center')
  177. self.trv_Orcam.column('valor', anchor='center')
  178. self.trv_Orcam.heading('#', text='#')
  179. self.trv_Orcam.heading('nome', text='Nome')
  180. self.trv_Orcam.heading('carro', text='Carro')
  181. self.trv_Orcam.heading('valor', text='Valor')
  182. self.trv_Orcam.heading('descricao', text='Descrição do Serviço')
  183. self.trv_Orcam.bind('<Double 1>', self.pegar_linha3)
  184. self.trv_Orcam.pack(fill='both')
  185. self.listarOrcamentos()
  186. ### ==============| SEÇÃO PESQUISAR ORCAMENTO |=========== ###
  187. self.pesqOrc = Label(self.secaoPesqOrca,
  188. text='Palavra-chave', bg="#484848", fg="white")
  189. self.pesqOrc.pack(side='left', padx=10, pady=6)
  190. self.keyOrcam = Entry(self.secaoPesqOrca,
  191. textvariable='txtPesquisaOrcamento')
  192. self.keyOrcam.pack(side='left', padx=10, pady=6)
  193. # =========== BOTÕES ================= #
  194. self.btnPesqOrcam = Button(
  195. self.secaoPesqOrca, text='Pesquisar Orçamento', command=self.pesquisarORCAMENTO, bg="#484848", fg="white")
  196. self.btnMostrarOrcam = Button(
  197. self.secaoPesqOrca, text='Mostrar Todos', command=self.listarOrcamentos, bg="#484848", fg="white")
  198. self.btnPesqOrcam.pack(side='left', padx=10, pady=6, ipadx=40)
  199. self.btnMostrarOrcam.pack(side='left', padx=10, pady=6, ipadx=40)
  200. self.valoresDaSoma = []
  201. ### =============| SEÇÃO RODAPÉ |================== ###
  202. # ==================| BOTÃO |================== #
  203. self.btnVoltar = Button(
  204. self.rodape, text='Voltar', command=self.voltar, bg="#484848", fg="white")
  205. self.btnVoltar.pack(side='right', padx=10, pady=10, ipadx=40)
  206. self.lista_de_cadORCAMENTO = []
  207. self.contador = 0
  208. mainloop()
  209. #====================================================| FUNÇÕES |=======================================================#
  210. # =====| GERAIS |===== #
  211. def treeviewDelete(self, local):
  212. return local.delete(*local.get_children())
  213. def voltar(self):
  214. self.janelaCad_Orc.destroy()
  215. return
  216. def entNormal(self):
  217. self.entNomeClient.configure(state='normal')
  218. self.entClient_CPF.configure(state='normal')
  219. self.entCarro.configure(state='normal')
  220. self.entNomeMec.configure(state='normal')
  221. self.entMEC_CPF.configure(state='normal')
  222. def entLeitura(self):
  223. self.entNomeClient.configure(state='readonly')
  224. self.entClient_CPF.configure(state='readonly')
  225. self.entCarro.configure(state='readonly')
  226. # self.entNomeMec.configure(state='readonly')
  227. # self.entMEC_CPF.configure(state='readonly')
  228. def limpar_tudo(self):
  229. self.entNormal()
  230. self.entNomeClient.delete(0, END)
  231. self.entClient_CPF.delete(0, END)
  232. self.entCarro.delete(0, END)
  233. self.entServico.delete(0, END)
  234. self.entValor.delete(0, END)
  235. self.total = 0
  236. self.valorTotal["text"] = f'Valor Total: R${self.total:.2f}'
  237. self.contador = 0
  238. self.valoresDaSoma = []
  239. self.lista_de_cadORCAMENTO = []
  240. self.entLeitura()
  241. def soma_valor(self):
  242. valor = 0
  243. selected = self.lista_de_cadORCAMENTO
  244. for i in selected:
  245. valor = i[2]
  246. self.valoresDaSoma.append(valor)
  247. total = sum(self.valoresDaSoma)
  248. self.total = total
  249. self.valorTotal["text"] = f'Valor Total: R${self.total:.2f}'
  250. # =====| CLIENTES |===== #
  251. def view_Client(self, local):
  252. self.treeviewDelete(local)
  253. linhas = orc.viewClientes()
  254. for i in linhas:
  255. local.insert('', END, values=i)
  256. def listarClientes(self):
  257. return self.view_Client(self.trvClient)
  258. def pesquisar_cliente(self):
  259. chave = self.keyClient.get()
  260. result = orc.searchCliente(chave)
  261. self.treeviewDelete(self.trvClient)
  262. selection = []
  263. selection.append((result[0][0], result[0][1],
  264. result[0][3], result[0][4]))
  265. for i in selection:
  266. self.trvClient.insert('', END, values=i)
  267. def identificar_linha1(self, trvLocal):
  268. listaItem = []
  269. self.entNormal()
  270. self.limpar_Cadastro_Cliente()
  271. self.entNormal()
  272. for item in trvLocal.selection():
  273. identif = trvLocal.item(item, 'values')
  274. listaItem.append(identif)
  275. self.entNomeClient.insert(INSERT, listaItem[0][1])
  276. self.entClient_CPF.insert(INSERT, listaItem[0][2])
  277. self.entCarro.insert(INSERT, listaItem[0][3])
  278. self.entLeitura()
  279. def pegar_linha1(self, event):
  280. return self.identificar_linha1(self.trvClient)
  281. # ======| CADASTRO |=====#
  282. def view_cadORCAMENTO(self, local):
  283. self.treeviewDelete(local)
  284. linhas = self.lista_de_cadORCAMENTO
  285. for i in linhas:
  286. local.insert('', END, values=i)
  287. self.tupToStr(self.lista_de_cadORCAMENTO)
  288. def listarCadOrcamento(self):
  289. return self.view_cadORCAMENTO(self.trvCadastro)
  290. def limpar_Cadastro_Cliente(self):
  291. self.treeviewDelete(self.trvCadastro)
  292. self.entNormal()
  293. self.entNomeClient.delete(0, END)
  294. self.entClient_CPF.delete(0, END)
  295. self.entCarro.delete(0, END)
  296. self.entLeitura()
  297. def limpar_Servicos(self):
  298. self.entServico.delete(0, END)
  299. self.entValor.delete(0, END)
  300. def adicionar(self, event):
  301. self.adicionar_serv()
  302. def adicionar_serv(self):
  303. self.contador += 1
  304. self.appendListCadOrc(self.contador)
  305. self.listarCadOrcamento()
  306. self.limpar_Servicos()
  307. self.soma_valor()
  308. self.entServico.focus()
  309. def appendListCadOrc(self, contador):
  310. servico = str(self.entServico.get())
  311. valor = int(self.entValor.get())
  312. return self.lista_de_cadORCAMENTO.append((contador, servico, valor))
  313. def filtroDeImpurezas(self, string):
  314. characters = "(',)"
  315. for x in range(len(characters)):
  316. string = string.replace(characters[x], "")
  317. return string
  318. def adicionar_Orc(self, trvLocal):
  319. self.tupla = []
  320. for item in trvLocal.selection():
  321. self.identificador = trvLocal.item(item, 'values')
  322. self.tupla.append((self.identificador))
  323. self.idCadOrc = self.filtroDeImpurezas(self.tupla[0][0])
  324. self.entServico.insert(
  325. INSERT, self.filtroDeImpurezas(self.tupla[0][1]))
  326. self.entValor.insert(INSERT, self.filtroDeImpurezas(self.tupla[0][2]))
  327. self.entServico.focus()
  328. def pegar_linha2(self, event):
  329. self.limpar_Servicos()
  330. return self.adicionar_Orc(self.trvCadastro)
  331. def alterar_Serv(self, trvLocal):
  332. listValue = []
  333. selecao = trvLocal.selection()
  334. for item in selecao:
  335. identificador = trvLocal.item(item, 'values')
  336. listValue.append(identificador)
  337. trvLocal.item(selecao, values=(
  338. listValue[0][0], self.entServico.get(), self.entValor.get()))
  339. return
  340. def alterar(self):
  341. return self.alterar_Serv(self.trvCadastro)
  342. def cadastrar_orc(self):
  343. self.entNormal()
  344. status = 'Pendente'
  345. cliente = self.entNomeClient.get()
  346. cpf_client = self.entClient_CPF.get()
  347. carro = self.entCarro.get()
  348. nome_mec = self.entNomeMec.get()
  349. cpf_mec = self.entMEC_CPF.get()
  350. descricao = self.filtroDeImpurezas(
  351. self.tupToStr(self.lista_de_cadORCAMENTO))
  352. valor = self.total
  353. valores = orc.inserir_orc(
  354. cliente, carro, cpf_client, nome_mec, cpf_mec, valor, descricao, status)
  355. print(valores)
  356. self.view_Orcamento(self.trv_Orcam)
  357. self.limpar_tudo()
  358. self.entLeitura()
  359. def tupToStr(self, tupla):
  360. lista = []
  361. for i in tupla:
  362. lista.append(i)
  363. stringed = ''
  364. for x in lista:
  365. stringed += str(x)
  366. return stringed
  367. # =====| ORCAMENTO |===== #
  368. def view_Orcamento(self, local):
  369. self.treeviewDelete(local)
  370. linhas = orc.view()
  371. print(linhas)
  372. for i in linhas:
  373. local.insert('', END, values=i)
  374. def listarOrcamentos(self):
  375. return self.view_Orcamento(self.trv_Orcam)
  376. def pesquisarORCAMENTO(self):
  377. chave = self.keyOrcam.get()
  378. result = orc.search(chave)
  379. self.treeviewDelete(self.trv_Orcam)
  380. for i in result:
  381. self.trv_Orcam.insert('', END, values=i)
  382. def add_cadastro(self, trvLocal):
  383. self.tupla = []
  384. for item in trvLocal.selection():
  385. self.identificador = trvLocal.item(item, 'values')
  386. self.tupla.append((self.identificador[4]))
  387. self.treeviewDelete(self.trvCadastro)
  388. for i in self.tupla:
  389. self.trvCadastro.insert(
  390. '', END, values=self.filtroDeImpurezas(self.tupToStr(i)))
  391. def pegar_linha3(self, event):
  392. return self.add_cadastro(self.trv_Orcam)
  393. def hoverIn(self, event):
  394. event.widget.config(bg="#1E90FF", fg="white", relief=GROOVE)
  395. def hoverIn2(self, event):
  396. event.widget.config(bg="#FF0000", fg="white", relief=GROOVE)
  397. def hoverIn3(self, event):
  398. event.widget.config(bg="#FFD700", fg="black", relief=GROOVE)
  399. def hoverOut(self, event):
  400. event.widget.config(bg="#484848", fg="white", relief=RAISED)
  401. # def executeJan(self):
  402. # app = cadastrar_orcamento()
  403. # return app.janelaCad_Orc.mainloop()
  404. app = cadastrar_orcamento()