diff --git a/src/movimiento/entities/movimiento.entity.ts b/src/movimiento/entities/movimiento.entity.ts index c8b617a..2ec34a4 100644 --- a/src/movimiento/entities/movimiento.entity.ts +++ b/src/movimiento/entities/movimiento.entity.ts @@ -1,4 +1,3 @@ -import { join } from 'path'; import { Equipo } from 'src/equipo/entities/equipo.entity'; import { Usuario } from 'src/usuarios/entities/usuario.entity'; import { diff --git a/src/movimiento/movimiento.controller.ts b/src/movimiento/movimiento.controller.ts index 0b619b1..c9e47f2 100644 --- a/src/movimiento/movimiento.controller.ts +++ b/src/movimiento/movimiento.controller.ts @@ -1,18 +1,32 @@ import { Controller, - Post, Get, - Body, - Param, - ParseIntPipe, - Patch, UseGuards, + Req, + NotFoundException, } from '@nestjs/common'; import { MovimientoService } from './movimiento.service'; -import { CreateMovimientoDto } from './dto/create-movimiento.dto'; -import { UpdateMovimientoDto } from './dto/update-movimiento.dto'; +import { AuthGuard } from '@nestjs/passport'; @Controller('movimientos') export class MovimientoController { constructor(private readonly movimientoService: MovimientoService) {} + + @UseGuards(AuthGuard('jwt')) + @Get('historial') + buscarEquipoPorToken(@Req() req: any) { + const id_usuario = req.user.id; + + if (!id_usuario) { + throw new NotFoundException('token sin id_usuario'); + } + + return this.movimientoService.searchByIdUser(id_usuario); + } + + @UseGuards(AuthGuard('jwt')) + @Get('dia') + EquiposCensadosPorDia() { + return this.movimientoService.countCensosPorDiaUnicos(); + } } diff --git a/src/movimiento/movimiento.service.ts b/src/movimiento/movimiento.service.ts index ae5fca3..109aa54 100644 --- a/src/movimiento/movimiento.service.ts +++ b/src/movimiento/movimiento.service.ts @@ -32,4 +32,55 @@ export class MovimientoService { return movimiento; } + + async searchByIdUser(id_usuario: number) { + const movimientos = await this.movimientoRepo + .createQueryBuilder('mov') + .leftJoinAndSelect('mov.equipo', 'equipo') + .leftJoinAndSelect('equipo.tipoEquipo', 'tipoEquipo') + .leftJoinAndSelect('equipo.periferico', 'periferico') + .leftJoin('mov.user', 'user') + .where('user.id_usuario = :id_usuario', { id_usuario }) + .orderBy('mov.fechaMovimiento', 'DESC') + .getMany(); + + if (!movimientos.length) { + throw new NotFoundException('Sin equipos modificados o guardados'); + } + + const vistos = new Set(); + const unicos: Movimiento[] = []; // <-- FIX + + for (const mov of movimientos) { + const inventario = mov.equipo?.inventario; + + if (!vistos.has(inventario)) { + vistos.add(inventario); + unicos.push(mov); + } + } + + return unicos.map((mov) => ({ + inventario: mov.equipo?.inventario, + tipo_equipo: mov.equipo?.tipoEquipo?.tipo_equipo, + periferico: mov.equipo?.periferico?.periferico, + fechaMovimiento: mov.fechaMovimiento, + })); + } + + async countCensosPorDiaUnicos() { + const result = await this.movimientoRepo + .createQueryBuilder('mov') + .innerJoin('mov.equipo', 'equipo') + .select('DATE(mov.fechaMovimiento)', 'fecha') + .addSelect('COUNT(DISTINCT equipo.inventario)', 'total') + .groupBy('DATE(mov.fechaMovimiento)') + .orderBy('fecha', 'ASC') + .getRawMany(); + + return result.map((r) => ({ + fecha: r.fecha, + total: Number(r.total), + })); + } } diff --git a/src/usuarios/dto/create-usuario.dto.ts b/src/usuarios/dto/create-usuario.dto.ts index e653399..7aef9ab 100644 --- a/src/usuarios/dto/create-usuario.dto.ts +++ b/src/usuarios/dto/create-usuario.dto.ts @@ -1,4 +1,3 @@ -import { DefaultValuePipe } from "@nestjs/common" import { Transform } from "class-transformer" import { IsInt, IsNotEmpty, IsOptional, IsString, MinLength} from "class-validator" @@ -18,5 +17,4 @@ contraseƱa:string @IsOptional() tipoUsuario?:number - }