PageRenderTime 58ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/core/promogest/modules/ImportPriceList/ui/ProductFromCSV.py

http://promogest.googlecode.com/
Python | 507 lines | 496 code | 4 blank | 7 comment | 1 complexity | af14df7bc2e78b0d2ccb0693bbed07f0 MD5 | raw file
Possible License(s): GPL-2.0
  1. # -*- coding: utf-8 -*-
  2. # Promogest
  3. #
  4. # Copyright (C) 2007 by Promotux Informatica - http://www.promotux.it/
  5. # Author: Marco Pinna "Dr astico" <zoccolodignu@gmail.com>
  6. # Author: Francesco Meloni "Vete" <francesco@promotux.it.com>
  7. from decimal import *
  8. from promogest import Environment
  9. from promogest.dao.Articolo import Articolo
  10. from promogest.dao.AliquotaIva import AliquotaIva
  11. from promogest.dao.CodiceABarreArticolo import CodiceABarreArticolo
  12. from promogest.dao.FamigliaArticolo import FamigliaArticolo
  13. from promogest.dao.CategoriaArticolo import CategoriaArticolo
  14. from promogest.dao.Fornitura import Fornitura
  15. from promogest.dao.Listino import Listino
  16. from promogest.dao.ListinoArticolo import ListinoArticolo
  17. from promogest.dao.UnitaBase import UnitaBase
  18. from promogest.dao.ScontoVenditaDettaglio import ScontoVenditaDettaglio
  19. from promogest.dao.ScontoVenditaIngrosso import ScontoVenditaIngrosso
  20. import promogest.ui.AnagraficaListini
  21. import promogest.ui.Main
  22. from promogest.ui.Main import *
  23. from promogest.ui.utils import *
  24. import promogest.ui.Login
  25. #from ImportPriceListPreview import ImportPreview
  26. from fieldsDict import *
  27. if posso("PW"):
  28. from promogest.modules.PromoWear.dao.AnnoAbbigliamento import AnnoAbbigliamento
  29. from promogest.modules.PromoWear.dao.Modello import Modello
  30. from promogest.modules.PromoWear.dao.ArticoloTagliaColore import ArticoloTagliaColore
  31. from promogest.modules.PromoWear.dao.Taglia import Taglia
  32. from promogest.modules.PromoWear.dao.Colore import Colore
  33. from promogest.modules.PromoWear.dao.GenereAbbigliamento import GenereAbbigliamento
  34. from promogest.modules.PromoWear.dao.GruppoTaglia import GruppoTaglia
  35. from promogest.modules.PromoWear.dao.GruppoTagliaTaglia import GruppoTagliaTaglia
  36. from promogest.modules.PromoWear.dao.StagioneAbbigliamento import StagioneAbbigliamento
  37. class ProductFromCsv(object):
  38. """Takes a product from a generic price list and "translates" it in a
  39. promogest-compatible dao product, ListinoArticolo and Fornitura"""
  40. def __init__(self, listaRighe=None,
  41. PLModel=None, promoPriceList=None,
  42. idfornitore=None, dataListino=None, createData=False):
  43. self.PLModel = PLModel
  44. self.listaRighe = listaRighe
  45. self.promoPriceList = promoPriceList or None
  46. self.fornitore = idfornitore
  47. self.dataListino = dataListino
  48. self.daoArticolo = None
  49. if self.promoPriceList:
  50. liss = Listino().select(idListino=self.promoPriceList, batchSize=None)
  51. if liss:
  52. self.price_list_id = liss[0].id
  53. del self.promoPriceList
  54. self.defaults = self.PLModel._defaultAttributes
  55. if createData and posso("PW"):
  56. self.addGruppiTaglia()
  57. self.listaRighe = []
  58. def addGruppiTaglia(self):
  59. for riga in self.listaRighe:
  60. if "Gruppo Taglia" in riga and \
  61. riga["Gruppo Taglia"] and \
  62. "Taglia" in riga and\
  63. riga["Taglia"] == "":
  64. gruppo_taglia = GruppoTaglia().select(denominazione = riga["Gruppo Taglia"])
  65. if not gruppo_taglia:
  66. a = GruppoTaglia()
  67. a.denominazione = riga["Gruppo Taglia"]
  68. a.denominazione_breve = riga["Gruppo Taglia"]
  69. a.persist()
  70. elif "Gruppo Taglia" in riga and \
  71. riga["Gruppo Taglia"] and\
  72. "Taglia" in riga and\
  73. riga["Taglia"]:
  74. _taglia = Taglia().select(denominazione = riga["Taglia"])
  75. if not _taglia:
  76. t = Taglia()
  77. t.denominazione = riga["Taglia"]
  78. t.denominazione_breve = riga["Taglia"]
  79. t.persist()
  80. tid = Taglia().select(denominazione = riga["Taglia"])[0].id
  81. gtids = GruppoTaglia().select(denominazione = riga["Gruppo Taglia"])
  82. if gtids:
  83. gtid = gtids[0].id
  84. if tid and gtid:
  85. gtt = GruppoTagliaTaglia().select(idGruppoTaglia= gtid,
  86. idTaglia = tid)
  87. if not gtt:
  88. numero_taglie = GruppoTagliaTaglia().count(idGruppoTaglia= gtid)
  89. gtt = GruppoTagliaTaglia()
  90. gtt.id_gruppo_taglia = gtid
  91. gtt.id_taglia = tid
  92. gtt.ordine = (numero_taglie or 1) +1
  93. gtt.persist()
  94. if "Modello" in riga and riga["Modello"]:
  95. mo = Modello().select(denominazione = riga["Modello"])
  96. if not mo:
  97. mm = Modello()
  98. mm.denominazione = riga["Modello"]
  99. mm.denominazione_breve = riga["Modello"]
  100. mm.persist()
  101. if "Colore" in riga and riga["Colore"]:
  102. co = Colore().select(denominazione = riga["Colore"])
  103. if not co:
  104. c = Colore()
  105. c.denominazione = riga["Colore"]
  106. c.denominazione_breve = riga["Colore"]
  107. c.persist()
  108. def save(self, product):
  109. self.tipoArticolo = None
  110. self.articoloPadre = None
  111. self.daoArticolo = None
  112. """Gets the existing Dao"""
  113. self.product = product
  114. # print "dissss", self.__dict__
  115. for key in possibleFieldsDict.keys():
  116. if key not in self.product.keys():
  117. setattr(self, possibleFieldsDict[key], None)
  118. else:
  119. setattr(self, possibleFieldsDict[key], self.product[key])
  120. print "SELF CODICE ARTICO", self.codice_articolo
  121. if self.codice_articolo:
  122. try:
  123. self.daoArticolo = Articolo().select(codiceEM=self.codice_articolo)[0]
  124. print "CODICE GIŔ PRESENTE NEL DATABASE"
  125. except:
  126. print "CODICE %s NON TROVATO" %self.codice_articolo
  127. elif self.codice_barre_articolo:
  128. daoCodiceABarre = CodiceABarreArticolo().select(codiceEM=self.codice_barre_articolo)
  129. if daoCodiceABarre:
  130. self.daoArticolo = Articolo().getRecord(id=daoCodiceABarre[0].id_articolo)
  131. elif self.codice_fornitore:
  132. daoFornitura = Fornitura().select(codiceArticoloFornitoreEM=self.codice_fornitore)
  133. if len(daoFornitura) == 1:
  134. self.daoArticolo = Articolo().getRecord(id=daoFornitura[0].id_articolo)
  135. #Non ho trovato un articolo esistente ne' come codice ne' come cbarre
  136. #o cod fornitore ne istanzio uno nuovo
  137. if not self.daoArticolo:
  138. print "ISTANZIO UN NUOVO ARTICOLO"
  139. self.daoArticolo = Articolo()
  140. if posso("PW"):
  141. if self.codice_padre and self.codice_articolo:
  142. print "ARTICOLO PADRE"
  143. self.tipoArticolo = "FATHER"
  144. self.addTagliaColoreData(tipo = self.tipoArticolo, articolo = self.daoArticolo)
  145. self.articoloPadre = None
  146. elif self.codice_padre and not self.codice_articolo:
  147. print "ARTICOLO FIGLIO", self.codice_padre
  148. padre = Articolo().select(codiceEM=self.codice_padre)
  149. if not padre:
  150. print "ERROREEEEEEEEE non puň essere caricato un figlio senza il padre"
  151. else:
  152. self.articoloPadre = padre[0]
  153. self.tipoArticolo = "SON"
  154. codice = self.articoloPadre.codice + self.gruppo_taglia[0:3] + self.taglia + self.colore
  155. test = Articolo().select(codiceEM= codice)
  156. if test:
  157. self.daoArticolo = test[0]
  158. self.addTagliaColoreData(tipo = self.tipoArticolo,
  159. articoloPadre=self.articoloPadre,
  160. articolo = self.daoArticolo)
  161. elif not self.codice_padre and self.codice_articolo:
  162. print "ARTICOLO NORMALE"
  163. self.fillDaos()
  164. def addTagliaColoreData(self, tipo =None, articolo=None, articoloPadre=None):
  165. """
  166. modello, genere, colore, gruppo taglia, taglia, stagione, anno
  167. """
  168. artTC = None
  169. if articolo and articolo.id and tipo == "FATHER":
  170. artTC = ArticoloTagliaColore().select(idArticolo = articolo.id)
  171. elif articolo and articolo.id and articoloPadre and tipo =="SON":
  172. artTC = ArticoloTagliaColore().select(idArticolo = articolo.id,
  173. idArticoloPadre=articoloPadre.id)
  174. if artTC:
  175. artTC = artTC[0]
  176. else:
  177. artTC = ArticoloTagliaColore()
  178. if tipo =="SON":
  179. artTC.id_articolo_padre = articoloPadre.id
  180. #MODELLO
  181. if self.modello:
  182. mode = Modello().select(denominazione = self.modello)
  183. artTC.id_modello = mode[0].id
  184. elif not self.modello:
  185. try:
  186. artTC.id_modello = articoloPadre.id_modello
  187. except:
  188. print " questo csv non ha modello"
  189. #ANNO
  190. if self.anno:
  191. anno = AnnoAbbigliamento().select(denominazione = self.anno)
  192. artTC.id_anno = anno[0].id
  193. elif not self.anno:
  194. artTC.id_annno = articoloPadre.id_anno
  195. #GENERE
  196. if self.genere:
  197. genere = GenereAbbigliamento().select(denominazione = self.genere.capitalize())
  198. artTC.id_genere = genere[0].id
  199. elif not self.genere:
  200. artTC.id_genere = articoloPadre.id_genere
  201. #GRUPPO TAGLIA
  202. if self.gruppo_taglia:
  203. gruppo_taglia = GruppoTaglia().select(denominazione = self.gruppo_taglia)[0].id
  204. artTC.id_gruppo_taglia = gruppo_taglia
  205. elif not self.gruppo_taglia:
  206. artTC.id_gruppo_taglia = articoloPadre.id_gruppo_taglia
  207. #TAGLIA
  208. if self.taglia:
  209. taglia = Taglia().select(denominazione = self.taglia)[0].id
  210. artTC.id_taglia = taglia
  211. #COLORE
  212. if self.colore:
  213. artTC.id_colore = Colore().select(denominazione = self.colore)[0].id
  214. #STAGIONE
  215. if self.stagione:
  216. stagione = StagioneAbbigliamento().select(denominazione = self.stagione)
  217. if stagione:
  218. artTC.id_stagione = stagione[0].id
  219. elif not self.stagione:
  220. artTC.id_stagione = articoloPadre.id_stagione
  221. self.daoArticolo.articoloTagliaColore = artTC
  222. artTC = None
  223. def fillDaos(self):
  224. """fillDaos method fills all Dao related to daoArticolo
  225. """
  226. if posso("PW") and self.tipoArticolo == "SON":
  227. self.daoArticolo.codice = self.articoloPadre.codice + self.gruppo_taglia[0:3] + self.taglia + self.colore
  228. self.daoArticolo.denominazione = self.articoloPadre.denominazione + ' ' + self.taglia + ' ' + self.colore
  229. self.codice_articolo = self.articoloPadre
  230. else:
  231. if self.codice_articolo is None or self.codice_articolo == "None":
  232. self.codice_articolo = promogest.dao.Articolo.getNuovoCodiceArticolo()
  233. self.daoArticolo.codice = str(self.codice_articolo)
  234. if self.denominazione_articolo:
  235. self.daoArticolo.denominazione = str(self.denominazione_articolo)
  236. else:
  237. if not self.daoArticolo.denominazione:
  238. messageInfo(msg= "ATTENZIONE DESCRIZIONE MANCANTE\nIN INSERIMENTO NUOVO ARTICOLO %s" %str(self.codice_barre_articolo))
  239. # raise NameError("ERRORE DESCRIZIONE MANCANTE")
  240. return
  241. # print "STO PER SALVARE ", self.daoArticolo.denominazione
  242. #families
  243. id_famiglia = None
  244. if self.famiglia_articolo is None:
  245. self.famiglia_articolo_id = int(self.defaults['Famiglia'])
  246. self.famiglia_articolo = FamigliaArticolo().getRecord(id=self.famiglia_articolo_id)
  247. id_famiglia = self.famiglia_articolo.id
  248. else:
  249. self._families = FamigliaArticolo().select(batchSize=None)
  250. code_list = []
  251. for f in self._families:
  252. code_list.append(f.codice)
  253. if self.famiglia_articolo in (f.denominazione_breve,
  254. f.denominazione, f.codice, f.id):
  255. id_famiglia = f.id
  256. break
  257. if id_famiglia is None:
  258. family_code = self.famiglia_articolo[:4]
  259. if len(self._families) > 0:
  260. ind = 0
  261. for code in code_list:
  262. if family_code == code[:4]:
  263. ind +=1
  264. family_code = family_code+'/'+str(ind)
  265. daoFamiglia = FamigliaArticolo()
  266. daoFamiglia.codice = family_code
  267. daoFamiglia.denominazione_breve = self.famiglia_articolo[:10]
  268. daoFamiglia.denominazione = self.famiglia_articolo
  269. daoFamiglia.id_padre = None
  270. daoFamiglia.persist()
  271. id_famiglia = daoFamiglia.id
  272. self._families.append(daoFamiglia)
  273. self.daoArticolo.id_famiglia_articolo = id_famiglia
  274. #categories
  275. id_categoria = None
  276. if self.categoria_articolo is None:
  277. self.categoria_articolo_id = self.defaults['Categoria']
  278. self.categoria_articolo = CategoriaArticolo().getRecord(id=self.categoria_articolo_id)
  279. id_categoria = self.categoria_articolo.id
  280. else:
  281. self._categories = CategoriaArticolo().select(batchSize=None)
  282. category_list = []
  283. for c in self._categories:
  284. category_list.append(c.denominazione_breve)
  285. if self.categoria_articolo in (c.denominazione, c.denominazione_breve):
  286. id_categoria = c.id
  287. break
  288. if id_categoria == None:
  289. category_short_name = self.categoria_articolo[:7]
  290. if len(self._categories) > 0:
  291. ind = 0
  292. for category in category_list:
  293. if category_short_name == category[:7]:
  294. ind +=1
  295. category_short_name = category_short_name+'/'+str(ind)
  296. daoCategoria = CategoriaArticolo()
  297. daoCategoria.denominazione_breve = category_short_name
  298. daoCategoria.denominazione = self.categoria_articolo
  299. daoCategoria.persist()
  300. id_categoria = daoCategoria.id
  301. self._categories.append(daoCategoria)
  302. self.daoArticolo.id_categoria_articolo = id_categoria
  303. #IVA
  304. id_aliquota_iva = None
  305. if self.aliquota_iva is None:
  306. self.aliquota_iva_id = self.defaults['Aliquota iva']
  307. self.aliquota_iva = AliquotaIva().getRecord(id=self.aliquota_iva_id)
  308. id_aliquota_iva = self.aliquota_iva.id
  309. else:
  310. self._vats = AliquotaIva().select(batchSize=None)
  311. for v in self._vats:
  312. if self.aliquota_iva.lower() in (v.denominazione_breve.lower(),
  313. v.denominazione.lower()) or\
  314. int(str(self.aliquota_iva).replace('%', '') or 20) == int(v.percentuale):
  315. id_aliquota_iva = v.id
  316. break
  317. if id_aliquota_iva is None:
  318. self.aliquota_iva = str(self.aliquota_iva).replace('%', '')
  319. daoAliquotaIva = AliquotaIva()
  320. daoAliquotaIva.denominazione = 'ALIQUOTA '+ self.aliquota_iva +'%'
  321. daoAliquotaIva.denominazione_breve = self.aliquota_iva + '%'
  322. daoAliquotaIva.id_tipo = 1
  323. daoAliquotaIva.percentuale = Decimal(self.aliquota_iva)
  324. daoAliquotaIva.persist()
  325. id_aliquota_iva = daoAliquotaIva.id
  326. self._vats.append(daoAliquotaIva)
  327. self.daoArticolo.id_aliquota_iva = id_aliquota_iva
  328. #UNITA BASE
  329. id_unita_base = None
  330. if self.unita_base is None:
  331. self.unita_base_id = self.defaults['Unita base']
  332. #FIXME: promogest2 ----proviamo
  333. # La storedProcedure UnitaBaseGet NON esiste e la chiamta Dao
  334. #qui sotto fallisce con un errore!!!
  335. self.unita_base = UnitaBase().getRecord(id=self.unita_base_id)
  336. id_unita_base = self.unita_base_id
  337. else:
  338. unis = UnitaBase().select(batchSize=None)
  339. for u in unis:
  340. if self.unita_base.lower() in (u.denominazione.lower(),
  341. u.denominazione_breve.lower()):
  342. id_unita_base = u.id
  343. break
  344. if id_unita_base is None:
  345. self.unita_base = UnitaBase().select(denominazione='Pezzi',
  346. batchSize=None)[0]
  347. id_unita_base = self.unita_base.id
  348. self.daoArticolo.id_unita_base = id_unita_base
  349. self.daoArticolo.produttore = self.produttore or ''
  350. self.daoArticolo.cancellato = False
  351. self.daoArticolo.sospeso = False
  352. # print "PTIMA DEL PERSIT", self.daoArticolo.__dict__
  353. self.daoArticolo.persist()
  354. product_id = self.daoArticolo.id
  355. #barcode
  356. if self.codice_barre_articolo is not None:
  357. self.codice_barre_articolo = str(self.codice_barre_articolo).strip()
  358. try:
  359. oldCodeBar= CodiceABarreArticolo().select(idArticolo=product_id)
  360. if oldCodeBar:
  361. for codes in oldCodeBar:
  362. codes.primario = False
  363. codes.persist()
  364. except:
  365. pass
  366. barCode = CodiceABarreArticolo().\
  367. select(codiceEM=self.codice_barre_articolo,
  368. batchSize=None)
  369. if len(barCode) > 0:
  370. daoBarCode = CodiceABarreArticolo().getRecord(id=barCode[0].id)
  371. daoBarCode.id_articolo = product_id
  372. daoBarCode.primario = True
  373. daoBarCode.persist()
  374. else:
  375. daoBarCode = CodiceABarreArticolo()
  376. daoBarCode.id_articolo = product_id
  377. daoBarCode.codice = self.codice_barre_articolo
  378. daoBarCode.primario = True
  379. daoBarCode.persist()
  380. #price-list--> product
  381. decimalSymbol = self.PLModel._decimalSymbol
  382. if (self.prezzo_vendita_non_ivato is not None or \
  383. self.prezzo_acquisto_non_ivato is not None or \
  384. self.prezzo_acquisto_ivato is not None or \
  385. self.prezzo_vendita_ivato is not None):
  386. try:
  387. daoPriceListProduct = ListinoArticolo().\
  388. select(idListino=self.price_list_id,
  389. idArticolo=product_id,
  390. batchSize=None)[0]
  391. except:
  392. daoPriceListProduct = ListinoArticolo()
  393. daoPriceListProduct.id_articolo = product_id
  394. daoPriceListProduct.id_listino = self.price_list_id
  395. daoPriceListProduct.data_listino_articolo = self.dataListino
  396. daoPriceListProduct.listino_attuale = True
  397. if self.prezzo_vendita_ivato is not None:
  398. prezzo = self.sanitizer(self.prezzo_vendita_ivato)
  399. daoPriceListProduct.prezzo_dettaglio = mN(prezzo)
  400. else:
  401. daoPriceListProduct.prezzo_dettaglio = 0
  402. if self.prezzo_vendita_non_ivato is not None:
  403. prezzo = self.sanitizer(self.prezzo_vendita_non_ivato)
  404. daoPriceListProduct.prezzo_ingrosso = mN(prezzo)
  405. else:
  406. daoPriceListProduct.prezzo_ingrosso = 0
  407. sconti_ingrosso = [ScontoVenditaIngrosso(), ]
  408. sconti_dettaglio = [ScontoVenditaDettaglio(), ]
  409. if self.sconto_vendita_ingrosso is not None \
  410. and str(self.sconto_vendita_ingrosso).strip() != "0" \
  411. and str(self.sconto_vendita_ingrosso).strip() !="":
  412. self.sconto_vendita_ingrosso = self.sanitizer(self.sconto_vendita_ingrosso)
  413. sconti_ingrosso[0].valore = mN(self.sconto_vendita_ingrosso)
  414. sconti_ingrosso[0].tipo_sconto = 'percentuale'
  415. daoPriceListProduct.sconto_vendita_ingrosso = sconti_ingrosso
  416. if self.sconto_vendita_dettaglio and \
  417. str(self.sconto_vendita_dettaglio).strip() != "0" and \
  418. str(self.sconto_vendita_dettaglio).strip() !="":
  419. self.sconto_vendita_dettaglio = self.sanitizer(self.sconto_vendita_dettaglio)
  420. sconti_dettaglio[0].valore = mN(self.sconto_vendita_dettaglio)
  421. sconti_dettaglio[0].tipo_sconto = 'percentuale'
  422. daoPriceListProduct.sconto_vendita_dettaglio = sconti_dettaglio
  423. if self.prezzo_acquisto_non_ivato is not None and \
  424. str(self.prezzo_acquisto_non_ivato).strip() != "0" and \
  425. str(self.prezzo_acquisto_non_ivato).strip() !="":
  426. prezzo = self.sanitizer(self.prezzo_acquisto_non_ivato)
  427. daoPriceListProduct.ultimo_costo = mN(prezzo)
  428. elif self.prezzo_acquisto_ivato is not None and \
  429. str(self.prezzo_acquisto_ivato).strip() != "0" and \
  430. str(self.prezzo_acquisto_ivato).strip() !="":
  431. prezzo = self.sanitizer(self.prezzo_acquisto_ivato)
  432. self.aliquota_iva.percentuale = self.sanitizer(self.aliquota_iva.percentuale)
  433. daoPriceListProduct.ultimo_costo = mN(calcolaPrezzoIva(mN(prezzo), -1 * (mN(self.aliquota_iva.percentuale))))
  434. else:
  435. daoPriceListProduct.ultimo_costo = 0
  436. # print " QUSTNO NON VA BEEN ", daoPriceListProduct.__dict__
  437. daoPriceListProduct.persist()
  438. # Fornitura
  439. daoFornitura = Fornitura().select(idFornitore=self.fornitore,
  440. idArticolo=self.daoArticolo.id,
  441. daDataPrezzo=self.dataListino,
  442. aDataPrezzo=self.dataListino,
  443. batchSize=None)
  444. if len(daoFornitura) == 0:
  445. daoFornitura = Fornitura()
  446. daoFornitura.prezzo_netto = prezzo or 0
  447. daoFornitura.prezzo_lordo = prezzo or 0
  448. daoFornitura.id_fornitore = self.fornitore
  449. daoFornitura.id_articolo = self.daoArticolo.id
  450. try:
  451. daoFornitura.percentuale_iva = Decimal(str(self.aliquota_iva.percentuale))
  452. except:
  453. daoFornitura.percentuale_iva = Decimal(str(self.aliquota_iva))
  454. daoFornitura.data_prezzo = self.dataListino
  455. daoFornitura.codice_articolo_fornitore = self.codice_fornitore
  456. daoFornitura.fornitore_preferenziale = True
  457. daoFornitura.persist()
  458. self.product = None
  459. def checkDecimalSymbol(self, number, symbol):
  460. """ adjust non decimal simbols """
  461. if number is None:
  462. return str(0)
  463. if symbol == '.':
  464. number = str(number).replace(',', '')
  465. elif symbol == ',':
  466. number = str(number).replace('.', '')
  467. number = str(number).replace(',', '.')
  468. return number
  469. def sanitizer(self, value):
  470. if value:
  471. value = value.strip()
  472. value = value.replace("€", "")
  473. value = value.replace("%", "")
  474. value = value.replace(",", ".")
  475. return value