Exemple #1
0
 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)
Exemple #2
0
 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
Exemple #3
0
    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
Exemple #4
0
    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