new ep findAllInscritos and findByDate

This commit is contained in:
2026-02-17 19:21:29 -06:00
parent ece4c9a2f2
commit 296b1d9121
6 changed files with 103 additions and 49 deletions
@@ -1,14 +1,13 @@
import { Controller, Get, Post, Body, Param, Patch } from '@nestjs/common';
import { AlumnoInscritoService } from './alumno_inscrito.service';
import {
AddTimeDto,
CreateAlumnoInscritoDto,
} from './dto/create-alumno_inscrito.dto';
import { AlumnoInscrito } from './entities/alumno_inscrito.entity';
@Controller('alumno-inscrito')
export class AlumnoInscritoController {
constructor(private readonly alumnoInscritoService: AlumnoInscritoService) {}
constructor(private readonly alumnoInscritoService: AlumnoInscritoService) { }
@Post()
async create(@Body() dto: CreateAlumnoInscritoDto): Promise<AlumnoInscrito> {
@@ -20,6 +19,11 @@ export class AlumnoInscritoController {
return this.alumnoInscritoService.findAll();
}
@Get("/inscritos/:idPeriodo")
async findAllInscritos(@Param('idPeriodo') idPeriodo:number) {
return this.alumnoInscritoService.findAllInscritos(idPeriodo);
}
// @Post('/tiempo')
// async addTime(@Body() body: AddTimeDto) {
// const { idCuenta, idPlataforma, tiempoExtra } = body;
+30 -1
View File
@@ -17,7 +17,7 @@ export class AlumnoInscritoService {
@InjectRepository(Plataforma)
private readonly plataformaRepo: Repository<Plataforma>,
private readonly periodoService: PeriodoService,
) {}
) { }
async createWhitoutPay(
dto: CreateAlumnoInscritoDto,
@@ -55,6 +55,35 @@ export class AlumnoInscritoService {
});
}
async findAllInscritos(idPeriodo: number) {
return this.alumnoInscritoRepo
.createQueryBuilder('inscritos')
// Relaciones
.innerJoin('inscritos.alumno', 'alumno')
.innerJoin('alumno.carrera', 'carrera')
.innerJoin('inscritos.plataforma', 'plataforma')
.innerJoin('inscritos.periodo', 'periodo')
// Filtro por periodo
.where('periodo.id_periodo = :idPeriodo', { idPeriodo })
// Selecciones
.select([
'carrera.carrera AS carrera',
'alumno.genero AS genero',
'plataforma.nombre AS profesor',
'COUNT(DISTINCT alumno.id_cuenta) AS total'
])
// Agrupaciones
.groupBy('carrera.carrera')
.addGroupBy('alumno.genero')
.addGroupBy('plataforma.nombre')
.getRawMany();
}
async findAllPlataforma() {
return this.plataformaRepo.find();
}
@@ -8,11 +8,11 @@ import {
Delete,
} from '@nestjs/common';
import { BitacoraMesaService } from './bitacora_mesa.service';
import { CreateBitacoraMesaDto } from './dto/create-bitacora_mesa.dto';
import { CreateBitacoraMesaDto, FindByDate } from './dto/create-bitacora_mesa.dto';
@Controller('bitacora-mesa')
export class BitacoraMesaController {
constructor(private readonly bitacoraMesaService: BitacoraMesaService) {}
constructor(private readonly bitacoraMesaService: BitacoraMesaService) { }
@Post()
assignment(@Body() createBitacoraMesaDto: CreateBitacoraMesaDto) {
@@ -39,6 +39,11 @@ export class BitacoraMesaController {
return this.bitacoraMesaService.findByTable(id_mesa);
}
@Post('/date')
findByDate(@Body() data: FindByDate) {
return this.bitacoraMesaService.findByDate(data.date);
}
@Patch('cancelar/:id')
cancelationByMachine(
@Param('id') id: number,
+54 -42
View File
@@ -2,7 +2,7 @@ import { Injectable, NotFoundException } from '@nestjs/common';
import { CreateBitacoraMesaDto } from './dto/create-bitacora_mesa.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { BitacoraMesa } from './entities/bitacora_mesa.entity';
import { Repository } from 'typeorm';
import { Repository, Between } from 'typeorm';
import { BadRequestException } from '@nestjs/common';
@@ -11,42 +11,42 @@ export class BitacoraMesaService {
constructor(
@InjectRepository(BitacoraMesa)
private readonly bitacoraMesaRepository: Repository<BitacoraMesa>,
) {}
) { }
async assignment(dto: CreateBitacoraMesaDto) {
async assignment(dto: CreateBitacoraMesaDto) {
// VALIDAR: el alumno ya tiene una mesa activa
const alumnoConMesa = await this.bitacoraMesaRepository
.createQueryBuilder('bitacora')
.where('bitacora.id_alumno_inscrito = :id_alumno_inscrito', {
id_alumno_inscrito: dto.id_alumno_inscrito,
})
.andWhere(
`TIMESTAMPDIFF(
// VALIDAR: el alumno ya tiene una mesa activa
const alumnoConMesa = await this.bitacoraMesaRepository
.createQueryBuilder('bitacora')
.where('bitacora.id_alumno_inscrito = :id_alumno_inscrito', {
id_alumno_inscrito: dto.id_alumno_inscrito,
})
.andWhere(
`TIMESTAMPDIFF(
SECOND,
NOW(),
DATE_ADD(bitacora.tiempo_entrada, INTERVAL bitacora.tiempo_asignado MINUTE)
) > 0`,
)
.getOne();
)
.getOne();
if (alumnoConMesa) {
throw new BadRequestException(
'El alumno ya tiene una mesa asignada',
);
if (alumnoConMesa) {
throw new BadRequestException(
'El alumno ya tiene una mesa asignada',
);
}
const bitacora = this.bitacoraMesaRepository.create({
tiempo_entrada: new Date(),
tiempo_asignado: dto.tiempo_asignado,
mesa: { id_mesa: dto.id_mesa },
alumno_inscrito: { id_alumno_inscrito: dto.id_alumno_inscrito },
});
return this.bitacoraMesaRepository.save(bitacora);
}
const bitacora = this.bitacoraMesaRepository.create({
tiempo_entrada: new Date(),
tiempo_asignado: dto.tiempo_asignado,
mesa: { id_mesa: dto.id_mesa },
alumno_inscrito: { id_alumno_inscrito: dto.id_alumno_inscrito },
});
return this.bitacoraMesaRepository.save(bitacora);
}
findAll() {
return this.bitacoraMesaRepository.find({
relations: ['mesa', 'alumno_inscrito'],
@@ -81,7 +81,7 @@ export class BitacoraMesaService {
return student;
}
async findByTable(id_mesa: number) {
async findByTable(id_mesa: number) {
const student = await this.bitacoraMesaRepository
.createQueryBuilder('bitacora')
.leftJoinAndSelect('bitacora.alumno_inscrito', 'alumnoInscrito')
@@ -104,19 +104,31 @@ export class BitacoraMesaService {
return student;
}
async cancelation(id_bitacora_mesa: number, nuevoTiempo: number) {
const bitacora = await this.bitacoraMesaRepository.findOne({
where: { id_bitacora_mesa },
});
async findByDate(date) {
const start = new Date(`${date}T00:00:00`);
const end = new Date(`${date}T23:59:59`);
if (!bitacora) {
throw new NotFoundException('Mesa no encontrada');
}
return this.bitacoraMesaRepository.find({
where: {
tiempo_entrada: Between(start, end),
},
})
bitacora.tiempo_asignado -= nuevoTiempo;
await this.bitacoraMesaRepository.save(bitacora);
return { message: 'Tiempo cancelado' };
}
}
async cancelation(id_bitacora_mesa: number, nuevoTiempo: number) {
const bitacora = await this.bitacoraMesaRepository.findOne({
where: { id_bitacora_mesa },
});
if (!bitacora) {
throw new NotFoundException('Mesa no encontrada');
}
bitacora.tiempo_asignado -= nuevoTiempo;
await this.bitacoraMesaRepository.save(bitacora);
return { message: 'Tiempo cancelado' };
}
}
@@ -1,4 +1,4 @@
import { IsInt, IsPositive } from 'class-validator';
import { IsDateString, IsInt, IsPositive } from 'class-validator';
export class CreateBitacoraMesaDto {
@IsInt()
@@ -12,4 +12,9 @@ export class CreateBitacoraMesaDto {
@IsInt()
@IsPositive()
id_alumno_inscrito: number;
}
export class FindByDate {
@IsDateString()
date: string;
}
@@ -19,7 +19,6 @@ export class BitacoraMesa {
@Column({ name: 'tiempo_entrada', type: 'datetime' })
tiempo_entrada: Date;
@ManyToOne(() => Mesa)
@JoinColumn({ name: 'id_mesa' })
mesa: Mesa;