From 29ffb0e3275bb57e9693207fa993a16069e8e9ed Mon Sep 17 00:00:00 2001 From: IO <320154041@pcpuma.acatlan.unam.mx> Date: Thu, 26 Mar 2026 09:52:09 -0500 Subject: [PATCH] added new ep graficaPolar --- src/equipo/dto/grafica.dto.ts | 8 +++++++ src/equipo/equipo.controller.ts | 19 +++++++++++++-- src/equipo/equipo.service.ts | 41 ++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/equipo/dto/grafica.dto.ts b/src/equipo/dto/grafica.dto.ts index df00841..0fd015e 100644 --- a/src/equipo/dto/grafica.dto.ts +++ b/src/equipo/dto/grafica.dto.ts @@ -55,4 +55,12 @@ export class FiltrosTablaDto { @IsString({ each: true }) antiguedad?: string[] +} + + +export class FiltrosPolarDto { + @IsOptional() + @IsArray() + @IsString({ each: true }) + adscripciones?: string[] } \ No newline at end of file diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index 9ff20d4..a990b69 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -19,11 +19,12 @@ import { UpdateEquipoDto } from './dto/update-equipo.dto'; import { AuthGuard } from '@nestjs/passport'; import { CreateEquipoDto } from './dto/create-equipo.dto'; import type { Response } from 'express'; -import { FiltrosGraficaDto, FiltrosTablaDto } from './dto/grafica.dto'; +import { FiltrosGraficaDto, FiltrosPolarDto, FiltrosTablaDto } from './dto/grafica.dto'; @Controller('equipos') export class EquipoController { constructor(private readonly equipoService: EquipoService) { } + @UseGuards(AuthGuard('jwt')) @Get('buscar') async buscarEquipos( @@ -34,6 +35,7 @@ export class EquipoController { return this.equipoService.buscarEquipos(filtros, +page, +limit); } + @UseGuards(AuthGuard('jwt')) @Post('grafica/:tipo') async grafica( @Param("tipo") tipo: 'antiguedad' | 'uso' | 'so' | 'procesador', @@ -42,7 +44,16 @@ export class EquipoController { return this.equipoService.grafica(tipo, filtros); } - @Post('graficaPerifericos/:tipo') + @Post('graficaPolar/:tipo') + async graficaPolar( + @Param("tipo") tipo: 'ALUMNO' | 'PROFESOR' | 'ADMINISTRATIVO', + @Body() filtros: FiltrosPolarDto + ) { + return this.equipoService.graficaPolar(tipo, filtros); + } + + @UseGuards(AuthGuard('jwt')) + @Post('graficaPerifericos/:tipo') async graficaPerifericos( @Param("tipo") tipo: 'antiguedad' | 'uso' | 'so' | 'procesador', @Body() filtros: FiltrosGraficaDto @@ -50,6 +61,7 @@ export class EquipoController { return this.equipoService.graficaPerifericos(tipo, filtros); } + @UseGuards(AuthGuard('jwt')) @Post('tabla') async tabla( @Body() filtros: FiltrosTablaDto @@ -57,6 +69,7 @@ export class EquipoController { return this.equipoService.tabla(filtros); } + @UseGuards(AuthGuard('jwt')) @Post('tabla/count') async tablacount( @Body() filtros: FiltrosTablaDto @@ -64,6 +77,7 @@ export class EquipoController { return this.equipoService.tablaCount(filtros); } + @UseGuards(AuthGuard('jwt')) @Post('excel/tabla') async exceltabla( @Res() res: Response, @@ -80,6 +94,7 @@ export class EquipoController { res.send(buffer); } + @UseGuards(AuthGuard('jwt')) @Post('excel/tabla/count') async exceltablacount( @Res() res: Response, diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index 3143e2a..b2dba03 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -28,7 +28,7 @@ import { CreateEquipoDto } from './dto/create-equipo.dto'; import { MovimientoService } from 'src/movimiento/movimiento.service'; import { Cron } from '@nestjs/schedule'; -import { FiltrosGraficaDto, FiltrosTablaDto } from './dto/grafica.dto'; +import { FiltrosGraficaDto, FiltrosPolarDto, FiltrosTablaDto } from './dto/grafica.dto'; @Injectable() export class EquipoService { @@ -1744,6 +1744,45 @@ export class EquipoService { return await workbook.xlsx.writeBuffer(); } + + async graficaPolar(tipo: 'ALUMNO' | 'PROFESOR' | 'ADMINISTRATIVO', filtros?: FiltrosPolarDto) { + const qb = this.equipoRepository + .createQueryBuilder('equipo') + .leftJoin('equipo.tipoUso', 'tipoUso') + .leftJoin('equipo.adscripcion', 'adscripcion') + .andWhere('tipoUso.tipo_uso = :uso', { + uso: tipo + }); + + const tieneFiltroReal = (arr?: string[]) => arr?.length && !arr.includes("0") && !arr.includes("Todos"); + + qb.andWhere('equipo.id_periferico IS NULL') + // ADSCRIPCIONES + if (filtros?.adscripciones?.length) { + qb.addSelect('adscripcion.adscripcion', 'adscripcion'); + + + if (tieneFiltroReal(filtros.adscripciones)) { + qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', { + adscripciones: filtros.adscripciones + }); + } + } + + return qb + .select('equipo.antiguedad', 'antiguedad') + .addSelect('COUNT(*)', 'total') + .groupBy('equipo.antiguedad') + .orderBy(` + CASE + WHEN equipo.antiguedad = 'Menor a 2 años' THEN 1 + WHEN equipo.antiguedad = 'Entre 2 y 3 años' THEN 2 + WHEN equipo.antiguedad = 'Entre 4 y 5 años' THEN 3 + WHEN equipo.antiguedad = 'Mayor a 6 años' THEN 4 + END + `) + .getRawMany(); + } } let estado_excluidos = ['DE BAJA'];