PageRenderTime 40ms CodeModel.GetById 1ms RepoModel.GetById 0ms app.codeStats 0ms

/core/promogest/dao/TestataDocumento.py

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

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