PageRenderTime 26ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/core/promogest/dao/DaoUtils.py

http://promogest.googlecode.com/
Python | 426 lines | 393 code | 7 blank | 26 comment | 0 complexity | 6653b55a952891a275d569ca9705782e 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 import Environment
  19. import datetime
  20. def giacenzaSel(year=None, idMagazzino=None, idArticolo=None,allMag= None):
  21. """
  22. Calcola la quantitŕ di oggetti presenti in magazzino
  23. @param year=None: Anno di riferimento
  24. @type year=None: Intero
  25. @param idMagazzino=None: se c'č questo č l'id magazzino
  26. @type idMagazzino=None: interno
  27. @param idArticolo=None: Id Articolo da quantificare
  28. @type idArticolo=None:
  29. @param allMag=: Tutti i magazzini ( utile per l'html )
  30. @type allMag=: bool
  31. """
  32. from promogest.dao.TestataMovimento import TestataMovimento
  33. from promogest.dao.RigaMovimento import RigaMovimento
  34. from promogest.dao.Riga import Riga
  35. from promogest.dao.Fornitura import Fornitura
  36. from promogest.dao.Magazzino import Magazzino
  37. if allMag:
  38. magazzini = Environment.params["session"].query(Magazzino.id).all()
  39. if not magazzini:
  40. return []
  41. else:
  42. magazzini = magazzini[0]
  43. righeArticoloMovimentate= Environment.params["session"]\
  44. .query(RigaMovimento,TestataMovimento)\
  45. .filter(TestataMovimento.data_movimento.between(datetime.date(int(year), 1, 1), datetime.date(int(year) + 1, 1, 1)))\
  46. .filter(RigaMovimento.id_testata_movimento == TestataMovimento.id)\
  47. .filter(Riga.id_articolo==idArticolo)\
  48. .filter(Riga.id_magazzino.in_(magazzini))\
  49. .all()
  50. else:
  51. magazzini = idMagazzino
  52. righeArticoloMovimentate= Environment.params["session"]\
  53. .query(RigaMovimento,TestataMovimento)\
  54. .filter(TestataMovimento.data_movimento.between(datetime.date(int(year), 1, 1), datetime.date(int(year) + 1, 1, 1)))\
  55. .filter(RigaMovimento.id_testata_movimento == TestataMovimento.id)\
  56. .filter(Riga.id_articolo==idArticolo)\
  57. .filter(Riga.id_magazzino ==magazzini)\
  58. .all()
  59. lista = []
  60. for ram in righeArticoloMovimentate:
  61. def calcolaGiacenza(quantita=None, moltiplicatore=None, segno=None, valunine=None):
  62. """
  63. Effettua realmente il calcolo
  64. """
  65. giacenza=0
  66. if segno =="-":
  67. giacenza -= quantita*moltiplicatore
  68. else:
  69. giacenza += quantita*moltiplicatore
  70. valore= giacenza*valunine
  71. return (giacenza, valore)
  72. def addFornitura(data=None):
  73. return Fornitura().select(idArticolo = idArticolo,dataFornitura=data)
  74. if ram[1].segnoOperazione =="+":
  75. fornitura = addFornitura(data=ram[1].data_movimento)
  76. else:
  77. fornitura = None
  78. diz = {"daoRigaMovimento": ram[0],
  79. "daoTestataMovimento":ram[1],
  80. "numero":ram[1].numero,
  81. "fornitura": fornitura,
  82. "data_movimento":ram[1].data_movimento,
  83. "operazione":ram[1].operazione,
  84. "id_articolo":ram[0].id_articolo,
  85. "giacenza":calcolaGiacenza(quantita=ram[0].quantita,moltiplicatore=ram[0].moltiplicatore, segno=ram[1].segnoOperazione, valunine=ram[0].valore_unitario_netto)[0],
  86. "cliente":ram[1].ragione_sociale_cliente,
  87. "fornitore":ram[1].ragione_sociale_fornitore,
  88. "valore":calcolaGiacenza(quantita=ram[0].quantita,moltiplicatore=ram[0].moltiplicatore, segno=ram[1].segnoOperazione, valunine=ram[0].valore_unitario_netto)[1],
  89. "segnoOperazione":ram[1].segnoOperazione,
  90. }
  91. lista.append(diz)
  92. return lista
  93. def articoloStatistiche(arti=None, righe=None):
  94. prezzo_ultimo_vendita = 0
  95. prezzo_ultimo_acquisto = 0
  96. quantita_acquistata= 0
  97. quantita_venduta = 0
  98. data_ultimo_acquisto = ""
  99. data_ultima_vendita = ""
  100. prezzo_vendita = []
  101. prezzo_acquisto = []
  102. if arti:
  103. arti = arti
  104. else:
  105. arti = {}
  106. if righe:
  107. new_data =datetime.datetime(2003, 7, 14, 12, 30)
  108. for riga in righe:
  109. rm = riga[0]
  110. tm = riga[1]
  111. data_movimento=tm.data_movimento
  112. if data_movimento >= new_data:
  113. new_data = data_movimento
  114. if tm.segnoOperazione == "-":
  115. prezzo_ultimo_vendita = rm.valore_unitario_netto
  116. data_ultima_vendita = new_data
  117. else:
  118. prezzo_ultimo_acquisto = rm.valore_unitario_netto
  119. data_ultimo_acquisto = new_data
  120. if tm.segnoOperazione == "-":
  121. prezzo_vendita.append(rm.valore_unitario_netto)
  122. else:
  123. prezzo_acquisto.append(rm.valore_unitario_netto)
  124. if tm.segnoOperazione == "-":
  125. quantita_venduta += rm.quantita *rm.moltiplicatore
  126. else:
  127. quantita_acquistata += rm.quantita *rm.moltiplicatore
  128. giacenza = abs(quantita_acquistata-quantita_venduta)
  129. if prezzo_acquisto:
  130. media_acquisto = sum(prezzo_acquisto) / len(prezzo_acquisto)
  131. else:
  132. media_acquisto = 0
  133. if prezzo_vendita:
  134. media_vendita = sum(prezzo_vendita) / len(prezzo_vendita)
  135. else:
  136. media_vendita = 0
  137. arti.update(prezzo_ultima_vendita = prezzo_ultimo_vendita,
  138. data_ultima_vendita = data_ultima_vendita,
  139. prezzo_ultimo_acquisto = prezzo_ultimo_acquisto,
  140. data_ultimo_acquisto = data_ultimo_acquisto,
  141. media_acquisto = media_acquisto,
  142. media_vendita = media_vendita,
  143. quantita_venduta = quantita_venduta,
  144. quantita_acquistata = quantita_acquistata,
  145. giacenza = giacenza)
  146. else:
  147. arti.update(prezzo_ultima_vendita = 0,
  148. data_ultima_vendita = data_ultima_vendita,
  149. prezzo_ultimo_acquisto = 0,
  150. data_ultimo_acquisto = data_ultimo_acquisto,
  151. media_acquisto = 0,
  152. media_vendita = 0,
  153. quantita_venduta = 0,
  154. quantita_acquistata = 0,
  155. giacenza = 0)
  156. return arti
  157. def giacenzaArticolo(year=None, idMagazzino=None, idArticolo=None, allMag=None):
  158. """
  159. Calcola la giacenza insieme a giacenzaSel
  160. """
  161. if not idArticolo or not year or (not idMagazzino and not allMag):
  162. return "0"
  163. else:
  164. lista = giacenzaSel(year=year, idMagazzino=idMagazzino, idArticolo=idArticolo, allMag=allMag)
  165. totGiacenza = 0
  166. for t in lista:
  167. totGiacenza += (t['giacenza'] or 0)
  168. #totGiacenza += (t[4] or 0)
  169. return round(totGiacenza,2)
  170. def TotaleAnnualeCliente(id_cliente=None):
  171. """
  172. Ritorna il totale avere da un cliente
  173. """
  174. from promogest.dao.TestataDocumento import TestataDocumento
  175. documentiCliente = TestataDocumento().select(idCliente=id_cliente,
  176. batchSize=None)
  177. totale =0
  178. for doc in documentiCliente:
  179. if doc.operazione in ["Fattura vendita",
  180. 'Fattura differita vendita',
  181. 'Fattura accompagnatoria',
  182. 'Vendita dettaglio',
  183. 'Nota di credito a cliente']:
  184. if not doc.totale_pagato: doc.totale_pagato=0
  185. if not doc.totale_sospeso: doc.totale_sospeso=0
  186. totale += (doc.totale_pagato + doc.totale_sospeso)
  187. return totale
  188. def TotaleClienteAperto(id_cliente=None):
  189. """
  190. Ritorna il totale avere da un cliente
  191. """
  192. from promogest.dao.TestataDocumento import TestataDocumento
  193. documentiCliente = TestataDocumento().select(idCliente=id_cliente,
  194. batchSize=None)
  195. totale =0
  196. for doc in documentiCliente:
  197. if doc.operazione in ["Fattura vendita",
  198. 'Fattura differita vendita',
  199. 'Fattura accompagnatoria',
  200. 'Vendita dettaglio',
  201. 'Nota di credito a cliente']:
  202. totale += doc.totale_sospeso
  203. return totale
  204. def TotaleAnnualeFornitore(id_fornitore=None):
  205. """
  206. Calcola i sospesi del fornitore
  207. """
  208. from promogest.dao.TestataDocumento import TestataDocumento
  209. documentiFornitore = TestataDocumento().select(idFornitore=id_fornitore,
  210. batchSize=None)
  211. totale =0
  212. for doc in documentiFornitore:
  213. if doc.operazione in ['Fattura acquisto',
  214. 'Fattura differita acquisto',
  215. 'Nota di credito da fornitore']:
  216. if not doc.totale_pagato: doc.totale_pagato=0
  217. if not doc.totale_sospeso: doc.totale_sospeso=0
  218. totale += (doc.totale_pagato + doc.totale_sospeso)
  219. return totale
  220. def TotaleFornitoreAperto(id_fornitore=None):
  221. """
  222. Calcola i sospesi del fornitore
  223. """
  224. from promogest.dao.TestataDocumento import TestataDocumento
  225. documentiFornitore = TestataDocumento().select(idFornitore=id_fornitore,
  226. batchSize=None)
  227. totale =0
  228. for doc in documentiFornitore:
  229. if doc.operazione in ['Fattura acquisto',
  230. 'Fattura differita acquisto',
  231. 'Nota di credito da fornitore']:
  232. totale += doc.totale_sospeso
  233. return totale
  234. def righeDocumentoDel(id=None):
  235. """
  236. Cancella le righe associate ad un documento
  237. """
  238. from promogest.dao.RigaDocumento import RigaDocumento
  239. if posso("SM"):
  240. from promogest.modules.SuMisura.dao.MisuraPezzo import MisuraPezzo
  241. row = RigaDocumento().select(idTestataDocumento= id,
  242. offset = None,
  243. batchSize = None)
  244. if row:
  245. for r in row:
  246. if posso("SM"):
  247. mp = MisuraPezzo().select(idRiga=r.id)
  248. if mp:
  249. for m in mp:
  250. Environment.params['session'].delete(m)
  251. Environment.params["session"].commit()
  252. Environment.params['session'].delete(r)
  253. Environment.params["session"].commit()
  254. return True
  255. def righeMovimentoDel(id=None):
  256. """
  257. Cancella le righe associate ad un documento
  258. """
  259. from promogest.dao.RigaMovimento import RigaMovimento
  260. if "SuMisura" in Environment.modulesList:
  261. from promogest.modules.SuMisura.dao.MisuraPezzo import MisuraPezzo
  262. row = RigaMovimento().select(idTestataMovimento= id,
  263. offset = None,
  264. batchSize = None)
  265. if row:
  266. for r in row:
  267. if posso("SM"):
  268. mp = MisuraPezzo().select(idRiga=r.id)
  269. if mp:
  270. for m in mp:
  271. Environment.params['session'].delete(m)
  272. Environment.params["session"].commit()
  273. Environment.params['session'].delete(r)
  274. Environment.params["session"].commit()
  275. return True
  276. def scontiTestataDocumentoDel(id=None):
  277. """
  278. Cancella gli sconti associati ad un documento
  279. """
  280. from promogest.dao.ScontoTestataDocumento import ScontoTestataDocumento
  281. row = ScontoTestataDocumento().select(idScontoTestataDocumento= id,
  282. offset = None,
  283. batchSize = None)
  284. if row:
  285. for r in row:
  286. Environment.params['session'].delete(r)
  287. Environment.params["session"].commit()
  288. return True
  289. def scontiVenditaDettaglioDel(idListino=None,idArticolo=None,dataListinoArticolo=None):
  290. """
  291. cancella gli sconti associati al listino articolo
  292. """
  293. from promogest.dao.ScontoVenditaDettaglio import ScontoVenditaDettaglio
  294. row = ScontoVenditaDettaglio().select(idListino=idListino,
  295. idArticolo=idArticolo,
  296. dataListinoArticolo=dataListinoArticolo,
  297. offset = None,
  298. batchSize = None,
  299. orderBy=ScontoVenditaDettaglio.id_listino)
  300. if row:
  301. for r in row:
  302. Environment.params['session'].delete(r)
  303. Environment.params["session"].commit()
  304. return True
  305. def scontiVenditaIngrossoDel(idListino=None,idArticolo=None,dataListinoArticolo=None):
  306. """
  307. cancella gli sconti associati al listino articolo
  308. """
  309. from promogest.dao.ScontoVenditaIngrosso import ScontoVenditaIngrosso
  310. row = ScontoVenditaIngrosso().select(idListino=idListino,
  311. idArticolo=idArticolo,
  312. dataListinoArticolo=dataListinoArticolo,
  313. offset = None,
  314. batchSize = None,
  315. orderBy=ScontoVenditaIngrosso.id_listino)
  316. if row:
  317. for r in row:
  318. Environment.params['session'].delete(r)
  319. Environment.params["session"].commit()
  320. return True
  321. def testataDocumentoScadenzaDel(id=None):
  322. """
  323. Cancella la scadenza documento associato ad un documento
  324. """
  325. from promogest.modules.Pagamenti.dao.TestataDocumentoScadenza import TestataDocumentoScadenza
  326. row = TestataDocumentoScadenza().select(idTestataDocumentoScadenza= id,
  327. offset = None,
  328. batchSize = None,
  329. orderBy=TestataDocumentoScadenza.id_testata_documento)
  330. for r in row:
  331. Environment.params['session'].delete(r)
  332. Environment.params["session"].commit()
  333. return True
  334. def scontiRigaDocumentoDel(id=None):
  335. """
  336. Cancella gli sconti legati ad una riga movimento
  337. """
  338. from promogest.dao.ScontoRigaDocumento import ScontoRigaDocumento
  339. row = ScontoRigaDocumento().select(idRigaDocumento= id,
  340. offset = None,
  341. batchSize = None)
  342. if row:
  343. for r in row:
  344. Environment.params['session'].delete(r)
  345. Environment.params["session"].commit()
  346. return True
  347. def scontiRigaMovimentoDel(id=None):
  348. """
  349. Cancella gli sconti legati ad una riga movimento
  350. """
  351. from promogest.dao.ScontoRigaMovimento import ScontoRigaMovimento
  352. row = ScontoRigaMovimento().select(idRigaMovimento= id,
  353. offset = None,
  354. batchSize = None)
  355. if row:
  356. for r in row:
  357. Environment.params['session'].delete(r)
  358. Environment.params["session"].commit()
  359. return True
  360. def ckd(dao):
  361. classe = dao.__class__.__name__
  362. # Environment.pg2log.info("MODULI E OPZIONI: " \
  363. # + str(Environment.modulesList)+" "\
  364. # +str(Environment.tipo_pg) \
  365. # +" "+str(classe))
  366. stopp = False
  367. if "ONE BASIC" in Environment.modulesList or \
  368. "PRO BASIC" in Environment.modulesList:
  369. if Environment.tipodb =="sqlite":
  370. records = Environment.session.query(dao.__class__).count()
  371. for a in Environment.modulesList:
  372. if "+S" not in a:
  373. if "TestataScontrino" in classe:
  374. print "SHOP LIMITATO"
  375. if records > 20: stopp = True
  376. if "TestataDocumento" in classe:
  377. if records > 50: stopp = True
  378. if "Articolo" in classe:
  379. if records > 500: stopp = True
  380. if stopp:
  381. msg = """HAI RAGGIUNTO IL LIMITE MASSIMO CONSENTITO
  382. DALLA VERSIONE ONE BASIC GRATUITA PER QUESTA OPERAZIONE, ACQUISTA
  383. LA VERSIONE "ONE STANDARD" PER ELIMINARE TUTTI I LIMITI
  384. O LA "ONE FULL" PER ATTIVARE ANCHE TUTTI I MODULI"""
  385. Environment.messageInfoEnv(msg=msg)
  386. Environment.params["session"].rollback()
  387. return False
  388. else:
  389. return True
  390. return True