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]
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 )
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 )
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)
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)
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)
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 )
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 )
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:] ]
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 )
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)
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 )
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)
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)
def details(self, key): return self.canvis.setdefault(key, ns())
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')