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

/core/promogest/modules/SchedaLavorazione/ui/SchedaLavorazioneUtils.py

http://promogest.googlecode.com/
Python | 506 lines | 477 code | 9 blank | 20 comment | 1 complexity | d70dfdc6089b12368ca04527cb083ef2 MD5 | raw file
Possible License(s): GPL-2.0
  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2005, 2006, 2007 2008, 2009, 2010, 2011 by Promotux
  3. # di Francesco Meloni snc - http://www.promotux.it/
  4. # Author: Francesco Meloni <francesco@promotux.it>
  5. # Author: Dr astico (Pinna Marco) <zoccolodignu@gmail.com>
  6. # Author: Francesco Marella <francesco.marella@gmail.com>
  7. # This file is part of Promogest.
  8. # Promogest is free software: you can redistribute it and/or modify
  9. # it under the terms of the GNU General Public License as published by
  10. # the Free Software Foundation, either version 2 of the License, or
  11. # (at your option) any later version.
  12. # Promogest is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU General Public License for more details.
  16. # You should have received a copy of the GNU General Public License
  17. # along with Promogest. If not, see <http://www.gnu.org/licenses/>.
  18. import os
  19. import string, re, time, datetime, decimal
  20. from decimal import *
  21. from promogest import Environment
  22. from promogest.ui.utils import *
  23. from promogest.ui.gtk_compat import *
  24. from promogest.modules.SchedaLavorazione.dao.SchedaOrdinazione import SchedaOrdinazione
  25. from promogest.modules.SchedaLavorazione.dao.ColoreStampa import ColoreStampa
  26. from promogest.modules.SchedaLavorazione.dao.CarattereStampa import CarattereStampa
  27. from promogest.modules.DistintaBase.dao.AssociazioneArticolo import AssociazioneArticolo
  28. from promogest.modules.SchedaLavorazione.dao.ScontoRigaScheda import ScontoRigaScheda
  29. from promogest.modules.SchedaLavorazione.dao.ScontoSchedaOrdinazione import ScontoSchedaOrdinazione
  30. from promogest.modules.SchedaLavorazione.dao.PromemoriaSchedaOrdinazione import PromemoriaSchedaOrdinazione
  31. from promogest.dao.ListinoArticolo import ListinoArticolo
  32. from promogest.dao.Articolo import Articolo
  33. def fillComboboxColoreStampa(combobox, filter=False):
  34. """
  35. Crea la combo dei colori per la stampa
  36. """
  37. model = gtk.ListStore(object, int, str)
  38. liss = ColoreStampa().select(denominazione=None,
  39. orderBy = None,
  40. offset = None,
  41. batchSize = None)
  42. if not filter:
  43. emptyRow = ''
  44. else:
  45. emptyRow = '< Tutti >'
  46. model.append((None, 0, emptyRow))
  47. for l in liss:
  48. model.append((l, l.id, (l.denominazione or '')[0:20]))
  49. combobox.clear()
  50. renderer = gtk.CellRendererText()
  51. combobox.pack_start(renderer, True)
  52. combobox.add_attribute(renderer, 'text', 2)
  53. combobox.set_model(model)
  54. # if combobox.__class__ is gtk.ComboBoxEntry:
  55. # combobox.set_text_column(2)
  56. def fillComboboxCarattereStampa(combobox, filter=False):
  57. """
  58. Crea la combo dei caratteri per la stampa
  59. """
  60. model = gtk.ListStore(object, int, str)
  61. liss = CarattereStampa().select(denominazione=None,
  62. orderBy = None,
  63. offset = None,
  64. batchSize = None)
  65. if not filter:
  66. emptyRow = ''
  67. else:
  68. emptyRow = '< Tutti >'
  69. model.append((None, 0, emptyRow))
  70. for l in liss:
  71. model.append((l, l.id, (l.denominazione or '')[0:20]))
  72. combobox.clear()
  73. renderer = gtk.CellRendererText()
  74. combobox.pack_start(renderer, True)
  75. combobox.add_attribute(renderer, 'text', 2)
  76. combobox.set_model(model)
  77. # if combobox.__class__ is gtk.ComboBoxEntry:
  78. # combobox.set_text_column(2)
  79. def fillComboboxAssociazioneArticoli(combobox, search_string=None):
  80. """
  81. Riempie la combobox di selezione delle associazioni di articoli.
  82. Se la lista risultante ha un solo elemento, questo viene automaticamente selezionato.
  83. """
  84. model = gtk.ListStore(object, str, str)
  85. model.clear()
  86. liss = Articolo().select(node =True,
  87. codiceEM=search_string,
  88. offset=None,
  89. batchSize=None)
  90. # questa combobox mi sa che non puo' andare a finire in un filter widget
  91. emptyRow = ''
  92. model.append((None, None, emptyRow))
  93. for l in liss:
  94. model.append([l,l.codice, l.denominazione])
  95. combobox.clear()
  96. renderer = gtk.CellRendererText()
  97. combobox.pack_start(renderer, True)
  98. combobox.add_attribute(renderer, 'text', 1)
  99. renderer = gtk.CellRendererText()
  100. combobox.pack_start(renderer, True)
  101. combobox.add_attribute(renderer, 'text', 2)
  102. combobox.set_model(model)
  103. if len(liss) == 1 and search_string is not None:
  104. combobox.set_active(1)
  105. return True
  106. def fetch_date(string):
  107. """
  108. This should return a string indicating a date in italian format (dd/mm/YYYY)
  109. or None if some of the parts of the input string cant be translated into number format
  110. """
  111. def fetch_day(str):
  112. if len(str) <= 2:
  113. try:
  114. number = int(str)
  115. if number <= 31 and number > 0:
  116. return str(number)
  117. except:
  118. #questa espressione regolare continua a matchare con la stringa "0" e "00"
  119. # necessario risolvere (potrebbe creare problemi)
  120. re_str = re.compile('(^[0-2]?[0-9]$|^30$|^31$){1}')
  121. if re_str.match(str) and str != ('0'or '00'):
  122. return str
  123. else:
  124. return None
  125. def fetch_month(str):
  126. monthList = ['gennaio','febraio','marzo','aprile','maggio',
  127. 'giugno','luglio','agosto','settembre','ottobre',
  128. 'novembre','dicembre']
  129. if len(str) <= 2:
  130. try:
  131. number = int(str)
  132. if number <= 12 and number > 0:
  133. return str(number)
  134. except:
  135. #se fallisce quello sopra... questo ha poche speranze.
  136. re_str = re.compile('(^[0-1]?[0-9]$|^10$|^11$|^12$){1}')
  137. if re_str.match(str) and str != ('0'or '00'):
  138. return str
  139. return None
  140. else:
  141. ind = 1
  142. for month in monthList:
  143. if str.lower() == month:
  144. return ind
  145. break
  146. ind += 1
  147. return None
  148. def fetch_year(str):
  149. if len(str) == 2:
  150. return '20'+str
  151. elif len(str) == 4:
  152. return str
  153. else:
  154. return None
  155. data = string.split(' ')
  156. if len (data) == 3:
  157. day = fetch_day(data[0])
  158. month = fetch_month(data[1])
  159. year = fetch_year(data[2])
  160. elif len(data) == 4:
  161. day = fetch_day(data[0]) or fetch_day(data[1])
  162. month = fetch_month(data[2])
  163. year = fetch_year(data[3])
  164. if (day is not None) and (month is not None) and (year is not None):
  165. return stringTodate (day+'/'+month+'/'+year)
  166. else:
  167. return None
  168. def get_nomi_sposi(str1,str2, reverse = False):
  169. if not reverse:
  170. return str1.split(' ')[0]+' e '+str2.split(' ')[0]
  171. else:
  172. return str1.split(' ')[-1]+' - '+str2.split(' ')[-1]
  173. def create_schede_ordinazioni(data):
  174. schede_saltate = []
  175. codice_contrassegno = 5
  176. codice_stampa = 6
  177. for form in data:
  178. data_matrimonio = fetch_date(form['Data_matrimonio'])
  179. citta_matrimonio = form["Citta_matrimonio"]
  180. carattere = form["carattere"]
  181. colore = form["colore"]
  182. referente = form["nome"]
  183. presso = form["Presso"]
  184. via_piazza = form["Via_e_num"]
  185. citta = form["Citta"]
  186. provincia = form["Provincia"]
  187. zip = form["CAP"]
  188. telefono = form["telefono"]
  189. cellulare = form["Cellulare"]
  190. prima_email = form["From"]
  191. pagamento = form["pagamento"]
  192. sconto = form["Percentuale di sconto"].replace("%","")
  193. articoli_scheda = form['articoli']
  194. lui_e_lei = get_nomi_sposi(form["Nome_sposo"],form["Nome_sposa"])
  195. nomi_sposi = get_nomi_sposi(form["Nome_sposo"],form["Nome_sposa"], reverse=True)
  196. dao = SchedaOrdinazione()
  197. if data_matrimonio is not None:
  198. dao.data_matrimonio = utils.stringToDate(data_matrimonio)
  199. else:
  200. schede_saltate.append(form)
  201. continue
  202. dao.data_presa_in_carico = datetime.date.today()
  203. dao.nomi_sposi = nomi_sposi
  204. dao.lui_e_lei = lui_e_lei
  205. dao.id_carattere_stampa = CarattereStampa().select(denominazione= carattere,
  206. orderBy = None,
  207. offset = None,
  208. batchSize = None)[0].id
  209. dao.id_colore_stampa = ColoreStampa().select(denominazione= colore,
  210. orderBy = None,
  211. offset = None,
  212. batchSize = None)[0].id
  213. dao.provenienza = citta_matrimonio
  214. dao.referente = referente
  215. dao.presso = presso
  216. dao.via_piazza = via_piazza
  217. dao.zip = zip
  218. dao.localita = citta
  219. dao.provincia = provincia
  220. dao.stato = 'Italia'
  221. dao.prima_email = prima_email
  222. dao.telefono = telefono
  223. dao.cellulare = cellulare
  224. art = articoli_scheda.iteritems()[0]
  225. associazione = AssociazioneArticoli().select(nodo=True,
  226. codice=art[0],
  227. offset=None,
  228. batchSize=None)
  229. quantita = []
  230. _produttore = associazione[0].produttore
  231. if _produttore.lower() in Environment.conf.SchedaLavorazione.aziende_cliche.lower().strip().split(', '):
  232. dao.bomba_in_cliche = True
  233. else:
  234. dao.bomba_in_cliche = False
  235. for ass in associazione:
  236. for art in articoli_scheda.iteritems():
  237. if ass.codice == int(art[0]):
  238. quantita.append(art[1])
  239. continue
  240. if ass.denominazione.lower() == 'stampa':
  241. quantita.append(1)
  242. continue
  243. elif ass.denominazione.lower() == 'contrassegno':
  244. if pagamento.lower() == 'contrassegno':
  245. quantita.append(1)
  246. continue
  247. else:
  248. delete_contrassegno = True
  249. continue
  250. listini = []
  251. listinoarticolo = ListinoArticolo(Environment.connection, 1, ass.id_articolo)
  252. listini.append(listinoarticolo)
  253. if delete_contrassegno:
  254. for ass in associazione:
  255. if ass.denominazione.lower() == 'contrassegno':
  256. associazione.remove(ass)
  257. del delete_contrassegno
  258. righe = []
  259. id_magazzino = 1
  260. id_listino = 1
  261. dao.righe = []
  262. _parzialeNetto = Decimal('0')
  263. for i in range(len(associazione)):
  264. daoRiga = RigaSchedaOrdinazione()
  265. daoRiga.id_scheda = dao.id or None
  266. daoRiga.id_articolo = associazione[i].id_articolo
  267. daoRiga.id_magazzino = id_magazzino
  268. daoRiga.descrizione = associazione[i].denominazione
  269. daoRiga.codiceArticoloFornitore = None
  270. daoRiga.id_listino = id_listino
  271. daoRiga.percentuale_iva = lettura_articolo['percentualeAliquotaIva']
  272. setScontiRiga(daoRiga)
  273. daoRiga.quantita = quantita[i]
  274. daoRiga.id_multiplo = None
  275. daoRiga.moltiplicatore = None
  276. daoRiga.valore_unitario_lordo = listinoarticolo[i].prezzo_dettaglio
  277. daoRiga, _parzialeNetto = getPrezzoNetto(daoRiga,_parzialeNetto)
  278. dao.righe.append(daoRiga)
  279. dao.totale_lordo = _parzialeNetto.quantize(Decimal('.01'), rounding=ROUND_HALF_UP)
  280. def getPrezzoNetto(dao, parzialeNetto=None):
  281. """ calcola il prezzo netto dal prezzo lordo e dagli sconti in una riga """
  282. prezzoLordo = Decimal(str(dao.valore_unitario_lordo))
  283. prezzoNetto = prezzoLordo
  284. applicazione = dao.applicazione_sconti
  285. sconti = dao.scontiRiga
  286. if sconti:
  287. for s in sconti:
  288. if s.tipo_sconto == 'percentuale':
  289. if applicazione == 'scalare':
  290. prezzoNetto = prezzoNetto * Decimal(str(1 - float(s.valore) / 100))
  291. elif applicazione == 'non scalare':
  292. prezzoNetto = prezzoNetto - prezzoLordo * Decimal(str(float(s.valore) / 100))
  293. elif s.tipo_sconto == 'valore':
  294. prezzoNetto = prezzoNetto - Decimal(str(float(s.valore)))
  295. dao.valore_unitario_netto = prezzoNetto
  296. if parzialeNetto:
  297. parzialeNetto += prezzoNetto
  298. return dao, parzialeNetto
  299. else:
  300. return dao
  301. def fillSchedaLavorazioneFromEmail(ui):
  302. text = []
  303. try:
  304. email = file(os.path.expanduser('~') +"/Form ordine partecipazioni.eml","r")
  305. text = email.readlines()
  306. email.close()
  307. except:
  308. messageInfo(msg="ATTENZIONEEEEEEEEEEEE!!!! FILE EMAIL NON PRESENTE")
  309. for line in text:
  310. line = line.decode('iso-8859-1', 'replace').encode('utf8')
  311. lista = line.split(":")
  312. campo = lista[0].strip()
  313. #print "CAMPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",campo
  314. #valore = lista[1].strip()
  315. if campo == "Subject":
  316. if lista[1].strip() != "Form ordine partecipazioni":
  317. raise Exception,"errore email di tipo errato"
  318. if campo == "From":
  319. ui.prima_email_entry.set_text(lista[1].strip())
  320. elif campo == "Date":
  321. #Tue, 3 Mar 2009 22:03:38 +0100
  322. a = lista[1].strip().split(",")[1][0:-2].strip()
  323. a = a.replace("May", "5")
  324. a = a.replace("Apr", "4")
  325. a = a.replace("Feb", "2")
  326. a = a.replace("Mar", "3")
  327. a = a.replace("Jun", "6")
  328. a = a.replace("Jul", "7")
  329. a = a.replace("Aug", "8")
  330. a = a.replace("Sep", "9")
  331. a = a.replace("Oct", "10")
  332. a = a.replace("Dec", "12")
  333. a = a.replace("Nov", "11")
  334. a = a.replace("Jan", "1")
  335. a = a.replace(" ", "/")
  336. ui.data_presa_in_carico_entry.set_text(a)
  337. elif campo == "Nome_sposo":
  338. ui.nome_sposo_entry.set_text(lista[1].strip().upper())
  339. elif campo == "Cognome_sposo":
  340. cognome_sposo = lista[1].strip().upper()
  341. ui.cognome_sposo_entry.set_text(cognome_sposo)
  342. elif campo == "Nome_sposa":
  343. ui.nome_sposa_entry.set_text(lista[1].strip())
  344. elif campo == "Cognome_sposa":
  345. cognome_sposa = lista[1].strip().upper()
  346. ui.cognome_sposa_entry.set_text(cognome_sposa)
  347. elif campo == "messaggio alternativo a annunciano...":
  348. messaggio_alternativo = lista[1].strip().upper()
  349. elif campo == "cerimonia":
  350. cerimonia = lista[1].strip().upper()
  351. elif campo == "nome_luogo_cerimonia":
  352. nome_luogo_cerimonia = lista[1].strip().upper()
  353. elif campo == "localita_matrimonio":
  354. localita_matrimonio = lista[1].strip().upper()
  355. elif campo == "Citta_matrimonio":
  356. ui.provenienza_entry.set_text(lista[1].strip().upper())
  357. elif campo == "orderdate":
  358. print lista[1].strip()
  359. datamat=lista[1].strip()
  360. datamat=datamat.replace("-","/")
  361. #datamat=datamat[0:-2]+"20"+datamat[-2:]
  362. ui.data_matrimonio_entry.set_text(datamat)
  363. elif campo == "Ora_matrimonio":
  364. ora_matrimonio = lista[1].strip().upper()
  365. elif campo == "Citta_sposo":
  366. citta_sposo = lista[1].strip().upper()
  367. elif campo == "Via_e_num_sposo":
  368. via_e_num_sposo = lista[1].strip().upper()
  369. elif campo == "num_sposo":
  370. num_sposo = lista[1].strip().upper()
  371. elif campo == "Citta_sposa":
  372. citta_sposa = lista[1].strip().upper()
  373. elif campo == "Via_e_num_sposa":
  374. via_e_num_sposa = lista[1].strip().upper()
  375. elif campo == "Num_sposa":
  376. num_sposa = lista[1].strip()
  377. elif campo == "Indirizzo_coniugale":
  378. indirizzo_coniugale = lista[1].strip().upper()
  379. elif campo == "Luogo_ricevimento":
  380. luogo_ricevimento = lista[1].strip()
  381. elif campo == "biglietto_bomboniera":
  382. #biglietto_bomboniera = lista[1].strip().upper()
  383. #if biglietto_bomboniera:
  384. #ui.bomba_si_checkbutton.set_active(False)
  385. #else:
  386. ui.bomba_no_checkbutton.set_active(True)
  387. elif campo == "gradita_conferma":
  388. gradita_conferma = lista[1].strip().upper()
  389. elif campo == "Commenti":
  390. commenti = lista[1].strip().upper()
  391. elif campo == "carattere":
  392. carattere_stampa = lista[1].strip().upper()
  393. elif campo == "colore":
  394. colore_stampa = lista[1].strip().upper()
  395. elif campo == "sito_omaggio":
  396. sito_omaggio = lista[1].strip().upper()
  397. elif campo == "Luogo_spedizione":
  398. luogo_spedizione = lista[1].strip().upper()
  399. elif campo == "nome":
  400. ui.referente_entry.set_text(lista[1].strip().upper())
  401. elif campo == "Presso":
  402. ui.presso_entry.set_text(lista[1].strip().upper())
  403. elif campo == "Via_e_num":
  404. ui.via_piazza_entry.set_text(lista[1].strip().upper())
  405. #dao.num_civ = ""
  406. elif campo == "Citta":
  407. ui.localita_entry.set_text(lista[1].strip().upper())
  408. elif campo == "Provincia":
  409. ui.provincia_entry.set_text(lista[1].strip().upper())
  410. elif campo == "CAP":
  411. ui.zip_entry.set_text(lista[1].strip().upper())
  412. elif campo == "telefono":
  413. ui.telefono_entry.set_text(lista[1].strip().upper())
  414. elif campo == "Cellulare":
  415. ui.cellulare_entry.set_text(lista[1].strip().upper())
  416. elif campo == "codicefiscale":
  417. codicefiscale = lista[1].strip().upper()
  418. elif campo == "Note_aggiuntive":
  419. ui.note_final_entry.set_text(lista[1].strip().upper())
  420. elif campo == "pagamento":
  421. pagamento = lista[1].strip().upper()
  422. elif campo == "documento":
  423. if lista[1].strip() == "ricevuta":
  424. ui.ricevuta_checkbutton.set_active(True)
  425. #dao.fattura = False
  426. #else:
  427. #dao.fattura = True
  428. elif campo == "autorizzo_si":
  429. autorizzo_si = lista[1].strip().upper()
  430. elif campo == "privacy":
  431. privacy = lista[1].strip().upper()
  432. elif campo == "pagina":
  433. pagina = lista[1].strip().upper()
  434. elif campo == "spesa":
  435. pagina = lista[1].strip().upper()
  436. elif campo == "PRODOTTO":
  437. prodotto = lista[1].strip().upper()[3:]
  438. elif campo == "CODICE PARTECIPAZIONE":
  439. codParte = lista[1].strip().split("(")[0].strip()[1:-1].replace("Art.",'')[1:-1]
  440. quantitaParte = lista[2].strip().split("-")[0].strip()[2:-2]
  441. print "CODICE PARTECIPAZIONE", codParte, quantitaParte
  442. if not codParte:
  443. messageInfo(msg="ATTENZIONE! CODICE PARTECIPAZIONE NON PRESENTE????")
  444. elif campo == "CODICE INVITO":
  445. codInvito = lista[1].strip().split("(")[0].strip()[1:-1].replace("Art.",'')[1:-1]
  446. quantitaInvito = lista[2].strip().split("-")[0].strip()[2:-2]
  447. print "CODICE INVITO", codInvito, quantitaInvito
  448. elif campo == "CODICE BOMBONIERA":
  449. codBombo = lista[1].strip().split("(")[0].strip()[1:-1].replace("Art.",'')[1:-1]
  450. quantitaBombo = lista[2].strip().split("-")[0].strip()[2:-2]
  451. print "CODICE BOMBONIERA", codBombo, quantitaBombo
  452. elif campo == "PERCENTUALE DI SCONTO APPLICATO":
  453. percentualeSconto = lista[1].strip()[0:-1]
  454. print "PERCENTUALE DI SCONTO APPLICATO", percentualeSconto
  455. elif campo == "COSTO STAMPA APPLICATO":
  456. costoStampa = lista[1].strip()
  457. print "COSTO STAMPA APPLICATO", costoStampa
  458. elif campo == "TOTALE":
  459. totale = lista[1].strip()[1:].strip()
  460. print "TOTALE", totale
  461. ordine = {"colore_stampa":colore_stampa,
  462. "carattere_stampa":carattere_stampa,
  463. "prodotto":prodotto,
  464. "codParte":codParte,
  465. "quantitaParte":quantitaParte,
  466. "codInvito":codInvito,
  467. "quantitaInvito":quantitaInvito,
  468. "codBombo":codBombo,
  469. "quantitaBombo": quantitaBombo,
  470. "costoStampa":costoStampa,
  471. "percentualeSconto": percentualeSconto,
  472. "totale":totale
  473. }
  474. ui.nomi_sposi_entry.set_text(cognome_sposo.upper()+" - "+cognome_sposa.upper())
  475. return ordine