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 {}