root/trunk/core/promogest/dao/TestataDocumento.py @ 746

Revision 746, 39.7 KB (checked in by vete, 9 months ago)

aggiunta property modello

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
8from Dao import Dao
9
10from sqlalchemy import *
11from sqlalchemy.orm import *
12from ScontoTestataDocumento import ScontoTestataDocumento
13from DestinazioneMerce import DestinazioneMerce
14from TestataMovimento import TestataMovimento
15from Pagamento import Pagamento
16from Vettore import Vettore
17from promogest.modules.Agenti.dao.Agente import Agente
18from Fornitore import Fornitore
19from Cliente import Cliente
20from RigaDocumento import RigaDocumento
21from RigaDocumento import *
22from AliquotaIva import AliquotaIva
23from RigaMovimento import RigaMovimento
24from Banca import Banca
25from Riga import Riga
26from Articolo import Articolo
27from ScontoRigaMovimento import ScontoRigaMovimento
28from TestataDocumentoScadenza import TestataDocumentoScadenza
29
30#from DaoUtils import *
31from decimal import *
32from promogest.ui.utils import *
33from promogest.ui.utilsCombobox import *
34
35from promogest.Environment import *
36from promogest import Environment
37
38class TestataDocumento(Dao):
39
40    def __init__(self, arg=None):
41        Dao.__init__(self, entity=self)
42
43        self.__righeDocumento = None
44        self.__operazione = None
45        self.__dbScadenzeDocumento = []
46        self.__ScadenzeDocumento = []
47        self.__dbScontiTestataDocumento = []
48        self.__scontiTestataDocumento = []
49        self.__dbRigheDocumentoPart = []
50        self.__dbRigheMovimentoPart = []
51        self.__righeDocumento = []
52        self._totaleImponibile = 0
53        self._totaleNonScontato = 0
54        self._totaleScontato = 0
55        self._totaleImponibile = 0
56        self._totaleImponibileScontato = 0
57        self._totaleImposta = 0
58        self._totaleImpostaScontata = 0
59        self._totaleScontato = 0
60        self._castellettoIva = 0
61        self.__data_inizio_noleggio = None
62        self.__data_fine_noleggio = None
63        self.__numeroMagazzini = 0
64
65    @reconstructor
66    def init_on_load(self):
67        self.__dbScadenzeDocumento = []
68        self.__dbScontiTestataDocumento = []
69        self.__dbRigheDocumentoPart = []
70        self.__dbRigheMovimentoPart = []
71        self.__righeDocumento = []
72        self.__ScadenzeDocumento = []
73        self.__scontiTestataDocumento = []
74        self.__data_inizio_noleggio = None
75        self.__data_fine_noleggio = None
76
77    def _getScadenzeDocumento(self):
78        if self.id:
79            self.__dbScadenzeDocumento = params['session']\
80                                    .query(TestataDocumentoScadenza)\
81                                    .with_parent(self)\
82                                    .filter_by(id_testata_documento=self.id)\
83                                    .all()
84        self.__ScadenzeDocumento = self.__dbScadenzeDocumento[:]
85        return self.__ScadenzeDocumento
86
87    def _setScadenzeDocumento(self, value):
88        self.__ScadenzeDocumento = value
89
90    #if Environment.conf.hasPagamenti == True:
91    scadenze = property(_getScadenzeDocumento, _setScadenzeDocumento)
92
93    def sort_by_attr(self,seq,attr):
94        intermed = [ (getattr(seq[i],attr), i, seq[i]) for i in xrange(len(seq)) ]
95        intermed.sort()
96        return [ tup[-1] for tup in intermed ]
97
98    def _getRigheDocumento(self):
99        if self.id:
100            self.__dbRigheDocumentoPart = params['session']\
101                                        .query(RigaDocumento )\
102                                        .filter(RigaDocumento.id_testata_documento == self.id).all()
103            try:
104                self.__dbRigheMovimentoPart = params['session']\
105                                .query(RigaMovimento)\
106                                .join(RigaMovimento.testata_movimento)\
107                                .filter(RigaMovimento.id_testata_movimento==select([TestataMovimento.id], \
108                                        TestataMovimento.id_testata_documento==self.id)).all()
109            except:
110                self.rollback()
111                test = TestataMovimento().select(idTestataDocumento = self.id)
112                if len(test) >1:
113                    Environment.pg2log.debug("ATTENZIONEEEEEEEEE due movimenti fanno riferimento ad una sola testata documento:"+str(self.id))
114                    for t in test:
115                        Environment.pg2log.debug("DATI MOVIMENTO ERRATI id:"+str(t.id))
116                    messageInfo(msg="""ATTENZIONE, Più di un movimento fa riferimento
117                                                    allo stesso documento.
118                                                    Contattare l'assistenza con urgenza""")
119            self.__dbRigheDocumento = self.__dbRigheDocumentoPart + self.__dbRigheMovimentoPart
120            self.__dbRigheDocumento = self.sort_by_attr(self.__dbRigheDocumento,"id")
121            self.__righeDocumento = self.__dbRigheDocumento[:]
122        else:
123            self.__righeDocumento = []
124        return self.__righeDocumento
125
126    def _setRigheDocumento(self, value):
127        self.__righeDocumento =value
128
129    righe = property(_getRigheDocumento, _setRigheDocumento)
130
131    def _getDocumentTotalConfections(self):
132        """
133        Ritorna il numero totale delle confezioni inserite nelle righe del documento:
134        quantità Totale = sommatoria(i=1 to n)[quantità(riga i) * moltiplicatore(riga i)]
135        """
136        __quantitaTotale = 0
137        if len(self.righe) > 0:
138            for r in self.righe:
139                __quantitaTotale += float(r.quantita*r.moltiplicatore)
140        return __quantitaTotale
141
142    totalConfections = property(_getDocumentTotalConfections)
143
144    def _getNumeroMagazzini(self):
145        """
146        Restituisce il numero di magazzini presenti nel documento. Ci serve per poter effettuare
147        il trasferimento di articoli che partono tutti dallo stesso magazzino
148        """
149        __numeroMagazzini = []
150        for riga in self.righe:
151            if riga.id_magazzino not in __numeroMagazzini:
152                __numeroMagazzini.append(riga.id_magazzino)
153        return len(__numeroMagazzini)
154
155        #__numeroMagazzini = 0
156
157        #if len(self.righe) > 0 and self.id:
158          #mov_query = params['session'].query(RigaMovimento.id).filter(RigaMovimento.id_testata_movimento == self.id)
159          #doc_query = params['session'].query(RigaDocumento.id).filter(RigaDocumento.id_testata_documento == self.id)
160          #res = params['session'].query(Riga.id_magazzino).filter(or_(Riga.id.in_(mov_query),Riga.id.in_(doc_query))).distinct().count()
161          #__numeroMagazzini = res
162        #return __numeroMagazzini
163
164    numeroMagazzini = property(_getNumeroMagazzini)
165
166    def _getScontiTestataDocumento(self):
167        if not self.__scontiTestataDocumento and self.id:
168            self.__dbScontiTestataDocumento = ScontoTestataDocumento().select(join = ScontoTestataDocumento.TD,
169                                                                                idScontoTestataDocumento=self.id,
170                                                                                batchSize=None)
171        self.__scontiTestataDocumento = self.__dbScontiTestataDocumento
172        return self.__scontiTestataDocumento
173
174    def _setScontiTestataDocumento(self, value):
175        self.__scontiTestataDocumento = value
176
177    sconti = property(_getScontiTestataDocumento, _setScontiTestataDocumento)
178
179    def _getStringaScontiTestataDocumento(self):
180        (listSconti, applicazione) = getScontiFromDao(self._getScontiTestataDocumento(), self.applicazione_sconti)
181        return getStringaSconti(listSconti)
182    stringaSconti = property(_getStringaScontiTestataDocumento)
183
184
185    def _getIntestatario(self):
186        """
187        Restituisce la ragione sociale o cognome + nome
188        se la ragione sociale e' vuota
189        """
190        intestatario = ''
191
192        if self.id_cliente is not None:
193            if (hasattr(self, 'ragione_sociale_cliente') and
194                hasattr(self, 'cognome_cliente') and
195                hasattr(self, 'nome_cliente')):
196                intestatario = self.ragione_sociale_cliente
197                if intestatario == '':
198                    intestatario = self.cognome_cliente + ' ' + self.nome_cliente
199                return intestatario
200            else:
201                cliente = leggiCliente(self.id_cliente)
202                intestatario = cliente['ragioneSociale']
203                if intestatario == '':
204                    intestatario = cliente['cognome'] + ' ' + cliente['nome']
205                return intestatario
206        elif self.id_fornitore is not None:
207            if (hasattr(self, 'ragione_sociale_fornitore') and
208                hasattr(self, 'cognome_fornitore') and
209                hasattr(self, 'nome_fornitore')):
210                intestatario = self.ragione_sociale_fornitore
211                if intestatario == '':
212                    intestatario = self.cognome_fornitore + ' ' + self.nome_fornitore
213                return intestatario
214            else:
215                fornitore = leggiFornitore(self.id_fornitore)
216                intestatario = fornitore['ragioneSociale']
217                if intestatario == '':
218                    intestatario = fornitore['cognome'] + ' ' + fornitore['nome']
219                return intestatario
220        else:
221            return ''
222
223    intestatario = property(_getIntestatario, )
224
225
226    def _getTotaliDocumento(self):
227        self.__operazione = leggiOperazione(self.operazione)
228        fonteValore = self.__operazione["fonteValore"]
229
230        # FIXME: duplicated in AnagraficaDocumenti.py
231        totaleImponibile = Decimal(0)
232        totaleImposta = Decimal(0)
233        totaleNonScontato = Decimal(0)
234        totaleImpostaScontata = Decimal(0)
235        totaleImponibileScontato = Decimal(0)
236        totaleScontato = Decimal(0)
237        castellettoIva = {}
238        righeDocumento = self.righe
239        for riga in righeDocumento:
240
241            # FIXME: added for supporting dumb rows when printing
242            if riga is None:
243                continue
244            #print "VALORIIIIIIIIIIIIIIIII", riga.quantita, riga.moltiplicatore, riga.valore_unitario_netto
245            if not riga.moltiplicatore:
246                riga.moltiplicatore = 1
247            totaleRiga = Decimal(str(riga.quantita)) * Decimal(str(riga.moltiplicatore)) * mN(str(riga.valore_unitario_netto))
248            percentualeIvaRiga = Decimal(str(riga.percentuale_iva))
249            if percentualeIvaRiga != Environment.percentualeIvaRiga:
250                aliquotaIvaRiga = riga.aliquota
251                Environment.percentualeIvaRiga = percentualeIvaRiga
252                Environment.aliquotaIvaRiga = aliquotaIvaRiga
253            else:
254                aliquotaIvaRiga = Environment.aliquotaIvaRiga
255            #aliquotaIvaRiga = righeDocumento[i].aliquota
256
257
258            if (fonteValore == "vendita_iva" or fonteValore == "acquisto_iva"):
259                totaleImponibileRiga = calcolaPrezzoIva(totaleRiga, -1 * percentualeIvaRiga)
260            else:
261                totaleImponibileRiga = mN(totaleRiga,2)
262                totaleRiga = calcolaPrezzoIva(totaleRiga, percentualeIvaRiga)
263
264            totaleImpostaRiga = mN(totaleRiga,2) - totaleImponibileRiga
265            totaleNonScontato += totaleRiga
266            totaleImponibile += totaleImponibileRiga
267            totaleImposta += totaleImpostaRiga
268
269            if aliquotaIvaRiga not in castellettoIva.keys():
270                castellettoIva[aliquotaIvaRiga] = {'percentuale': percentualeIvaRiga,
271                                                    'imponibile': totaleImponibileRiga,
272                                                    'imposta': totaleImpostaRiga,
273                                                    'totale': totaleRiga}
274            else:
275                castellettoIva[aliquotaIvaRiga]['percentuale'] = percentualeIvaRiga
276                castellettoIva[aliquotaIvaRiga]['imponibile'] += totaleImponibileRiga
277                castellettoIva[aliquotaIvaRiga]['imposta'] += totaleImpostaRiga
278                castellettoIva[aliquotaIvaRiga]['totale'] += totaleRiga
279
280        totaleNonScontato = mN(totaleNonScontato, 2)
281        totaleImponibile = mN(totaleImponibile, 2)
282        totaleImposta = totaleNonScontato - totaleImponibile
283        for aliquotaIva in castellettoIva:
284            castellettoIva[aliquotaIva]['imponibile'] = mN(castellettoIva[aliquotaIva]['imponibile'], 2)
285            castellettoIva[aliquotaIva]['imposta'] = mN(castellettoIva[aliquotaIva]['imposta'], 2)
286            castellettoIva[aliquotaIva]['totale'] = mN(castellettoIva[aliquotaIva]['totale'], 2)
287
288        totaleImpostaScontata = totaleImposta
289        totaleImponibileScontato = totaleImponibile
290        totaleScontato = totaleNonScontato
291        scontiSuTotale = self.sconti
292        applicazioneSconti = self.applicazione_sconti
293
294        if len(scontiSuTotale) > 0:
295            for s in scontiSuTotale:
296                if s.tipo_sconto == 'percentuale':
297                    if applicazioneSconti == 'scalare':
298                        totaleScontato = mN(totaleScontato) * (1 - mN(s.valore) / 100)
299                    elif applicazioneSconti == 'non scalare':
300                        totaleScontato = mN(totaleScontato) - mN(totaleNonScontato) * mN(s.valore) / 100
301                    else:
302                        raise Exception, ('BUG! Tipo di applicazione sconto '
303                                          'sconosciuto: %s' % s.tipo_sconto)
304                elif s.tipo_sconto == 'valore':
305                    totaleScontato = mN(totaleScontato) - mN(s.valore)
306
307            # riporta l'insieme di sconti ad una percentuale globale
308            if totaleNonScontato == 0:
309                totaleNonScontato = 1
310            percentualeScontoGlobale = (1 - totaleScontato / totaleNonScontato) * 100
311            totaleImpostaScontata = 0
312            totaleImponibileScontato = 0
313            totaleScontato = 0
314            # riproporzione del totale, dell'imponibile e dell'imposta
315            for k in castellettoIva.keys():
316                castellettoIva[k]['totale'] = mN(castellettoIva[k]['totale'] * (1 - mN(percentualeScontoGlobale) / 100), 2)
317                castellettoIva[k]['imponibile'] = mN(castellettoIva[k]['imponibile'] * (1 - mN(percentualeScontoGlobale) / 100),2)
318                castellettoIva[k]['imposta'] = castellettoIva[k]['totale'] - castellettoIva[k]['imponibile']
319
320                totaleImponibileScontato += castellettoIva[k]['imponibile']
321                totaleImpostaScontata += castellettoIva[k]['imposta']
322
323            totaleScontato = mN(totaleImponibileScontato) + mN(totaleImpostaScontata)
324
325        self._totaleNonScontato = mN(totaleNonScontato,2)
326        self._totaleScontato = mN(totaleScontato,2)
327        self._totaleImponibile = mN(totaleImponibile,2)
328        self._totaleImposta = mN(totaleImposta,2)
329        self._totaleImponibileScontato = mN(totaleImponibileScontato,2)
330        self._totaleImpostaScontata = mN(totaleImpostaScontata,2)
331        self._castellettoIva = []
332        for k in castellettoIva.keys():
333            dictCastellettoIva = castellettoIva[k]
334            dictCastellettoIva['aliquota'] = k
335            self._castellettoIva.append(dictCastellettoIva)
336
337        return None
338
339    totali = property(_getTotaliDocumento, )
340
341    def contieneMovimentazione(self, righe=None):
342        """
343            Verifica se sono e devono essere presenti righe di movimentazione magazzino
344            dicesi riga di movimentazione se Ú legata ad una operazione che ha un segno
345            sia esso positivo o negativo e deve avere anche un id_articolo abbinato
346        """
347        righeMovimentazione = False
348        operazione = leggiOperazione(self.operazione)
349        if operazione["segno"] != '':
350            if righe is not None:
351                for riga in righe:
352                    if riga.id_articolo is not None:
353                        righeMovimentazione = True
354                        break
355        return righeMovimentazione
356
357
358    #Salvataggi subordinati alla testata Documento, iniziamo da righe documento e poi righe
359    def persist(self):
360        DaoTestataMovimento = None
361        params["session"].add(self)
362        params["session"].commit()
363
364        Environment.pg2log.debug("INIZIO SALVATAGGIO DOCUMENTO")
365        self.scontiTestataDocumentoDel(id=self.id)
366        self.testataDocumentoScadenzaDel(id=self.id)
367        self.righeDocumentoDel(id=self.id)
368        #verifica se sono presenti righe di movimentazione magazzino
369        contieneMovimentazione = self.contieneMovimentazione(righe=self.righeDocumento)
370        #cerco le testate movimento associate al documento
371        #FIXME: se ne trovo piu' di una ? (ad esempio se il documento e' in realta' un cappello)
372        res = TestataMovimento().select(idTestataDocumento = self.id,batchSize=None)
373        #Tutto nuovo non ci sono teste movimento relate a questa testata documento
374        if not res:
375            #se però c'Ú movimentazione vuol dire che ha un movimento abbinato
376            if contieneMovimentazione:
377                #creo una nuova testata movimento
378                DaoTestataMovimento = TestataMovimento()
379                DaoTestataMovimento.data_movimento = self.data_documento
380                if not DaoTestataMovimento.numero:
381                    valori = numeroRegistroGet(tipo="Movimento", date=self.data_documento)
382                    DaoTestataMovimento.numero = valori[0]
383                    DaoTestataMovimento.registro_numerazione= valori[1]
384                DaoTestataMovimento.operazione = self.operazione
385                DaoTestataMovimento.id_cliente = self.id_cliente
386                DaoTestataMovimento.id_fornitore = self.id_fornitore
387                DaoTestataMovimento.note_interne = self.note_interne
388                DaoTestataMovimento.note_interne = self.note_interne
389                DaoTestataMovimento.id_testata_documento = self.id # abbino la testata alla testata movimento
390        elif len(res) == 1:
391            #print "RES È UGUALE AD UNO.... ESITE UN MOVIMENTO USO RES"
392            DaoTestataMovimento = res[0] #TestataMovimento().getRecord(id=res[0].id)
393            if not contieneMovimentazione:
394                #devo eliminare il movimento interamente, visto che non ci sono righe movimento
395                #self.righeMovimentoDel(id=DaoTestataMovimento.id)
396                DaoTestataMovimento.delete()
397                DaoTestataMovimento = None
398            else:
399                #la testata movimento e` gia` presente, quindi devo aggiornarla
400                DaoTestataMovimento.data_movimento = self.data_documento
401                DaoTestataMovimento.operazione = self.operazione
402                DaoTestataMovimento.id_cliente = self.id_cliente
403                DaoTestataMovimento.id_fornitore = self.id_fornitore
404                DaoTestataMovimento.note_interne = self.note_interne
405                DaoTestataMovimento.note_interne = self.note_interne
406                DaoTestataMovimento.id_testata_documento = self.id
407                #righeMovimentoDel(id=DaoTestataMovimento.id)
408        else:
409            # ci sono piu' movimenti collegati al documento
410            # FIXME: che fare ?
411            raise Exception, "ATTENZIONE CI SONO PIU' MOVIMENTI LEGATI AD UN DOCUMENTO"
412        #print "DOPO if di check di RES ", tempo()
413        righeMovimento = []
414        righeDocumento = []
415        scontiRigaMovimento = []
416        if self.righeDocumento:  #trattiamo le righe documento e movimento
417            #print "Prima del FOR delle RIGHE ", tempo()
418            for row in self.righeDocumento:
419                if (row.id_articolo is not None and contieneMovimentazione):
420                    #salvo tra le righe movimenti
421                    #print "RIGHE ",row.id_articolo, tempo()
422                    daoRigaMovimento = RigaMovimento()
423                    #daoRigaMovimento.id_testata_movimento = DaoTestataMovimento.id
424                    daoRigaMovimento.valore_unitario_netto = row.valore_unitario_netto
425                    daoRigaMovimento.valore_unitario_lordo = row.valore_unitario_lordo
426                    daoRigaMovimento.quantita = row.quantita
427                    daoRigaMovimento.moltiplicatore = row.moltiplicatore
428                    daoRigaMovimento.applicazione_sconti = row.applicazione_sconti
429                    daoRigaMovimento.percentuale_iva = row.percentuale_iva
430                    daoRigaMovimento.descrizione = row.descrizione
431                    daoRigaMovimento.id_listino = row.id_listino
432                    daoRigaMovimento.id_magazzino = row.id_magazzino
433                    daoRigaMovimento.id_articolo = row.id_articolo
434                    daoRigaMovimento.id_multiplo = row.id_multiplo
435                    daoRigaMovimento.codiceArticoloFornitore = row.codiceArticoloFornitore
436                    if hasattr(conf, "GestioneNoleggio") and getattr(conf.GestioneNoleggio,'mod_enable')=="yes":
437                        daoRigaMovimento.prezzo_acquisto_noleggio = row.prezzo_acquisto_noleggio
438                        daoRigaMovimento.coeficente_noleggio = row.coeficente_noleggio
439                        daoRigaMovimento.isrent = row.isrent
440
441                    scontiRigaMovimento = []
442                    if row.scontiRigaDocumento:
443                        for v in row.scontiRigaDocumento:
444                            daoScontoMovimento = ScontoRigaMovimento()
445                            daoScontoMovimento.valore = v.valore
446                            daoScontoMovimento.tipo_sconto = v.tipo_sconto
447
448                            scontiRigaMovimento.append(daoScontoMovimento)
449                    if hasattr(conf, "SuMisura") and getattr(conf.SuMisura,'mod_enable')=="yes":
450                        if row.misura_pezzo:
451                                daoRigaMovimento.misura_pezzo = row.misura_pezzo
452
453                    daoRigaMovimento.scontiRigheMovimento = scontiRigaMovimento
454                    righeMovimento.append(daoRigaMovimento)
455                    #righeMovimento.scontiRigheMovimento = scontiRigaMovimento
456                else:
457                    Environment.pg2log.debug("RIGA SENZA RIFERMENTO ARTICOLO QUINDI DESCRITTIVA, SALVO IN RIGADOCUMENTO")
458                    #annullamento id della riga
459                    #row._resetId()
460                    #associazione alla riga della testata
461                    row.id_testata_documento = self.id
462                    righeMovimento.append(row)
463
464        #print "DOPO IL FOR", tempo()
465        if (DaoTestataMovimento is not None):
466            if righeMovimento:
467                ##print "SE ARRIVI QUI DOVREBBE ANDARE TUTTO BENE" , righeMovimento
468                DaoTestataMovimento.righeMovimento=righeMovimento
469                DaoTestataMovimento.persist()
470        else:
471            for riga in righeMovimento:
472                riga.persist()
473        #print "DOPO IL PERSIST DI RIGA", tempo()
474
475        if self.__ScadenzeDocumento:
476            for scad in self.__ScadenzeDocumento:
477                scad._resetId()
478                scad.id_testata_documento = self.id
479                scad.persist()
480        #print "DOPO SCADENZE", tempo()
481
482        if self.__data_fine_noleggio and self.__data_inizio_noleggio:
483            tn = TestataGestioneNoleggio()
484            tn.id_testata_documento = self.id
485            tn.data_inizio_noleggio = self.data_inizio_noleggio
486            tn.data_fine_noleggio = self.data_fine_noleggio
487            tn.persist()
488        #print "DOPO FINE NOLEGGIO", tempo()
489
490        if self.scontiSuTotale:
491            self.scontiTestataDocumentoDel(id=self.id)
492            for scontisutot in self.scontiSuTotale:
493                scontisutot.id_testata_documento = self.id
494                scontisutot.persist()
495        #params["session"].flush()
496        Environment.pg2log.debug("FINE SALVATAGGIO DOCUMENTO")
497
498
499    def righeDocumentoDel(self, id=None):
500        """
501        Cancella le righe associate ad un documento
502        """
503        row = RigaDocumento().select(idTestataDocumento= id,
504                                                    offset = None,
505                                                    batchSize = None)
506        if row:
507            for r in row:
508                if "SuMisura" in modulesList:
509                    mp = MisuraPezzo().select(idRiga=r.id)
510                    if mp:
511                        for m in mp:
512                            params['session'].delete(m)
513                        params["session"].commit()
514                params['session'].delete(r)
515            params["session"].commit()
516            return True
517
518
519
520    def scontiTestataDocumentoDel(self,id=None):
521        """
522        Cancella gli sconti associati ad un documento
523        """
524        row = ScontoTestataDocumento().select(idScontoTestataDocumento= id,
525                                                        offset = None,
526                                                        batchSize = None,
527                                                        orderBy="id_testata_documento")
528        if row:
529            for r in row:
530                params['session'].delete(r)
531            params["session"].commit()
532            return True
533
534
535    def testataDocumentoScadenzaDel(self,id=None):
536        """
537        Cancella la scadenza documento associato ad un documento
538        """
539        row = TestataDocumentoScadenza().select(idTestataDocumentoScadenza= id,
540                                                                    offset = None,
541                                                                    batchSize = None,
542                                                                    orderBy="id_testata_documento")
543        for r in row:
544            params['session'].delete(r)
545        params["session"].commit()
546        return True
547
548    def scontiRigaDocumentoDel(self,id=None):
549        """
550        Cancella gli sconti legati ad una riga movimento
551        """
552        row = ScontoRigaDocumento().select(idRigaDocumento= id,
553                                                    offset = None,
554                                                    batchSize = None)
555        if row:
556            for r in row:
557                params['session'].delete(r)
558            params["session"].commit()
559            return True
560
561
562
563    def _al(self):
564        if self.AL: return self.AL.denominazione
565        else: return ""
566    aliquota_iva_esenzione = property(_al)
567
568
569    #property vettore
570    def _rag_soc_vett(self):
571        if self.PV: return self.PV.ragione_sociale
572        else: return ""
573    ragione_sociale_vettore = property(_rag_soc_vett)
574
575
576    #property destinazione_merce
577    def _destMerc(self):
578        if self.DM: dm = self.DM.denominazione
579        else: return ""
580    destinazione_merce = property(_destMerc)
581
582    def _destMercInd(self):
583        if self.DM: return self.DM.indirizzo
584        else: return ""
585    indirizzo_destinazione_merce = property(_destMercInd)
586
587    def _destMercloca(self):
588        if self.DM: return self.DM.localita
589        else: return ""
590    localita_destinazione_merce = property(_destMercloca)
591
592    def _destMerccap(self):
593        if self.DM: return self.DM.cap
594        else: return ""
595    cap_destinazione_merce = property(_destMerccap)
596
597    def _destMercprov(self):
598        if self.DM: return self.DM.provincia
599        else: return ""
600    provincia_destinazione_merce = property(_destMercprov)
601
602
603    #property banca
604    def _banca(self):
605        if self.BN: return self.BN.denominazione
606        else: return ""
607    banca = property(_banca)
608
609    def _agenzia(self):
610        if self.BN: return self.BN.agenzia
611        else: return ""
612    agenzia = property(_agenzia)
613
614    def _iban(self):
615        if self.BN: return self.BN.iban
616        else:return ""
617    iban = property(_iban)
618
619
620    #property pagamento
621    def _pagamento(self):
622        if self.PG: return self.PG.denominazione
623        else:return ""
624    pagamento = property(_pagamento)
625
626
627
628    #property cliente
629    def _ragione_sociale_cliente(self):
630        if self.CLI: return self.CLI.ragione_sociale
631        else: return ""
632    ragione_sociale_cliente= property(_ragione_sociale_cliente)
633
634    def _indirizzo_cliente(self):
635        if self.CLI: return self.CLI.sede_legale_indirizzo
636        else: return ""
637    indirizzo_cliente= property(_indirizzo_cliente)
638
639    def _indirizzo_cliente_operativa(self):
640        if self.CLI: return self.CLI.sede_operativa_indirizzo
641        else: return ""
642    indirizzo_cliente_operativa= property(_indirizzo_cliente_operativa)
643
644    def _cap_cliente(self):
645        if self.CLI: return self.CLI.sede_legale_cap
646        else:return ""
647    cap_cliente= property(_cap_cliente)
648
649    def _cap_cliente_operativa(self):
650        if self.CLI: return self.CLI.sede_operativa_cap
651        else:return ""
652    cap_cliente_operativa= property(_cap_cliente_operativa)
653
654    def _localita_cliente(self):
655        if self.CLI: return self.CLI.sede_legale_localita
656        else: return ""
657    localita_cliente= property(_localita_cliente)
658
659    def _localita_cliente_operativa(self):
660        if self.CLI: return self.CLI.sede_operativa_localita
661        else: return ""
662    localita_cliente_operativa= property(_localita_cliente_operativa)
663
664    def _provincia_cliente(self):
665        if self.CLI: return self.CLI.sede_legale_provincia
666        else: return ""
667    provincia_cliente= property(_provincia_cliente)
668
669    def _provincia_cliente_operativa(self):
670        if self.CLI: return self.CLI.sede_operativa_provincia
671        else: return ""
672    provincia_cliente_operativa= property(_provincia_cliente_operativa)
673
674    def _partita_iva_cliente(self):
675        if self.CLI: return self.CLI.partita_iva
676        else: return ""
677    partita_iva_cliente= property(_partita_iva_cliente)
678
679    def _codice_fiscale_cliente(self):
680        if self.CLI: return self.CLI.codice_fiscale
681        else: return ""
682    codice_fiscale_cliente= property(_codice_fiscale_cliente)
683
684    def _cognome_cliente(self):
685        if self.CLI: return self.CLI.cognome
686        else: return ""
687    cognome_cliente= property(_cognome_cliente)
688
689    def _nome_cliente(self):
690        if self.CLI: return self.CLI.nome
691        else: return ""
692    nome_cliente= property(_nome_cliente)
693
694
695
696    #property Fornitore
697    def _ragione_sociale_fornitore(self):
698        if self.FORN: return self.FORN.ragione_sociale
699        else: return ""
700    ragione_sociale_fornitore= property(_ragione_sociale_fornitore)
701
702    def _indirizzo_fornitore(self):
703        if self.FORN: return self.FORN.sede_legale_indirizzo
704        else: return ""
705    indirizzo_fornitore= property(_indirizzo_fornitore)
706
707    def _indirizzo_fornitore_operativa(self):
708        if self.FORN: return self.FORN.sede_operativa_indirizzo
709        else: return ""
710    indirizzo_fornitore_operativa= property(_indirizzo_fornitore_operativa)
711
712    def _cap_fornitore(self):
713        if self.FORN: return self.FORN.sede_legale_cap
714        else: return ""
715    cap_fornitore= property(_cap_fornitore)
716
717    def _cap_fornitore_operativa(self):
718        if self.FORN: return self.FORN.sede_operativa_cap
719        else: return ""
720    cap_fornitore_operativa= property(_cap_fornitore_operativa)
721
722    def _localita_fornitore(self):
723        if self.FORN: return self.FORN.sede_legale_localita
724        else: return ""
725    localita_fornitore= property(_localita_fornitore)
726
727    def _localita_fornitore_operativa(self):
728        if self.FORN: return self.FORN.sede_operativa_localita
729        else: return ""
730    localita_fornitore_operativa = property(_localita_fornitore_operativa)
731
732    def _provincia_fornitore(self):
733        if self.FORN: return self.FORN.sede_legale_provincia
734        else: return ""
735    provincia_fornitore= property(_provincia_fornitore)
736
737    def _provincia_fornitore_operativa(self):
738        if self.FORN: return self.FORN.sede_operativa_provincia
739        else: return ""
740    provincia_fornitore_operativa= property(_provincia_fornitore_operativa)
741
742    def _partita_iva_fornitore(self):
743        if self.FORN: return self.FORN.partita_iva
744        else: return ""
745    partita_iva_fornitore= property(_partita_iva_fornitore)
746
747    def _codice_fiscale_fornitore(self):
748        if self.FORN: return self.FORN.codice_fiscale
749        else: return ""
750    codice_fiscale_fornitore= property(_codice_fiscale_fornitore)
751
752    def _cognome_fornitore(self):
753        if self.FORN: return self.FORN.cognome
754        else: return ""
755    cognome_fornitore= property(_cognome_fornitore)
756
757    def _nome_fornitore(self):
758        if self.FORN: return self.FORN.nome
759        else: return ""
760    nome_fornitore= property(_nome_fornitore)
761
762    #property Agente
763    def _ragione_sociale_agente(self):
764        if self.AGE: return self.AGE.ragione_sociale
765        else: return ""
766    ragione_sociale_agente= property(_ragione_sociale_agente)
767
768
769    if hasattr(conf, "GestioneNoleggio") and getattr(conf.GestioneNoleggio,'mod_enable')=="yes":
770        def _get_data_inizio_noleggio(self):
771            if not self.__data_inizio_noleggio:
772                if self.TGN:
773                    self.__data_inizio_noleggio = self.TGN.data_inizio_noleggio
774                else:
775                    self.__data_inizio_noleggio =  ""
776            return self.__data_inizio_noleggio
777        def _set_data_inizio_noleggio(self, value):
778            self.__data_inizio_noleggio = value
779        data_inizio_noleggio = property(_get_data_inizio_noleggio, _set_data_inizio_noleggio)
780
781        def _get_data_fine_noleggio(self):
782            if not self.__data_fine_noleggio:
783                if self.TGN:
784                    self.__data_fine_noleggio = self.TGN.data_fine_noleggio
785                else:
786                    self.__data_fine_noleggio =  ""
787            return self.__data_fine_noleggio
788        def _set_data_fine_noleggio(self, value):
789            self.__data_fine_noleggio = value
790        data_fine_noleggio = property(_get_data_fine_noleggio, _set_data_fine_noleggio)
791
792
793    def delete(self):
794        #print "PARTIAMO DA QUI"
795        #testataMovDel = TestataMovimento().select(id_testata_documento = self.id).all()
796
797        params['session'].delete(self)
798        params['session'].commit()
799
800    def filter_values(self,k,v):
801        if k == 'daNumero':
802            dic = {k:testata_documento.c.numero >= v}
803        elif k == 'aNumero':
804            dic = {k:testata_documento.c.numero <= v}
805        elif k == 'daParte':
806            dic = {k:testata_documento.c.parte >= v}
807        elif k == 'aParte':
808            dic = {k:testata_documento.c.parte <= v}
809        elif k == 'daData':
810            dic = {k:testata_documento.c.data_documento >= v}
811        elif k== 'aData':
812            dic = {k:testata_documento.c.data_documento <= v}
813        elif k =='protocollo':
814            dic = {k:testata_documento.c.protocollo.ilike("%"+v+"%")}
815        elif k == 'idOperazione':
816            dic = {k:testata_documento.c.operazione == v}
817        elif k == 'idMagazzino':
818            dic = {k:testata_movi.c.id.in_(select([RigaMovimento.id_testata_movimento],and_(
819                                        testata_movi.c.id_testata_documento == testata_documento.c.id,
820                                        Riga.id==RigaMovimento.id,Riga.id_magazzino== v)))
821                                        }
822#            dic = {k:and_(or_(testata_movi.c.id_testata_documento == testata_documento.c.id,
823#                            testata_movi.c.id == RigaMovimento.id_testata_movimento,
824#                            Riga.id==RigaMovimento.id, Riga.id_magazzino== v),
825#                        or_(testata_documento.c.id == RigaDocumento.id_testata_documento,
826#                            Riga.id==RigaDocumento.id, Riga.id_magazzino== v))
827#                             }
828        elif k == 'idCliente':
829            dic = {k:testata_documento.c.id_cliente == v}
830        elif k == 'idFornitore':
831            dic = {k:testata_documento.c.id_fornitore == v}
832        elif k == 'idAgente':
833            dic = {k:testata_documento.c.id_agente == v}
834        elif k == 'statoDocumento':
835            dic = {k:testata_documento.c.documento_saldato == v}
836        elif k == 'idArticolo':
837            dic = {k:and_(Articolo.id ==Riga.id_articolo,
838                           riga.c.id==RigaMovimento.id,
839                           RigaMovimento.id_testata_movimento == TestataMovimento.id,
840                           TestataMovimento.id_testata_documento == testata_documento.c.id,
841                           Articolo.id ==v)}
842#            dic = {k:testata_documento.c.id.in_(select([testata_documento.c.id],
843#                        or_(and_(testata_movi.c.id_testata_documento == testata_documento.c.id,
844#                        Riga.id==RigaMovimento.id,Articolo.id ==Riga.id_articolo,
845#                        Articolo.id == v),and_(testata_documento.c.id==riga_doc.c.id_testata_documento,
846#                        Riga.id==riga_doc.c.id,Articolo.id ==Riga.id_articolo,
847#                        Articolo.id == v))))}
848        elif hasattr(conf, "GestioneNoleggio") and getattr(conf.GestioneNoleggio,'mod_enable')=="yes":
849            if k == 'daDataInizioNoleggio':
850                dic = {k:and_(testata_documento.c.id == TestataGestioneNoleggio.id_testata_documento,
851                            TestataGestioneNoleggio.data_inizio_noleggio >= v)}
852            elif k== 'aDataInizioNoleggio':
853                dic = {k:and_(testata_documento.c.id == TestataGestioneNoleggio.id_testata_documento,
854                            TestataGestioneNoleggio.data_inizio_noleggio <= v)}
855            if k == 'daDataFineNoleggio':
856                dic = {k:and_(testata_documento.c.id == TestataGestioneNoleggio.id_testata_documento,
857                            TestataGestioneNoleggio.data_fine_noleggio >= v)}
858            elif k== 'aDataFineNoleggio':
859                dic = {k:and_(testata_documento.c.id == TestataGestioneNoleggio.id_testata_documento,
860                            TestataGestioneNoleggio.data_fine_noleggio <= v)}
861        return  dic[k]
862
863riga=Table('riga',params['metadata'],schema = params['schema'],autoload=True)
864riga_doc=Table('riga_documento',params['metadata'],schema = params['schema'],autoload=True)
865testata_documento=Table('testata_documento',params['metadata'],schema = params['schema'],autoload=True)
866vettore = Table('vettore',params['metadata'],schema = params['schema'],autoload=True)
867testata_movi=Table('testata_movimento',params['metadata'],schema = params['schema'],autoload=True)
868agen = Table('agente',params['metadata'],schema = params['schema'],autoload=True)
869paga = Table('pagamento',params['metadata'],schema = params['schema'],autoload=True)
870clie = Table('cliente',params['metadata'],schema = params['schema'],autoload=True)
871banc = Table('banca',params['metadata'],schema = params['schema'],autoload=True)
872fornitor=Table('fornitore', params['metadata'], schema = params['schema'], autoload=True)
873
874std_mapper = mapper(TestataDocumento, testata_documento, properties={
875        "rigadoc": relation(RigaDocumento, backref="testata_documento"),
876        "testata_documento_scadenza" :relation(TestataDocumentoScadenza,cascade="all, delete, delete-orphan", backref="testata_documento"),
877        "PG":relation(Pagamento,primaryjoin = testata_documento.c.id_pagamento==paga.c.id),
878        "BN":relation(Banca,primaryjoin = (testata_documento.c.id_banca==banc.c.id)),
879        "AL":relation(AliquotaIva,primaryjoin = (testata_documento.c.id_aliquota_iva_esenzione==AliquotaIva.id)),
880        "PV":relation(Vettore,primaryjoin = (testata_documento.c.id_vettore==vettore.c.id)),
881        "DM":relation(DestinazioneMerce, primaryjoin=(testata_documento.c.id_destinazione_merce==DestinazioneMerce.id)),
882        "TM":relation(TestataMovimento,primaryjoin = (testata_documento.c.id==testata_movi.c.id_testata_documento), backref='TD'),
883        "CLI":relation(Cliente,primaryjoin = (testata_documento.c.id_cliente==clie.c.id)),
884        "FORN":relation(Fornitore,primaryjoin = (testata_documento.c.id_fornitore==fornitor.c.id)),
885        "AGE":relation(Agente,primaryjoin = (testata_documento.c.id_agente==agen.c.id)),
886        "OP":relation(Operazione,primaryjoin = (testata_documento.c.operazione==Operazione.denominazione), backref="TD"),
887        "STD":relation(ScontoTestataDocumento,primaryjoin = (testata_documento.c.id==ScontoTestataDocumento.id_testata_documento), backref="TD"),
888        #'lang':relation(Language, backref='user')
889        }, order_by=testata_documento.c.numero)
890
891if hasattr(conf, "GestioneNoleggio") and getattr(conf.GestioneNoleggio,'mod_enable')=="yes":
892    from promogest.modules.GestioneNoleggio.dao.TestataGestioneNoleggio import TestataGestioneNoleggio
893    std_mapper.add_property("TGN",relation(TestataGestioneNoleggio,primaryjoin=(testata_documento.c.id==TestataGestioneNoleggio.id_testata_documento),backref="TD",uselist = False))
Note: See TracBrowser for help on using the browser.