created counter

This commit is contained in:
2025-12-02 19:06:07 -06:00
parent c321917ed3
commit 6e4112d9fa
4 changed files with 72 additions and 10 deletions
@@ -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 {
+21 -7
View File
@@ -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();
}
}
+51
View File
@@ -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<string>();
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),
}));
}
}
-2
View File
@@ -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
}