root/trunk/core/promogest/dao/Inventario.py @ 853

Revision 853, 11.1 KB (checked in by vete, 7 months ago)

aggiunti i filtri in stoccaggi, rivisto il template, da aggiungere alcune colonne

Line 
1# -*- coding: utf-8 -*-
2
3# Promogest
4#
5# Copyright (C) 2005 by Promotux Informatica - http://www.promotux.it/
6# Author: Andrea Argiolas <andrea@promotux.it>
7
8
9import gtk
10from promogest import Environment
11from sqlalchemy import *
12from sqlalchemy.orm import *
13from promogest.Environment import *
14from promogest.dao.Articolo import Articolo
15from promogest.dao.Fornitura import Fornitura
16from promogest.dao.CodiceABarreArticolo import CodiceABarreArticolo
17from promogest.dao.Dao import Dao
18
19if hasattr(conf, "PromoWear") and getattr(conf.PromoWear,'mod_enable')=="yes":
20    from promogest.modules.PromoWear.dao.Colore import Colore
21    from promogest.modules.PromoWear.dao.Taglia import Taglia
22    from promogest.modules.PromoWear.dao.ArticoloTagliaColore import ArticoloTagliaColore
23    from promogest.modules.PromoWear.dao.AnnoAbbigliamento import AnnoAbbigliamento
24    from promogest.modules.PromoWear.dao.GruppoTaglia import GruppoTaglia
25    from promogest.modules.PromoWear.dao.StagioneAbbigliamento import StagioneAbbigliamento
26    from promogest.modules.PromoWear.dao.GenereAbbigliamento import GenereAbbigliamento
27
28class Inventario(Dao):
29    def __init__(self, arg=None):
30        Dao.__init__(self, entity=self)
31
32    def _unita_base(self):
33        if self.arti: return self.arti.denominazione_breve_unita_base
34        else: return ""
35    denominazione_breve_unita_base= property(_unita_base)
36
37    def _codice_articolo(self):
38        if self.arti: return self.arti.codice
39        else: return ""
40    codice_articolo= property(_codice_articolo)
41
42    def _articolo(self):
43        if self.arti: return self.arti.denominazione
44        else: return ""
45    articolo= property(_articolo)
46
47    def _produttore(self):
48        if self.arti: return self.arti.produttore
49        else: return ""
50    produttore= property(_produttore)
51
52    def _denominazione_famiglia(self):
53        if self.arti: return self.arti.denominazione_famiglia
54        else: return ""
55    denominazione_famiglia= property(_denominazione_famiglia)
56
57    def _denominazione_categoria(self):
58        if self.arti: return self.arti.denominazione_categoria
59        else: return ""
60    denominazione_categoria= property(_denominazione_categoria)
61
62    def _codice_a_barre(self):
63        if self.arti: return self.arti.codice_a_barre
64        else: return ""
65    codice_a_barre= property(_codice_a_barre)
66
67    def _codice_articolo_fornitore(self):
68        if self.arti: return self.arti.codice_articolo_fornitore
69        else: return ""
70    codice_articolo_fornitore= property(_codice_articolo_fornitore)
71
72    def filter_values(self,k,v):
73        if k == 'denominazione':
74            dic= {  k : inventario.c.anno == v}
75        elif k == 'idMagazzino':
76            dic = {k:inventario.c.id_magazzino == v}
77        elif k == 'idArticolo':
78            dic = {k:inventario.c.id_articolo == v}
79        elif k == 'anno':
80            dic = {k:inventario.c.anno == v}
81        elif k == 'daDataAggiornamento':
82            dic = {k:inventario.c.data_aggiornameno >= v}
83        elif k == 'aDataAggiornamento':
84            dic = {k:inventario.c.data_aggiornameno >= v}
85        elif k == 'qa_zero':
86            dic = {k:inventario.c.quantita == 0}
87        elif k == 'quantita':
88            dic = {k:inventario.c.quantita > 0}
89        elif k == 'qa_negativa':
90            dic = {k:inventario.c.quantita < 0}
91        elif k == 'val_negativo':
92            dic = {k:inventario.c.valore_unitario == None}
93        elif k == 'inventariato':
94            dic = {k:inventario.c.quantita >= 1}
95        elif k == 'articolo':
96            dic = {k:and_(inventario.c.id_articolo==Articolo.id, Articolo.denominazione.ilike("%"+v+"%"))}
97        elif k == 'codice':
98            dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.codice.ilike("%"+v+"%"))}
99        elif k == 'codiceABarre':
100            dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==CodiceABarreArticolo.id_articolo,CodiceABarreArticolo.codice.ilike("%"+v+"%"))}
101        elif k == 'produttore':
102            dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.produttore.ilike("%"+v+"%"))}
103        elif k== 'codiceArticoloFornitoreEM':
104            dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==Fornitura.id_articolo,Fornitura.codice_articolo_fornitore == v)}
105        elif k=='idFamiglia':
106            dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id_famiglia_articolo ==v)}
107        elif k == 'idCategoria':
108            dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id_categoria_articolo ==v)}
109        elif k == 'idStato':
110            dic= {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id_stato_articolo == v)}
111        elif k == 'cancellato':
112            dic = {k:or_(and_(inventario.c.id_articolo==Articolo.id,Articolo.cancellato != v))}
113        elif "PromoWear" in Environment.modulesList:
114            if k == 'figliTagliaColore':
115                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_articolo_padre==None)}
116            elif k == 'idTaglia':
117                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_taglia==v)}
118            elif k == 'idModello':
119                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_modello==v)}
120            elif k == 'idGruppoTaglia':
121                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_gruppo_taglia ==v)}
122            elif k == 'padriTagliaColore':
123                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_articolo_padre!=None)}
124            elif k == 'idColore':
125                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_colore ==v)}
126            elif k == 'idStagione':
127                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_stagione ==v)}
128            elif k == 'idAnno':
129                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_anno == v)}
130            elif k == 'idGenere':
131                dic = {k:and_(inventario.c.id_articolo==Articolo.id,Articolo.id==ArticoloTagliaColore.id_articolo, ArticoloTagliaColore.id_genere ==v)}
132        return  dic[k]
133
134    def update(self):
135        """ Aggiornamento inventario con gli articoli eventualmente non presenti """
136        sel2 = Environment.params['session'].query(Inventario.id_magazzino, Inventario.id_articolo).filter(Inventario.anno ==Environment.workingYear).all()
137        sel = Environment.params['session'].query(Magazzino.id, Articolo.id).filter(Articolo.cancellato != True).all()
138        for s in sel:
139            if s not in sel2:
140                inv = Inventario()
141                inv.anno = Environment.workingYear
142                inv.id_magazzino = s[0]
143                inv.id_articolo = s[1]
144                inv.persist()
145        print sel2, sel
146
147
148
149
150    def control(self,window):
151
152        def calcolaGiacenza(quantita=None, moltiplicatore=None, segno=None, valunine=None):
153            giacenza=0
154            if segno =="-":
155                giacenza -= quantita*moltiplicatore
156            else:
157                giacenza += quantita*moltiplicatore
158            valore= giacenza*valunine
159            return (giacenza, valore)
160
161        """ Verifica se esistono gia' delle righe di inventario nell'anno di esercizio """
162        res = self.count(anno=Environment.workingYear)
163        print "REEEEEEEEEEEEEEEEEEEESSS PER INVENTARIO", res
164        if not res :
165            # richiesta di generazione dell'inventario
166            msg = ("Non e' presente nessun caricamento di inventario nell'anno di lavoro:\n\n" +
167                "si desidera generarne uno ?")
168            dialog = gtk.MessageDialog(window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
169                                    gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, msg)
170            response = dialog.run()
171            dialog.destroy()
172            if response == gtk.RESPONSE_YES:
173                from TestataMovimento import TestataMovimento
174                from RigaMovimento import RigaMovimento
175                from Riga import Riga
176                from Magazzino import Magazzino
177                from Articolo import Articolo
178                giacenza = 0
179                #sel2 = Environment.params['session'].query(Inventario.id_magazzino, Inventario.id_articolo).filter(Inventario.anno ==Environment.workingYear).all()
180                sel = Environment.params['session'].query(Magazzino.id, Articolo.id).filter(Articolo.cancellato != True).all()
181                for s in sel:
182                    righeArticoloMovimentate= params["session"]\
183                        .query(RigaMovimento,TestataMovimento)\
184                        .filter(and_(func.date_part("year", TestataMovimento.data_movimento)==(int(Environment.workingYear)-1)))\
185                        .filter(RigaMovimento.id_testata_movimento == TestataMovimento.id)\
186                        .filter(Riga.id_articolo==s[1])\
187                        .filter(Riga.id_magazzino==s[0])\
188                        .filter(Articolo.cancellato!=True)\
189                        .all()
190
191                    for ram in righeArticoloMovimentate:
192                        giacenza = calcolaGiacenza(quantita=ram[0].quantita,
193                                                    moltiplicatore=ram[0].moltiplicatore,
194                                                    segno=ram[1].segnoOperazione,
195                                                    valunine=ram[0].valore_unitario_netto)[0]
196                        giacenza +=giacenza
197                    #if s not in sel2:
198                    inv = Inventario()
199                    inv.anno = Environment.workingYear
200                    inv.id_magazzino = s[0]
201                    inv.quantita = giacenza
202                    inv.id_articolo = s[1]
203                    inv.persist()
204
205                # genera l'inventario per l'anno in corso sulla base delle giacenze finali
206                # dell'anno precedente, per ogni magazzino e per ogni articolo
207                #Environment.connection.execStoredProcedure('InventarioFill', (int(Environment.conf.workingYear),))
208
209                msg = ("Generazione completata.\n\nEffettuare le dovute modifiche dall'apposita maschera\n" +
210                    "di caricamento inventario dopo aver fatto i rilevamenti\n" +
211                    "delle merci nei magazzini.\n")
212                dialog = gtk.MessageDialog(window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
213                                        gtk.MESSAGE_INFO, gtk.BUTTONS_OK, msg)
214                response = dialog.run()
215                dialog.destroy()
216
217inventario=Table('inventario',params['metadata'],schema = params['schema'],autoload=True)
218std_mapper = mapper(Inventario, inventario,properties={
219        "arti":relation(Articolo,primaryjoin=inventario.c.id_articolo==Articolo.id,backref ="inve")
220        }, order_by=inventario.c.id)
Note: See TracBrowser for help on using the browser.