diff --git a/src/app.module.ts b/src/app.module.ts index b95d085..c9372a6 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'; import { Direccion } from './entities/direccion.entity'; import { DireccionModule } from './direccion/direccion.module'; config({ path: '.env' }); @@ -34,6 +36,7 @@ config({ path: '.env' }); ComentariosModule, LineasProgramaticasModule, CarreraModule, + ReportesModule, DireccionModule, ConfigModule.forRoot({ isGlobal: true, @@ -68,6 +71,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..26ed26d --- /dev/null +++ b/src/reportes/participacionAlumno.service.ts @@ -0,0 +1,75 @@ +import { Injectable } from '@nestjs/common'; +import { Repository, SelectQueryBuilder } from 'typeorm'; +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 { + constructor( + @InjectRepository(UsuarioEntity) + private readonly reportesRepository: Repository, + @InjectRepository(TipoUsuarioEntity) + private readonly tUReportesRepository: Repository, + @InjectRepository(Carrera) + private readonly carrearasReportesRepository: 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 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'); + return (await queryBuilder + .select('tu.tipo AS tipo_usuario') + .addSelect('COUNT(u.id) AS total_usuarios') + .innerJoin('tu.usuarios', 'u') + .groupBy('tu.id, tu.tipo') + .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 new file mode 100644 index 0000000..f10b561 --- /dev/null +++ b/src/reportes/reportes.controller.ts @@ -0,0 +1,28 @@ +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('participacionTrabajador') + async geParticipacionTrabajador(): Promise { + return this.participacionService.getParticipacionTrabajador(); + } + + @Get('totalParticipantes') + 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 new file mode 100644 index 0000000..2d306d7 --- /dev/null +++ b/src/reportes/reportes.module.ts @@ -0,0 +1,17 @@ +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'; +import { Carrera } from '../entities/carreras.entity'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([UsuarioEntity, TipoUsuarioEntity, Carrera]), + ], + providers: [ParticipacionService], + controllers: [ReportesController], + exports: [ParticipacionService], +}) +export class ReportesModule {}