From b3673fbae4b11abb22b567140710ce46e1404c55 Mon Sep 17 00:00:00 2001 From: IO420 <320154041@pcpuma.acatlan.unam.mx> Date: Wed, 3 Dec 2025 18:49:17 -0600 Subject: [PATCH] added ranking --- src/equipo/equipo.controller.ts | 9 ++++--- src/equipo/equipo.service.ts | 36 ++++++++++++++++++++++++++++ src/movimiento/movimiento.service.ts | 2 +- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index eb8fcc4..aa56e4a 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -8,8 +8,6 @@ import { Get, Query, Delete, - HttpCode, - HttpStatus, NotFoundException, Post, Res, @@ -19,7 +17,6 @@ import { import { EquipoService } from './equipo.service'; import { UpdateEquipoDto } from './dto/update-equipo.dto'; import { AuthGuard } from '@nestjs/passport'; -import { Equipo } from './entities/equipo.entity'; import { CreateEquipoDto } from './dto/create-equipo.dto'; import type { Response } from 'express'; @@ -360,6 +357,12 @@ export class EquipoController { ); } } + + @UseGuards(AuthGuard('jwt')) + @Get('ranking') + async ranking() { + return this.equipoService.ranking(); + } } let escritorio = ['ESCRITORIO PC', 'ESCRITORIO MAC OS ', 'ESCRITORIO LINUX']; diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index 2cc7d99..510664e 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -970,6 +970,42 @@ export class EquipoService { } return res; } + + async ranking() { + const equipos = await this.equipoRepository.find({ + relations: ['mov', 'mov.user'], + }); + + const conteo = new Map< + number, + { id_usuario: number; nombre: string; total: number } + >(); + + for (const equipo of equipos) { + if (!equipo.mov || equipo.mov.length === 0) continue; + + const ultimoMov = equipo.mov.sort( + (a, b) => + new Date(b.fechaMovimiento).getTime() - + new Date(a.fechaMovimiento).getTime(), + )[0]; + + const user = ultimoMov.user; + if (!user) continue; + + if (!conteo.has(user.id_usuario)) { + conteo.set(user.id_usuario, { + id_usuario: user.id_usuario, + nombre: user.nombre, + total: 0, + }); + } + + conteo.get(user.id_usuario)!.total++; + } + + return Array.from(conteo.values()).sort((a, b) => b.total - a.total); + } } let estado_excluidos = ['DE BAJA']; diff --git a/src/movimiento/movimiento.service.ts b/src/movimiento/movimiento.service.ts index d0ec872..44ce2d2 100644 --- a/src/movimiento/movimiento.service.ts +++ b/src/movimiento/movimiento.service.ts @@ -49,7 +49,7 @@ export class MovimientoService { } const vistos = new Set(); - const unicos: Movimiento[] = []; // <-- FIX + const unicos: Movimiento[] = []; for (const mov of movimientos) { const inventario = mov.equipo?.inventario;