Merge branch 'Axel' of repositorio.acatlan.unam.mx:IO/api-AT

This commit is contained in:
2026-04-06 14:42:00 -05:00
2 changed files with 112 additions and 21 deletions
@@ -59,11 +59,26 @@ export class AlumnoInscritoController {
return this.alumnoInscritoService.findById(id_cuenta); return this.alumnoInscritoService.findById(id_cuenta);
} }
@Get('inscritos/:inicio/:fin') @Get('inscritos/periodo/:inicio/:fin')
findAllInscritosByRango( findByPeriodo(
@Param('inicio', ParseIntPipe) inicio: number, @Param('inicio', ParseIntPipe) inicio: number,
@Param('fin', ParseIntPipe) fin: number, @Param('fin', ParseIntPipe) fin: number,
) { ) {
return this.alumnoInscritoService.findAllInscritosByRango(inicio, fin); return this.alumnoInscritoService.findAllInscritosByRango(inicio, fin, 'periodo');
}
@Get('inscritos/anio/:inicio/:fin')
findByAnio(
@Param('inicio', ParseIntPipe) inicio: number,
@Param('fin', ParseIntPipe) fin: number,
) {
return this.alumnoInscritoService.findAllInscritosByRango(inicio, fin, 'anio');
}
@Get('inscritos/mes/:anio')
findByMes(
@Param('anio', ParseIntPipe) anio: number,
) {
return this.alumnoInscritoService.findAllInscritosByRango(anio, 0, 'mes');
} }
} }
+94 -18
View File
@@ -231,22 +231,28 @@ async findAllInscritos(idPeriodo: number) {
const create = repo.create(data); const create = repo.create(data);
return await repo.save(create); return await repo.save(create);
} }
async findAllInscritosByRango(
async findAllInscritosByRango( inicio: number,
idPeriodoInicio: number, fin: number,
idPeriodoFin: number, tipo: 'periodo' | 'mes' | 'anio',
) { ) {
return this.alumnoInscritoRepo const qb = this.alumnoInscritoRepo
.createQueryBuilder('inscritos') .createQueryBuilder('inscritos')
.innerJoin('inscritos.alumno', 'alumno') .innerJoin('inscritos.alumno', 'alumno')
.innerJoin('alumno.carrera', 'carrera') .innerJoin('alumno.carrera', 'carrera')
.innerJoin('inscritos.plataforma', 'plataforma') .innerJoin('inscritos.plataforma', 'plataforma')
.innerJoin('inscritos.periodo', 'periodo') .innerJoin('inscritos.periodo', 'periodo');
.where('periodo.id_periodo BETWEEN :inicio AND :fin', {
inicio: idPeriodoInicio, // ============================
fin: idPeriodoFin, // 🟢 PERIODO
}) // ============================
.select([ if (tipo === 'periodo') {
qb.where('periodo.id_periodo BETWEEN :inicio AND :fin', {
inicio,
fin,
});
qb.select([
'periodo.id_periodo AS id_periodo', 'periodo.id_periodo AS id_periodo',
'periodo.semestre AS semestre', 'periodo.semestre AS semestre',
'carrera.carrera AS carrera', 'carrera.carrera AS carrera',
@@ -263,11 +269,81 @@ async findAllInscritos(idPeriodo: number) {
END) AS masculino`, END) AS masculino`,
'COUNT(DISTINCT alumno.id_cuenta) AS total', 'COUNT(DISTINCT alumno.id_cuenta) AS total',
]) ]);
.groupBy('periodo.id_periodo')
.addGroupBy('carrera.carrera') qb.groupBy('periodo.id_periodo')
.addGroupBy('plataforma.nombre') .addGroupBy('carrera.carrera')
.orderBy('periodo.id_periodo', 'ASC') .addGroupBy('plataforma.nombre')
.getRawMany(); .orderBy('periodo.id_periodo', 'ASC');
} }
// ============================
// 🔵 AÑO
// ============================
else if (tipo === 'anio') {
qb.where(
'periodo.fecha_inicio_servicio BETWEEN :inicio AND :fin',
{
inicio: `${inicio}-01-01`,
fin: `${fin}-12-31`,
},
);
qb.select([
'YEAR(periodo.fecha_inicio_servicio) AS semestre',
'carrera.carrera AS carrera',
'plataforma.nombre AS profesor',
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('F', 'Femenino')
THEN alumno.id_cuenta
END) AS femenino`,
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('M', 'Masculino')
THEN alumno.id_cuenta
END) AS masculino`,
'COUNT(DISTINCT alumno.id_cuenta) AS total',
]);
qb.groupBy('YEAR(periodo.fecha_inicio_servicio)')
.addGroupBy('carrera.carrera')
.addGroupBy('plataforma.nombre')
.orderBy('YEAR(periodo.fecha_inicio_servicio)', 'ASC')
}
// ============================
// 🟡 MES (UN SOLO AÑO)
// ============================
else if (tipo === 'mes') {
qb.where('YEAR(periodo.fecha_inicio_servicio) = :anio', {
anio: inicio, // aquí "inicio" es el año
});
qb.select([
'MONTH(periodo.fecha_inicio_servicio) AS semestre',
'carrera.carrera AS carrera',
'plataforma.nombre AS profesor',
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('F', 'Femenino')
THEN alumno.id_cuenta
END) AS femenino`,
`COUNT(DISTINCT CASE
WHEN alumno.genero IN ('M', 'Masculino')
THEN alumno.id_cuenta
END) AS masculino`,
'COUNT(DISTINCT alumno.id_cuenta) AS total',
]);
qb.groupBy('MONTH(periodo.fecha_inicio_servicio)')
.addGroupBy('carrera.carrera')
.addGroupBy('plataforma.nombre')
.orderBy('YEAR(periodo.fecha_inicio_servicio)', 'ASC')
}
return qb.getRawMany();
} }
}