Esempio n. 1
0
		def queryOneOrEmpty(aQuery, **vars):
			many = query(aQuery, **vars)
			if not many: return ns()
			if len(many) is not 1:
				warn("S'esperava un sol registre o cap i s'han trobat {}\n"
					"A la query:\n{}\nAmb:\n{}"
					.format(len(many),aQuery,ns(vars).dump()))
			return many[0]
Esempio n. 2
0
	def test_genera_rejectedRequest_multipleDistros(self) :
		informe = SwichingReport(
			CodigoAgente='R2-415',
			TipoMercado='E',
			TipoAgente='C',
			Periodo='201501',
			)
		informe.fillRejected( [
			ns(
				nprocessos=300,
				ontime=300,
				late=0,
				verylate=0, 
				ontimeaddedtime=450,
				lateaddedtime=0,
				verylateaddedtime=0,
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-001',
				rejectreason='03',
				),
			ns(
				nprocessos=200,
				ontime=200,
				late=0,
				verylate=0, 
				ontimeaddedtime=1000,
				lateaddedtime=0,
				verylateaddedtime=0,
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-002',
				rejectreason='01',
				),
			])
		self.assertXmlEqual(
			informe.genera(),
			self.head + self.summaryHead +
			"""\
			<DetalleRechazadas>
				<TipoRetraso>00</TipoRetraso>
				<TMSolicitudesRechazadas>1.5</TMSolicitudesRechazadas>
				<MotivoRechazo>03</MotivoRechazo>
				<NumSolicitudesRechazadas>300</NumSolicitudesRechazadas>
			</DetalleRechazadas>
""" + self.secondSummaryHeader + """\
			<DetalleRechazadas>
				<TipoRetraso>00</TipoRetraso>
				<TMSolicitudesRechazadas>5.0</TMSolicitudesRechazadas>
				<MotivoRechazo>01</MotivoRechazo>
				<NumSolicitudesRechazadas>200</NumSolicitudesRechazadas>
			</DetalleRechazadas>
""" + self.summaryFoot + self.foot
			)
Esempio n. 3
0
	def test_genera_solicitudsPendents_diversesComercialitzadores(self) :
		informe = SwichingReport(
			CodigoAgente='R2-415',
			TipoMercado='E',
			TipoAgente='C',
			Periodo='201501',
			)
		informe.fillPending( [
			ns(
				nprocessos=300,
				ontime=300,
				late=0,
				verylate=0, 
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-001',
				),
			ns(
				nprocessos=600,
				ontime=100,
				late=200,
				verylate=300, 
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-002',
				),
			])

		self.assertXmlEqual(
			informe.genera(),
			self.head +
			self.summaryHead +
			"""\
			<DetallePendientesRespuesta>
				<TipoRetraso>00</TipoRetraso>
				<NumSolicitudesPendientes>300</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
""" + self.secondSummaryHeader + """\
			<DetallePendientesRespuesta>
				<TipoRetraso>00</TipoRetraso>
				<NumSolicitudesPendientes>100</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>05</TipoRetraso>
				<NumSolicitudesPendientes>200</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>15</TipoRetraso>
				<NumSolicitudesPendientes>300</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
""" + self.summaryFoot + self.foot
			)
Esempio n. 4
0
    def test_genera_rejectedRequest_multipleDistros(self):
        informe = SwichingReport(
            CodigoAgente='R2-415',
            TipoMercado='E',
            TipoAgente='C',
            Periodo='201501',
        )
        informe.fillRejected([
            ns(
                nprocessos=300,
                ontime=300,
                late=0,
                verylate=0,
                ontimeaddedtime=450,
                lateaddedtime=0,
                verylateaddedtime=0,
                codiprovincia='08',
                tarname='2.0DHA',
                tipocambio='C3',
                tipopunto='1',
                refdistribuidora='R1-001',
                rejectreason='03',
            ),
            ns(
                nprocessos=200,
                ontime=200,
                late=0,
                verylate=0,
                ontimeaddedtime=1000,
                lateaddedtime=0,
                verylateaddedtime=0,
                codiprovincia='08',
                tarname='2.0DHA',
                tipocambio='C3',
                tipopunto='1',
                refdistribuidora='R1-002',
                rejectreason='01',
            ),
        ])
        self.assertXmlEqual(
            informe.genera(), self.head + self.summaryHead + """\
			<DetalleRechazadas>
				<TipoRetraso>00</TipoRetraso>
				<TMSolicitudesRechazadas>1.5</TMSolicitudesRechazadas>
				<MotivoRechazo>03</MotivoRechazo>
				<NumSolicitudesRechazadas>300</NumSolicitudesRechazadas>
			</DetalleRechazadas>
""" + self.secondSummaryHeader + """\
			<DetalleRechazadas>
				<TipoRetraso>00</TipoRetraso>
				<TMSolicitudesRechazadas>5.0</TMSolicitudesRechazadas>
				<MotivoRechazo>01</MotivoRechazo>
				<NumSolicitudesRechazadas>200</NumSolicitudesRechazadas>
			</DetalleRechazadas>
""" + self.summaryFoot + self.foot)
Esempio n. 5
0
    def test_genera_solicitudsPendents_diversesComercialitzadores(self):
        informe = SwichingReport(
            CodigoAgente='R2-415',
            TipoMercado='E',
            TipoAgente='C',
            Periodo='201501',
        )
        informe.fillPending([
            ns(
                nprocessos=300,
                ontime=300,
                late=0,
                verylate=0,
                codiprovincia='08',
                tarname='2.0DHA',
                tipocambio='C3',
                tipopunto='1',
                refdistribuidora='R1-001',
            ),
            ns(
                nprocessos=600,
                ontime=100,
                late=200,
                verylate=300,
                codiprovincia='08',
                tarname='2.0DHA',
                tipocambio='C3',
                tipopunto='1',
                refdistribuidora='R1-002',
            ),
        ])

        self.assertXmlEqual(
            informe.genera(), self.head + self.summaryHead + """\
			<DetallePendientesRespuesta>
				<TipoRetraso>00</TipoRetraso>
				<NumSolicitudesPendientes>300</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
""" + self.secondSummaryHeader + """\
			<DetallePendientesRespuesta>
				<TipoRetraso>00</TipoRetraso>
				<NumSolicitudesPendientes>100</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>05</TipoRetraso>
				<NumSolicitudesPendientes>200</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>15</TipoRetraso>
				<NumSolicitudesPendientes>300</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
""" + self.summaryFoot + self.foot)
Esempio n. 6
0
    def test_genera_activatedRequest_ontime(self):
        informe = SwichingReport(
            CodigoAgente='R2-415',
            TipoMercado='E',
            TipoAgente='C',
            Periodo='201501',
        )
        informe.fillActivated([
            ns(
                nprocessos=300,
                ontime=300,
                late=0,
                verylate=0,
                ontimeaddedtime=6000,
                lateaddedtime=0,
                verylateaddedtime=0,
                ontimeissues=0,
                lateissues=0,
                verylateissues=0,
                codiprovincia='08',
                tarname='2.0DHA',
                tipocambio='C3',
                tipopunto='1',
                refdistribuidora='R1-001',
            ),
        ])
        self.assertXmlEqual(
            informe.genera(), self.head + self.summaryHead + """\
			<DetalleActivadas>
				<TipoRetraso>00</TipoRetraso>
				<TMActivacion>20.0</TMActivacion>
				<NumIncidencias>0</NumIncidencias>
				<NumSolicitudesActivadas>300</NumSolicitudesActivadas>
			</DetalleActivadas>
""" + self.summaryFoot + self.foot)
Esempio n. 7
0
	def test_genera_activationPendingRequest_ontime(self) :
		informe = SwichingReport(
			CodigoAgente='R2-415',
			TipoMercado='E',
			TipoAgente='C',
			Periodo='201501',
			)
		informe.fillActivationPending( [
			ns(
				nprocessos=300,
				ontime=300,
				late=0,
				verylate=0, 
				ontimeissues=0,
				lateissues=0,
				verylateissues=0, 
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-001',
				),
			])
		self.assertXmlEqual(
			informe.genera(),
			self.head + self.summaryHead +
		"""\
			<DetallePdteActivacion>
				<TipoRetraso>00</TipoRetraso>
				<NumIncidencias>0</NumIncidencias>
				<NumSolicitudesPdteActivacion>300</NumSolicitudesPdteActivacion>
			</DetallePdteActivacion>
""" + self.summaryFoot + self.foot
			)
Esempio n. 8
0
	def test_genera_nonDetail(self) :
		informe = SwichingReport(
			CodigoAgente='R2-415',
			TipoMercado='E',
			TipoAgente='C',
			Periodo='201501',
			)
		informe.fillSent([
			ns(
				nreq=2,
				nprocessos=300,
				ontime=300,
				late=0,
				verylate=0, 
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-001',
				),
			])
		self.assertXmlEqual(
			informe.genera(),
			self.head+self.summaryHead2+self.summaryFoot+self.foot
			)
Esempio n. 9
0
def fetchNs(cursor):
    """Wraps a database cursor so that instead of providing data
	as arrays, it provides objects with attributes named
	as the query column names."""
    fields = [column.name for column in cursor.description]
    for row in cursor:
        yield ns(zip(fields, row))
    raise StopIteration
Esempio n. 10
0
def fetchNs(cursor):
	"""Wraps a database cursor so that instead of providing data
	as arrays, it provides objects with attributes named
	as the query column names."""
	fields = [column.name for column in cursor.description]
	for row in cursor:
		yield ns(zip(fields, row))
	raise StopIteration
def readCsvNs(filename):
    """reads a tab separated csv file as an array of namespaces
    using column headers (first line) as keys"""
    table = readCsvTable(filename)

    keys = table[0]
    return [
        ns((key, value) for key, value in zip(keys, line))
        for line in table[1:]
        ]
Esempio n. 12
0
	def test_genera_solicitudsPendents_retrasades(self) :
		informe = SwichingReport(
			CodigoAgente='R2-415',
			TipoMercado='E',
			TipoAgente='C',
			Periodo='201501',
			)
		informe.fillPending( [
			ns(
				nprocessos=600,
				ontime=100,
				late=200,
				verylate=300, 
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-002',
				),
			])

		self.assertXmlEqual(
			informe.genera(),
			self.head +
			"""\
	<SolicitudesRealizadas>
		<DatosSolicitudes>
			<Provincia>08000</Provincia>
			<Distribuidor>R1-002</Distribuidor>
			<Comer_entrante>R2-415</Comer_entrante>
			<Comer_saliente>0</Comer_saliente>
			<TipoCambio>C3</TipoCambio>
			<TipoPunto>1</TipoPunto>
			<TarifaATR>2</TarifaATR>
			<TotalSolicitudesEnviadas>0</TotalSolicitudesEnviadas>
			<SolicitudesAnuladas>0</SolicitudesAnuladas>
			<Reposiciones>0</Reposiciones>
			<ClientesSalientes>0</ClientesSalientes>
			<NumImpagados>0</NumImpagados>
			<DetallePendientesRespuesta>
				<TipoRetraso>00</TipoRetraso>
				<NumSolicitudesPendientes>100</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>05</TipoRetraso>
				<NumSolicitudesPendientes>200</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>15</TipoRetraso>
				<NumSolicitudesPendientes>300</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
		</DatosSolicitudes>
	</SolicitudesRealizadas>
""" + self.foot
			)
Esempio n. 13
0
    def test_genera_solicitudsPendents_retrasades(self):
        informe = SwichingReport(
            CodigoAgente='R2-415',
            TipoMercado='E',
            TipoAgente='C',
            Periodo='201501',
        )
        informe.fillPending([
            ns(
                nprocessos=600,
                ontime=100,
                late=200,
                verylate=300,
                codiprovincia='08',
                tarname='2.0DHA',
                tipocambio='C3',
                tipopunto='1',
                refdistribuidora='R1-002',
            ),
        ])

        self.assertXmlEqual(
            informe.genera(), self.head + """\
	<SolicitudesRealizadas>
		<DatosSolicitudes>
			<Provincia>08000</Provincia>
			<Distribuidor>R1-002</Distribuidor>
			<Comer_entrante>R2-415</Comer_entrante>
			<Comer_saliente>0</Comer_saliente>
			<TipoCambio>C3</TipoCambio>
			<TipoPunto>1</TipoPunto>
			<TarifaATR>2</TarifaATR>
			<TotalSolicitudesEnviadas>0</TotalSolicitudesEnviadas>
			<SolicitudesAnuladas>0</SolicitudesAnuladas>
			<Reposiciones>0</Reposiciones>
			<ClientesSalientes>0</ClientesSalientes>
			<NumImpagados>0</NumImpagados>
			<DetallePendientesRespuesta>
				<TipoRetraso>00</TipoRetraso>
				<NumSolicitudesPendientes>100</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>05</TipoRetraso>
				<NumSolicitudesPendientes>200</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
			<DetallePendientesRespuesta>
				<TipoRetraso>15</TipoRetraso>
				<NumSolicitudesPendientes>300</NumSolicitudesPendientes>
			</DetallePendientesRespuesta>
		</DatosSolicitudes>
	</SolicitudesRealizadas>
""" + self.foot)
Esempio n. 14
0
	def test_genera_solicitudsAcceptades_delayed(self) :
		informe = SwichingReport(
			CodigoAgente='R2-415',
			TipoMercado='E',
			TipoAgente='C',
			Periodo='201501',
			)
		informe.fillAccepted( [
			ns(
				nprocessos=300,
				ontime=0,
				late=200,
				verylate=100, 
				ontimeaddedtime=0,
				lateaddedtime=3200,
				verylateaddedtime=2000,
				codiprovincia='08',
				tarname='2.0DHA',
				tipocambio='C3',
				tipopunto='1',
				refdistribuidora='R1-001',
				),
			])

		self.assertXmlEqual(
			informe.genera(),
			self.head + self.summaryHead +
			"""\
			<DetalleAceptadas>
				<TipoRetraso>05</TipoRetraso>
				<TMSolicitudesAceptadas>16.0</TMSolicitudesAceptadas>
				<NumSolicitudesAceptadas>200</NumSolicitudesAceptadas>
			</DetalleAceptadas>
			<DetalleAceptadas>
				<TipoRetraso>15</TipoRetraso>
				<TMSolicitudesAceptadas>20.0</TMSolicitudesAceptadas>
				<NumSolicitudesAceptadas>100</NumSolicitudesAceptadas>
			</DetalleAceptadas>
""" + self.summaryFoot +  self.foot
			)
Esempio n. 15
0
    def test_genera_solicitudsAcceptades_delayed(self):
        informe = SwichingReport(
            CodigoAgente='R2-415',
            TipoMercado='E',
            TipoAgente='C',
            Periodo='201501',
        )
        informe.fillAccepted([
            ns(
                nprocessos=300,
                ontime=0,
                late=200,
                verylate=100,
                ontimeaddedtime=0,
                lateaddedtime=3200,
                verylateaddedtime=2000,
                codiprovincia='08',
                tarname='2.0DHA',
                tipocambio='C3',
                tipopunto='1',
                refdistribuidora='R1-001',
            ),
        ])

        self.assertXmlEqual(
            informe.genera(), self.head + self.summaryHead + """\
			<DetalleAceptadas>
				<TipoRetraso>05</TipoRetraso>
				<TMSolicitudesAceptadas>16.0</TMSolicitudesAceptadas>
				<NumSolicitudesAceptadas>200</NumSolicitudesAceptadas>
			</DetalleAceptadas>
			<DetalleAceptadas>
				<TipoRetraso>15</TipoRetraso>
				<TMSolicitudesAceptadas>20.0</TMSolicitudesAceptadas>
				<NumSolicitudesAceptadas>100</NumSolicitudesAceptadas>
			</DetalleAceptadas>
""" + self.summaryFoot + self.foot)
Esempio n. 16
0
 def test_genera_nonDetail(self):
     informe = SwichingReport(
         CodigoAgente='R2-415',
         TipoMercado='E',
         TipoAgente='C',
         Periodo='201501',
     )
     informe.fillSent([
         ns(
             nreq=2,
             nprocessos=300,
             ontime=300,
             late=0,
             verylate=0,
             codiprovincia='08',
             tarname='2.0DHA',
             tipocambio='C3',
             tipopunto='1',
             refdistribuidora='R1-001',
         ),
     ])
     self.assertXmlEqual(
         informe.genera(),
         self.head + self.summaryHead2 + self.summaryFoot + self.foot)
Esempio n. 17
0
 def details(self, key):
     return self.canvis.setdefault(key, ns())
Esempio n. 18
0
	def details(self, key) :
		return self.canvis.setdefault(key, ns())
                line.nif[2:],
                line.email,
                line.lang,
                0 if esPersonaFisica(line) else 1,
                line.ncontractes,
                ambPuntDeMilers(totalUse),
                ambPuntDeMilers(recommendedShares),
                ambPuntDeMilers(recommendedShares * shareUse),
                ambPuntDeMilers(recommendedInvestment),
                1 if line.already_invested else 0,
                1 if totalUse is None else 0,
                1 if totalUse * recommendedPercent < shareUse * 100 else 0,
                1 if line.essoci else 0 
            ])
        except Exception as e:
            import traceback
            error("Error processant soci {}\n{}\n{}".format(
                line.nsoci,
                e,
                "\n".join(traceback.format_stack()),
                )) 
            error(ns(cas=line).dump())








def generateMaps(year, month):
    import datetime
    import dbutils

    beginingNextMonth = (
        datetime.date(year, month+1, 1)
        if month != 12 else 
        datetime.date(year+1, 1, 1)
        ) - datetime.timedelta(days=1)

    populationPerCCAA = dict(
        (line.code, int(line.population_2014_01))
        for line in readCsvNs('poblacio_ccaa.csv')
        )
    populationPerProvincia = dict(
        (line.code, int(line.population_2015_01))
        for line in readCsvNs('poblacio_provincies-20150101.csv')
        )

#    distribucioSocis = readCsvNs("distribucio.csv")
    distribucioSocis = distribucioSocies(str(beginingNextMonth), dbutils.nsList)

    socisPerCCAA = countBy('codi_ccaa', distribucioSocis, noneValue='00')
    socisPerProvincia = countBy('codi_provincia', distribucioSocis, noneValue='00')
    socisPerMunicipi = countBy('codi_ine', distribucioSocis, noneValue='00000')
    socisPerPais = countBy('codi_pais', distribucioSocis, noneValue='00')

    relativeSocisPerCCAA = dict(
        (ccaa, socis*10000./populationPerCCAA[ccaa])
        for ccaa, socis in socisPerCCAA.items()
        )

    relativeSocisPerProvincia = dict(
        (prov, socis*10000./populationPerProvincia[prov])
        for prov, socis in socisPerProvincia.items()
	if prov in populationPerProvincia
        )


    totalSocis = sum(value for value in socisPerCCAA.values())


    months = (
        "Enero Febrero Marzo Abril Mayo Junio "
        "Julio Agosto Septiembre Octubre Noviembre Diciembre"
        ).split()


    output = ns(
        month = months[month-1].upper(),
        year = year,
        )

    step("Generant mapa amb valors absoluts")

    output.titol = ""
    output.subtitol = ""

    maxSocis = max(value for value in socisPerCCAA.values()) and 1800
    minSocis = min(value for value in socisPerCCAA.values())
    for ccaa, population in populationPerCCAA.items():
        socis = socisPerCCAA.get(ccaa,0)
        output['number_'+ccaa] = socis
        output['percent_'+ccaa] = '{:.1f}%'.format(socis*100./totalSocis).replace('.',',')
        output['color_'+ccaa] = mapColor(socis, minSocis, maxSocis)
    renderMap('SocisPerCCAA-absoluts-{:04}-{:02}'.format(year,month), output)

    step("Generant mapa amb valors relatius")

    output.titol = "Socixs/10.000 hab."
    output.subtitol = "             (datos INE 01/2014)"

    maxRelativeSocis = max(value for value in relativeSocisPerCCAA.values()) and 10.
    minRelativeSocis = min(value for value in relativeSocisPerCCAA.values())

    for ccaa, population in populationPerCCAA.items():
        relativeSoci = relativeSocisPerCCAA.get(ccaa,0)
        output['number_'+ccaa] = '{:.1f}'.format(relativeSoci).replace('.',',')
        output['color_'+ccaa] = mapColor(
            relativeSoci, minRelativeSocis, maxRelativeSocis)
        output['percent_'+ccaa] = ''
    renderMap('SocisPerCCAA-relatius-{:04}-{:02}'.format(year,month), output)


    output = ns(
        month = months[month-1].upper(),
        year = year,
        )
    step("Generant mapa per provincies amb valors absoluts")

    maxSocis = max(value for value in socisPerProvincia.values()) and 1800
    minSocis = min(value for value in socisPerProvincia.values())
    for prov, population in populationPerProvincia.items():
        socis = socisPerProvincia.get(prov,0)
        output['number_'+prov] = socis
        output['percent_'+prov] = '{:.1f}%'.format(socis*100./totalSocis).replace('.',',')
        output['color_'+prov] = mapColor(socis, minSocis, maxSocis)
    renderMap('SocisPerProvincies-absoluts-{:04}-{:02}'.format(year,month), output, 'MapaProvincias-template.svg')

    step("Generant mapa per provincies amb valors relatius")

    output.titol = "Socixs/10.000 hab."
    output.subtitol = "             (datos INE 01/2015)"

    maxRelativeSocis = max(value for value in relativeSocisPerProvincia.values()) and 10.
    minRelativeSocis = min(value for value in relativeSocisPerProvincia.values())

    for prov, population in populationPerProvincia.items():
        relativeSoci = relativeSocisPerProvincia.get(prov,0)
        output['number_'+prov] = '{:.1f}'.format(relativeSoci).replace('.',',')
        output['color_'+prov] = mapColor(
            relativeSoci, minRelativeSocis, maxRelativeSocis)
        output['percent_'+prov] = ''
    renderMap('SocisPerProvincies-relatius-{:04}-{:02}'.format(year,month), output, 'MapaProvincias-template.svg')