main.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #!/usr/bin/env python
  2. #
  3. # This is the GUI for the system!
  4. #
  5. # The pack() and pack_forget combinations are extremely powerful!
  6. #
  7. import os
  8. import sys
  9. import Tkinter as tk
  10. import admin
  11. import config
  12. class BaseWindow:
  13. '''
  14. This is the basic window wireframe. All the interaction will happen here
  15. (no opening up new windows, etc) so we will devise a way of using "tabs"
  16. where the choices chosen through the menubar will show-hide the content.
  17. '''
  18. def destroy(self, event=None):
  19. '''
  20. For now a thin wrapper for the Tk.quit() method, but may be used as
  21. a safety catch e.g. if one hasn't saved inventory changes before
  22. quitting. I dno. Let's see how this goes.
  23. '''
  24. print "Quitting..."
  25. self.window.quit()
  26. def submit_purchase(self):
  27. '''
  28. Read all fields and submit them!
  29. '''
  30. values = []
  31. if self.new_purchase_fields[0].get() == "":
  32. self.statusbar.config(text="Preencha o nome do cliente")
  33. return
  34. elif self.new_purchase_fields[1].get() == "":
  35. self.statusbar.config(text="Preencha o email do cliente")
  36. return
  37. for field in self.new_purchase_fields:
  38. if field.get() == "":
  39. values.append(0)
  40. else:
  41. values.append(field.get())
  42. code = admin.new_purchase(
  43. values[0],
  44. values[1],
  45. int(values[2]),
  46. int(values[3]),
  47. int(values[4]),
  48. int(values[5]),
  49. int(values[6])
  50. )
  51. if code[0] == "unavailable":
  52. self.statusbar.config(text="Indisponivel no estoque: %s" % code[1])
  53. else:
  54. self.statusbar.config(text="Pedido numero %s cadastrado" % code[0])
  55. for field in self.new_purchase_fields:
  56. field.delete(0, tk.END)
  57. def checkorder(self):
  58. purchase = admin.view_purchase(
  59. self.ordervalue.get().split(" ")[0]
  60. )
  61. finalstring = ""
  62. if purchase is not None:
  63. finalstring += "Cliente: %s (%s)\n" % (purchase[0], purchase[1])
  64. if purchase[2] != 0:
  65. finalstring += "Sabonete de Mel: %s unidades\n" % purchase[2]
  66. if purchase[3] != 0:
  67. finalstring += "Sabonete de Patchouli: %s unidades\n" % purchase[3]
  68. if purchase[4] != 0:
  69. finalstring += "Sabonete de Papoula: %s unidades\n" % purchase[4]
  70. if purchase[5] != 0:
  71. finalstring += "Sabonete de Capim-limao: %s unidades\n" % purchase[5]
  72. if purchase[6] != 0:
  73. finalstring += "Alcool-gel: %s unidades\n" % purchase[6]
  74. finalstring += "Status do pedido: %s\n" % purchase[7]
  75. finalstring += "Criado em: %s" % purchase[8]
  76. self.resultsfield.config(text=finalstring)
  77. else:
  78. self.resultsfield.config(text="Transaction not found")
  79. def availability(self):
  80. '''
  81. Queries the database to see if there are any items still available
  82. '''
  83. product = self.menuvalue.get()
  84. stock = admin.view_availability(product)
  85. self.statusbar.config(text="Quantidade em estoque: %s" % stock)
  86. # These three methods change the main view of the program:
  87. def view_inventory(self):
  88. self.statusbar.config(text="Visualizando inventario")
  89. self.new_purchase_frame.pack_forget()
  90. self.ongoing_purchase_frame.pack_forget()
  91. self.inventory_frame.pack(expand=True, fill=tk.BOTH)
  92. def view_purchases(self):
  93. self.statusbar.config(text="Visualizando compras")
  94. self.new_purchase_frame.pack_forget()
  95. self.inventory_frame.pack_forget()
  96. self.ongoing_purchase_frame.pack(expand=True, fill=tk.BOTH)
  97. def view_new_purchase(self):
  98. self.statusbar.config(text="Cadastre uma nova compra")
  99. self.ongoing_purchase_frame.pack_forget()
  100. self.inventory_frame.pack_forget()
  101. self.new_purchase_frame.pack(expand=True, fill=tk.BOTH)
  102. def update_ongoing(self):
  103. ongoing = admin.get_transactions("pendente")
  104. raw = []
  105. for item in ongoing:
  106. raw.append("%s - %s" % (item[0], item[1]))
  107. return tuple(raw)
  108. def __init__(self):
  109. self.window = tk.Tk()
  110. self.window.title("Gerenciador de inventario e vendas")
  111. self.window.geometry("600x500")
  112. self.window.bind("<Control-q>", self.destroy)
  113. # Base canvas on which all content will be placed:
  114. self.canvas = tk.Frame(self.window)
  115. # Show-hide canvases for each of the "application windows"
  116. self.new_purchase_frame = tk.Frame(self.canvas)
  117. self.ongoing_purchase_frame = tk.Frame(self.canvas)
  118. self.inventory_frame = tk.Frame(self.canvas)
  119. # This statusbar will be present at all times in the interface:
  120. self.statusbar = tk.Label(self.window)
  121. # Menubar to go full WIMP
  122. self.menubar = tk.Menu(self.window)
  123. self.filemenu = tk.Menu(self.menubar, tearoff=False)
  124. self.filemenu.add_command(label="Sair", command=self.destroy, underline=0)
  125. self.viewmenu = tk.Menu(self.menubar, tearoff=False)
  126. self.viewmenu.add_command(label="Nova compra",
  127. command=self.view_new_purchase, underline=0)
  128. self.viewmenu.add_command(label="Inventario",
  129. command=self.view_inventory, underline=0)
  130. self.viewmenu.add_command(label="Compras",
  131. command=self.view_purchases, underline=0)
  132. self.menubar.add_cascade(label="Arquivo", menu=self.filemenu, underline=0)
  133. self.menubar.add_cascade(label="Visualizar", menu=self.viewmenu, underline=0)
  134. self.window.config(menu=self.menubar)
  135. #-----------------------
  136. #
  137. # Packing content for NEW PURCHASE
  138. #
  139. #-----------------------
  140. self.new_purchase_fields = []
  141. self.namelabel = tk.Label(self.new_purchase_frame, text="Nome do cliente:")
  142. self.namefield = tk.Entry(self.new_purchase_frame)
  143. self.new_purchase_fields.append(self.namefield)
  144. self.emaillabel = tk.Label(self.new_purchase_frame, text="Email do cliente:")
  145. self.emailfield = tk.Entry(self.new_purchase_frame)
  146. self.new_purchase_fields.append(self.emailfield)
  147. self.mellabel = tk.Label(self.new_purchase_frame, text="Qtd Sabonete de mel:")
  148. self.melfield = tk.Entry(self.new_purchase_frame)
  149. self.new_purchase_fields.append(self.melfield)
  150. self.patchoulilabel = tk.Label(self.new_purchase_frame, text="Qtd Sabonete de Patchouli:")
  151. self.patchoulifield = tk.Entry(self.new_purchase_frame)
  152. self.new_purchase_fields.append(self.patchoulifield)
  153. self.papoulalabel = tk.Label(self.new_purchase_frame, text="Qtd Sabonete de Papoula:")
  154. self.papoulafield = tk.Entry(self.new_purchase_frame)
  155. self.new_purchase_fields.append(self.papoulafield)
  156. self.capimlabel = tk.Label(self.new_purchase_frame, text="Qtd Sabonete de Capim-limao:")
  157. self.capimfield = tk.Entry(self.new_purchase_frame)
  158. self.new_purchase_fields.append(self.capimfield)
  159. self.alcoollabel = tk.Label(self.new_purchase_frame, text="Qtd Alcool-gel:")
  160. self.alcoolfield = tk.Entry(self.new_purchase_frame)
  161. self.new_purchase_fields.append(self.alcoolfield)
  162. self.submit = tk.Button(self.new_purchase_frame, text="Cadastrar",
  163. command=self.submit_purchase)
  164. self.namelabel.pack(fill="x")
  165. self.namefield.pack(fill="x")
  166. self.emaillabel.pack(fill="x")
  167. self.emailfield.pack(fill="x")
  168. self.mellabel.pack()
  169. self.melfield.pack()
  170. self.patchoulilabel.pack()
  171. self.patchoulifield.pack()
  172. self.papoulalabel.pack()
  173. self.papoulafield.pack()
  174. self.capimlabel.pack()
  175. self.capimfield.pack()
  176. self.alcoollabel.pack()
  177. self.alcoolfield.pack()
  178. self.submit.pack()
  179. #-----------------------
  180. #
  181. # Packing content for ONGOING TRANSACTIONS
  182. #
  183. #-----------------------
  184. self.coderow = tk.Frame(self.ongoing_purchase_frame)
  185. self.orderframe = tk.Frame(self.coderow)
  186. self.ordervalue = tk.StringVar(self.window)
  187. self.ordervalue.set("Clique para escolher")
  188. self.orderdropdown = apply(tk.OptionMenu, (self.orderframe,
  189. self.ordervalue) + self.update_ongoing())
  190. self.codelabel = tk.Label(self.coderow, text="Codigo do pedido")
  191. self.checkbutton = tk.Button(self.coderow, text="Checar",
  192. command=self.checkorder)
  193. self.resultsarea = tk.Frame(self.ongoing_purchase_frame)
  194. self.resultslabel = tk.Label(self.resultsarea, text="Detalhes do pedido")
  195. self.resultsfield = tk.Label(self.resultsarea, text="")
  196. self.coderow.pack(expand=False, fill=tk.BOTH)
  197. self.resultsarea.pack(expand=True, fill=tk.BOTH)
  198. self.resultslabel.pack()
  199. self.resultsfield.pack(expand=True, fill=tk.BOTH)
  200. self.codelabel.pack(side="left")
  201. self.orderframe.pack(side="left", expand=True, fill="x")
  202. self.orderdropdown.pack(side="left", expand=True, fill="x")
  203. self.checkbutton.pack(side="left")
  204. #-----------------------
  205. #
  206. # Packing content for INVENTORY
  207. #
  208. #-----------------------
  209. # Stuff for Dropdown menu:
  210. self.menuvalue = tk.StringVar(self.window)
  211. self.menuvalue.set("Clique para escolher")
  212. self.inventoryframe = tk.Frame(self.inventory_frame)
  213. self.dropdown = apply(tk.OptionMenu, (self.inventoryframe,
  214. self.menuvalue) + config.products)
  215. self.checker = tk.Button(self.inventory_frame, text="Checar disponibilidade",
  216. command=self.availability)
  217. self.inventoryframe.pack(side="left", expand=1)
  218. self.dropdown.pack(expand=1)
  219. self.checker.pack(side="right")
  220. #-----------------------
  221. #
  222. # Packing content for CLIENT INFORMATION
  223. #
  224. #-----------------------
  225. # TODO!
  226. # Pack them up.
  227. self.canvas.pack(expand=True)
  228. self.new_purchase_frame.pack(expand=True, fill=tk.BOTH)
  229. self.ongoing_purchase_frame.pack(expand=True, fill=tk.BOTH)
  230. self.inventory_frame.pack(expand=True, fill=tk.BOTH)
  231. self.new_purchase_frame.pack_forget()
  232. self.ongoing_purchase_frame.pack_forget()
  233. self.inventory_frame.pack_forget()
  234. self.statusbar.pack()
  235. def main(self):
  236. self.statusbar.config(text="Ready to roll")
  237. self.window.mainloop()
  238. if __name__ == "__main__":
  239. app = BaseWindow()
  240. app.main()