LeenO computo metrico con LibreOffice  3.22.0
Il software libero per la gestione di computi metrici e contabilità lavori.
LeenoImport_XPWE.py
Vai alla documentazione di questo file.
1 u"""
2 Importazione computo/variante/contabilità/prezzario
3 dal formato XPWE
4 """
5 import logging
6 
7 from xml.etree.ElementTree import ElementTree, ParseError
8 from com.sun.star.table import CellRangeAddress
9 
10 import LeenoUtils
11 import LeenoFormat
12 
13 import pyleeno as PL
14 import LeenoDialogs as DLG
15 
16 import SheetUtils
17 import LeenoConfig
18 import LeenoSheetUtils
19 import LeenoAnalysis
20 import LeenoComputo
21 import LeenoVariante
22 import LeenoContab
23 
24 
25 import Dialogs
26 
27 
29  ''' legge i dati anagrafici generali '''
30 
31  datiAnagrafici = {}
32  try:
33  DatiGenerali = dati.getchildren()[0][0]
34 
35  datiAnagrafici['comune'] = DatiGenerali[1].text or ''
36  datiAnagrafici['oggetto'] = DatiGenerali[3].text or ''
37  datiAnagrafici['committente'] = DatiGenerali[4].text or ''
38  datiAnagrafici['impresa'] = DatiGenerali[5].text or ''
39  '''
40  datiAnagrafici['percprezzi'] = DatiGenerali[0].text or ''
41  datiAnagrafici['provincia'] = DatiGenerali[2].text or ''
42  datiAnagrafici['parteopera'] = DatiGenerali[6].text or ''
43  '''
44  except:
45  datiAnagrafici['comune'] = ''
46  datiAnagrafici['oggetto'] = ''
47  datiAnagrafici['committente'] = ''
48  datiAnagrafici['impresa'] = ''
49 
50  return datiAnagrafici
51 
52 
53 def leggiSuperCapitoli(CapCat):
54  ''' legge SuperCapitoli '''
55 
56  # PweDGSuperCapitoli
57  listaSuperCapitoli = []
58  if CapCat.find('PweDGSuperCapitoli'):
59  PweDGSuperCapitoli = CapCat.find('PweDGSuperCapitoli').getchildren()
60  for elem in PweDGSuperCapitoli:
61  id_sc = elem.get('ID')
62  #~ codice = elem.find('Codice').text
63  try:
64  codice = elem.find('Codice').text
65  except AttributeError:
66  codice = ''
67  dessintetica = elem.find('DesSintetica').text
68  try:
69  percentuale = elem.find('Percentuale').text
70  except:
71  percentuale = ''
72  diz = {}
73  diz['id_sc'] = id_sc
74  diz['codice'] = codice
75  diz['dessintetica'] = dessintetica
76  diz['percentuale'] = percentuale
77  listaSuperCapitoli.append(diz)
78  return listaSuperCapitoli
79 
80 
81 def leggiCapitoli(CapCat):
82  ''' legge Capitoli '''
83 
84  # PweDGCapitoli
85  listaCapitoli = []
86  if CapCat.find('PweDGCapitoli'):
87  PweDGCapitoli = CapCat.find('PweDGCapitoli').getchildren()
88  for elem in PweDGCapitoli:
89  id_sc = elem.get('ID')
90  #~ codice = elem.find('Codice').text
91  try:
92  codice = elem.find('Codice').text
93  except AttributeError:
94  codice = ''
95  dessintetica = elem.find('DesSintetica').text
96  try:
97  percentuale = elem.find('Percentuale').text
98  except:
99  percentuale = ''
100  diz = {}
101  diz['id_sc'] = id_sc
102  diz['codice'] = codice
103  diz['dessintetica'] = dessintetica
104  diz['percentuale'] = percentuale
105  listaCapitoli.append(diz)
106  return listaCapitoli
107 
108 
109 def leggiSottoCapitoli(CapCat):
110  ''' legge SottoCapitoli '''
111 
112  # PweDGSubCapitoli
113  listaSottoCapitoli = []
114  if CapCat.find('PweDGSubCapitoli'):
115  PweDGSubCapitoli = CapCat.find('PweDGSubCapitoli').getchildren()
116  for elem in PweDGSubCapitoli:
117  id_sc = elem.get('ID')
118  try:
119  codice = elem.find('Codice').text
120  except AttributeError:
121  codice = ''
122  try:
123  codice = elem.find('Codice').text
124  except AttributeError:
125  codice = ''
126  dessintetica = elem.find('DesSintetica').text
127  try:
128  percentuale = elem.find('Percentuale').text
129  except:
130  percentuale = ''
131  diz = {}
132  diz['id_sc'] = id_sc
133  diz['codice'] = codice
134  diz['dessintetica'] = dessintetica
135  diz['percentuale'] = percentuale
136  listaSottoCapitoli.append(diz)
137  return listaSottoCapitoli
138 
139 
141  ''' legge SuperCategorie '''
142 
143  # PweDGSuperCategorie
144  listaSuperCategorie = []
145  if CapCat.find('PweDGSuperCategorie'):
146  PweDGSuperCategorie = CapCat.find(
147  'PweDGSuperCategorie').getchildren()
148  for elem in PweDGSuperCategorie:
149  id_sc = elem.get('ID')
150  dessintetica = elem.find('DesSintetica').text
151  try:
152  percentuale = elem.find('Percentuale').text
153  except AttributeError:
154  percentuale = '0'
155  supcat = (id_sc, dessintetica, percentuale)
156  listaSuperCategorie.append(supcat)
157  return listaSuperCategorie
158 
159 
160 def leggiCategorie(CapCat):
161  ''' legge Categorie '''
162 
163  # PweDGCategorie
164  listaCategorie = []
165  if CapCat.find('PweDGCategorie'):
166  PweDGCategorie = CapCat.find('PweDGCategorie').getchildren()
167  for elem in PweDGCategorie:
168  id_sc = elem.get('ID')
169  dessintetica = elem.find('DesSintetica').text
170  try:
171  percentuale = elem.find('Percentuale').text
172  except AttributeError:
173  percentuale = '0'
174  cat = (id_sc, dessintetica, percentuale)
175  listaCategorie.append(cat)
176  return listaCategorie
177 
178 
180  ''' legge SottoCategorie '''
181 
182  # PweDGSubCategorie
183  listaSottoCategorie = []
184  if CapCat.find('PweDGSubCategorie'):
185  PweDGSubCategorie = CapCat.find('PweDGSubCategorie').getchildren()
186  for elem in PweDGSubCategorie:
187  id_sc = elem.get('ID')
188  dessintetica = elem.find('DesSintetica').text
189  try:
190  percentuale = elem.find('Percentuale').text
191  except AttributeError:
192  percentuale = '0'
193  subcat = (id_sc, dessintetica, percentuale)
194  listaSottoCategorie.append(subcat)
195  return listaSottoCategorie
196 
197 
199  ''' legge capitoli e categorie '''
200 
201  res = {
202  'SuperCapitoli': [],
203  'Capitoli': [],
204  'SottoCapitoli': [],
205  'SuperCategorie': [],
206  'Categorie': [],
207  'SottoCategorie': []
208  }
209 
210  # PweDGCapitoliCategorie
211  try:
212  CapCat = dati.find('PweDGCapitoliCategorie')
213  except AttributeError:
214  return res
215 
216  # legge SuperCapitoli
217  res['SuperCapitoli'] = leggiSuperCapitoli(CapCat)
218  # legge Capitoli
219  res['Capitoli'] = leggiCapitoli(CapCat)
220  # legge SottoCapitoli
221  res['SottoCapitoli'] = leggiSottoCapitoli(CapCat)
222  # legge SuperCategorie
223  res['SuperCategorie'] = leggiSuperCategorie(CapCat)
224  # legge Categorie
225  res['Categorie'] = leggiCategorie(CapCat)
226  # legge SottoCategorie
227  res['SottoCategorie'] = leggiSottoCategorie(CapCat)
228 
229  return res
230 
231 
233  ''' legge i dati generali di analisi '''
234 
235  try:
236  PweDGAnalisi = dati.find('PweDGModuli').getchildren()[0]
237 
238  try:
239  speseGenerali = float(PweDGAnalisi.find('SpeseGenerali').text) / 100
240  except ValueError:
241  speseGenerali = 0
242 
243  try:
244  utiliImpresa = float(PweDGAnalisi.find('UtiliImpresa').text) / 100
245  except ValueError:
246  utiliImpresa = 0
247 
248  try:
249  oneriAccessoriSicurezza = float(PweDGAnalisi.find('OneriAccessoriSc').text) / 100
250  except ValueError:
251  oneriAccessoriSicurezza = 0
252  '''
253  speseutili = PweDGAnalisi.find('SpeseUtili').text
254  confquantita = PweDGAnalisi.find('ConfQuantita').text
255  '''
256  # ~except AttributeError:
257  except:
258  speseGenerali = 0
259  utiliImpresa = 0
260  oneriAccessoriSicurezza = 0
261 
262  return {
263  'SpeseGenerali': speseGenerali,
264  'UtiliImpresa': utiliImpresa,
265  'OneriAccessoriSicurezza': oneriAccessoriSicurezza
266  }
267 
268 
270  ''' legge le impostazioni di approssimazione numerica '''
271 
272  try:
273  PweDGConfigNumeri = dati.find('PweDGConfigurazione')
274  except AttributeError:
275  PweDGConfigNumeri = None
276 
277  if PweDGConfigNumeri is None:
278  return {}
279  PweDGConfigNumeri = PweDGConfigNumeri.getchildren()[0]
280  res = {}
281 
282  partiUguali = PweDGConfigNumeri.find('PartiUguali')
283  try:
284  res['PartiUguali'] = int(partiUguali.text.split('.')[-1].split('|')[0])
285  except:
286  pass
287 
288  larghezza = PweDGConfigNumeri.find('Larghezza')
289  try:
290  res['Larghezza'] = int(larghezza.text.split('.')[-1].split('|')[0])
291  except:
292  pass
293 
294  lunghezza = PweDGConfigNumeri.find('Lunghezza')
295  try:
296  res['Lunghezza'] = int(lunghezza.text.split('.')[-1].split('|')[0])
297  except:
298  pass
299 
300  hPeso = PweDGConfigNumeri.find('HPeso')
301  try:
302  res['HPeso'] = int(hPeso.text.split('.')[-1].split('|')[0])
303  except:
304  pass
305 
306  quantita = PweDGConfigNumeri.find('Quantita')
307  try:
308  res['Quantita'] = int(quantita.text.split('.')[-1].split('|')[0])
309  except:
310  pass
311 
312  prezzi = PweDGConfigNumeri.find('Prezzi')
313  try:
314  res['Prezzi'] = int(prezzi.text.split('.')[-1].split('|')[0])
315  except:
316  pass
317 
318  prezziTotale = PweDGConfigNumeri.find('PrezziTotale')
319  try:
320  res['PrezziTotale'] = int(prezziTotale.text.split('.')[-1].split('|')[0])
321  except:
322  pass
323  '''
324  Divisa = PweDGConfigNumeri.find('Divisa').text
325  ConversioniIN = PweDGConfigNumeri.find('ConversioniIN').text
326  FattoreConversione = PweDGConfigNumeri.find('FattoreConversione').text
327  Cambio = PweDGConfigNumeri.find('Cambio').text
328  ConvPrezzi = PweDGConfigNumeri.find('ConvPrezzi').text.split('.')[-1].split('|')[0]
329  ConvPrezziTotale = PweDGConfigNumeri.find('ConvPrezziTotale').text.split('.')[-1].split('|')[0]
330  IncidenzaPercentuale = PweDGConfigNumeri.find('IncidenzaPercentuale').text.split('.')[-1].split('|')[0]
331  Aliquote = PweDGConfigNumeri.find('Aliquote').text.split('.')[-1].split('|')[0]
332  '''
333  return res
334 
335 
336 def compilaAnagraficaGenerale(oDoc, datiAnagrafici):
337  ''' compilo Anagrafica generale '''
338 
339  oSheet = oDoc.getSheets().getByName('S2')
340  oSheet.getCellByPosition(2, 2).String = datiAnagrafici['oggetto']
341  oSheet.getCellByPosition(2, 3).String = datiAnagrafici['comune']
342  oSheet.getCellByPosition(2, 5).String = datiAnagrafici['committente']
343  oSheet.getCellByPosition(3, 16).String = datiAnagrafici['impresa']
344 
345 
346 def compilaDatiGeneraliAnalisi(oDoc, datiGeneraliAnalisi):
347  ''' compila i dati generali dell'analisi, ovvero le percentuali relative '''
348 
349  oSheet = oDoc.getSheets().getByName('S1')
350 
351  oSheet.getCellByPosition(7, 318).Value = datiGeneraliAnalisi['OneriAccessoriSicurezza']
352  oSheet.getCellByPosition(7, 319).Value = datiGeneraliAnalisi['SpeseGenerali']
353  oSheet.getCellByPosition(7, 320).Value = datiGeneraliAnalisi['UtiliImpresa']
354 
355 
356 def compilaApprossimazioni(oDoc, approssimazioni):
357  ''' compila le approssimazioni modificando la precisione nelle relative celle '''
358 
359  if 'PartiUguali' in approssimazioni:
360  LeenoFormat.setCellStyleDecimalPlaces('comp 1-a PU', approssimazioni['PartiUguali'])
361  if 'Lunghezza' in approssimazioni:
362  LeenoFormat.setCellStyleDecimalPlaces('comp 1-a LUNG', approssimazioni['Lunghezza'])
363  if 'Larghezza' in approssimazioni:
364  LeenoFormat.setCellStyleDecimalPlaces('comp 1-a LARG', approssimazioni['Larghezza'])
365  if 'HPeso' in approssimazioni:
366  LeenoFormat.setCellStyleDecimalPlaces('comp 1-a peso', approssimazioni['HPeso'])
367  if 'Quantita' in approssimazioni:
368  for el in ('Comp-Variante num sotto', 'An-lavoraz-input', 'Blu'):
369  LeenoFormat.setCellStyleDecimalPlaces(el, approssimazioni['Quantita'])
370  if 'Prezzi' in approssimazioni:
371  for el in ('comp sotto Unitario', 'An-lavoraz-generica'):
372  LeenoFormat.setCellStyleDecimalPlaces(el, approssimazioni['Prezzi'])
373  if 'PrezziTotale' in approssimazioni:
374  for el in ('comp sotto Euro Originale', 'Livello-0-scritta mini val',
375  'Livello-1-scritta mini val', 'livello2 scritta mini',
376  'Comp TOTALI', 'Ultimus_totali_1', 'Ultimus_bordo',
377  'ULTIMUS_3', 'Ultimus_Bordo_sotto',
378  'Comp-Variante num sotto', 'An-valuta-dx', 'An-1v-dx',
379  'An-lavoraz-generica', 'An-lavoraz-Utili-num sin'):
380  LeenoFormat.setCellStyleDecimalPlaces(el, approssimazioni['PrezziTotale'])
381 
382 
383 def leggiElencoPrezzi(misurazioni):
384  ''' legge l'elenco prezzi e le eventuali voci di analisi prezzi '''
385 
386  dizionarioArticoli = {}
387  listaArticoli = []
388  listaAnalisi = []
389  listaTariffeAnalisi = []
390 
391  PweElencoPrezzi = misurazioni.getchildren()[0]
392 
393  # leggo l'elenco prezzi
394  epitems = PweElencoPrezzi.findall('EPItem')
395 
396  for elem in epitems:
397  id_ep = elem.get('ID')
398  dizionarioArticolo = {}
399  try:
400  tipoep = elem.find('TipoEP').text
401  except:
402  tipoep = '0'
403  tariffa = elem.find('Tariffa').text or ''
404  articolo = elem.find('Articolo').text
405  desridotta = elem.find('DesRidotta').text
406  destestesa = elem.find('DesEstesa').text # .strip()
407  try:
408  desridotta = elem.find('DesBreve').text
409  except AttributeError:
410  pass
411  try:
412  desbreve = elem.find('DesBreve').text
413  except AttributeError:
414  desbreve = ''
415 
416  unmisura = elem.find('UnMisura').text or ''
417  if elem.find('Prezzo1').text == '0' or elem.find('Prezzo1').text is None:
418  prezzo1 = ''
419  else:
420  prezzo1 = float(elem.find('Prezzo1').text)
421  try:
422  prezzo2 = elem.find('Prezzo2').text
423  except:
424  prezzo2 = '0'
425  try:
426  prezzo3 = elem.find('Prezzo3').text
427  except:
428  prezzo3 = '0'
429  try:
430  prezzo4 = elem.find('Prezzo4').text
431  except:
432  prezzo4 = '0'
433  try:
434  prezzo5 = elem.find('Prezzo5').text
435  except:
436  prezzo5 = '0'
437  try:
438  idspcap = elem.find('IDSpCap').text
439  except AttributeError:
440  idspcap = ''
441  try:
442  idcap = elem.find('IDCap').text
443  except AttributeError:
444  idcap = ''
445  '''
446  try:
447  idsbcap = elem.find('IDSbCap').text
448  except AttributeError:
449  idsbcap = ''
450  '''
451  try:
452  flags = elem.find('Flags').text
453  except AttributeError:
454  flags = ''
455  try:
456  data = elem.find('Data').text
457  except AttributeError:
458  data = ''
459  IncSIC = ''
460  IncMDO = ''
461  IncMAT = ''
462  IncATTR = ''
463  try:
464  if float(elem.find('IncSIC').text) != 0:
465  IncSIC = float(elem.find('IncSIC').text) / 100
466  except Exception: # AttributeError TypeError:
467  pass
468  try:
469  if float(elem.find('IncMDO').text) != 0:
470  IncMDO = float(elem.find('IncMDO').text) / 100
471  except Exception: # AttributeError TypeError:
472  pass
473  try:
474  if float(elem.find('IncMAT').text) != 0:
475  IncMAT = float(elem.find('IncMAT').text) / 100
476  except Exception: # AttributeError TypeError:
477  pass
478  try:
479  if float(elem.find('IncATTR').text) != 0:
480  IncATTR = float(elem.find('IncATTR').text) / 100
481  except Exception: # AttributeError TypeError:
482  pass
483  try:
484  adrinternet = elem.find('AdrInternet').text
485  except AttributeError:
486  adrinternet = ''
487  try:
488  pweepanalisi = elem.find('PweEPAnalisi').text
489  except:
490  pweepanalisi = ''
491 
492  dizionarioArticolo['tipoep'] = tipoep
493  dizionarioArticolo['tariffa'] = tariffa
494  dizionarioArticolo['articolo'] = articolo
495  dizionarioArticolo['desridotta'] = desridotta
496  dizionarioArticolo['destestesa'] = destestesa
497  dizionarioArticolo['desridotta'] = desridotta
498  dizionarioArticolo['desbreve'] = desbreve
499  dizionarioArticolo['unmisura'] = unmisura
500  dizionarioArticolo['prezzo1'] = prezzo1
501  dizionarioArticolo['prezzo2'] = prezzo2
502  dizionarioArticolo['prezzo3'] = prezzo3
503  dizionarioArticolo['prezzo4'] = prezzo4
504  dizionarioArticolo['prezzo5'] = prezzo5
505  dizionarioArticolo['idspcap'] = idspcap
506  dizionarioArticolo['idcap'] = idcap
507  dizionarioArticolo['flags'] = flags
508  dizionarioArticolo['data'] = data
509  dizionarioArticolo['adrinternet'] = adrinternet
510 
511  dizionarioArticolo['IncSIC'] = IncSIC
512  dizionarioArticolo['IncMDO'] = IncMDO
513  dizionarioArticolo['IncMAT'] = IncMDO
514  dizionarioArticolo['IncATTR'] = IncMDO
515  '''
516  dizionarioArticolo['pweepanalisi'] = pweepanalisi
517  '''
518  # il dizionario articolo lo tengo completo di voci
519  # con analisi di prezzi; la lista articoli, per contro,
520  # visto che è usata SOLO per riempire il foglio EP,
521  # viene direttamente purgata dalle voci con analisi
522  dizionarioArticoli[id_ep] = dizionarioArticolo
523 
524  # leggo analisi di prezzo
525 
526  pweepanalisi = elem.find('PweEPAnalisi')
527  try:
528  PweEPAR = pweepanalisi.find('PweEPAR')
529  except:
530  PweEPAR = None
531  if PweEPAR is not None:
532  EPARItem = PweEPAR.findall('EPARItem')
533  analisi = []
534  for el in EPARItem:
535  '''
536  id_an = el.get('ID')
537  an_tipo = el.find('Tipo').text
538  '''
539  id_ep = el.find('IDEP').text
540  an_des = el.find('Descrizione').text
541  an_um = el.find('Misura').text
542  if an_um is None:
543  an_um = ''
544  try:
545  an_qt = el.find('Qt').text.replace(' ', '')
546  except Exception:
547  an_qt = ''
548  try:
549  an_pr = el.find('Prezzo').text.replace(' ', '')
550  except Exception:
551  an_pr = ''
552  '''
553  an_fld = el.find('FieldCTL').text
554  '''
555  an_rigo = (id_ep, an_des, an_um, an_qt, an_pr)
556  analisi.append(an_rigo)
557  listaAnalisi.append([tariffa, destestesa, unmisura, analisi, prezzo1])
558  listaTariffeAnalisi.append(tariffa)
559  else:
560  # analisi non presente, includo il prezzo nell'elenco
561  articolo_modificato = (
562  tariffa,
563  destestesa,
564  unmisura,
565  IncSIC,
566  prezzo1,
567  IncMDO,
568  IncMAT,
569  IncATTR)
570  listaArticoli.append(articolo_modificato)
571  return {
572  'DizionarioArticoli': dizionarioArticoli,
573  'ListaArticoli': listaArticoli,
574  'ListaAnalisi': listaAnalisi,
575  'ListaTariffeAnalisi': listaTariffeAnalisi
576  }
577 
578 
579 def leggiMisurazioni(misurazioni, ordina):
580  ''' leggo voci di misurazione e righe '''
581 
582  listaMisure = []
583  try:
584  PweVociComputo = misurazioni.getchildren()[1]
585  vcitems = PweVociComputo.findall('VCItem')
586  prova_l = []
587  for elem in vcitems:
588  diz_misura = {}
589  id_vc = elem.get('ID')
590  id_ep = elem.find('IDEP').text
591  quantita = elem.find('Quantita').text
592  try:
593  datamis = elem.find('DataMis').text
594  except AttributeError:
595  datamis = ''
596  try:
597  flags = elem.find('Flags').text
598  except AttributeError:
599  flags = ''
600  try:
601  idspcat = elem.find('IDSpCat').text
602  except AttributeError:
603  idspcat = ''
604  try:
605  idcat = elem.find('IDCat').text
606  except AttributeError:
607  idcat = ''
608  try:
609  idsbcat = elem.find('IDSbCat').text
610  except AttributeError:
611  idsbcat = ''
612  '''
613  try:
614  CodiceWBS = elem.find('CodiceWBS').text
615  except AttributeError:
616  CodiceWBS = ''
617  '''
618  righi_mis = elem.getchildren()[-1].findall('RGItem')
619  riga_misura = []
620  lista_righe = []
621  new_id_l = []
622 
623  for el in righi_mis:
624  '''
625  rgitem = el.get('ID')
626  '''
627  idvv = el.find('IDVV').text
628  if el.find('Descrizione').text is not None:
629  descrizione = el.find('Descrizione').text
630  else:
631  descrizione = ''
632  partiuguali = el.find('PartiUguali').text
633  if partiuguali != None:
634  if ' ' in partiuguali:
635  partiuguali = None
636  lunghezza = el.find('Lunghezza').text
637  if lunghezza != None:
638  if ' ' in lunghezza:
639  lunghezza = None
640  larghezza = el.find('Larghezza').text
641  if larghezza != None:
642  if ' ' in larghezza:
643  larghezza = None
644  hpeso = el.find('HPeso').text
645  if hpeso != None:
646  if ' ' in hpeso:
647  hpeso = None
648  quantita = el.find('Quantita').text
649  flags = el.find('Flags').text
650  riga_misura = (
651  descrizione,
652  '',
653  '',
654  partiuguali,
655  lunghezza,
656  larghezza,
657  hpeso,
658  quantita,
659  flags,
660  idvv,
661  )
662  mia = []
663  mia.append(riga_misura[0])
664  for el in riga_misura[1:]:
665  if el is None:
666  el = ''
667  else:
668  try:
669  el = float(el)
670  except ValueError:
671  if el != '':
672  el = '=' + el.replace('.', ',')
673  mia.append(el)
674  lista_righe.append(riga_misura)
675  diz_misura['id_vc'] = id_vc
676  diz_misura['id_ep'] = id_ep
677  diz_misura['quantita'] = quantita
678  diz_misura['datamis'] = datamis
679  diz_misura['flags'] = flags
680  diz_misura['idspcat'] = idspcat
681  diz_misura['idcat'] = idcat
682  diz_misura['idsbcat'] = idsbcat
683  diz_misura['lista_rig'] = lista_righe
684 
685  new_id = PL.strall(idspcat) + '.' + PL.strall(idcat) + '.' + PL.strall(idsbcat)
686  new_id_l = (new_id, diz_misura)
687  prova_l.append(new_id_l)
688  listaMisure.append(diz_misura)
689 
690  # se richiesto ordina le misure
691  if len(listaMisure) != 0 and ordina:
692  riordine = sorted(prova_l, key=lambda el: el[0])
693  listaMisure = []
694  for el in riordine:
695  listaMisure.append(el[1])
696 
697  except IndexError:
698  Dialogs.Exclamation(Title="Attenzione",
699  Text="Nel file scelto non risultano esserci voci di misurazione,\n"
700  "perciò saranno importate le sole voci di Elenco Prezzi.\n\n"
701  "Si tenga conto che:\n"
702  "- sarà importato solo il 'Prezzo 1' dell'elenco;\n"
703  "- a seconda della versione, il formato XPWE potrebbe\n"
704  " non conservare alcuni dati come le incidenze di\n"
705  " sicurezza e di manodopera!"
706  )
707 
708  return listaMisure
709 
710 
711 def stileCelleElencoPrezzi(oSheet, startRow, endRow, color=None):
712  oSheet.getCellRangeByPosition(0, startRow, 0, endRow).CellStyle = "EP-aS"
713  oSheet.getCellRangeByPosition(1, startRow, 1, endRow).CellStyle = "EP-a"
714  oSheet.getCellRangeByPosition(2, startRow, 4, endRow).CellStyle = "EP-mezzo"
715  oSheet.getCellRangeByPosition(5, startRow, 5, endRow).CellStyle = "EP-mezzo %"
716  oSheet.getCellRangeByPosition(6, startRow, 7, endRow).CellStyle = "EP-mezzo"
717  oSheet.getCellRangeByPosition(8, startRow, 9, endRow).CellStyle = "EP-sfondo"
718  oSheet.getCellRangeByPosition(11, startRow, 11, endRow).CellStyle = 'EP-mezzo %'
719  oSheet.getCellRangeByPosition(15, startRow, 15, endRow).CellStyle = 'EP-mezzo %'
720  oSheet.getCellRangeByPosition(19, startRow, 19, endRow).CellStyle = 'EP-mezzo %'
721  oSheet.getCellRangeByPosition(26, startRow, 26, endRow).CellStyle = 'EP-mezzo %'
722  oSheet.getCellRangeByPosition(12, startRow, 12, endRow).CellStyle = 'EP statistiche_q'
723  oSheet.getCellRangeByPosition(16, startRow, 16, endRow).CellStyle = 'EP statistiche_q'
724  oSheet.getCellRangeByPosition(20, startRow, 20, endRow).CellStyle = 'EP statistiche_q'
725  oSheet.getCellRangeByPosition(23, startRow, 23, endRow).CellStyle = 'EP statistiche_q'
726  oSheet.getCellRangeByPosition(13, startRow, 13, endRow).CellStyle = 'EP statistiche'
727  oSheet.getCellRangeByPosition(17, startRow, 17, endRow).CellStyle = 'EP statistiche'
728  oSheet.getCellRangeByPosition(21, startRow, 21, endRow).CellStyle = 'EP statistiche'
729  oSheet.getCellRangeByPosition(24, startRow, 25, endRow).CellStyle = 'EP statistiche'
730  if color is not None:
731  oSheet.getCellRangeByPosition(0, startRow, 0, endRow).CellBackColor = color
732 
733 def estraiDatiCapitoliCategorie(capitoliCategorie, catName):
734  resList = []
735  for el in capitoliCategorie[catName]:
736  tariffa = el.get('codice')
737  if tariffa is not None:
738  destestesa = el.get('dessintetica')
739  titolo = (tariffa, destestesa, '', '', '', '', '')
740  resList.append(titolo)
741  return tuple(resList)
742 
743 def riempiBloccoElencoPrezzi(oSheet, dati, col, progress):
744 
745  progStart = progress.getValue()
746  righe = len(dati)
747  colonne = len(dati[0])
748 
749  # i dati partono dalla riga 3 (quarta, in effetti)
750  oSheet.getRows().insertByIndex(3, righe)
751 
752  riga = 0
753  step = 100
754  while riga < righe:
755  sliced = dati[riga:riga + step]
756  num = len(sliced)
757  oRange = oSheet.getCellRangeByPosition(
758  0,
759  3 + riga,
760  colonne - 1,
761  3 + riga + num - 1)
762  oRange.setDataArray(sliced)
763 
764  # modifica lo stile del gruppo di celle
765  stileCelleElencoPrezzi(oSheet, 3 + riga, 3 + riga + num - 1, col)
766 
767  riga = riga + num
768  progress.setValue(riga + progStart)
769 
770 
771 def compilaElencoPrezzi(oDoc, capitoliCategorie, elencoPrezzi, progress):
772  ''' compila l'elenco prezzi '''
773 
774  # per prima cosa estrae le liste di EP, capitoli, eccetera
775  # e le converte in array
776 
777  # articoli
778  arrayArticoli = tuple(elencoPrezzi['ListaArticoli'])
779  righeArticoli = len(arrayArticoli)
780  # SuperCapitoli
781  arraySuperCapitoli = estraiDatiCapitoliCategorie(capitoliCategorie, 'SuperCapitoli')
782  righeSuperCapitoli = len(arraySuperCapitoli)
783  # capitoli
784  arrayCapitoli = estraiDatiCapitoliCategorie(capitoliCategorie, 'Capitoli')
785  righeCapitoli = len(arrayCapitoli)
786  # SottoCapitoli
787  arraySottoCapitoli = estraiDatiCapitoliCategorie(capitoliCategorie, 'SottoCapitoli')
788  righeSottoCapitoli = len(arraySottoCapitoli)
789 
790  # numero totale di righe da inserire
791  righeTotali = righeArticoli + righeSuperCapitoli + righeCapitoli + righeSottoCapitoli
792 
793  # inizializza la progressbar
794  progress.setLimits(0, righeTotali)
795  progress.setValue(0)
796 
797  # compilo Elenco Prezzi
798  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
799 
800  riempiBloccoElencoPrezzi(oSheet, arrayArticoli, None, progress)
801  '''
802  aggiungo i capitoli alla lista delle voci
803  giallo(16777072,16777120,16777168)
804  verde(9502608,13696976,15794160)
805  viola(12632319,13684991,15790335)
806  SUPERCAPITOLI
807  '''
808  # SuperCapitoli
809  if righeSuperCapitoli:
810  riempiBloccoElencoPrezzi(oSheet, arraySuperCapitoli, 16777072, progress)
811 
812  # Capitoli
813  if righeCapitoli:
814  riempiBloccoElencoPrezzi(oSheet, arrayCapitoli, 16777120, progress)
815 
816  # SottoCapitoli
817  if righeSottoCapitoli:
818  riempiBloccoElencoPrezzi(oSheet, arraySottoCapitoli, 16777168, progress)
819 
820  PL.riordina_ElencoPrezzi(oDoc)
821 
822 
823 def compilaAnalisiPrezzi(oDoc, elencoPrezzi, progress):
824  ''' Compilo Analisi di prezzo '''
825  numAnalisi = len(elencoPrezzi['ListaAnalisi'])
826  if numAnalisi != 0:
827 
828  # inizializza la progressbar
829  progress.setLimits(0, numAnalisi)
830  val = 0
831  progress.setValue(val)
832 
833  # inizializza l'analisi dei prezzi
834  oSheet, startRow = LeenoAnalysis.inizializzaAnalisi(oDoc)
835 
836  # compila le voci dell'analisi
837  for el in elencoPrezzi['ListaAnalisi']:
838  prezzo_finale = el[-1]
839 
840  # circoscrive la voce di analisi corrente
841  sStRange = LeenoAnalysis.circoscriveAnalisi(oSheet, startRow)
842 
843  lrow = sStRange.RangeAddress.StartRow + 2
844  oSheet.getCellByPosition(0, lrow).String = el[0]
845  oSheet.getCellByPosition(1, lrow).String = el[1]
846  oSheet.getCellByPosition(2, lrow).String = el[2]
847  y = 0
848  n = lrow + 2
849  for x in el[3]:
850  if el[3][y][1] in (
851  'MANODOPERA', 'MATERIALI', 'NOLI', 'TRASPORTI',
852  'ALTRE FORNITURE E PRESTAZIONI', 'overflow'):
853  if el[3][y][1] != 'overflow':
854  n = SheetUtils.uFindStringCol(el[3][y][1], 1, oSheet, lrow)
855  else:
857  if elencoPrezzi['DizionarioArticoli'].get(el[3][y][0]) is not None:
858  oSheet.getCellByPosition(0, n).String = (
859  elencoPrezzi['DizionarioArticoli'].get(el[3][y][0]).get('tariffa'))
860  # per gli inserimenti liberi (L)
861  else:
862  oSheet.getCellByPosition(0, n).String = ''
863  try:
864  oSheet.getCellByPosition(1, n).String = x[1]
865  except:
866  oSheet.getCellByPosition(1, n).String = ''
867  oSheet.getCellByPosition(2, n).String = x[2]
868  try:
869  float(x[3].replace(',', '.'))
870  oSheet.getCellByPosition(3, n).Value = float(x[3].replace(',', '.'))
871  except Exception:
872  oSheet.getCellByPosition(3, n).Value = 0
873  try:
874  float(x[4].replace(',', '.'))
875  oSheet.getCellByPosition(4, n).Value = float(x[4].replace(',', '.'))
876  except:
877  oSheet.getCellByPosition(4, n).Value = 0
878  if el[3][y][1] not in (
879  'MANODOPERA', 'MATERIALI', 'NOLI', 'TRASPORTI',
880  'ALTRE FORNITURE E PRESTAZIONI', 'overflow'):
881  if el[3][y][3] == '':
882  oSheet.getCellByPosition(3, n).Value = 0
883  else:
884  try:
885  float(el[3][y][3])
886  oSheet.getCellByPosition(3, n).Value = el[3][y][3]
887  except Exception:
888  oSheet.getCellByPosition(3, n).Formula = '=' + el[3][y][3]
889  y += 1
890  n += 1
891  sStRange = LeenoAnalysis.circoscriveAnalisi(oSheet, lrow)
892  startRow = sStRange.RangeAddress.StartRow
893  endRow = sStRange.RangeAddress.EndRow
894  for m in reversed(range(startRow, endRow)):
895  if(oSheet.getCellByPosition(0, m).String == 'Cod. Art.?' and
896  oSheet.getCellByPosition(0, m - 1).CellStyle == 'An-lavoraz-Cod-sx'):
897  oSheet.getRows().removeByIndex(m, 1)
898  if oSheet.getCellByPosition(0, m).String == 'Cod. Art.?':
899  oSheet.getCellByPosition(0, m).String = ''
900  if oSheet.getCellByPosition(6, startRow + 2).Value != prezzo_finale:
901  oSheet.getCellByPosition(6, startRow + 2).Value = prezzo_finale
902  oSheet, startRow = LeenoAnalysis.inizializzaAnalisi(oDoc)
903 
904  # aggiorna la progressbar
905  val += 1
906  progress.setValue(val)
907 
908  # siccome viene inserita una voce PRIMA di iniziare la compilazione
909  # occorre eliminare l'ultima voce che risulta vuota
911  PL.tante_analisi_in_ep()
912 
913 
914 def compilaComputo(oDoc, elaborato, capitoliCategorie, elencoPrezzi, listaMisure, progress):
915  ''' compila il computo '''
916 
917  # crea / attiva l'elaborato del tipo scelto
918  if elaborato == 'VARIANTE':
919  if oDoc.getSheets().hasByName('VARIANTE'):
920  oSheet = LeenoVariante.generaVariante(oDoc, False)
921  else:
922  oSheet = LeenoVariante.generaVariante(oDoc, True)
923  oSheet.getRows().removeByIndex(2, 4)
924  elif elaborato == 'CONTABILITA':
925  #PL.attiva_contabilita()
926  oSheet = LeenoContab.generaContabilita(oDoc)
927  else:
928  oSheet = oDoc.getSheets().getByName(elaborato)
929 
930  # elimina l'eventuale riga vuota iniziale
931  if oSheet.getCellByPosition(1, 4).String == 'Cod. Art.?':
932  if elaborato == 'CONTABILITA':
933  oSheet.getRows().removeByIndex(3, 5)
934  else:
935  oSheet.getRows().removeByIndex(3, 4)
936 
937  oCellRangeAddr = CellRangeAddress()
938  # recupero l'index del foglio
939  oCellRangeAddr.Sheet = oSheet.RangeAddress.Sheet
940 
941  # mappa le voci computo con le righe del foglio
942  # (ad esempio per riferimenti tipo vedi_voce)
943  mappaVociRighe = {}
944 
945  # numero di sequenza delle voci del computo
946  numeroVoce = 1
947 
948  # variabili utilizzate per evitare le ripetizioni di
949  # supercategoria, categoria e sottocategoria ad ogni voce
950  testspcat = '0'
951  testcat = '0'
952  testsbcat = '0'
953 
954  # inizializza la progressbar
955  progress.setLimits(0, len(listaMisure))
956  val = 0
957  progress.setValue(val)
958 
959  for el in listaMisure:
960  # dati della misura
961  datamis = el.get('datamis')
962  # id supercategoria
963  idspcat = el.get('idspcat')
964  # id categoria
965  idcat = el.get('idcat')
966  # id subcategoria
967  idsbcat = el.get('idsbcat')
968 
969  # si posizione dopo l'ultima voce nel foglio
970  lrow = LeenoSheetUtils.cercaUltimaVoce(oSheet) + 1
971 
972  # inserisco le supercategorie, categorie e sottocategorie
973  # le varie 'testspcat', 'testcat' e 'testsbcat' servono per
974  # evitare la ripetizione per voci consecutive
975 
976  if elaborato != 'CONTABILITA':
977  # supercategoria
978  try:
979  if idspcat != testspcat:
980  testspcat = idspcat
981  testcat = '0'
982  # non capisco il perchè dell' EVAL ma mi adeguo, per ora
983  LeenoSheetUtils.inserSuperCapitolo(oSheet, lrow, capitoliCategorie['SuperCategorie'][eval(idspcat) - 1][1])
984  lrow += 1
985  except UnboundLocalError:
986  pass
987 
988  # categoria
989  try:
990  if idcat != testcat:
991  testcat = idcat
992  testsbcat = '0'
993  # non capisco il perchè dell' EVAL ma mi adeguo, per ora
994  LeenoSheetUtils.inserCapitolo(oSheet, lrow, capitoliCategorie['Categorie'][eval(idcat) - 1][1])
995  lrow += 1
996  except UnboundLocalError:
997  pass
998 
999  # sottocategoria
1000  try:
1001  if idsbcat != testsbcat:
1002  testsbcat = idsbcat
1003  # non capisco il perchè dell' EVAL ma mi adeguo, per ora
1004  LeenoSheetUtils.inserSottoCapitolo(oSheet, lrow, capitoliCategorie['SottoCategorie'][eval(idsbcat) - 1][1])
1005  lrow += 1
1006  except UnboundLocalError:
1007  pass
1008 
1009  if elaborato == 'CONTABILITA':
1010  LeenoContab.insertVoceContabilita(oSheet, lrow)
1011  else:
1012  # inserisce la nuova voce (vuota) nel computo
1014 
1015  # id dell'elenco prezzi
1016  ID = el.get('id_ep')
1017 
1018  # inserisce la tariffa dall'elenco prezzi
1019  # non capisco il perchè della try..except con la PASS senza segnalazione di errore...
1020  try:
1021  oSheet.getCellByPosition(1, lrow + 1).String = elencoPrezzi['DizionarioArticoli'].get(ID).get('tariffa')
1022  except Exception:
1023  pass
1024 
1025  # id della voce computo corrente nell' XPWE
1026  idVoceComputo = el.get('id_vc')
1027 
1028  # mappa l'id della voce con la riga del computo
1029  # in modo da poter gestire i VEDI_VOCE successivamente
1030  mappaVociRighe[idVoceComputo] = lrow + 1
1031 
1032  # scrive il numero sequenziale della voce corrente
1033  # nella prima colonna, seconda riga della voce
1034  oSheet.getCellByPosition(0, lrow + 1).String = str(numeroVoce)
1035  numeroVoce += 1
1036 
1037  # si posiziona ad inizio area misure
1038  startRow = lrow + 2
1039 
1040  lista_righe = el.get('lista_rig')
1041  nrighe = len(lista_righe)
1042 
1043  # compila le righe di misurazione
1044  if nrighe > 0:
1045  endRow = startRow + nrighe
1046 
1047  # se la voce ha più di una riga di misurazione,
1048  # inserisce le righe aggiuntive
1049  if nrighe > 1:
1050  oSheet.getRows().insertByIndex(startRow + 1, nrighe - 1)
1051 
1052  # seleziona la prima riga di misurazioni...
1053  oRangeAddress = oSheet.getCellRangeByPosition(0, startRow, 250, startRow).getRangeAddress()
1054 
1055  # ... e la copia sulle rimanenti
1056  for n in range(startRow + 1, endRow):
1057  oCellAddress = oSheet.getCellByPosition(0, n).getCellAddress()
1058  oSheet.copyRange(oCellAddress, oRangeAddress)
1059  if elaborato == 'CONTABILITA':
1060  oSheet.getCellByPosition(1, n).String = ''
1061  oSheet.getCellByPosition(1, n).CellStyle = 'Comp-Bianche in mezzo_R'
1062 
1063  # inserisco prima solo le righe se no mi fa casino
1064  if elaborato == 'CONTABILITA':
1065  oSheet.getCellByPosition(1, startRow).Formula = (
1066  '=DATE(' + datamis.split('/')[2] +
1067  ';' + datamis.split('/')[1] + ';' +
1068  datamis.split('/')[0] + ')'
1069  )
1070  oSheet.getCellByPosition(1, startRow).Value = oSheet.getCellByPosition(1, startRow).Value
1071  for mis in lista_righe:
1072 
1073  # descrizione
1074  if mis[0] is not None:
1075  descrizione = mis[0].strip()
1076  oSheet.getCellByPosition(2, startRow).String = descrizione
1077  else:
1078  descrizione = ''
1079 
1080  # parti uguali
1081  if mis[3] is not None:
1082  try:
1083  oSheet.getCellByPosition(5, startRow).Value = float(mis[3].replace(',', '.'))
1084  except ValueError:
1085  # tolgo evenutali '=' in eccesso
1086  oSheet.getCellByPosition(5, startRow).Formula = '=' + str(mis[3]).split('=')[-1]
1087 
1088  # lunghezza
1089  if mis[4] is not None:
1090  try:
1091  oSheet.getCellByPosition(6, startRow).Value = float(mis[4].replace(',', '.'))
1092  except ValueError:
1093  # tolgo evenutali '=' in eccesso
1094  oSheet.getCellByPosition(6, startRow).Formula = '=' + str(mis[4]).split('=')[-1]
1095 
1096  # larghezza
1097  if mis[5] is not None:
1098  try:
1099  oSheet.getCellByPosition(7, startRow).Value = float(mis[5].replace(',', '.'))
1100  except ValueError:
1101  # tolgo evenutali '=' in eccesso
1102  oSheet.getCellByPosition(7, startRow).Formula = '=' + str(mis[5]).split('=')[-1]
1103 
1104  # HPESO
1105  if mis[6] is not None:
1106  try:
1107  oSheet.getCellByPosition(8, startRow).Value = float(mis[6].replace(',', '.'))
1108  except Exception:
1109  # tolgo evenutali '=' in eccesso
1110  oSheet.getCellByPosition(8, startRow).Formula = '=' + str(mis[6]).split('=')[-1]
1111 
1112  if mis[8] == '2':
1113  PL.parziale_core(oSheet, startRow)
1114  if elaborato != 'CONTABILITA':
1115  oSheet.getRows().removeByIndex(startRow + 1, 1)
1116  descrizione = ''
1117 
1118  if mis[9] != '-2':
1119  vedi = mappaVociRighe.get(mis[9])
1120  try:
1121  test = PL.vedi_voce_xpwe(oSheet, startRow, vedi)
1122  except Exception:
1123  Dialogs.Exclamation(Title="Attenzione",
1124  Text="Il file di origine è particolarmente disordinato.\n"
1125  "Riordinando il computo trovo riferimenti a voci "
1126  "non ancora inserite.\n\n"
1127  "Al termine dell'importazione controlla la voce con tariffa " +
1128  elencoPrezzi['DizionarioArticoli'].get(ID).get('tariffa') +
1129  "\nella riga n." + str(lrow + 2) +
1130  " del foglio, evidenziata qui a sinistra.")
1131  oSheet.getCellByPosition(44, startRow).String = (
1132  elencoPrezzi['DizionarioArticoli'].get(ID).get('tariffa'))
1133  try:
1134  mis[7]
1135  if '-' in mis[7]:
1136  for x in range(5, 9):
1137  try:
1138  if oSheet.getCellByPosition(x, startRow).Value != 0:
1139  oSheet.getCellByPosition(x, startRow).Value = abs(oSheet.getCellByPosition(x, startRow).Value)
1140  except Exception:
1141  pass
1142  LeenoSheetUtils.invertiUnSegno(oSheet, startRow)
1143  #~PL.invertiSegnoRow(oSheet, startRow)
1144  if elaborato == 'CONTABILITA':
1145  if test == '-':
1146  LeenoSheetUtils.invertiUnSegno(oSheet, startRow)
1147  #~PL.invertiSegnoRow(oSheet, startRow)
1148  test = ''
1149  except Exception:
1150  pass
1151 
1152  # prossima riga di misurazione
1153  startRow = startRow + 1
1154 
1155  # aggiorna la progressbar
1156  val += 1
1157  progress.setValue(val)
1158 
1159  LeenoSheetUtils.numeraVoci(oSheet, 0, True)
1160 
1161  try:
1162  PL.Rinumera_TUTTI_Capitoli2(oSheet)
1163  except Exception:
1164  pass
1165 
1166  PL.fissa()
1167 
1169  '''
1170  Importazione dati dal formato XPWE
1171  '''
1172  oDoc = LeenoUtils.getDocument()
1174  isLeenoDoc = LeenoUtils.isLeenoDocument()
1175  if isLeenoDoc == False:
1176  PL.creaComputo(0)
1177  isLeenoDoc = LeenoUtils.isLeenoDocument()
1178  # legge i totali dal documento
1179  if isLeenoDoc:
1180  oDoc = LeenoUtils.getDocument()
1181  vals = []
1182  for el in ("COMPUTO", "VARIANTE", "CONTABILITA"):
1183  try:
1184  vals.append(oDoc.getSheets().getByName(el).getCellRangeByName('A2').Value)
1185  except Exception:
1186  vals.append(None)
1187  else:
1188  vals = [None, None, None]
1189 
1190  # sceglie il tipo di dati da importare
1191  ordina = LeenoConfig.Config().read('Importazione', 'ordina_computo') == '1'
1192  elabdest = DLG.ScegliElabDest(
1193  Title="Importa dal formato XPWE",
1194  AskTarget=isLeenoDoc,
1195  AskSort=True,
1196  Sort=ordina,
1197  ValComputo=vals[0],
1198  ValVariante=vals[1],
1199  ValContabilita=vals[2]
1200  )
1201  # controlla se si è annullato il comando
1202  if elabdest is None:
1203  return
1204  elaborato = elabdest['elaborato']
1205  destinazione = elabdest['destinazione']
1206  ordina = elabdest['ordina']
1207  LeenoConfig.Config().write('Importazione', 'ordina_computo', '1' if ordina else '0')
1208 
1209  if elaborato in ('Elenco', 'CONTABILITA'):
1210  ordina = False
1211 
1212  filename = Dialogs.FileSelect('Scegli il file XPWE da importare...', '*.xpwe') # *.xpwe')
1213  if filename in ('Cancel', '', None):
1214  return
1215 
1216  # effettua il parsing del file XML
1217  tree = ElementTree()
1218  try:
1219  tree.parse(filename)
1220  except ParseError:
1221  Dialogs.Exclamation(Title="Errore nel file",
1222  Text="È stato riscontrato un errore nel contenuto del file\n"
1223  "Accertati il file sia in formato XPWE.")
1224  return
1225  except PermissionError:
1226  Dialogs.Exclamation(Title="Errore",
1227  Text="Impossibile leggere il file\n"
1228  "Accertati che il nome del file sia corretto.")
1229  return
1230 
1231  # ottieni l'item root
1232  root = tree.getroot()
1233  logging.debug(list(root))
1234 
1235  # attiva la progressbar
1236  progress = Dialogs.Progress(Title="Importazione file XPWE in corso", Text="Lettura dati")
1237  progress.setLimits(0, 6)
1238  progress.setValue(0)
1239  progress.show()
1240 
1241  # ########################################################################################
1242  # LETTURA DATI
1243 
1244  # va alla sezione dei dati generali
1245  dati = root.find('PweDatiGenerali')
1246  if dati == None:
1247  dati = root.getchildren()[0].find('PweDatiGenerali')
1248 
1249  # legge i dati anagrafici generali
1250  datiAnagrafici = leggiAnagraficaGenerale(dati)
1251  progress.setValue(1)
1252 
1253  # legge capitoli e categorie
1254  capitoliCategorie = leggiCapitoliCategorie(dati)
1255  progress.setValue(2)
1256 
1257  # legge i dati generali per l'analisi
1258  datiGeneraliAnalisi = leggiDatiGeneraliAnalisi(dati)
1259  progress.setValue(3)
1260 
1261  # legge le approssimazioni
1262  approssimazioni = leggiApprossimazioni(dati)
1263  progress.setValue(4)
1264 
1265  misurazioni = root.find('PweMisurazioni')
1266  if misurazioni == None:
1267  misurazioni = root.getchildren()[0].find('PweMisurazioni')
1268 
1269  # legge l'elenco prezzi
1270  elencoPrezzi = leggiElencoPrezzi(misurazioni)
1271  # ~DLG.chi(elencoPrezzi)
1272  # ~return
1273  progress.setValue(5)
1274 
1275  # legge le misurazioni
1276  if elaborato != 'Elenco':
1277  listaMisure = leggiMisurazioni(misurazioni, ordina)
1278  else:
1279  listaMisure = []
1280  progress.setValue(6)
1281 
1282  # ########################################################################################
1283  # SCRITTURA COMPUTO
1284 
1285  # se la destinazione è un nuovo documento, crealo
1286  if destinazione == 'NUOVO':
1287  oDoc = PL.creaComputo(0)
1288 
1289  # occorre ricreare di nuovo la progressbar, in modo che sia
1290  # agganciata al nuovo documento
1291  progress.hide();
1292  progress = Dialogs.Progress(Title="Importazione file XPWE in corso", Text="")
1293  progress.show()
1294 
1295  # disattiva l'output a video
1297 
1298  # compila i dati generali per l'analisi
1299  progress.setText("Compilazione dati generali di analisi")
1300  compilaDatiGeneraliAnalisi(oDoc, datiGeneraliAnalisi)
1301 
1302  # compila le approssimazioni
1303  progress.setText("Compilazione approssimazioni")
1304  compilaApprossimazioni(oDoc, approssimazioni)
1305 
1306  # compilo Anagrafica generale
1307  progress.setText("Compilazione anagrafica generale")
1308  compilaAnagraficaGenerale(oDoc, datiAnagrafici)
1309 
1310  # compilo Elenco Prezzi
1311  progress.setText("Compilazione elenco prezzi")
1312  if elaborato == 'CONTABILITA':
1313  capitoliCategorie = {'SuperCapitoli': [], 'Capitoli': [], 'SottoCapitoli': [], 'SuperCategorie': [], 'Categorie': [], 'SottoCategorie': []}
1314  compilaElencoPrezzi(oDoc, capitoliCategorie, elencoPrezzi, progress)
1315 
1316  # Compilo Analisi di prezzo
1317  progress.setText("Compilazione analisi prezzi")
1318  compilaAnalisiPrezzi(oDoc, elencoPrezzi, progress)
1319 
1320  #progress.hide()
1321  #return
1322 
1323  # elimina doppioni nell'elenco prezzi
1324  # ~progress.setText("Eliminazione voci doppie elenco prezzi")
1325  # ~PL.EliminaVociDoppieElencoPrezzi()
1326 
1327  # se non ci sono misurazioni di computo, finisce qui
1328  if len(listaMisure) == 0:
1329  progress.hide()
1330 
1331  Dialogs.Info(Title="Importazione completata",
1332  Text="Importate n." +
1333  str(len(elencoPrezzi['ListaArticoli'])) +
1334  " voci dall'elenco prezzi\ndel file: " + filename)
1335  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
1336  oDoc.CurrentController.setActiveSheet(oSheet)
1337 
1338  # riattiva l'output a video
1340  return
1341 
1342  # compila il computo
1343  progress.setText(f'Compilazione {elaborato}')
1344  compilaComputo(oDoc, elaborato, capitoliCategorie, elencoPrezzi, listaMisure, progress)
1345 
1346  # riattiva l'output a video
1348 
1349  PL.GotoSheet(elaborato)
1350  progress.setText("Adattamento altezze righe")
1351 
1352  progress.setText("Fine")
1353  progress.hide()
1354 
1355  oSheet = oDoc.getSheets().getByName(elaborato)
1358  Dialogs.Ok(Text='Importazione di\n\n' + elaborato + '\n\neseguita con successo!')
LeenoImport_XPWE.compilaElencoPrezzi
def compilaElencoPrezzi(oDoc, capitoliCategorie, elencoPrezzi, progress)
Definition: LeenoImport_XPWE.py:771
LeenoImport_XPWE.leggiSottoCategorie
def leggiSottoCategorie(CapCat)
Definition: LeenoImport_XPWE.py:179
LeenoSheetUtils.inserCapitolo
def inserCapitolo(oSheet, lrow, sTesto='Categoria')
Definition: LeenoSheetUtils.py:567
Dialogs.Ok
def Ok(*Title='', Text='')
Definition: Dialogs.py:2542
LeenoSheetUtils.adattaAltezzaRiga
def adattaAltezzaRiga(oSheet)
Definition: LeenoSheetUtils.py:468
LeenoSheetUtils.invertiUnSegno
def invertiUnSegno(oSheet, lrow)
Definition: LeenoSheetUtils.py:666
LeenoUtils.getDocument
def getDocument()
Definition: LeenoUtils.py:67
LeenoSheetUtils.eliminaVoce
def eliminaVoce(oSheet, lrow)
Definition: LeenoSheetUtils.py:319
LeenoImport_XPWE.compilaAnalisiPrezzi
def compilaAnalisiPrezzi(oDoc, elencoPrezzi, progress)
Definition: LeenoImport_XPWE.py:823
LeenoImport_XPWE.estraiDatiCapitoliCategorie
def estraiDatiCapitoliCategorie(capitoliCategorie, catName)
Definition: LeenoImport_XPWE.py:733
LeenoImport_XPWE.leggiCapitoliCategorie
def leggiCapitoliCategorie(dati)
Definition: LeenoImport_XPWE.py:198
LeenoUtils.isLeenoDocument
def isLeenoDocument()
Definition: LeenoUtils.py:98
LeenoSheetUtils.inserSottoCapitolo
def inserSottoCapitolo(oSheet, lrow, sTesto)
Definition: LeenoSheetUtils.py:610
SheetUtils.uFindStringCol
def uFindStringCol(sString, nCol, oSheet, start=2, equal=0, up=False)
Definition: SheetUtils.py:403
LeenoImport_XPWE.compilaComputo
def compilaComputo(oDoc, elaborato, capitoliCategorie, elencoPrezzi, listaMisure, progress)
Definition: LeenoImport_XPWE.py:914
LeenoImport_XPWE.leggiDatiGeneraliAnalisi
def leggiDatiGeneraliAnalisi(dati)
Definition: LeenoImport_XPWE.py:232
LeenoUtils.DocumentRefresh
def DocumentRefresh(boo)
Definition: LeenoUtils.py:109
LeenoVariante.generaVariante
def generaVariante(oDoc, clear)
Definition: LeenoVariante.py:8
LeenoSheetUtils.cercaUltimaVoce
def cercaUltimaVoce(oSheet)
Definition: LeenoSheetUtils.py:184
LeenoImport_XPWE.riempiBloccoElencoPrezzi
def riempiBloccoElencoPrezzi(oSheet, dati, col, progress)
Definition: LeenoImport_XPWE.py:743
LeenoImport_XPWE.MENU_XPWE_import
def MENU_XPWE_import()
Definition: LeenoImport_XPWE.py:1168
LeenoContab.generaContabilita
def generaContabilita(oDoc)
Definition: LeenoContab.py:268
Dialogs.Info
def Info(*Title='', Text='')
Definition: Dialogs.py:2539
Dialogs.Exclamation
def Exclamation(*Title='', Text='')
Definition: Dialogs.py:2536
LeenoImport_XPWE.leggiSuperCategorie
def leggiSuperCategorie(CapCat)
Definition: LeenoImport_XPWE.py:140
LeenoImport_XPWE.leggiSottoCapitoli
def leggiSottoCapitoli(CapCat)
Definition: LeenoImport_XPWE.py:109
LeenoImport_XPWE.leggiElencoPrezzi
def leggiElencoPrezzi(misurazioni)
Definition: LeenoImport_XPWE.py:383
Dialogs.FileSelect
def FileSelect(titolo='Scegli il file...', est=' *.*', mode=0, startPath=None)
SOME COMMON DIALOGS.
Definition: Dialogs.py:2448
Dialogs.Progress
Definition: Dialogs.py:2583
LeenoImport_XPWE.leggiAnagraficaGenerale
def leggiAnagraficaGenerale(dati)
Definition: LeenoImport_XPWE.py:28
LeenoImport_XPWE.stileCelleElencoPrezzi
def stileCelleElencoPrezzi(oSheet, startRow, endRow, color=None)
Definition: LeenoImport_XPWE.py:711
LeenoComputo.insertVoceComputoGrezza
def insertVoceComputoGrezza(oSheet, lrow)
Definition: LeenoComputo.py:115
LeenoConfig.Config
Definition: LeenoConfig.py:26
LeenoImport_XPWE.leggiApprossimazioni
def leggiApprossimazioni(dati)
Definition: LeenoImport_XPWE.py:269
LeenoAnalysis.copiaRigaAnalisi
def copiaRigaAnalisi(oSheet, lrow)
Definition: LeenoAnalysis.py:81
LeenoSheetUtils.inserSuperCapitolo
def inserSuperCapitolo(oSheet, lrow, sTesto='Super Categoria')
Definition: LeenoSheetUtils.py:524
LeenoContab.insertVoceContabilita
def insertVoceContabilita(oSheet, lrow)
Definition: LeenoContab.py:50
LeenoImport_XPWE.leggiSuperCapitoli
def leggiSuperCapitoli(CapCat)
Definition: LeenoImport_XPWE.py:53
LeenoSheetUtils.numeraVoci
def numeraVoci(oSheet, lrow, tutte)
Definition: LeenoSheetUtils.py:730
LeenoImport_XPWE.compilaApprossimazioni
def compilaApprossimazioni(oDoc, approssimazioni)
Definition: LeenoImport_XPWE.py:356
LeenoImport_XPWE.compilaAnagraficaGenerale
def compilaAnagraficaGenerale(oDoc, datiAnagrafici)
Definition: LeenoImport_XPWE.py:336
LeenoImport_XPWE.leggiMisurazioni
def leggiMisurazioni(misurazioni, ordina)
Definition: LeenoImport_XPWE.py:579
LeenoImport_XPWE.leggiCategorie
def leggiCategorie(CapCat)
Definition: LeenoImport_XPWE.py:160
LeenoAnalysis.inizializzaAnalisi
def inizializzaAnalisi(oDoc)
Definition: LeenoAnalysis.py:11
LeenoFormat.setCellStyleDecimalPlaces
def setCellStyleDecimalPlaces(nome_stile, n)
Definition: LeenoFormat.py:35
LeenoAnalysis.circoscriveAnalisi
def circoscriveAnalisi(oSheet, lrow)
Definition: LeenoAnalysis.py:59
LeenoImport_XPWE.compilaDatiGeneraliAnalisi
def compilaDatiGeneraliAnalisi(oDoc, datiGeneraliAnalisi)
Definition: LeenoImport_XPWE.py:346
LeenoImport_XPWE.leggiCapitoli
def leggiCapitoli(CapCat)
Definition: LeenoImport_XPWE.py:81