From b130428835c4cb48ff1b223932c25cf1a996514d Mon Sep 17 00:00:00 2001 From: TheManus88 Date: Fri, 27 Sep 2024 20:18:55 -0600 Subject: [PATCH 1/3] add data to reports --- src/app.module.ts | 4 ++ src/reportes/ParticipacionAlumno.interface.ts | 5 +++ src/reportes/participacionAlumno.service.ts | 44 +++++++++++++++++++ src/reportes/reportes.controller.ts | 18 ++++++++ src/reportes/reportes.module.ts | 14 ++++++ 5 files changed, 85 insertions(+) create mode 100644 src/reportes/ParticipacionAlumno.interface.ts create mode 100644 src/reportes/participacionAlumno.service.ts create mode 100644 src/reportes/reportes.controller.ts create mode 100644 src/reportes/reportes.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index 6e48e06..1a790e6 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -23,6 +23,8 @@ import { LineasProgramaticasModule } from './lineasProgramaticas/lineasProgramat import { CarreraModule } from './carrera/carreras.module'; import { ComentariosModule } from './comentarios/comentarios.module'; import { ComentarioLineasProgramaticas } from './entities/comentarioLineasProgramaticas.entity'; +import { ReportesController } from './reportes/reportes.controller'; +import { ReportesModule } from './reportes/reportes.module'; config({ path: '.env' }); @Module({ imports: [ @@ -32,6 +34,7 @@ config({ path: '.env' }); ComentariosModule, LineasProgramaticasModule, CarreraModule, + ReportesModule, ConfigModule.forRoot({ isGlobal: true, }), @@ -64,6 +67,7 @@ config({ path: '.env' }); UsuarioController, EjesEstrategicosController, LineasProgramaticasController, + ReportesController, ], providers: [AppService, EjesEstrategicosService, LineasProgramaticasService], }) diff --git a/src/reportes/ParticipacionAlumno.interface.ts b/src/reportes/ParticipacionAlumno.interface.ts new file mode 100644 index 0000000..5e1d1db --- /dev/null +++ b/src/reportes/ParticipacionAlumno.interface.ts @@ -0,0 +1,5 @@ +export interface ParticipacionAlumno { + carrera: string; + participacion: number; + porcentajeParticipacion: number; +} diff --git a/src/reportes/participacionAlumno.service.ts b/src/reportes/participacionAlumno.service.ts new file mode 100644 index 0000000..38e6fc7 --- /dev/null +++ b/src/reportes/participacionAlumno.service.ts @@ -0,0 +1,44 @@ +import { Injectable } from '@nestjs/common'; +import { Repository } from 'typeorm'; +import { ParticipacionAlumno } from './ParticipacionAlumno.interface'; +import { InjectRepository } from '@nestjs/typeorm'; +import { UsuarioEntity } from '../entities/usuario.entity'; +import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity'; + +@Injectable() +export class ParticipacionService { + constructor( + @InjectRepository(UsuarioEntity) + private readonly reportesRepository: Repository, + @InjectRepository(TipoUsuarioEntity) + private readonly tUReportesRepository: Repository, + ) {} + + async getParticipacionAlumno(): Promise { + const queryBuilder = await this.reportesRepository.createQueryBuilder('u'); // Inject 'userRepository' instead + + return (await queryBuilder + .select('c.nombre AS carrera') + .addSelect('COUNT(DISTINCT u.id) AS participacion') + .addSelect( + '(COUNT(DISTINCT u.id) / (SELECT COUNT(*) FROM usuarios WHERE carrera_id = u.carrera_id AND tipo_usuario_id = 2)) * 100 AS porcentajeParticipacion', + ) + .innerJoin('u.comentarios', 'clp') + .innerJoin('u.carrera', 'c') + .where('u.tipo_usuario_id = 2') + .groupBy('c.nombre') + .getRawMany()) as ParticipacionAlumno[]; + } + + async getTotalUsuarios(): Promise { + const queryBuilder = + await this.tUReportesRepository.createQueryBuilder('tu'); // Alias for 'tipos_usuarios' + + return (await queryBuilder + .select('tu.tipo AS tipo_usuario') + .addSelect('COUNT(u.id) AS total_usuarios') + .innerJoin('tu.usuarios', 'u') // Assuming 'usuarios' is the relationship property + .groupBy('tu.id, tu.tipo') + .getRawMany()) as any[]; // Cast to the interface + } +} diff --git a/src/reportes/reportes.controller.ts b/src/reportes/reportes.controller.ts new file mode 100644 index 0000000..038e637 --- /dev/null +++ b/src/reportes/reportes.controller.ts @@ -0,0 +1,18 @@ +import { Controller, Get } from '@nestjs/common'; +import { ParticipacionAlumno } from './ParticipacionAlumno.interface'; +import { ParticipacionService } from './participacionAlumno.service'; + +@Controller('reportes') +export class ReportesController { + constructor(private readonly participacionService: ParticipacionService) {} + + @Get('participacionAlumnos') + async geParticipacionAlumno(): Promise { + return this.participacionService.getParticipacionAlumno(); + } + + @Get('totalParticipantes') + async getTotalParticipantes(): Promise { + return this.participacionService.getTotalUsuarios(); + } +} diff --git a/src/reportes/reportes.module.ts b/src/reportes/reportes.module.ts new file mode 100644 index 0000000..b31b9ca --- /dev/null +++ b/src/reportes/reportes.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { ParticipacionService } from './participacionAlumno.service'; +import { ReportesController } from './reportes.controller'; +import { UsuarioEntity } from '../entities/usuario.entity'; +import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity'; + +@Module({ + imports: [TypeOrmModule.forFeature([UsuarioEntity, TipoUsuarioEntity])], + providers: [ParticipacionService], + controllers: [ReportesController], + exports: [ParticipacionService], +}) +export class ReportesModule {} From b4ee82e6aeafe098aaacaeddb8c67654bc2bc9fc Mon Sep 17 00:00:00 2001 From: TheManus88 Date: Fri, 27 Sep 2024 20:28:44 -0600 Subject: [PATCH 2/3] total por carrera --- src/reportes/participacionAlumno.service.ts | 23 +++++++++++++++++---- src/reportes/reportes.controller.ts | 5 +++++ src/reportes/reportes.module.ts | 5 ++++- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/reportes/participacionAlumno.service.ts b/src/reportes/participacionAlumno.service.ts index 38e6fc7..022cbc9 100644 --- a/src/reportes/participacionAlumno.service.ts +++ b/src/reportes/participacionAlumno.service.ts @@ -4,6 +4,7 @@ import { ParticipacionAlumno } from './ParticipacionAlumno.interface'; import { InjectRepository } from '@nestjs/typeorm'; import { UsuarioEntity } from '../entities/usuario.entity'; import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity'; +import { Carrera } from '../entities/carreras.entity'; @Injectable() export class ParticipacionService { @@ -12,6 +13,8 @@ export class ParticipacionService { private readonly reportesRepository: Repository, @InjectRepository(TipoUsuarioEntity) private readonly tUReportesRepository: Repository, + @InjectRepository(Carrera) + private readonly carrearasReportesRepository: Repository, ) {} async getParticipacionAlumno(): Promise { @@ -32,13 +35,25 @@ export class ParticipacionService { async getTotalUsuarios(): Promise { const queryBuilder = - await this.tUReportesRepository.createQueryBuilder('tu'); // Alias for 'tipos_usuarios' - + await this.tUReportesRepository.createQueryBuilder('tu'); return (await queryBuilder .select('tu.tipo AS tipo_usuario') .addSelect('COUNT(u.id) AS total_usuarios') - .innerJoin('tu.usuarios', 'u') // Assuming 'usuarios' is the relationship property + .innerJoin('tu.usuarios', 'u') .groupBy('tu.id, tu.tipo') - .getRawMany()) as any[]; // Cast to the interface + .getRawMany()) as any[]; + } + + async getTotalAlumnos(): Promise { + const queryBuilder = + await this.carrearasReportesRepository.createQueryBuilder('c'); + + return (await queryBuilder + .select('c.nombre AS carrera') + .addSelect('COUNT(u.id) AS total_alumnos') + .innerJoin('c.usuarios', 'u') + .where('u.tipo_usuario_id = 2') + .groupBy('c.id, c.nombre') + .getRawMany()) as any[]; // Cast to } } diff --git a/src/reportes/reportes.controller.ts b/src/reportes/reportes.controller.ts index 038e637..90a9402 100644 --- a/src/reportes/reportes.controller.ts +++ b/src/reportes/reportes.controller.ts @@ -15,4 +15,9 @@ export class ReportesController { async getTotalParticipantes(): Promise { return this.participacionService.getTotalUsuarios(); } + + @Get('totalAlumnosPorCarrera') + async getTotalAlumnosPorCarrera(): Promise { + return this.participacionService.getTotalAlumnos(); + } } diff --git a/src/reportes/reportes.module.ts b/src/reportes/reportes.module.ts index b31b9ca..2d306d7 100644 --- a/src/reportes/reportes.module.ts +++ b/src/reportes/reportes.module.ts @@ -4,9 +4,12 @@ import { ParticipacionService } from './participacionAlumno.service'; import { ReportesController } from './reportes.controller'; import { UsuarioEntity } from '../entities/usuario.entity'; import { TipoUsuarioEntity } from '../entities/tipoUsuario.entity'; +import { Carrera } from '../entities/carreras.entity'; @Module({ - imports: [TypeOrmModule.forFeature([UsuarioEntity, TipoUsuarioEntity])], + imports: [ + TypeOrmModule.forFeature([UsuarioEntity, TipoUsuarioEntity, Carrera]), + ], providers: [ParticipacionService], controllers: [ReportesController], exports: [ParticipacionService], From 2b2834e121256ef739b75c6bbf0804541699ee13 Mon Sep 17 00:00:00 2001 From: TheManus88 Date: Fri, 27 Sep 2024 21:09:38 -0600 Subject: [PATCH 3/3] add participacion trabajadores --- src/reportes/participacionAlumno.service.ts | 18 +++++++++++++++++- src/reportes/reportes.controller.ts | 5 +++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/reportes/participacionAlumno.service.ts b/src/reportes/participacionAlumno.service.ts index 022cbc9..26ed26d 100644 --- a/src/reportes/participacionAlumno.service.ts +++ b/src/reportes/participacionAlumno.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { Repository } from 'typeorm'; +import { Repository, SelectQueryBuilder } from 'typeorm'; import { ParticipacionAlumno } from './ParticipacionAlumno.interface'; import { InjectRepository } from '@nestjs/typeorm'; import { UsuarioEntity } from '../entities/usuario.entity'; @@ -33,6 +33,22 @@ export class ParticipacionService { .getRawMany()) as ParticipacionAlumno[]; } + async getParticipacionTrabajador(): Promise> { + const result = await this.reportesRepository + .createQueryBuilder('usuarios') + .select('COUNT(DISTINCT usuarios.id)', 'Participacion Trabajadores') + .addSelect( + ` + (COUNT(DISTINCT usuarios.id) * 100.0 / (SELECT COUNT(*) FROM usuarios WHERE usuarios.tipo_usuario_id = 3)) AS PorcentajeParticipacion + `, + ) + .innerJoin('usuarios.comentarios', 'clp') + .where('usuarios.tipo_usuario_id = 3') + .getRawOne(); + + return result; + } + async getTotalUsuarios(): Promise { const queryBuilder = await this.tUReportesRepository.createQueryBuilder('tu'); diff --git a/src/reportes/reportes.controller.ts b/src/reportes/reportes.controller.ts index 90a9402..f10b561 100644 --- a/src/reportes/reportes.controller.ts +++ b/src/reportes/reportes.controller.ts @@ -11,6 +11,11 @@ export class ReportesController { return this.participacionService.getParticipacionAlumno(); } + @Get('participacionTrabajador') + async geParticipacionTrabajador(): Promise { + return this.participacionService.getParticipacionTrabajador(); + } + @Get('totalParticipantes') async getTotalParticipantes(): Promise { return this.participacionService.getTotalUsuarios();