diff --git a/src/bitacora_mesa/bitacora_mesa.service.ts b/src/bitacora_mesa/bitacora_mesa.service.ts index 3b0c3f1..5544330 100644 --- a/src/bitacora_mesa/bitacora_mesa.service.ts +++ b/src/bitacora_mesa/bitacora_mesa.service.ts @@ -3,6 +3,8 @@ 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 { BadRequestException } from '@nestjs/common'; + @Injectable() export class BitacoraMesaService { @@ -11,17 +13,40 @@ export class BitacoraMesaService { private readonly bitacoraMesaRepository: Repository, ) {} - async assignment(dto: CreateBitacoraMesaDto) { - 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 }, - }); + async assignment(dto: CreateBitacoraMesaDto) { - return this.bitacoraMesaRepository.save(bitacora); + // 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(); + + 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); +} + findAll() { return this.bitacoraMesaRepository.find({ relations: ['mesa', 'alumno_inscrito'], diff --git a/src/bitacora_mesa/entities/bitacora_mesa.entity.ts b/src/bitacora_mesa/entities/bitacora_mesa.entity.ts index bc50e99..6edd0ce 100644 --- a/src/bitacora_mesa/entities/bitacora_mesa.entity.ts +++ b/src/bitacora_mesa/entities/bitacora_mesa.entity.ts @@ -19,6 +19,7 @@ export class BitacoraMesa { @Column({ name: 'tiempo_entrada', type: 'datetime' }) tiempo_entrada: Date; + @ManyToOne(() => Mesa) @JoinColumn({ name: 'id_mesa' }) mesa: Mesa; diff --git a/src/mesa/mesa.controller.ts b/src/mesa/mesa.controller.ts index 881e0a7..e048d98 100644 --- a/src/mesa/mesa.controller.ts +++ b/src/mesa/mesa.controller.ts @@ -15,7 +15,7 @@ export class MesaController { async findAllActivo() { return this.mesaService.findAllActivo(); } - + @Patch(':id') async updateActivo( @Param('id') id: number, diff --git a/src/mesa/mesa.service.ts b/src/mesa/mesa.service.ts index 49b1775..c089e2b 100644 --- a/src/mesa/mesa.service.ts +++ b/src/mesa/mesa.service.ts @@ -9,12 +9,42 @@ export class MesaService { constructor( @InjectRepository(Mesa) private readonly mesaRepository: Repository, - ) {} + ) { } + + async asignarMesa(idUsuario: number, idMesa: number) { + + const yaTieneMesa = await this.mesaRepository.findOne({ + where: { id_mesa: idMesa } + }); + + if (yaTieneMesa) { + throw new BadRequestException('El usuario ya tiene una mesa asignada'); + } + + const mesa = await this.mesaRepository.findOne({ + where: { id_mesa: idMesa } + }); + + if (!mesa) { + throw new NotFoundException('Mesa no existe'); + } + + mesa.activo = false; + await this.mesaRepository.save(mesa); + + return await this.mesaRepository.save({ + id_usuario: idUsuario, + id_mesa: idMesa, + }); + } + + async findAll(): Promise { return await this.mesaRepository.find(); } + async findAllActivo(): Promise { return await this.mesaRepository.find({ where: { activo: true } }); }