PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/core/promogest/dao/TestataMovimento.py

http://promogest.googlecode.com/
Python | 319 lines | 290 code | 14 blank | 15 comment | 5 complexity | db3930330cc2045e7554583a696b571e MD5 | raw file
Possible License(s): GPL-2.0
  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. # Author: Francesco Meloni <francesco@promotux.it>
  5. # This file is part of Promogest.
  6. # Promogest is free software: you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation, either version 2 of the License, or
  9. # (at your option) any later version.
  10. # Promogest is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. # GNU General Public License for more details.
  14. # You should have received a copy of the GNU General Public License
  15. # along with Promogest. If not, see <http://www.gnu.org/licenses/>.
  16. from sqlalchemy import *
  17. from sqlalchemy.orm import *
  18. from promogest.Environment import *
  19. from Dao import Dao
  20. from DaoUtils import *
  21. from promogest.dao.Articolo import Articolo
  22. from promogest.dao.Multiplo import Multiplo
  23. from promogest.dao.RigaMovimento import RigaMovimento
  24. from promogest.dao.RigaDocumento import RigaDocumento
  25. from promogest.dao.Riga import Riga
  26. from promogest.dao.RigaMovimentoFornitura import RigaMovimentoFornitura
  27. from promogest.ui.utils import numeroRegistroGet
  28. from Fornitore import Fornitore
  29. from Cliente import Cliente
  30. from Fornitura import Fornitura
  31. from Operazione import Operazione
  32. from ScontoFornitura import ScontoFornitura
  33. from promogest.ui.utils import *
  34. if hasattr(conf, "SuMisura") and getattr(conf.SuMisura,'mod_enable') == "yes":
  35. from promogest.modules.SuMisura.dao.MisuraPezzo import MisuraPezzo
  36. class TestataMovimento(Dao):
  37. def __init__(self, req=None):
  38. Dao.__init__(self, entity=self)
  39. self.__righeMovimento = []
  40. self.__dbRigheMovimento = []
  41. @reconstructor
  42. def init_on_load(self):
  43. self.__righeMovimento = []
  44. self.__dbRigheMovimento = []
  45. def _getRigheMovimento(self):
  46. if not self.__righeMovimento:
  47. self.__dbRigheMovimento = params['session'].query(RigaMovimento)\
  48. .with_parent(self)\
  49. .filter_by(id_testata_movimento=self.id)\
  50. .all()
  51. self.__righeMovimento = self.__dbRigheMovimento[:]
  52. return self.__righeMovimento
  53. def _setRigheMovimento(self, value):
  54. self.__righeMovimento = value
  55. righe = property(_getRigheMovimento, _setRigheMovimento)
  56. def _segno_operazione(self):
  57. if self.opera: return self.opera.segno
  58. else: return ""
  59. segnoOperazione = property(_segno_operazione)
  60. def _ragioneSocialeFornitore(self):
  61. if self.forni: return self.forni.ragione_sociale
  62. else: return ""
  63. ragione_sociale_fornitore = property(_ragioneSocialeFornitore)
  64. def _ragioneSocialeCliente(self):
  65. if self.cli: return self.cli.ragione_sociale
  66. else: return ""
  67. ragione_sociale_cliente= property(_ragioneSocialeCliente)
  68. def _cognome_cliente(self):
  69. if self.cli: return self.cli.cognome
  70. else: return ""
  71. cognome_cliente= property(_cognome_cliente)
  72. def _nome_cliente(self):
  73. if self.cli: return self.cli.nome
  74. else: return ""
  75. nome_cliente= property(_nome_cliente)
  76. def _cognome_fornitore(self):
  77. if self.forni: return self.forni.cognome
  78. else: return ""
  79. cognome_fornitore= property(_cognome_fornitore)
  80. def _nome_fornitore(self):
  81. if self.forni: return self.forni.nome
  82. else: return ""
  83. nome_fornitore= property(_nome_fornitore)
  84. def _getNumeroMagazzini(self):
  85. """
  86. Restituisce il numero di magazzini presenti nel documento. Ci serve per poter effettuare
  87. il trasferimento di articoli che partono tutti dallo stesso magazzino
  88. """
  89. __numeroMagazzini = []
  90. for riga in self.righe:
  91. if riga.id_magazzino not in __numeroMagazzini:
  92. __numeroMagazzini.append(riga.id_magazzino)
  93. return len(__numeroMagazzini)
  94. numeroMagazzini = property(_getNumeroMagazzini)
  95. def filter_values(self,k,v):
  96. if k == 'daNumero':
  97. dic = {k:testata_mov.c.numero >= v}
  98. elif k == 'aNumero':
  99. dic = {k:testata_mov.c.numero <= v}
  100. elif k == 'daParte':
  101. dic = {k:testata_mov.c.parte >= v}
  102. elif k == 'aParte':
  103. dic = {k:testata_mov.c.parte <= v}
  104. elif k == 'daData':
  105. dic = {k:testata_mov.c.data_movimento >= v}
  106. elif k == 'aData':
  107. dic = {k:testata_mov.c.data_movimento <= v}
  108. elif k == 'idOperazione':
  109. dic = {k:testata_mov.c.operazione == v}
  110. elif k == 'idMagazzino':
  111. dic = {k:testata_mov.c.id.in_(select([RigaMovimento.id_testata_movimento],and_(Riga.id==RigaMovimento.id,Riga.id_magazzino== v)))}
  112. elif k == 'idMagazzinoList':
  113. dic = {k:testata_mov.c.id.in_(select([RigaMovimento.id_testata_movimento],and_(Riga.id==RigaMovimento.id,Riga.id_magazzino.in_(v))))}
  114. elif k == 'idCliente':
  115. dic = {k:testata_mov.c.id_cliente == v}
  116. elif k == 'idClienteList':
  117. dic = {k:and_(testata_mov.c.id_cliente.in_(v))}
  118. elif k == 'idFornitore':
  119. dic = {k:testata_mov.c.id_fornitore == v}
  120. elif k == 'dataMovimento':
  121. dic = {k: testata_mov.c.data_movimento == v}
  122. elif k == 'registroNumerazione':
  123. dic = {k:testata_mov.c.registro_numerazione==v}
  124. elif k == 'id_testata_documento':
  125. dic = {k:testata_mov.c.id_testata_documento ==v}
  126. elif k == 'idTestataDocumento':
  127. dic = {k:testata_mov.c.id_testata_documento ==v}
  128. elif k == 'idArticolo':
  129. dic = {k:and_(RigaMovimento.id_testata_movimento == TestataMovimento.id,
  130. Riga.id==RigaMovimento.id,
  131. Articolo.id ==Riga.id_articolo,
  132. Articolo.id ==v)}
  133. return dic[k]
  134. def righeMovimentoDel(self,id=None):
  135. """
  136. Cancella le righe associate ad un documento
  137. """
  138. #from promogest.dao.RigaMovimento import RigaMovimento
  139. row = RigaMovimento().select(idTestataMovimento= id,
  140. offset = None,
  141. batchSize = None)
  142. if row:
  143. self.rmfv = RigaMovimentoFornitura().select(idRigaMovimentoVenditaBool = True, batchSize=None)
  144. print "QUI SEI PIENOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", self.rmfv
  145. if self.rmfv:
  146. print "QUESTO ARTICOLO ?ยจ stato venduto", len(self.rmfv), "volte"
  147. for r in row:
  148. if posso("SM"):
  149. mp = MisuraPezzo().select(idRiga=r.id, batchSize=None)
  150. if mp:
  151. for m in mp:
  152. params['session'].delete(m)
  153. params["session"].commit()
  154. rmfa = RigaMovimentoFornitura().select(idRigaMovimentoAcquisto = r.id, batchSize=None)
  155. if rmfa:
  156. for f in rmfa:
  157. params['session'].delete(f)
  158. params["session"].commit()
  159. params['session'].delete(r)
  160. params["session"].commit()
  161. return True
  162. def persist(self):
  163. """cancellazione righe associate alla testata
  164. conn.execStoredProcedure('RigheMovimentoDel',(self.id, ))"""
  165. pg2log.info("DENTRO IL TESTATA MOVIMENTO")
  166. if not self.numero:
  167. valori = numeroRegistroGet(tipo="Movimento", date=self.data_movimento)
  168. self.numero = valori[0]
  169. self.registro_numerazione= valori[1]
  170. params["session"].add(self)
  171. params["session"].commit()
  172. if self.righeMovimento:
  173. #print "PRIMA DI CANCELLA RIGHE MOV", tempo()
  174. self.righeMovimentoDel(id=self.id)
  175. #print "DOPO CANCELLA RIGHE MOV", tempo()
  176. for riga in self.righeMovimento:
  177. if "RigaDocumento" in str(riga.__module__):
  178. riga.persist()
  179. else:
  180. #annullamento id della riga
  181. riga._resetId()
  182. #associazione alla riga della testata
  183. riga.id_testata_movimento = self.id
  184. #salvataggio riga
  185. riga.persist()
  186. #print "DOPO il persist della riga", tempo()
  187. print "QUANTIAAAAAAAAAAAAAAAAAAAAAAAAA", riga.quantita
  188. if self.id_fornitore and riga.id_articolo:
  189. if hasattr(riga,"data_prezzo"):
  190. data_prezzo = stringToDateTime(riga.data_prezzo) or stringToDateTime(self.data_movimento)
  191. else:
  192. data_prezzo = stringToDateTime(self.data_movimento)
  193. #print "DATAPREZZOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", data_prezzo
  194. """aggiornamento forniture cerca la fornitura relativa al fornitore
  195. con data <= alla data del movimento"""
  196. fors = Fornitura().select(idArticolo=riga.id_articolo,
  197. idFornitore=self.id_fornitore,
  198. daDataPrezzo=None,
  199. aDataPrezzo= data_prezzo,
  200. orderBy = 'data_prezzo DESC',
  201. offset = None,
  202. batchSize = None)
  203. #print "DOPO dopo FORS", fors
  204. daoFornitura = None
  205. if fors:
  206. if fors[0].data_prezzo == data_prezzo:
  207. # ha trovato una fornitura con stessa data: aggiorno questa fornitura
  208. #pg2log.info("TROVATO UNA FORNITURA CON STESSA DATA: AGGIORNO QUESTA FORNITURA")
  209. daoFornitura = Fornitura().getRecord(id=fors[0].id)
  210. else:
  211. """creo una nuova fornitura con data_prezzo pari alla data del movimento
  212. copio alcuni dati dalla fornitura piu' prossima"""
  213. #pg2log.info("CREO UNA NUOVA FORNITURA CON DATA_PREZZO PARI ALLA DATA DEL MOVIMENTO COPIO ALCUNI DATI DALLA FORNITURA PIU' PROSSIMA")
  214. daoFornitura = Fornitura()
  215. else:
  216. # nessuna fornitura utilizzabile, ne creo una nuova (alcuni dati mancheranno)
  217. #pg2log.info("NESSUNA FORNITURA UTILIZZABILE, NE CREO UNA NUOVA (ALCUNI DATI MANCHERANNO)")
  218. daoFornitura = Fornitura()
  219. if hasattr(riga, "ordine_minimo") and riga.ordine_minimo:
  220. daoFornitura.scorta_minima = int(riga.ordine_minimo)
  221. #daoFornitura.id_multiplo = None
  222. if hasattr(riga, "tempo_arrivo") and riga.tempo_arrivo:
  223. daoFornitura.tempo_arrivo_merce = int(riga.tempo_arrivo)
  224. daoFornitura.fornitore_preferenziale = True
  225. if hasattr(riga,"numero_lotto"):
  226. daoFornitura.numero_lotto = riga.numero_lotto or ""
  227. if hasattr(riga, "data_scadenza"):
  228. daoFornitura.data_scadenza = stringToDate(riga.data_scadenza) or None
  229. if hasattr(riga, "data_produzione"):
  230. daoFornitura.data_produzione = stringToDate(riga.data_produzione) or None
  231. if hasattr(riga,"data_prezzo"):
  232. daoFornitura.data_prezzo = data_prezzo
  233. daoFornitura.id_fornitore = self.id_fornitore
  234. daoFornitura.id_articolo = riga.id_articolo
  235. if daoFornitura.data_fornitura is not None:
  236. if self.data_movimento > daoFornitura.data_fornitura:
  237. daoFornitura.data_fornitura = self.data_movimento
  238. else:
  239. daoFornitura.data_fornitura = self.data_movimento
  240. if "_RigaMovimento__codiceArticoloFornitore" in riga.__dict__:
  241. daoFornitura.codice_articolo_fornitore = riga.__dict__["_RigaMovimento__codiceArticoloFornitore"]
  242. daoFornitura.prezzo_lordo = riga.valore_unitario_lordo
  243. daoFornitura.prezzo_netto = riga.valore_unitario_netto
  244. daoFornitura.percentuale_iva = riga.percentuale_iva
  245. daoFornitura.applicazione_sconti = riga.applicazione_sconti
  246. sconti = []
  247. for s in riga.sconti:
  248. daoSconto = ScontoFornitura()
  249. daoSconto.id_fornitura = daoFornitura.id
  250. daoSconto.valore = s.valore
  251. daoSconto.tipo_sconto = s.tipo_sconto
  252. sconti.append(daoSconto)
  253. daoFornitura.sconti = sconti
  254. params["session"].add(daoFornitura)
  255. params["session"].commit()
  256. if self.id_fornitore and riga.id_articolo:
  257. for q in range(1,riga.quantita):
  258. a = RigaMovimentoFornitura()
  259. a.id_articolo = riga.id_articolo
  260. a.id_riga_movimento_acquisto = riga.id
  261. if self.rmfv and self.rmfv[0].id_articolo==riga.id_articolo and self.rmfv[0].id_fornitura == daoFornitura.id:
  262. a.id_riga_movimento_vendita = self.rmfv[0].id_riga_movimento_vendita
  263. del self.rmfv[0]
  264. a.id_fornitura = daoFornitura.id
  265. params["session"].add(a)
  266. params["session"].commit()
  267. else:
  268. print "E una vendita"
  269. #print "DOPO il for generale di riga movimento", tempo()
  270. self.__righeMovimento = []
  271. #riga=Table('riga',params['metadata'],schema = params['schema'],autoload=True)
  272. testata_mov=Table('testata_movimento', params['metadata'],schema = params['schema'],autoload=True)
  273. clie = Table('cliente',params['metadata'],schema = params['schema'],autoload=True)
  274. rigamovi = Table('riga_movimento',params['metadata'],schema = params['schema'],autoload=True)
  275. operaz = Table('operazione',params['metadata'],schema = params['mainSchema'],autoload=True)
  276. std_mapper = mapper(TestataMovimento, testata_mov,properties={
  277. "rigamov": relation(RigaMovimento,primaryjoin=
  278. testata_mov.c.id==rigamovi.c.id_testata_movimento,
  279. cascade="all, delete",
  280. backref="testata_movimento"),
  281. #"fornitore": relation(Fornitore, backref="testata_movimento"),
  282. "forni":relation(Fornitore,primaryjoin=
  283. (testata_mov.c.id_fornitore==Fornitore.id), backref="testata_movimento"),
  284. "cli":relation(Cliente,primaryjoin=
  285. (testata_mov.c.id_cliente==clie.c.id), backref="testata_movimento"),
  286. "opera": relation(Operazione,primaryjoin = (testata_mov.c.operazione==Operazione.denominazione),backref="testata_movimento"),
  287. }, order_by=testata_mov.c.id)