| 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 | |
|---|
| 9 | import gtk |
|---|
| 10 | from promogest import Environment |
|---|
| 11 | from sqlalchemy import * |
|---|
| 12 | from sqlalchemy.orm import * |
|---|
| 13 | from promogest.Environment import * |
|---|
| 14 | from promogest.dao.Articolo import Articolo |
|---|
| 15 | from promogest.dao.Fornitura import Fornitura |
|---|
| 16 | from promogest.dao.CodiceABarreArticolo import CodiceABarreArticolo |
|---|
| 17 | from promogest.dao.Dao import Dao |
|---|
| 18 | |
|---|
| 19 | if 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 | |
|---|
| 28 | class 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 | |
|---|
| 217 | inventario=Table('inventario',params['metadata'],schema = params['schema'],autoload=True) |
|---|
| 218 | std_mapper = mapper(Inventario, inventario,properties={ |
|---|
| 219 | "arti":relation(Articolo,primaryjoin=inventario.c.id_articolo==Articolo.id,backref ="inve") |
|---|
| 220 | }, order_by=inventario.c.id) |
|---|