4 Commits

4 changed files with 228 additions and 30 deletions
@@ -1,4 +1,4 @@
import { Controller, Get, Post, Body, Param, Patch, UseGuards } from '@nestjs/common'; import { Controller, Get, Post, Body, Param, Patch, UseGuards, ParseIntPipe } from '@nestjs/common';
import { AlumnoInscritoService } from './alumno_inscrito.service'; import { AlumnoInscritoService } from './alumno_inscrito.service';
import { import {
CreateAlumnoInscritoDto, CreateAlumnoInscritoDto,
@@ -58,4 +58,27 @@ export class AlumnoInscritoController {
): Promise<AlumnoInscrito[]> { ): Promise<AlumnoInscrito[]> {
return this.alumnoInscritoService.findById(id_cuenta); return this.alumnoInscritoService.findById(id_cuenta);
} }
@Get('inscritos/periodo/:inicio/:fin')
findByPeriodo(
@Param('inicio', ParseIntPipe) inicio: number,
@Param('fin', ParseIntPipe) fin: number,
) {
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');
}
} }
+136 -26
View File
@@ -61,31 +61,26 @@ export class AlumnoInscritoService {
take: 100, take: 100,
}); });
} }
async findAllInscritos(idPeriodo: number) {
async findAllInscritos(idPeriodo: number) { return this.alumnoInscritoRepo
return this.alumnoInscritoRepo .createQueryBuilder('inscritos')
.createQueryBuilder('inscritos') .innerJoin('inscritos.alumno', 'alumno')
.innerJoin('alumno.carrera', 'carrera')
.innerJoin('inscritos.alumno', 'alumno') .innerJoin('inscritos.plataforma', 'plataforma')
.innerJoin('alumno.carrera', 'carrera') .innerJoin('inscritos.periodo', 'periodo')
.innerJoin('inscritos.plataforma', 'plataforma') .where('periodo.id_periodo = :idPeriodo', { idPeriodo })
.innerJoin('inscritos.periodo', 'periodo') .select([
'carrera.carrera AS carrera',
.where('periodo.id_periodo = :idPeriodo', { idPeriodo }) 'periodo.semestre AS semestre',
'plataforma.nombre AS profesor',
.select([ 'COUNT(DISTINCT CASE WHEN alumno.genero IN (\'F\', \'Femenino\') THEN alumno.id_cuenta END) AS femenino',
'carrera.carrera AS carrera', 'COUNT(DISTINCT CASE WHEN alumno.genero IN (\'M\', \'Masculino\') THEN alumno.id_cuenta END) AS masculino',
'alumno.genero AS genero', 'COUNT(DISTINCT alumno.id_cuenta) AS total'
'plataforma.nombre AS profesor', ])
'COUNT(DISTINCT alumno.id_cuenta) AS total' .groupBy('carrera.carrera')
]) .addGroupBy('plataforma.nombre')
.getRawMany();
.groupBy('carrera.carrera') }
.addGroupBy('alumno.genero')
.addGroupBy('plataforma.nombre')
.getRawMany();
}
async findAllPlataforma() { async findAllPlataforma() {
return this.plataformaRepo.find(); return this.plataformaRepo.find();
@@ -199,7 +194,7 @@ export class AlumnoInscritoService {
} }
} }
//Borrar
async addTimeBorrar( async addTimeBorrar(
idCuenta: number, idCuenta: number,
idPlataforma: number, idPlataforma: number,
@@ -236,4 +231,119 @@ export class AlumnoInscritoService {
const create = repo.create(data); const create = repo.create(data);
return await repo.save(create); return await repo.save(create);
} }
async findAllInscritosByRango(
inicio: number,
fin: number,
tipo: 'periodo' | 'mes' | 'anio',
) {
const qb = this.alumnoInscritoRepo
.createQueryBuilder('inscritos')
.innerJoin('inscritos.alumno', 'alumno')
.innerJoin('alumno.carrera', 'carrera')
.innerJoin('inscritos.plataforma', 'plataforma')
.innerJoin('inscritos.periodo', 'periodo');
// ============================
// 🟢 PERIODO
// ============================
if (tipo === 'periodo') {
qb.where('periodo.id_periodo BETWEEN :inicio AND :fin', {
inicio,
fin,
});
qb.select([
'periodo.id_periodo AS id_periodo',
'periodo.semestre 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('periodo.id_periodo')
.addGroupBy('carrera.carrera')
.addGroupBy('plataforma.nombre')
.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();
} }
}
+21 -2
View File
@@ -1,4 +1,4 @@
import { Body, Controller, Delete, Get, Param, Patch, Post, Put, UseGuards } from '@nestjs/common'; import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, UseGuards } from '@nestjs/common';
import { PeriodoService } from './periodo.service'; import { PeriodoService } from './periodo.service';
import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto'; import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto';
import { JwtAuthGuard } from 'src/user/jwt.guard'; import { JwtAuthGuard } from 'src/user/jwt.guard';
@@ -20,7 +20,7 @@ export class PeriodoController {
@UseGuards(JwtAuthGuard, RolesGuard) @UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR) @Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Post() @Post()
create(@Body() data: CreatePeriodoDto) { create(@Body() data: CreatePeriodoDto) {
return this.periodoService.create(data); return this.periodoService.create(data);
} }
@@ -37,4 +37,23 @@ export class PeriodoController {
modifiedDate(@Body() data: ModifiedDateDto, @Param("id_periodo") id_periodo: number) { modifiedDate(@Body() data: ModifiedDateDto, @Param("id_periodo") id_periodo: number) {
return this.periodoService.modifiedDate(data, id_periodo) return this.periodoService.modifiedDate(data, id_periodo)
} }
@UseGuards(JwtAuthGuard, RolesGuard)
@Roles(Role.ADMINISTRADOR, Role.SUPER_ADMINISTRADOR)
@Get('compare')
compare(
@Query('p1') p1: number,
@Query('p2') p2: number,
) {
return this.periodoService.comparePeriodos(p1, p2);
}
@Get('range')
getRange(
@Query('p1') p1: number,
@Query('p2') p2: number,
) {
return this.periodoService.getPeriodosEnRango(p1, p2);
}
} }
+47 -1
View File
@@ -1,7 +1,7 @@
import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { Periodo } from './entities/periodo.entity'; import { Periodo } from './entities/periodo.entity';
import { Repository } from 'typeorm'; import { Between, Repository } from 'typeorm';
import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto'; import { CreatePeriodoDto, ModifiedDateDto } from './dto/create-periodo.dto';
@Injectable() @Injectable()
@@ -69,4 +69,50 @@ export class PeriodoService {
async modifiedDate(data: ModifiedDateDto, id_periodo) { async modifiedDate(data: ModifiedDateDto, id_periodo) {
return this.periodoRepository.update(id_periodo, data) return this.periodoRepository.update(id_periodo, data)
} }
async comparePeriodos(id1: number, id2: number) {
const periodo1 = await this.periodoRepository.findOne({
where: { id_periodo: id1 },
});
const periodo2 = await this.periodoRepository.findOne({
where: { id_periodo: id2 },
});
if (!periodo1 || !periodo2) {
throw new NotFoundException('Uno de los periodos no existe');
}
return {
periodo1: {
id: periodo1.id_periodo,
nombre: periodo1.semestre,
fecha_inicio: periodo1.fecha_inicio_servicio,
fecha_fin: periodo1.fecha_fin_servicio,
},
periodo2: {
id: periodo2.id_periodo,
nombre: periodo2.semestre,
fecha_inicio: periodo2.fecha_inicio_servicio,
fecha_fin: periodo2.fecha_fin_servicio,
},
};
} }
async getPeriodosEnRango(id1: number, id2: number) {
const min = Math.min(id1, id2);
const max = Math.max(id1, id2);
return this.periodoRepository.find({
where: {
id_periodo: Between(min, max),
},
order: {
id_periodo: 'ASC',
},
});
}
}