diff --git a/src/alumno_inscrito/alumno_inscrito.controller.ts b/src/alumno_inscrito/alumno_inscrito.controller.ts index 0e2ba2d..fba3a78 100644 --- a/src/alumno_inscrito/alumno_inscrito.controller.ts +++ b/src/alumno_inscrito/alumno_inscrito.controller.ts @@ -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 { @@ -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; diff --git a/src/alumno_inscrito/alumno_inscrito.service.ts b/src/alumno_inscrito/alumno_inscrito.service.ts index 81ed139..94cf9e5 100644 --- a/src/alumno_inscrito/alumno_inscrito.service.ts +++ b/src/alumno_inscrito/alumno_inscrito.service.ts @@ -17,7 +17,7 @@ export class AlumnoInscritoService { @InjectRepository(Plataforma) private readonly plataformaRepo: Repository, 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(); } diff --git a/src/bitacora_mesa/bitacora_mesa.controller.ts b/src/bitacora_mesa/bitacora_mesa.controller.ts index e1ad2bd..79cc6f1 100644 --- a/src/bitacora_mesa/bitacora_mesa.controller.ts +++ b/src/bitacora_mesa/bitacora_mesa.controller.ts @@ -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, diff --git a/src/bitacora_mesa/bitacora_mesa.service.ts b/src/bitacora_mesa/bitacora_mesa.service.ts index 5544330..892a19a 100644 --- a/src/bitacora_mesa/bitacora_mesa.service.ts +++ b/src/bitacora_mesa/bitacora_mesa.service.ts @@ -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, - ) {} + ) { } - 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' }; +} } diff --git a/src/bitacora_mesa/dto/create-bitacora_mesa.dto.ts b/src/bitacora_mesa/dto/create-bitacora_mesa.dto.ts index f275ace..0b7189a 100644 --- a/src/bitacora_mesa/dto/create-bitacora_mesa.dto.ts +++ b/src/bitacora_mesa/dto/create-bitacora_mesa.dto.ts @@ -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; } \ No newline at end of file diff --git a/src/bitacora_mesa/entities/bitacora_mesa.entity.ts b/src/bitacora_mesa/entities/bitacora_mesa.entity.ts index 6edd0ce..bc50e99 100644 --- a/src/bitacora_mesa/entities/bitacora_mesa.entity.ts +++ b/src/bitacora_mesa/entities/bitacora_mesa.entity.ts @@ -19,7 +19,6 @@ export class BitacoraMesa { @Column({ name: 'tiempo_entrada', type: 'datetime' }) tiempo_entrada: Date; - @ManyToOne(() => Mesa) @JoinColumn({ name: 'id_mesa' }) mesa: Mesa;