Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d0217b445b | |||
| 0b984f1a9e | |||
| 5b5d552b0c | |||
| b154d1fb93 |
@@ -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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user