diff --git a/src/alumno_inscrito/entities/alumno_inscrito.entity.ts b/src/alumno_inscrito/entities/alumno_inscrito.entity.ts index 009b5b4..5af16cb 100644 --- a/src/alumno_inscrito/entities/alumno_inscrito.entity.ts +++ b/src/alumno_inscrito/entities/alumno_inscrito.entity.ts @@ -75,6 +75,6 @@ export class AlumnoInscrito { @OneToMany(() => BitacoraMesa, (bitacoraMesa) => bitacoraMesa.alumno_inscrito) bitacoras_mesa: BitacoraMesa[]; - @OneToMany(() => Bitacora, (bitacora) => bitacora.equipo) + @OneToMany(() => Bitacora, (bitacora) => bitacora.alumno_inscrito) bitacoras: Bitacora[]; } diff --git a/src/bitacora/bitacora.controller.ts b/src/bitacora/bitacora.controller.ts index 0ffadc5..709597a 100644 --- a/src/bitacora/bitacora.controller.ts +++ b/src/bitacora/bitacora.controller.ts @@ -1,10 +1,10 @@ import { Controller, Get, Post, Body, Param, Patch } from '@nestjs/common'; import { BitacoraService } from './bitacora.service'; -import { CreateBitacoraDto } from './dto/create-bitacora.dto'; +import { BitacoraAlumnoDto, CreateBitacoraDto, EquiposPorEquipoDto } from './dto/create-bitacora.dto'; @Controller('bitacora') export class BitacoraController { - constructor(private readonly bitacoraService: BitacoraService) {} + constructor(private readonly bitacoraService: BitacoraService) { } @Post() assignment(@Body() createBitacoraDto: CreateBitacoraDto) { @@ -33,4 +33,23 @@ export class BitacoraController { findAll() { return this.bitacoraService.findAll(); } + + + @Post('equipos-por-dia') + async obtenerEquipos( + @Body() dto: BitacoraAlumnoDto + ) { + return this.bitacoraService.obtenerEquiposPorAlumnoYFecha( + dto.numero_cuenta, + dto.fecha, + ); + } + + @Post('equipos-por-equipo') + async equiposPorEquipo( + @Body() dto: EquiposPorEquipoDto, + ) { + return this.bitacoraService.equiposPorEquipo(dto); + } + } diff --git a/src/bitacora/bitacora.service.ts b/src/bitacora/bitacora.service.ts index 880d3ea..58c08c3 100644 --- a/src/bitacora/bitacora.service.ts +++ b/src/bitacora/bitacora.service.ts @@ -1,5 +1,5 @@ import { Injectable, NotFoundException } from '@nestjs/common'; -import { CreateBitacoraDto } from './dto/create-bitacora.dto'; +import { CreateBitacoraDto, EquiposPorEquipoDto } from './dto/create-bitacora.dto'; import { InjectRepository } from '@nestjs/typeorm'; import { Bitacora } from './entities/bitacora.entity'; import { Repository } from 'typeorm'; @@ -9,7 +9,7 @@ export class BitacoraService { constructor( @InjectRepository(Bitacora) private readonly bitacoraRepository: Repository, - ) {} + ) { } assignment(dto: CreateBitacoraDto) { const bitacora = this.bitacoraRepository.create({ @@ -91,4 +91,63 @@ export class BitacoraService { return { message: 'Tiempo cancelado' }; } + + async obtenerEquiposPorAlumnoYFecha(numeroCuenta: string, fecha: string) { + + const fechaInicio = new Date(`${fecha}T00:00:00`); + const fechaFin = new Date(`${fecha}T23:59:59`); + + return await this.bitacoraRepository + .createQueryBuilder('bitacora') + .innerJoinAndSelect('bitacora.equipo', 'equipo') + .innerJoin('bitacora.alumno_inscrito', 'alumnoInscrito') + .innerJoin('alumnoInscrito.alumno', 'alumno') + .where('alumno.id_cuenta = :numeroCuenta', { numeroCuenta }) + .andWhere('bitacora.tiempo_entrada BETWEEN :inicio AND :fin', { + inicio: fechaInicio, + fin: fechaFin, + }) + .select([ + 'bitacora.tiempo_entrada', + 'bitacora.tiempo_asignado', + 'equipo.ubicacion', + 'equipo.nombre_equipo' + ]) + .getMany(); + } + async equiposPorEquipo(dto: EquiposPorEquipoDto) { + const { id_equipo, fecha } = dto; + + const inicio = new Date(`${fecha}T00:00:00`); + const fin = new Date(`${fecha}T23:59:59`); + + const registros = await this.bitacoraRepository + .createQueryBuilder('bitacora') + .innerJoinAndSelect('bitacora.equipo', 'equipo') + .innerJoinAndSelect('bitacora.alumno_inscrito', 'alumnoInscrito') + .innerJoinAndSelect('alumnoInscrito.alumno', 'alumno') + .where('equipo.id_equipo = :id_equipo', { id_equipo }) + .andWhere('bitacora.tiempo_entrada BETWEEN :inicio AND :fin', { + inicio, + fin, + }) + .select([ + 'bitacora.tiempo_entrada', + 'bitacora.tiempo_asignado', + 'alumno.id_cuenta' + ]) + .orderBy('bitacora.tiempo_entrada', 'DESC') + .getMany(); + + return registros.map(reg => ({ + hora_entrada: reg.tiempo_entrada, + min_utilizados: reg.tiempo_asignado, + hora_salida: new Date( + new Date(reg.tiempo_entrada).getTime() + + reg.tiempo_asignado * 60000 + ), + cuenta_asociada: reg.alumno_inscrito?.alumno?.id_cuenta + })); + } + } diff --git a/src/bitacora/dto/create-bitacora.dto.ts b/src/bitacora/dto/create-bitacora.dto.ts index 17e3e0b..dc4e609 100644 --- a/src/bitacora/dto/create-bitacora.dto.ts +++ b/src/bitacora/dto/create-bitacora.dto.ts @@ -1,16 +1,32 @@ -import { IsInt, IsOptional, IsString } from "class-validator"; +import { IsDateString, IsInt, IsNumber, IsNumberString, IsOptional, IsString } from "class-validator"; export class CreateBitacoraDto { -@IsInt() -tiempo_asignado: number; + @IsInt() + tiempo_asignado: number; -@IsOptional() -@IsString() -ubicacion?: string; + @IsOptional() + @IsString() + ubicacion?: string; -@IsInt() -id_equipo: number; + @IsInt() + id_equipo: number; -@IsInt() -id_alumno_inscrito: number; -} \ No newline at end of file + @IsInt() + id_alumno_inscrito: number; +} + +export class BitacoraAlumnoDto { + @IsNumberString() + numero_cuenta: string; + + @IsDateString() + fecha: string; +} + +export class EquiposPorEquipoDto { + @IsNumber() + id_equipo: number; + + @IsString() + fecha: string; +}