PageRenderTime 29ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/core/promogest/modules/Inventario/ui/GestioneInventario.py

http://promogest.googlecode.com/
Python | 1123 lines | 1037 code | 46 blank | 40 comment | 19 complexity | e6758195fad9c463a07847795e84fa48 MD5 | raw file
Possible License(s): GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2005, 2006, 2007 2008, 2009, 2010, 2011 by Promotux
  3. # di Francesco Meloni snc - http://www.promotux.it/
  4. # Author: Francesco Meloni <francesco@promotux.it>
  5. # Author: Andrea Argiolas <andrea@promotux.it>
  6. # Author: Francesco Marella <francesco.marella@gmail.com>
  7. # This file is part of Promogest.
  8. # Promogest is free software: you can redistribute it and/or modify
  9. # it under the terms of the GNU General Public License as published by
  10. # the Free Software Foundation, either version 3 of the License, or
  11. # (at your option) any later version.
  12. # Promogest is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU General Public License for more details.
  16. # You should have received a copy of the GNU General Public License
  17. # along with Promogest. If not, see <http://www.gnu.org/licenses/>.
  18. from promogest.ui.gtk_compat import *
  19. import os
  20. from datetime import datetime
  21. from promogest.ui.RicercaComplessaArticoli import RicercaComplessaArticoli
  22. from promogest import Environment
  23. from promogest.dao.Operazione import Operazione
  24. from promogest.dao.Inventario import Inventario
  25. from promogest.dao.TestataMovimento import TestataMovimento
  26. from promogest.dao.RigaMovimento import RigaMovimento
  27. from promogest.dao.Riga import Riga
  28. from promogest.dao.Magazzino import Magazzino
  29. from promogest.dao.Articolo import Articolo
  30. from promogest.dao.Stoccaggio import Stoccaggio
  31. from promogest.dao.Listino import Listino
  32. from promogest.ui.GladeWidget import GladeWidget
  33. from promogest.ui.utils import *
  34. from promogest.dao.DaoUtils import giacenzaArticolo
  35. from sqlalchemy import func
  36. if posso("PW"):
  37. from promogest.modules.PromoWear.ui.PromowearUtils import *
  38. from promogest.modules.PromoWear.ui import AnagraficaArticoliPromoWearExpand
  39. class GestioneInventario(RicercaComplessaArticoli):
  40. """ Gestione inventario di magazzino """
  41. def __init__(self, idMagazzino = None):
  42. # aggiornamento inventario con gli articoli eventualmente non presenti
  43. # self.checkTable()
  44. # filtri propri della parte inventario
  45. self.additional_filter = GladeWidget(rootWidget='inventario_filter_table',
  46. fileName="Inventario/gui/inventario_filter_table.glade", isModule=True)
  47. fillComboboxMagazzini(self.additional_filter.id_magazzino_filter_combobox2, noempty=True)
  48. if idMagazzino:
  49. findComboboxRowFromId(self.additional_filter.id_magazzino_filter_combobox2,
  50. idMagazzino)
  51. # aggiunta della parte di dettaglio
  52. self._modifica = GladeWidget(rootWidget='inventario_detail_vbox',
  53. fileName="Inventario/gui/_inventario_select.glade", isModule=True)
  54. RicercaComplessaArticoli.__init__(self)
  55. self.anno = int(Environment.workingYear)
  56. self.annoScorso= int(Environment.workingYear) -1
  57. # modifiche all'interfaccia originaria
  58. self.getTopLevel().set_title('Promogest - Gestione inventario ' + str(self.annoScorso))
  59. self.search_image.set_no_show_all(True)
  60. self.search_image.set_property('visible', False)
  61. self.filter.filter_search_button.set_label('_Seleziona')
  62. # self.buttons_hbox.destroy()
  63. self._ricerca.varie_articolo_filter_expander.set_no_show_all(True)
  64. self._ricerca.varie_articolo_filter_expander.set_property('visible', False)
  65. # aggiunta dei filtri propri e della parte di dettaglio
  66. # ricerca_semplice_articoli_filter_vbox
  67. self.filters.ricerca_semplice_articoli_filter_vbox.pack_start(self.additional_filter.getTopLevel(), False, True, 0)
  68. self.filters.ricerca_semplice_articoli_filter_vbox.reorder_child(self.additional_filter.getTopLevel(), 0)
  69. self.results_vbox.pack_start(self._modifica.getTopLevel(), False, True, 0)
  70. self.additional_filter.id_magazzino_filter_combobox2.connect('changed',
  71. self.on_filter_field_changed)
  72. self.additional_filter.da_data_aggiornamento_filter_entry.connect('focus_out_event',
  73. self.on_filter_field_changed)
  74. self.additional_filter.a_data_aggiornamento_filter_entry.connect('focus_out_event',
  75. self.on_filter_field_changed)
  76. #self._modifica.quantita_entry.connect('key_press_event', self.detail_key_press_event)
  77. #self._modifica.valore_unitario_entry.connect('key_press_event', self.detail_key_press_event)
  78. self._modifica.azzera_button.connect('clicked', self.on_azzera_button_clicked)
  79. self._modifica.azzera_selected_button.connect('clicked', self.on_azzera_selected_button_clicked)
  80. self._modifica.ricrea_button.connect('clicked', self.on_ricrea_button_clicked)
  81. self._modifica.aggiorna_button.connect('clicked', self.on_aggiorna_button_clicked)
  82. self._modifica.aggiorna_da_ana_articoli.connect('clicked', self.on_aggiorna_da_ana_articoli_clicked)
  83. self._modifica.esporta_button.connect('clicked', self.on_esporta_button_clicked)
  84. self._modifica.esporta_conquantita_button.connect('clicked', self.on_esporta_conquantita_button_clicked)
  85. self._modifica.valorizza_button.connect('clicked', self.on_valorizza_button_clicked)
  86. self._modifica.movimento_button.connect('clicked', self.on_movimento_button_clicked)
  87. self._modifica.chiudi_button.connect('clicked', self.on_chiudi_button_clicked)
  88. self._modifica.giacenze_button.connect('clicked', self.on_giacenze_button_clicked)
  89. self._modifica.tutti_radio.connect('toggled', self.on_macro_filter_toggled)
  90. self._modifica.qa_zero_radio.connect('toggled', self.on_macro_filter_toggled)
  91. self._modifica.qa_negativa_radio.connect('toggled', self.on_macro_filter_toggled)
  92. self._modifica.val_negativo_radio.connect('toggled', self.on_macro_filter_toggled)
  93. self._modifica.calcola_pezzi_button.connect("clicked", self.on_calcola_pezzi_button_clicked)
  94. self._modifica.calcola_valori_button.connect("clicked", self.on_calcola_valori_button_clicked)
  95. # self.setRiepilogo()
  96. def checkTable(self):
  97. tutti = Environment.session.query(Inventario.id_articolo,Inventario.id_magazzino).all()
  98. cancellati = []
  99. # print "tutti", tutti
  100. for a in tutti:
  101. if tutti.count(a) >1 and a not in cancellati:
  102. dacancellare = Inventario().select(idArticolo=a[0],idMagazzino=a[1])
  103. cancellati.append(a)
  104. for g in dacancellare[1:]:
  105. g.delete()
  106. def draw(self):
  107. """ Disegna la treeview relativa al risultato del filtraggio """
  108. treeview = self.filter.resultsElement
  109. model = gtk.ListStore(object, str, str, str, str, str, str, str, str, str, str, str, str)
  110. rendererSx = gtk.CellRendererText()
  111. rendererDx = gtk.CellRendererText()
  112. rendererDx.set_property('xalign', 1)
  113. cellspin = gtk.CellRendererSpin()
  114. cellspin.set_property("editable", True)
  115. cellspin.set_property("visible", True)
  116. adjustment = gtk.Adjustment(1, 1, 1000, 0.500, 2)
  117. cellspin.set_property("adjustment", adjustment)
  118. cellspin.set_property("digits", 2)
  119. cellspin.set_property("climb-rate", 3)
  120. cellspin.set_property('xalign', 1)
  121. cellspin.connect('edited', self.on_column_quantita_edited, treeview, True)
  122. column = gtk.TreeViewColumn('Quantit? ', cellspin, text=1)
  123. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  124. column.set_clickable(True)
  125. column.connect("clicked", self.filter._changeOrderBy, (None, Inventario.quantita))
  126. column.set_resizable(True)
  127. column.set_expand(False)
  128. column.set_min_width(50)
  129. treeview.append_column(column)
  130. cellspin1 = gtk.CellRendererSpin()
  131. cellspin1.set_property("editable", True)
  132. cellspin1.set_property("visible", True)
  133. adjustment = gtk.Adjustment(1, 1, 1000, 0.500, 2)
  134. cellspin1.set_property("adjustment", adjustment)
  135. cellspin1.set_property("digits", 2)
  136. cellspin1.set_property("climb-rate", 3)
  137. cellspin1.set_property('xalign', 1)
  138. cellspin1.connect('edited', self.on_column_valore_unitario_edited, treeview, True)
  139. column = gtk.TreeViewColumn('Val. unitario', cellspin1, text=2)
  140. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  141. column.set_clickable(True)
  142. column.connect("clicked", self.filter._changeOrderBy, (None, Inventario.valore_unitario))
  143. column.set_resizable(True)
  144. column.set_expand(False)
  145. column.set_min_width(70)
  146. treeview.append_column(column)
  147. column = gtk.TreeViewColumn('U/B', rendererSx, text=3)
  148. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  149. # column.set_clickable(True)
  150. # column.connect("clicked", self.filter._changeOrderBy, (Articolo, Articolo.unita_base))
  151. column.set_resizable(False)
  152. column.set_expand(False)
  153. column.set_min_width(10)
  154. treeview.append_column(column)
  155. column = gtk.TreeViewColumn('Valorizza', rendererSx, text=4)
  156. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  157. column.set_clickable(False)
  158. # column.connect("clicked", self.filter._changeOrderBy, 'denominazione_breve_unita_base')
  159. column.set_resizable(False)
  160. column.set_expand(False)
  161. column.set_min_width(20)
  162. treeview.append_column(column)
  163. column = gtk.TreeViewColumn('Data agg', rendererSx, text=5)
  164. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  165. column.set_clickable(True)
  166. column.connect("clicked", self.filter._changeOrderBy, (None, Inventario.data_aggiornamento))
  167. column.set_resizable(True)
  168. column.set_expand(False)
  169. column.set_min_width(100)
  170. treeview.append_column(column)
  171. column = gtk.TreeViewColumn('Cod. ART', rendererSx, text=6)
  172. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  173. column.set_clickable(True)
  174. column.connect("clicked", self.filter._changeOrderBy,(Articolo, Articolo.codice))
  175. column.set_resizable(True)
  176. column.set_expand(False)
  177. column.set_min_width(100)
  178. treeview.append_column(column)
  179. column = gtk.TreeViewColumn('Descriz', rendererSx, text=7)
  180. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  181. column.set_clickable(True)
  182. column.connect("clicked", self.filter._changeOrderBy, (Articolo, Articolo.denominazione))
  183. column.set_resizable(True)
  184. column.set_expand(True)
  185. column.set_min_width(250)
  186. treeview.append_column(column)
  187. column = gtk.TreeViewColumn('C Barre', rendererSx, text=8)
  188. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  189. column.set_clickable(False)
  190. column.connect("clicked", self.filter._changeOrderBy, (None, 'produttore'))
  191. column.set_resizable(True)
  192. column.set_expand(False)
  193. treeview.append_column(column)
  194. column = gtk.TreeViewColumn('Produttore', rendererSx, text=9)
  195. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  196. column.set_clickable(True)
  197. column.connect("clicked", self.filter._changeOrderBy, 'produttore')
  198. column.set_resizable(True)
  199. column.set_expand(False)
  200. treeview.append_column(column)
  201. column = gtk.TreeViewColumn('Famiglia', rendererSx, text=10)
  202. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  203. column.set_clickable(True)
  204. column.connect("clicked", self.filter._changeOrderBy, 'denominazione_famiglia')
  205. column.set_resizable(True)
  206. column.set_expand(False)
  207. treeview.append_column(column)
  208. column = gtk.TreeViewColumn('Categoria', rendererSx, text=11)
  209. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  210. column.set_clickable(True)
  211. column.connect("clicked", self.filter._changeOrderBy, 'denominazione_categoria')
  212. column.set_resizable(True)
  213. column.set_expand(False)
  214. treeview.append_column(column)
  215. column = gtk.TreeViewColumn('Cod arti forn', rendererSx, text=12)
  216. column.set_sizing(GTK_COLUMN_GROWN_ONLY)
  217. column.set_clickable(True)
  218. column.connect("clicked", self.filter._changeOrderBy, 'codice_articolo_fornitore')
  219. column.set_resizable(True)
  220. column.set_expand(False)
  221. treeview.append_column(column)
  222. treeview.set_search_column(4)
  223. treeview.set_model(model)
  224. def setInitialSearch(self):
  225. """ Imposta il tipo di ricerca iniziale """
  226. self._ricerca.setRicercaSemplice()
  227. self._ricerca.ricerca_avanzata_articoli_button.set_no_show_all(True)
  228. self._ricerca.ricerca_avanzata_articoli_button.set_property('visible', False)
  229. self._ricerca.ricerca_semplice_articoli_button.set_no_show_all(True)
  230. self._ricerca.ricerca_semplice_articoli_button.set_property('visible', False)
  231. self.buttons_hbox.destroy()
  232. def on_macro_filter_toggled(self, radio):
  233. if radio.get_active():
  234. self.refresh()
  235. def refresh(self, macro_filter="tutti"):
  236. """ Esegue il filtraggio in base ai filtri impostati e aggiorna la treeview """
  237. self.anno = int(Environment.workingYear)
  238. self.annoScorso= int(Environment.workingYear) -1
  239. if (findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2) is None):
  240. obligatoryField(self.getTopLevel(),
  241. self.additional_filter.id_magazzino_filter_combobox2,
  242. 'Inserire il magazzino !')
  243. self.idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  244. self.qa_zero = self._modifica.qa_zero_radio.get_active() or None
  245. self.val_negativo =self._modifica.val_negativo_radio.get_active() or None
  246. self.qa_negativa =self._modifica.qa_negativa_radio.get_active() or None
  247. self.daData = stringToDate(self.additional_filter.da_data_aggiornamento_filter_entry.get_text())
  248. self.aData = stringToDate(self.additional_filter.a_data_aggiornamento_filter_entry.get_text())
  249. model = self.filter.resultsElement.get_model()
  250. # self.batchSize = 50
  251. # self._ricerca._prepare()
  252. denominazione = prepareFilterString(self._ricerca.denominazione_filter_entry.get_text())
  253. produttore = prepareFilterString(self._ricerca.produttore_filter_entry.get_text())
  254. codice = prepareFilterString(self._ricerca.codice_filter_entry.get_text())
  255. codiceABarre = prepareFilterString(self._ricerca.codice_a_barre_filter_entry.get_text())
  256. codiceArticoloFornitore = prepareFilterString(self._ricerca.codice_articolo_fornitore_filter_entry.get_text())
  257. idFamiglia = findIdFromCombobox(self._ricerca.id_famiglia_articolo_filter_combobox)
  258. idCategoria = findIdFromCombobox(self._ricerca.id_categoria_articolo_filter_combobox)
  259. idStato = findIdFromCombobox(self._ricerca.id_stato_articolo_filter_combobox)
  260. if self._ricerca.cancellato_filter_checkbutton.get_active():
  261. cancellato = False
  262. else:
  263. cancellato = True
  264. self.filterDict = { "articolo":denominazione,
  265. "codice":codice,
  266. "codiceABarre":codiceABarre,
  267. "codiceArticoloFornitore":codiceArticoloFornitore,
  268. "produttore":produttore,
  269. "idFamiglia":idFamiglia,
  270. "idCategoria":idCategoria,
  271. "idStato":idStato,
  272. "cancellato":cancellato
  273. }
  274. self._ricerca.filterDict= self.filterDict
  275. # if posso("PW"):
  276. # AnagraficaArticoliPromoWearExpand.refresh(self._ricerca)
  277. self.filter.numRecords = Inventario().count(anno=self.annoScorso,
  278. idMagazzino=self.idMagazzino,
  279. daDataAggiornamento=self.daData,
  280. aDataAggiornamento=self.aData,
  281. qa_zero=self.qa_zero,
  282. qa_negativa=self.qa_negativa,
  283. val_negativo = self.val_negativo,
  284. filterDict = self.filterDict
  285. )
  286. self.filter._refreshPageCount()
  287. invs = Inventario().select(orderBy=self.filter.orderBy,
  288. anno=self.annoScorso,
  289. idMagazzino=self.idMagazzino,
  290. daDataAggiornamento=self.daData,
  291. aDataAggiornamento=self.aData,
  292. qa_zero=self.qa_zero,
  293. qa_negativa=self.qa_negativa,
  294. val_negativo =self.val_negativo,
  295. offset=self.filter.offset,
  296. filterDict=self.filterDict)
  297. self.inventariati_filtrati_tutti = Inventario().select(
  298. anno=self.annoScorso,
  299. idMagazzino=self.idMagazzino,
  300. daDataAggiornamento=self.daData,
  301. aDataAggiornamento=self.aData,
  302. qa_zero=self.qa_zero,
  303. qa_negativa=self.qa_negativa,
  304. val_negativo =self.val_negativo,
  305. batchSize =None,
  306. filterDict=self.filterDict
  307. )
  308. model.clear()
  309. for i in invs:
  310. if not i.quantita:
  311. quantita = mN("0.00")
  312. else:
  313. quantita = Decimal(str(i.quantita).strip()).quantize(Decimal('.01'))
  314. if not i.valore_unitario:
  315. valore_unitario = mN("0.00")
  316. else:
  317. valore_unitario = mN(i.valore_unitario )or 0
  318. model.append((i,
  319. quantita,
  320. valore_unitario,
  321. (i.denominazione_breve_unita_base or ''),
  322. mN(valore_unitario*quantita ) or 0 ,
  323. dateTimeToString(i.data_aggiornamento),
  324. (i.codice_articolo or ''),
  325. (i.articolo or ''),
  326. (i.codice_a_barre or ''),
  327. (i.produttore or ''),
  328. (i.denominazione_famiglia or ''),
  329. (i.denominazione_categoria or ''),
  330. (i.codice_articolo_fornitore or '')))
  331. self._modifica.numero_referenze.set_text(str(self.inventariati()))
  332. def on_calcola_pezzi_button_clicked(self, button):
  333. self._modifica.numero_referenze.set_text(str(self.inventariati()))
  334. self._modifica.numero_pezzi.set_text(str(self.totaleInventariati()))
  335. def on_calcola_valori_button_clicked(self, button):
  336. self._modifica.numero_referenze.set_text(str(self.inventariati()))
  337. self._modifica.numero_pezzi.set_text(str(self.totaleInventariati()))
  338. self._modifica.valore_complessivo.set_text(str(self.valoreComplessivo()))
  339. def inventariati(self):
  340. """ numero delle referenze inventariate"""
  341. return Inventario().count(inventariato = True)
  342. def totaleInventariati(self):
  343. """ Numero totale dei pezzi inventariati numero * quantita' """
  344. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  345. sel = Inventario().select(anno=self.annoScorso,
  346. idMagazzino=idMagazzino, batchSize=None)
  347. tot=0
  348. for s in sel:
  349. if s.quantita >=1:
  350. tot+=s.quantita
  351. return tot
  352. def valoreComplessivo(self):
  353. """ Valore complessivo inventariato"""
  354. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  355. sel = Inventario().select(anno=self.annoScorso,
  356. idMagazzino=idMagazzino, batchSize=None)
  357. tot=0
  358. for s in sel:
  359. if s.quantita >0:
  360. if s.valore_unitario:
  361. valore = Decimal(s.quantita)*Decimal(s.valore_unitario)
  362. else:
  363. valore = 0
  364. tot+=valore
  365. valore = 0
  366. return mN(tot)
  367. def on_filter_treeview_row_activated(self, treeview, path, column):
  368. """ Rileva la riga attualmente selezionata e aggiorna il dettaglio """
  369. self.refreshDetail()
  370. def _changeTreeViewSelectionType(self):
  371. """ Imposta la modalita' di selezione nella treeview ad una sola riga """
  372. selection = self.filter.resultsElement.get_selection()
  373. selection.set_mode(GTK_SELECTIONMODE_SINGLE)
  374. def on_filter_field_changed(self, widget=None, event=None):
  375. """ Aggiorna il testo del riepilogo perche' almeno uno dei filtri propri e' cambiato """
  376. # self.setRiepilogo()
  377. return
  378. # def setRiepilogo(self):
  379. # """ Aggiorna il testo del riepilogo """
  380. # testo = ''
  381. # if self.additional_filter.id_magazzino_filter_combobox2.get_active() != -1:
  382. # value = findStrFromCombobox(self.additional_filter.id_magazzino_filter_combobox2, 2)
  383. # testo += ' Magazzino:\n'
  384. # testo += ' ' + value + '\n'
  385. # value = self.additional_filter.da_data_aggiornamento_filter_entry.get_text()
  386. # if value != '':
  387. # testo += ' Da data aggiornamento:\n'
  388. # testo += ' ' + value + '\n'
  389. # value = self.additional_filter.a_data_aggiornamento_filter_entry.get_text()
  390. # if value != '':
  391. # testo += ' A data aggiornamento:\n'
  392. # testo += ' ' + value + '\n'
  393. # self.setSummaryTextBefore(testo)
  394. def on_column_quantita_edited(self, cell, path, value, treeview, editNext=True):
  395. """ Function to set the value quantita edit in the cell
  396. """
  397. model = treeview.get_model()
  398. value=value.replace(",", ".")
  399. value = mN(value)
  400. model[path][1] = value
  401. #model[path][4] = dateToString(datetime.datetime.today().date())
  402. quantita = Decimal(value)
  403. valore_unitario = Decimal(model[path][2])
  404. model[path][4] = mN(Decimal(quantita*valore_unitario).quantize(Decimal('.01')))
  405. data = model[path][5] or datetime.datetime.today().date()
  406. dao = Inventario().getRecord(id=self.dao.id)
  407. dao.anno = self.dao.anno
  408. dao.id_magazzino = self.dao.id_magazzino
  409. dao.id_articolo = self.dao.id_articolo
  410. dao.quantita = quantita
  411. dao.valore_unitario = valore_unitario
  412. dao.data_aggiornamento = data
  413. Environment.params['session'].add(dao)
  414. Environment.params['session'].commit()
  415. def on_column_valore_unitario_edited(self, cell, path, value, treeview, editNext=True):
  416. """ Function ti set the value valore unitario edit in the cell
  417. """
  418. model = treeview.get_model()
  419. value=value.replace(",", ".")
  420. value = mN(value)
  421. model[path][2] = value
  422. model[path][5] = dateToString(datetime.datetime.today().date())
  423. valore_unitario = Decimal(value)
  424. quantita= Decimal(model[path][1])
  425. model[path][4] = mN(Decimal(quantita*valore_unitario).quantize(Decimal('.01')))
  426. data = model[path][5] or datetime.datetime.today().date()
  427. dao = Inventario().getRecord(id=self.dao.id)
  428. dao.anno = self.dao.anno
  429. dao.id_magazzino = self.dao.id_magazzino
  430. dao.id_articolo = self.dao.id_articolo
  431. dao.quantita = quantita
  432. dao.valore_unitario = valore_unitario
  433. dao.data_aggiornamento = data
  434. Environment.params['session'].add(dao)
  435. Environment.params['session'].commit()
  436. # def next(self):
  437. # """ Passa alla riga successiva della treeview """
  438. # treeview = self.filter.resultsElement
  439. # selection = treeview.get_selection()
  440. # (model, iterator) = selection.get_selected()
  441. # nextIter = model.iter_next(iterator)
  442. # if nextIter is not None:
  443. # path = model.get_path(nextIter)
  444. # selection.select_path(path)
  445. # treeview.scroll_to_cell(path)
  446. # self.on_filter_treeview_cursor_changed(treeview)
  447. # else:
  448. # if not(self.filter.isLastPage()):
  449. # self.filter.filter_next_button.clicked()
  450. # path=model.get_path(model.get_iter_root())
  451. # selection.select_path(path)
  452. # treeview.scroll_to_cell(path)
  453. # self.on_filter_treeview_cursor_changed(treeview)
  454. def on_azzera_selected_button_clicked(self, button):
  455. msg = """ATTENZIONE!!!
  456. Stai per cancellare le informazioni
  457. relative alle voci di inventario filtrate e selezionate.
  458. Confermi la cancellazione ?
  459. """
  460. if YesNoDialog(msg=msg, transient=self.getTopLevel()):
  461. for i in self.inventariati_filtrati_tutti:
  462. i.quantita = 0
  463. Environment.session.add(i)
  464. Environment.session.commit()
  465. self.refresh()
  466. self.fineElaborazione()
  467. def on_azzera_button_clicked(self, button):
  468. msg = """ATTENZIONE!!!
  469. Stai per cancellare il precedente inventario,
  470. TUTTI I MOVIMENTI DI MAGAZZINO FATTI COME
  471. CARICO DI INVENTARIO e successiva
  472. valorizzazione e quantificazione
  473. delle giacenze. Conferma SOLO
  474. se sei sicuro di quel che stai per fare.
  475. Confermi la cancellazione ?
  476. """
  477. if YesNoDialog(msg=msg, transient=self.getTopLevel()):
  478. print "cancello TUTTO IL MOVIMENTO INVENTARIO"
  479. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  480. sel2 = Environment.params['session']\
  481. .query(Inventario)\
  482. .filter(and_(Inventario.anno ==self.annoScorso,
  483. Inventario.id_magazzino==idMagazzino))\
  484. .all()
  485. for s in sel2:
  486. Environment.params['session'].delete(s)
  487. Environment.params['session'].commit()
  488. dat = '01/01/' + str(self.anno)
  489. data = stringToDate(dat)
  490. OneDay = datetime.timedelta(days=1)
  491. aData= data+OneDay
  492. movimento = TestataMovimento().select(daData = data,
  493. aData= aData,
  494. idOperazione= "Carico per inventario")
  495. if movimento:
  496. for m in movimento:
  497. for riga in movimento.righe:
  498. if riga.id_magazzino == self.idMagazzino:
  499. movimento.delete()
  500. return True
  501. model = self.filter.resultsElement.get_model()
  502. model.clear()
  503. return False
  504. def on_giacenze_button_clicked(self, button):
  505. sovrascrivi = False
  506. msg = """Stiamo per aggiungere le giacenze,
  507. si dovranno sovrascrivere quelle gi?  presenti?
  508. """
  509. if YesNoDialog(msg=msg, transient=self.getTopLevel()):
  510. sovrascrivi = True
  511. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  512. res = Inventario().select(anno=self.annoScorso,
  513. idMagazzino=idMagazzino, batchSize=None)
  514. if res:
  515. for r in res:
  516. if (sovrascrivi) or (not sovrascrivi and not r.quantita):
  517. print "ANNO DI GIACENZA", self.annoScorso
  518. giace = giacenzaArticolo(year=self.annoScorso,
  519. idMagazzino=idMagazzino,
  520. idArticolo=r.id_articolo)
  521. r.quantita = giace
  522. if giace >0:
  523. r.data_aggiornamento = datetime.datetime.today().date()
  524. Environment.params['session'].add(r)
  525. Environment.params['session'].commit()
  526. self.refresh()
  527. self.fineElaborazione()
  528. print "FINITO"
  529. def on_ricrea_button_clicked(self, button):
  530. """ Verifica se esistono gia' delle righe di inventario nell'anno di esercizio
  531. """
  532. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  533. res = Inventario().select(anno=self.anno,
  534. idMagazzino=idMagazzino)
  535. if res:
  536. messageInfo(msg='\nElaborazione Impossibile !', transient=self.getTopLevel())
  537. return
  538. else:
  539. giacenza = 0
  540. #sel2 = Environment.params['session'].query(Inventario.id_magazzino, Inventario.id_articolo).filter(Inventario.anno ==Environment.workingYear).all()
  541. sel = Environment.params['session'].query(Magazzino.id, Articolo.id)\
  542. .filter(Articolo.cancellato != True).all()
  543. for s in sel:
  544. righeArticoloMovimentate = Environment.params["session"]\
  545. .query(RigaMovimento, TestataMovimento)\
  546. .filter(and_(func.date_part("year", TestataMovimento.data_movimento)==(self.annoScorso)))\
  547. .filter(RigaMovimento.id_testata_movimento == TestataMovimento.id)\
  548. .filter(Riga.id_articolo==s[1])\
  549. .filter(Riga.id_magazzino==s[0])\
  550. .filter(Articolo.cancellato!=True)\
  551. .all()
  552. for ram in righeArticoloMovimentate:
  553. giacenza = calcolaGiacenza(quantita=ram[0].quantita,
  554. moltiplicatore=ram[0].moltiplicatore,
  555. segno=ram[1].segnoOperazione,
  556. valunine=ram[0].valore_unitario_netto)[0]
  557. giacenza +=giacenza
  558. #if s not in sel2:
  559. inv = Inventario()
  560. inv.anno = Environment.workingYear
  561. inv.id_magazzino = s[0]
  562. inv.quantita = giacenza
  563. inv.id_articolo = s[1]
  564. Environment.params['session'].add(inv)
  565. #inv.persist()
  566. print "RICREA"
  567. Environment.params['session'].commit()
  568. self.refresh()
  569. def on_aggiorna_button_clicked(self, button):
  570. """ Aggiornamento inventario con gli articoli eventualmente non presenti """
  571. #sql_statement:= \'INSERT INTO inventario (anno, id_magazzino, id_articolo, quantita, valore_unitario, data_aggiornamento)
  572. #(SELECT \' || _anno || \', M.id, A.id, NULL, NULL, NULL
  573. #FROM magazzino M CROSS JOIN articolo A
  574. #WHERE (M.id, A.id) NOT IN (SELECT I.id_magazzino, I.id_articolo FROM INVENTARIO I WHERE I.anno = \' || _anno || \')
  575. #AND A.cancellato <> True)\';
  576. sel2 = Environment.params['session'].\
  577. query(Inventario.id_magazzino,
  578. Inventario.id_articolo).\
  579. filter(Inventario.id_magazzino==self.idMagazzino).\
  580. filter(Inventario.anno == self.annoScorso).\
  581. order_by(Inventario.id_articolo).all()
  582. sel = Environment.params['session'].\
  583. query(Stoccaggio.id_magazzino,
  584. Stoccaggio.id_articolo).\
  585. filter(Magazzino.id==self.idMagazzino).\
  586. order_by(Stoccaggio.id_articolo).all()
  587. print "AGGIORNA" , self.idMagazzino
  588. print "SEL", sel,sel2
  589. if sel != sel2:
  590. for s in sel:
  591. if s not in sel2:
  592. print "MA QUI CI PASSI"
  593. inv = Inventario()
  594. inv.anno = self.annoScorso
  595. inv.id_magazzino = s[0]
  596. inv.id_articolo = s[1]
  597. Environment.params['session'].add(inv)
  598. Environment.params['session'].commit()
  599. self.refresh()
  600. def on_aggiorna_da_ana_articoli_clicked(self, button):
  601. """ Aggiornamento inventario con gli articoli eventualmente non presenti """
  602. sel2 = Environment.params['session'].\
  603. query(Inventario.id_articolo).\
  604. filter(and_(Inventario.anno == self.annoScorso, Inventario.id_magazzino == self.idMagazzino)).\
  605. order_by(Inventario.id_articolo).all()
  606. sel = Environment.params['session'].\
  607. query(Articolo.id).\
  608. order_by(Articolo.id).all()
  609. if sel != sel2:
  610. for s in sel:
  611. if s not in sel2:
  612. print "MA QUI CI PASSI"
  613. inv = Inventario()
  614. inv.anno = self.annoScorso
  615. inv.id_magazzino = self.idMagazzino
  616. inv.id_articolo = s[0]
  617. Environment.params['session'].add(inv)
  618. Environment.params['session'].commit()
  619. self.refresh()
  620. def on_esporta_conquantita_button_clicked(self, button):
  621. self.on_esporta_button_clicked(button=button, siquantita = True)
  622. def on_esporta_button_clicked(self, button= None, siquantita = False):
  623. """ Esportazione inventario in formato csv
  624. """
  625. if (findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2) is None):
  626. obligatoryField(self.getTopLevel(),
  627. self.additional_filter.id_magazzino_filter_combobox2,
  628. 'Inserire il magazzino !')
  629. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  630. fileDialog = gtk.FileChooserDialog(title='Esportazione inventario ',
  631. parent=self.getTopLevel(),
  632. action=GTK_FILE_CHOOSER_ACTION_SAVE,
  633. buttons=(gtk.STOCK_CANCEL,
  634. GTK_RESPONSE_CANCEL,
  635. gtk.STOCK_SAVE,
  636. GTK_RESPONSE_OK),
  637. backend=None)
  638. folder = setconf("General", "cartella_predefinita") or ""
  639. if folder == '':
  640. if os.name == 'posix':
  641. folder = os.environ['HOME']
  642. elif os.name == 'nt':
  643. folder = os.environ['USERPROFILE']
  644. fileDialog.set_current_folder(folder)
  645. fltr = gtk.FileFilter()
  646. fltr.add_pattern("*.csv")
  647. fltr.set_name('File CSV (*.csv)')
  648. fileDialog.add_filter(fltr)
  649. fileDialog.set_current_name('inv_' + Environment.workingYear + '.csv')
  650. response = fileDialog.run()
  651. if response == GTK_RESPONSE_OK:
  652. filename = fileDialog.get_filename()
  653. fileDialog.destroy()
  654. f = open(filename, 'w')
  655. riga = ('Codice; Descrizione; Quantita\'; Valore unitario; U.M.; ' +
  656. 'Codice a barre; Famiglia; Categoria;Anno ;idMagazzino ; idArticolo ;data_aggiornamento\n')
  657. f.write(riga)
  658. invs = Inventario().select(anno=self.annoScorso,
  659. idMagazzino=idMagazzino,
  660. offset=None,
  661. batchSize=None)
  662. if invs:
  663. for i in invs:
  664. quantita_ = '%14.4f' % float(i.quantita or 0)
  665. quantita = quantita_.replace('.', ',')
  666. valore = '%14.4f' % float(i.valore_unitario or 0)
  667. valore = valore.replace('.', ',')
  668. if siquantita:
  669. if float(quantita_)>0:
  670. riga = (str(i.codice_articolo or '') + ';' +
  671. str(i.articolo or '') + ';' +
  672. str(quantita).strip() + ';' +
  673. str(valore).strip() + ';' +
  674. str(i.denominazione_breve_unita_base or '') + ';' +
  675. str(i.codice_a_barre or '') + ';' +
  676. str(i.denominazione_famiglia or '') + ';' +
  677. str(i.denominazione_categoria or '') + ';'+
  678. str(i.anno or '') + ';'+
  679. str(i.id_magazzino or '') + ';'+
  680. str(i.id_articolo or '') + ';'+
  681. str(i.data_aggiornamento or '') + '\n')
  682. f.write(riga)
  683. else:
  684. riga = (str(i.codice_articolo or '') + ';' +
  685. str(i.articolo or '') + ';' +
  686. '"' + quantita + '",' +
  687. '"' + valore + '",' +
  688. '"' + str(i.denominazione_breve_unita_base or '') + '",' +
  689. '"' + str(i.codice_a_barre or '') + '",' +
  690. '"' + str(i.denominazione_famiglia or '') + '",' +
  691. '"' + str(i.denominazione_categoria or '') + '",'+
  692. '"' + str(i.anno or '') + '",'+
  693. '"' + str(i.id_magazzino or '') + '",'+
  694. '"' + str(i.id_articolo or '') + '",'+
  695. '"' + str(i.data_aggiornamento or '') + '"\n')
  696. f.write(riga)
  697. f.close()
  698. self.fineElaborazione()
  699. else:
  700. fileDialog.destroy()
  701. return
  702. def on_valorizza_button_clicked(self, button):
  703. """ Valorizzazione inventario (modifica automatica del valore unitario) """
  704. dialog = gtk.Dialog('Attenzione',
  705. self.getTopLevel(),
  706. GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
  707. None)
  708. hbox = gtk.HBox()
  709. image = GTK_IMAGE_NEW_FROM_STOCK(gtk.STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_BUTTON)
  710. image.set_padding(10, 10)
  711. label = gtk.Label('Verranno aggiornati i valori unitari non ancora\nspecificati secondo la modalita\' scelta.')
  712. label.set_justify(GTK_JUSTIFICATION_LEFT)
  713. label.set_alignment(0, 0)
  714. label.set_padding(15, 10)
  715. hbox.pack_start(image, False, False, 0)
  716. hbox.pack_start(label, True, True, 0)
  717. dialog.get_content_area().pack_start(hbox, True, True, 0)
  718. buttonAcquistoUltimo = gtk.Button(label = 'Ultimo prezzo\n di acquisto')
  719. buttonAcquistoUltimo.connect('clicked', self.on_buttonAcquistoUltimo_clicked)
  720. buttonVenditaUltimo = gtk.Button(label = 'Ultimo prezzo\n di vendita')
  721. buttonVenditaUltimo.connect('clicked', self.on_buttonVenditaUltimo_clicked)
  722. buttonAcquistoMedio = gtk.Button(label = 'Prezzo medio\n di acquisto')
  723. buttonAcquistoMedio.connect('clicked', self.on_buttonAcquistoMedio_clicked)
  724. buttonVenditaMedio = gtk.Button(label = 'Prezzo medio\n di vendita')
  725. buttonVenditaMedio.connect('clicked', self.on_buttonVenditaMedio_clicked)
  726. buttonVenditaDaListino = gtk.Button(label = 'Prezzo da listino\n di vendita')
  727. buttonVenditaDaListino.connect('clicked', self.on_buttonVenditaDaListino_clicked)
  728. dialog.get_action_area().pack_start(buttonAcquistoUltimo, True, True, 0)
  729. dialog.get_action_area().pack_start(buttonVenditaUltimo, True, True, 0)
  730. dialog.get_action_area().pack_start(buttonAcquistoMedio, True, True, 0)
  731. dialog.get_action_area().pack_start(buttonVenditaMedio, True, True, 0)
  732. dialog.get_action_area().pack_start(buttonVenditaDaListino, True, True, 0)
  733. dialog.show_all()
  734. result = dialog.run()
  735. dialog.destroy()
  736. def on_buttonVenditaDaListino_clicked(self, button):
  737. if self.confermaValorizzazione():
  738. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  739. sel = Inventario().select(anno=self.annoScorso,
  740. idMagazzino=idMagazzino, batchSize=None)
  741. noSconti = False
  742. if YesNoDialog(msg='Tengo conto degli sconti alla vendita?', transient=self.getTopLevel()):
  743. noSconti = True
  744. listino = Environment.conf.VenditaDettaglio.listino
  745. idListino = Listino().select(denominazioneEM = listino)
  746. for s in sel:
  747. # if s.quantita >=1:
  748. valori = leggiListino(idListino[0].id, s.id_articolo)
  749. if not noSconti:
  750. s.valore_unitario = valori["prezzoDettaglio"]
  751. else:
  752. prezzo = valori["prezzoDettaglio"]
  753. prezzoScontato = prezzo
  754. tipoSconto = None
  755. if "scontiDettaglio" in valori:
  756. if len(valori["scontiDettaglio"]) > 0:
  757. valoreSconto = valori['scontiDettaglio'][0].valore or 0
  758. if valoreSconto == 0:
  759. tipoSconto = None
  760. prezzoScontato = prezzo
  761. else:
  762. tipoSconto = valori['scontiDettaglio'][0].tipo_sconto
  763. if tipoSconto == "percentuale":
  764. prezzoScontato = mN(mN(prezzo) - (mN(prezzo) * mN(valoreSconto)) / 100)
  765. else:
  766. prezzoScontato = mN(mN(prezzo) -mN(valoreSconto))
  767. s.valore_unitario = prezzoScontato
  768. Environment.params['session'].add(s)
  769. print "VALORIZZA", valori
  770. Environment.params['session'].commit()
  771. self.refresh()
  772. self.fineElaborazione()
  773. def on_buttonAcquistoUltimo_clicked(self, button):
  774. """ Valorizzazione a ultimo prezzo di acquisto
  775. sql_stateme nt:= \'CREATE TEMPORARY TABLE valorizzazione_tmp AS
  776. (SELECT R.id_magazzino, R.id_articolo,
  777. MAX(R.valore_unitario_netto) AS prezzo,
  778. MAX(TM.data_movimento) AS data
  779. FROM riga_movimento RM INNER JOIN riga R ON RM.id = R.id
  780. INNER JOIN testata_movimento TM ON RM.id_testata_movimento = TM.id
  781. INNER JOIN promogest.operazione O ON TM.operazione = O.denominazione
  782. WHERE (R.valore_unitario_netto <> 0 AND O.segno = \'\'+\'\' AND
  783. DATE_PART(\'\'year\'\', TM.data_movimento) = \' || _anno_prec || \' AND
  784. R.id_magazzino = \' || _id_magazzino || \')
  785. GROUP BY R.id_magazzino, R.id_articolo) \';
  786. EXECUTE sql_statement;
  787. sql_statement:= \'UPDATE inventario SET valore_unitario = (SELECT prezzo FROM valorizzazione_tmp T WHERE inventario.id_magazzino = T.id_magazzino AND inventario.id_articolo = T.id_articolo) WHERE anno = \' || _anno || \' AND (valore_unitario IS NULL OR valore_unitario = 0)\';
  788. EXECUTE sql_statement;"""
  789. if self.confermaValorizzazione():
  790. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  791. sel = Inventario().select(anno=self.annoScorso,
  792. idMagazzino=idMagazzino, batchSize=None)
  793. for s in sel:
  794. print s.id_articolo
  795. if s.quantita >0:
  796. print s.quantita
  797. righeArticoloMovimentate = Environment.params["session"]\
  798. .query(func.max(RigaMovimento.valore_unitario_netto), func.max(TestataMovimento.data_movimento))\
  799. .join(TestataMovimento, Articolo)\
  800. .filter(TestataMovimento.data_movimento.between(datetime.date(int(self.annoScorso),1, 1), datetime.date(int(self.annoScorso), 12, 31)))\
  801. .filter(RigaMovimento.id_testata_movimento == TestataMovimento.id)\
  802. .filter(Operazione.segno=="+")\
  803. .filter(Riga.id_magazzino==idMagazzino)\
  804. .filter(Riga.id_articolo==s.id_articolo)\
  805. .filter(Riga.valore_unitario_netto!=0)\
  806. .all()
  807. if righeArticoloMovimentate and righeArticoloMovimentate[0][0]:
  808. s.valore_unitario = righeArticoloMovimentate[0][0]
  809. Environment.params['session'].add(s)
  810. print "VALORIZZA"
  811. Environment.params['session'].commit()
  812. self.refresh()
  813. self.fineElaborazione()
  814. def on_buttonVenditaUltimo_clicked(self, button):
  815. """ Valorizzazione a ultimo prezzo di vendita
  816. sql_statement:= \'CREATE TEMPORARY TABLE valorizzazione_tmp AS
  817. (SELECT R.id_magazzino, R.id_articolo,
  818. MAX(R.valore_unitario_netto) AS prezzo,
  819. MAX(TM.data_movimento) AS data
  820. FROM riga_movimento RM INNER JOIN riga R ON RM.id = R.id
  821. INNER JOIN testata_movimento TM ON RM.id_testata_movimento = TM.id
  822. INNER JOIN promogest.operazione O ON TM.operazione = O.denominazione
  823. WHERE (R.valore_unitario_netto <> 0 AND O.segno = \'\'-\'\' AND
  824. DATE_PART(\'\'year\'\', TM.data_movimento) = \' || _anno_prec || \' AND
  825. R.id_magazzino = \' || _id_magazzino || \')
  826. GROUP BY R.id_magazzino, R.id_articolo) \';
  827. EXECUTE sql_statement;
  828. sql_statement:= \'UPDATE inventario SET valore_unitario = (SELECT prezzo FROM valorizzazione_tmp T WHERE inventario.id_magazzino = T.id_magazzino AND inventario.id_articolo = T.id_articolo) WHERE anno = \' || _anno || \' AND (valore_unitario IS NULL OR valore_unitario = 0)\';
  829. EXECUTE sql_statement;"""
  830. if self.confermaValorizzazione():
  831. idMagazzino = findIdFromCombobox(self.additional_filter.id_magazzino_filter_combobox2)
  832. sel = Inventario().select(anno=self.annoScorso,
  833. idMagazzino=idMagazzino, batchSize=None)
  834. for s in sel:
  835. righeArticoloMovimentate = Environment.params["session"]\
  836. .query(func.max(RigaMovimento.valore_unitario_netto), func.max(TestataMovimento.data_movimento))\
  837. .join(TestataMovimento, Articolo)\
  838. .filter(TestataMovimento.data_movimento.between(datetime.date(int(self.annoScorso), 1, 1), datetime.date(int(self.annoScorso), 12, 31)))\
  839. .filter(RigaMovimento.id_testata_movimento == TestataMovimento.id)\
  840. .filter(Operazione.segno=="-")\
  841. .filter(Riga.id_magazzino==idMagazzino)\
  842. .filter(Riga.id_articolo==s.id_articolo)\
  843. .filter(Riga.valore_unitario_netto!=0)\
  844. .all()
  845. if righeArticoloMovimentate and righeArticoloMovimentate[0][0]:
  846. s.valore_unitario = righeArticoloMovimentate[0][0]
  847. Environment.params['session'].add(s)
  848. self.refresh()
  849. self.fineElaborazione()
  850. def on_buttonAcquistoMedio_clicked(self, button):
  851. """ Valorizzazione a prezzo medio di acquisto
  852. sql_statement:= \'CREATE TEMPORARY TABLE valorizzazione_tmp AS
  853. (SELECT R.id_magazzino, R.id_articolo,
  854. AVG(R.valore_unitario_netto) AS prezzo
  855. FROM riga_movimento RM INNER JOIN riga R ON RM.id = R.id
  856. INNER JOIN testata_movimento TM ON RM.id_testata_movimento = TM.id
  857. INNER JOIN promogest.operazione O ON TM.operazione = O.denominazione
  858. WHERE (R.valore_unitario_netto <> 0 AND O.segno = \'\'+\'\' AND
  859. DATE_PART(\'\'year\'\', TM.data_movimento) = \' || _anno_prec || \' AND
  860. R.id_magazzino = \' || _id_magazzino || \')
  861. GROUP BY R.id_magazzino, R.id_articolo) \';
  862. EXECUTE sql_statement;
  863. sql_statement:= \'UPDATE inventario SET valore_unitario = (SELECT prezzo FROM valorizzazione_tmp T WHERE inventario.id_magazzino = T.id_magazzino AND inventario.id_articolo = T.id_artic…

Large files files are truncated, but you can click here to view the full file