def _get_periodes_reactiva(self, lect_activa, lect_reactiva): """Retorna una llista de noms de periode que tenen excés de reactiva """ agrupat = INFO_TARIFA[self.codi_tarifa]['agrupat'] if len(lect_activa) < len(lect_reactiva): msg = _('Menor nombre de periodes en les lectures d\'activa '\ 'que en reactiva. No és possible calcular els excessos '\ 'de reactiva.') raise except_f1('Error', msg) if agrupat: lect_activa = aggr_consums(lect_activa) lect_reactiva = aggr_consums(lect_reactiva) periodes = lect_reactiva.keys() periodes.sort() calc = {} marge = INFO_TARIFA[self.codi_tarifa]['marge'] try: for i in periodes: activa = lect_activa[i] reactiva = lect_reactiva[i] val = float("%.2f" % exces_reactiva(activa, reactiva, marge)) # Comprovem que hi ha accés de reactiva i que el període en # el que estem es pot facturar la reactiva if val > 0 and i in INFO_TARIFA[self.codi_tarifa]['reactiva']: calc[i] = val return calc except KeyError, e: msg = _('No s\'ha trobat el periode \'%s\' en les lectures '\ ' d\'activa') % e[0] raise except_f1('Error', msg)
def get_info_activa(self): """Retornat els periodes d'energia""" periode = [] total = 0 lectures = [] for i in self.get_comptadors(): lectures.extend(i.get_lectures()) lect_activa = self.select_consum_from_lectures(lectures, 'A') lect_activa = aggr_consums(lect_activa) try: for ea in self.factura.EnergiaActiva.TerminoEnergiaActiva: d_ini = ea.FechaDesde.text d_fi = ea.FechaHasta.text p = 0 for i in ea.Periodo: if float(i.PrecioEnergia.text): p += 1 nom_p = 'P%d' % p val = float(i.ValorEnergiaActiva.text) if val in lect_activa.values(): per = [k for k in lect_activa if lect_activa[k] == val] if len(per) == 1: nom_p = per[0] periode.append(PeriodeActiva(i, nom_p, d_ini, d_fi)) if nom_p in lect_activa: del lect_activa[nom_p] total = float(self.factura.EnergiaActiva. ImporteTotalEnergiaActiva.text) except AttributeError: pass return periode, total
def get_info_reactiva(self): """Retorna els periodes de reactiva""" comptadors = self.get_comptadors() total = 0 periodes = [] nom_periodes_uniq = [] done = [] consums = {} # 2 meters: 1 active measures and other reactive measures # whe make a "Fusiooooo" like Dragon Ball Z reactive_only_meter = False if len(comptadors) == 2: meter_dict = {'A': [], 'R': []} for meter in comptadors: activa_ok = False reactiva_ok = False lectures = meter.get_lectures() consums_r = self.select_consum_from_lectures(lectures, 'R') consums_a = self.select_consum_from_lectures(lectures, 'A') if consums_r and not consums_a: # Comptador reactiva reactiva_ok = True if consums_a and not consums_r: # comptador activa activa_ok = True if activa_ok and reactiva_ok: continue else: meter_dict[activa_ok and 'A' or 'R'].append(meter) if (len(meter_dict['A']) == len(meter_dict['R']) and len(meter_dict['A']) == 1): l_a = meter_dict['A'][0].get_lectures() l_r = meter_dict['R'][0].get_lectures() consums_r_no_aggr = self.select_consum_from_lectures(l_r, 'R') consums_a_no_aggr = self.select_consum_from_lectures(l_a, 'A') for p, c in aggr_consums(consums_r_no_aggr).items(): consums.setdefault(p, 0) consums[p] += c nom_periodes = self._get_periodes_reactiva( consums_a_no_aggr, consums_r_no_aggr ) if nom_periodes_uniq: nom_periodes_uniq = list(set(nom_periodes_uniq + nom_periodes.keys())) else: nom_periodes_uniq = nom_periodes.keys() reactive_only_meter = True if not reactive_only_meter: for meter in comptadors: lectures = meter.get_lectures() # Fem un diccionari pels consums ja que UNION FENOSA no posene # l'excés de reactiva en el valor del terme sino que hi posen # el consum. Per detectar quin període és primer ho fem segons # l'excés i si no el troba ho buscarem pel consum consums_no_agg = self.select_consum_from_lectures(lectures, 'R') for p, c in aggr_consums(consums_no_agg).items(): consums.setdefault(p, 0) consums[p] += c nom_periodes = self.get_periodes_reactiva(lectures) if nom_periodes_uniq: nom_periodes_uniq = list(set(nom_periodes_uniq + nom_periodes.keys())) else: nom_periodes_uniq = nom_periodes.keys() nom_periodes_uniq.sort() if not nom_periodes_uniq: return None, None try: # Primer busquem per exces de reactiva periodes += self.find_terme_periode_reactiva(nom_periodes, done, 1) # Eliminem tots els períodes que ja hem identificat del diccionari # de consums for p in set(done): if p in consums: del consums[p] if consums: for p in consums.keys(): if p not in INFO_TARIFA[self.codi_tarifa]['reactiva']: del consums[p] periodes += self.find_terme_periode_reactiva(consums, done, 0) # treiem els periodes que no tenen excés de reactiva for p in consums.keys(): if p not in nom_periodes_uniq: del consums[p] falten = sorted(set(consums.keys()) - set(done)) if falten: # Si només tenim un període de reactiva i no l'hem trobat, # agafem el que tingui més "consum" if len(INFO_TARIFA[self.codi_tarifa]['reactiva']) == 1: peri = self.find_unic_terme_periode_reactiva(consums) periodes += peri else: # Qualsevol ens serveix, la factura ha d'entrar periodes += self.find_terme_periode_reactiva( consums, done, max(consums.values()) ) if not periodes: raise Exception( _("No s'ha pogut identificar tots els períodes de " "reactiva per facturar: %s") % ', '.join(falten) ) total = float(self.factura.EnergiaReactiva.\ ImporteTotalEnergiaReactiva.text) except AttributeError: pass return periodes, total
def get_info_reactiva(self): """Retorna els periodes de reactiva""" comptadors = self.get_comptadors() total = 0 periodes = [] nom_periodes_uniq = [] done = [] consums = {} for i in comptadors: lectures = i.get_lectures() # Fem un diccionari pels consums ja que UNION FENOSA no posene # l'excés de reactiva en el valor del terme sino que hi posen # el consum. Per detectar quin període és primer ho fem segons # l'excés i si no el troba ho buscarem pel consum consums_no_agg = self.select_consum_from_lectures(lectures, 'R') for p, c in aggr_consums(consums_no_agg).items(): consums.setdefault(p, 0) consums[p] += c nom_periodes = self.get_periodes_reactiva(lectures) if nom_periodes_uniq: nom_periodes_uniq = list(set(nom_periodes_uniq + nom_periodes.keys())) else: nom_periodes_uniq = list(nom_periodes.keys()) nom_periodes_uniq.sort() if not nom_periodes_uniq: return None, None try: # Primer busquem per exces de reactiva periodes += self.find_terme_periode_reactiva(nom_periodes, done, 1) # Eliminem tots els períodes que ja hem identificat del diccionari # de consums for p in set(done): if p in consums: del consums[p] if consums: for p in consums.keys(): if p not in INFO_TARIFA[self.codi_tarifa]['reactiva']: del consums[p] periodes += self.find_terme_periode_reactiva(consums, done, 0) # treiem els periodes que no tenen excés de reactiva for p in consums.keys(): if p not in nom_periodes_uniq: del consums[p] falten = sorted(set(consums.keys()) - set(done)) if falten: # Si només tenim un període de reactiva i no l'hem trobat, # agafem el que tingui més "consum" if len(INFO_TARIFA[self.codi_tarifa]['reactiva']) == 1: peri = self.find_unic_terme_periode_reactiva(consums) periodes += peri if not periodes: raise Exception( _("No s'ha pogut identificar tots els períodes de " "reactiva per facturar: %s") % ', '.join(falten) ) total = float(self.factura.EnergiaReactiva.\ ImporteTotalEnergiaReactiva.text) except AttributeError: pass return periodes, total