10 Commits

Author SHA1 Message Date
Tyrannuss 3dc49766cc se agrego un end point para perifericos 2026-03-23 18:55:29 -06:00
IO 36cf0d217b add where idPeriferico is null 2026-03-23 13:57:31 -05:00
IO 970a6acc0b fixed now can drive Todos 2026-03-20 19:04:53 -05:00
IO cd5f2efc54 added pool limit and modified logging 2026-03-19 16:06:04 -05:00
IO b76c98b7fc modified table 2026-03-19 11:00:09 -05:00
IO a3eea6bf2e added new ep tabla and tablaExcel 2026-03-18 17:02:59 -05:00
IO d2910bbdd7 modified the service grafica 2026-03-13 19:45:52 -05:00
IO 379f6844fb new filter 2026-03-13 19:00:50 -05:00
IO 435c61586d git add new ep grafica and dto 2026-03-13 18:49:04 -05:00
IO 19bde0d891 npm audit fix 2026-03-06 17:45:52 -06:00
6 changed files with 1125 additions and 488 deletions
+361 -478
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -39,7 +39,8 @@
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"typeor": "^1.2.0", "typeor": "^1.2.0",
"typeorm": "^0.3.27" "typeorm": "^0.3.27",
"xlsx": "^0.18.5"
}, },
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.2.0", "@eslint/eslintrc": "^3.2.0",
+6 -2
View File
@@ -24,7 +24,11 @@ import { AppController } from './app.controller';
autoLoadEntities: process.env.AUTOLOAD === 'true', autoLoadEntities: process.env.AUTOLOAD === 'true',
synchronize: process.env.SINCRONIZAR === 'true', synchronize: process.env.SINCRONIZAR === 'true',
logger: 'advanced-console', logger: 'advanced-console',
logging: 'all', logging: ['error', 'warn','log'],
extra: {
connectionLimit: 10,
},
}), }),
UsuariosModule, UsuariosModule,
MovimientoModule, MovimientoModule,
@@ -34,4 +38,4 @@ import { AppController } from './app.controller';
controllers: [AppController], controllers: [AppController],
providers: [AppService], providers: [AppService],
}) })
export class AppModule {} export class AppModule { }
+58
View File
@@ -0,0 +1,58 @@
import { IsArray, IsOptional, IsString } from "class-validator";
export class FiltrosGraficaDto {
@IsOptional()
@IsArray()
@IsString({ each: true })
adscripciones?: number[]
@IsOptional()
@IsArray()
@IsString({ each: true })
procesadores?: number[]
@IsOptional()
@IsArray()
@IsString({ each: true })
sistemas?: number[]
@IsOptional()
@IsArray()
@IsString({ each: true })
usos?: number[]
@IsOptional()
@IsArray()
@IsString({ each: true })
antiguedad?: string[]
}
export class FiltrosTablaDto {
@IsArray()
@IsString({ each: true })
adscripciones?: string[]
@IsOptional()
@IsArray()
@IsString({ each: true })
procesadores?: string[]
@IsOptional()
@IsArray()
@IsString({ each: true })
sistemas?: string[]
@IsOptional()
@IsArray()
@IsString({ each: true })
usos?: string[]
@IsOptional()
@IsArray()
@IsString({ each: true })
antiguedad?: string[]
}
+65 -1
View File
@@ -19,10 +19,11 @@ import { UpdateEquipoDto } from './dto/update-equipo.dto';
import { AuthGuard } from '@nestjs/passport'; import { AuthGuard } from '@nestjs/passport';
import { CreateEquipoDto } from './dto/create-equipo.dto'; import { CreateEquipoDto } from './dto/create-equipo.dto';
import type { Response } from 'express'; import type { Response } from 'express';
import { FiltrosGraficaDto, FiltrosTablaDto } from './dto/grafica.dto';
@Controller('equipos') @Controller('equipos')
export class EquipoController { export class EquipoController {
constructor(private readonly equipoService: EquipoService) {} constructor(private readonly equipoService: EquipoService) { }
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@Get('buscar') @Get('buscar')
async buscarEquipos( async buscarEquipos(
@@ -33,6 +34,68 @@ export class EquipoController {
return this.equipoService.buscarEquipos(filtros, +page, +limit); return this.equipoService.buscarEquipos(filtros, +page, +limit);
} }
@Post('grafica/:tipo')
async grafica(
@Param("tipo") tipo: 'antiguedad' | 'uso' | 'so' | 'procesador',
@Body() filtros: FiltrosGraficaDto
) {
return this.equipoService.grafica(tipo, filtros);
}
@Post('graficaPerifericos/:tipo')
async graficaPerifericos(
@Param("tipo") tipo: 'antiguedad' | 'uso' | 'so' | 'procesador',
@Body() filtros: FiltrosGraficaDto
) {
return this.equipoService.graficaPerifericos(tipo, filtros);
}
@Post('tabla')
async tabla(
@Body() filtros: FiltrosTablaDto
) {
return this.equipoService.tabla(filtros);
}
@Post('tabla/count')
async tablacount(
@Body() filtros: FiltrosTablaDto
) {
return this.equipoService.tablaCount(filtros);
}
@Post('excel/tabla')
async exceltabla(
@Res() res: Response,
@Body() filtros: FiltrosTablaDto
) {
const buffer = await this.equipoService.tablaExcel(filtros);
res.set({
'Content-Type':
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'Content-Disposition': 'attachment; filename=tabla.xlsx',
});
res.send(buffer);
}
@Post('excel/tabla/count')
async exceltablacount(
@Res() res: Response,
@Body() filtros: FiltrosGraficaDto
) {
const buffer = await this.equipoService.tablaCountExcel(filtros);
res.set({
'Content-Type':
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
'Content-Disposition': 'attachment; filename=tabla.xlsx',
});
res.send(buffer);
}
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@Get('buscar/:inv') @Get('buscar/:inv')
async serch(@Param('inv') inv: string) { async serch(@Param('inv') inv: string) {
@@ -92,6 +155,7 @@ export class EquipoController {
findTiposEquipo() { findTiposEquipo() {
return this.equipoService.findAllTiposEquipo(); return this.equipoService.findAllTiposEquipo();
} }
@UseGuards(AuthGuard('jwt')) @UseGuards(AuthGuard('jwt'))
@Get('sistemas-operativos') @Get('sistemas-operativos')
findSistemasOperativos() { findSistemasOperativos() {
+633 -6
View File
@@ -10,6 +10,7 @@ import { UpdateEquipoDto } from './dto/update-equipo.dto';
import axios from 'axios'; import axios from 'axios';
import e, { Response } from 'express'; import e, { Response } from 'express';
import * as ExcelJS from 'exceljs'; import * as ExcelJS from 'exceljs';
import { import {
Adscripcion, Adscripcion,
Estado, Estado,
@@ -27,6 +28,7 @@ import { CreateEquipoDto } from './dto/create-equipo.dto';
import { MovimientoService } from 'src/movimiento/movimiento.service'; import { MovimientoService } from 'src/movimiento/movimiento.service';
import { Cron } from '@nestjs/schedule'; import { Cron } from '@nestjs/schedule';
import { FiltrosGraficaDto, FiltrosTablaDto } from './dto/grafica.dto';
@Injectable() @Injectable()
export class EquipoService { export class EquipoService {
@@ -62,7 +64,7 @@ export class EquipoService {
private readonly laboratorioRepo: Repository<Laboratorio>, private readonly laboratorioRepo: Repository<Laboratorio>,
@InjectRepository(Proyecto) @InjectRepository(Proyecto)
private readonly proyectoRepo: Repository<Proyecto>, private readonly proyectoRepo: Repository<Proyecto>,
) {} ) { }
async deleteEquipo(inventario: string): Promise<{ message: string }> { async deleteEquipo(inventario: string): Promise<{ message: string }> {
const equipo = await this.equipoRepository.findOne({ const equipo = await this.equipoRepository.findOne({
@@ -293,12 +295,12 @@ export class EquipoService {
equipo.isImpresora equipo.isImpresora
? { ...datosBase, periferico: { id_periferico: equipo.id_periferico } } ? { ...datosBase, periferico: { id_periferico: equipo.id_periferico } }
: { : {
...datosBase, ...datosBase,
sistemaOperativo: { sistemaOperativo: {
id_sistema_operativo: equipo.id_sistema_operativo, id_sistema_operativo: equipo.id_sistema_operativo,
},
procesador: { id_procesador: equipo.id_procesador },
}, },
procesador: { id_procesador: equipo.id_procesador },
},
); );
let equip = await this.equipoRepository.save(nuevoEquipo); let equip = await this.equipoRepository.save(nuevoEquipo);
@@ -1117,6 +1119,631 @@ export class EquipoService {
return Array.from(conteo.values()).sort((a, b) => b.total - a.total); return Array.from(conteo.values()).sort((a, b) => b.total - a.total);
} }
async grafica(
tipo: 'antiguedad' | 'uso' | 'so' | 'procesador',
filtros?: FiltrosGraficaDto
) {
const qb = this.equipoRepository
.createQueryBuilder('equipo')
.leftJoin('equipo.adscripcion', 'adscripcion')
.leftJoin('equipo.procesador', 'procesador')
.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo')
.leftJoin('equipo.tipoUso', 'tipoUso')
// filtros
.andWhere('equipo.id_periferico IS NULL')
if (filtros?.adscripciones?.length) {
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
adscripciones: filtros.adscripciones
})
.addSelect('adscripcion.adscripcion', 'adscripcion')
.groupBy('equipo.adscripcion')
}
if (filtros?.procesadores?.length) {
qb.andWhere('procesador.id_procesador IN (:...procesadores)', {
procesadores: filtros.procesadores
})
}
if (filtros?.sistemas?.length) {
qb.andWhere('sistemaOperativo.id_sistema_operativo IN (:...sistemas)', {
sistemas: filtros.sistemas
})
}
if (filtros?.usos?.length) {
qb.andWhere('tipoUso.id_uso IN (:...usos)', {
usos: filtros.usos
})
}
if (filtros?.antiguedad?.length && !filtros.antiguedad.includes("Todos")) {
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
antiguedad: filtros.antiguedad
})
}
// selector dinámico
switch (tipo) {
case 'antiguedad':
qb.select('equipo.antiguedad', 'antiguedad')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('equipo.antiguedad')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('equipo.antiguedad')
}
qb.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
`)
break
case 'uso':
qb.select('tipoUso.tipo_uso', 'uso')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('tipoUso.tipo_uso')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('tipoUso.tipo_uso')
}
qb.orderBy(`
CASE
WHEN tipoUso.tipo_uso = 'ALUMNO' THEN 1
WHEN tipoUso.tipo_uso = 'PROFESOR' THEN 2
WHEN tipoUso.tipo_uso = 'ADMINISTRATIVO' THEN 3
WHEN tipoUso.tipo_uso = 'TÉCNICO ACADEMICO' THEN 4
END`)
break
case 'so':
qb.select('sistemaOperativo.sistema_operativo', 'so')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('sistemaOperativo.sistema_operativo')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('sistemaOperativo.sistema_operativo')
}
qb.orderBy(`equipo.adscripcion`, "ASC")
break
case 'procesador':
qb.select('procesador.procesador', 'procesador')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('procesador.procesador')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('procesador.procesador')
}
qb.orderBy(`equipo.adscripcion`, "ASC")
break
}
return qb.getRawMany()
}
async graficaPerifericos(
tipo: 'antiguedad' | 'uso' | 'so' | 'procesador',
filtros?: FiltrosGraficaDto
) {
const qb = this.equipoRepository
.createQueryBuilder('equipo')
.leftJoin('equipo.adscripcion', 'adscripcion')
.leftJoin('equipo.procesador', 'procesador')
.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo')
.leftJoin('equipo.tipoUso', 'tipoUso')
// filtros
.andWhere('equipo.id_periferico IS NOT NULL')
if (filtros?.adscripciones?.length) {
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
adscripciones: filtros.adscripciones
})
.addSelect('adscripcion.adscripcion', 'adscripcion')
.groupBy('equipo.adscripcion')
}
if (filtros?.procesadores?.length) {
qb.andWhere('procesador.id_procesador IN (:...procesadores)', {
procesadores: filtros.procesadores
})
}
if (filtros?.sistemas?.length) {
qb.andWhere('sistemaOperativo.id_sistema_operativo IN (:...sistemas)', {
sistemas: filtros.sistemas
})
}
if (filtros?.usos?.length) {
qb.andWhere('tipoUso.id_uso IN (:...usos)', {
usos: filtros.usos
})
}
if (filtros?.antiguedad?.length && !filtros.antiguedad.includes("Todos")) {
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
antiguedad: filtros.antiguedad
})
}
// selector dinámico
switch (tipo) {
case 'antiguedad':
qb.select('equipo.antiguedad', 'antiguedad')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('equipo.antiguedad')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('equipo.antiguedad')
}
qb.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
`)
break
case 'uso':
qb.select('tipoUso.tipo_uso', 'uso')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('tipoUso.tipo_uso')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('tipoUso.tipo_uso')
}
qb.orderBy(`
CASE
WHEN tipoUso.tipo_uso = 'ALUMNO' THEN 1
WHEN tipoUso.tipo_uso = 'PROFESOR' THEN 2
WHEN tipoUso.tipo_uso = 'ADMINISTRATIVO' THEN 3
WHEN tipoUso.tipo_uso = 'TÉCNICO ACADEMICO' THEN 4
END`)
break
case 'so':
qb.select('sistemaOperativo.sistema_operativo', 'so')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('sistemaOperativo.sistema_operativo')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('sistemaOperativo.sistema_operativo')
}
qb.orderBy(`equipo.adscripcion`, "ASC")
break
case 'procesador':
qb.select('procesador.procesador', 'procesador')
.addSelect('COUNT(*)', 'total')
if (filtros?.adscripciones?.length) {
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.groupBy('procesador.procesador')
.addGroupBy('adscripcion.adscripcion')
} else {
qb.groupBy('procesador.procesador')
}
qb.orderBy(`equipo.adscripcion`, "ASC")
break
}
return qb.getRawMany()
}
async tabla(filtros?: FiltrosTablaDto) {
const qb = this.equipoRepository
.createQueryBuilder('equipo')
.select([])
qb.leftJoin('equipo.adscripcion', 'adscripcion')
qb.leftJoin('equipo.procesador', 'procesador')
qb.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo')
qb.leftJoin('equipo.tipoUso', 'tipoUso')
qb.addSelect('equipo.inventario', 'inventario')
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.addSelect('equipo.lugar', 'ubicacion')
const tieneFiltroReal = (arr?: string[]) => arr?.length && !arr.includes("0") && !arr.includes("Todos")
qb.andWhere('equipo.id_periferico IS NULL')
// ADSCRIPCIONES
if (filtros?.adscripciones?.length) {
// siempre selecciona
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
if (tieneFiltroReal(filtros.adscripciones)) {
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
adscripciones: filtros.adscripciones
})
}
}
// PROCESADOR
if (filtros?.procesadores?.length) {
qb.addSelect('procesador.procesador', 'procesador')
if (tieneFiltroReal(filtros.procesadores)) {
qb.andWhere('procesador.id_procesador IN (:...procesadores)', {
procesadores: filtros.procesadores
})
}
}
// SISTEMA OPERATIVO
if (filtros?.sistemas?.length) {
qb.addSelect('sistemaOperativo.sistema_operativo', 'so')
if (tieneFiltroReal(filtros.sistemas)) {
qb.andWhere('sistemaOperativo.id_sistema_operativo IN (:...sistemas)', {
sistemas: filtros.sistemas
})
}
}
// USO
if (filtros?.usos?.length) {
qb.addSelect('tipoUso.tipo_uso', 'uso')
if (tieneFiltroReal(filtros.usos)) {
qb.andWhere('tipoUso.id_uso IN (:...usos)', {
usos: filtros.usos
})
}
}
// ANTIGÜEDAD
if (filtros?.antiguedad?.length) {
qb.addSelect('equipo.antiguedad', 'antiguedad')
if (tieneFiltroReal(filtros.antiguedad)) {
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
antiguedad: filtros.antiguedad
})
}
}
return qb
.orderBy(`equipo.adscripcion`, "DESC")
.getRawMany()
}
async tablaCount(filtros?: FiltrosTablaDto) {
const qb = this.equipoRepository
.createQueryBuilder('equipo')
.select([])
qb.leftJoin('equipo.adscripcion', 'adscripcion')
qb.leftJoin('equipo.procesador', 'procesador')
qb.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo')
qb.leftJoin('equipo.tipoUso', 'tipoUso')
qb.addSelect('adscripcion.adscripcion', 'adscripcion')
qb.andWhere('equipo.id_periferico IS NULL')
if (filtros?.adscripciones?.length) {
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
adscripciones: filtros.adscripciones
})
}
if (filtros?.procesadores?.length) {
qb.andWhere('procesador.id_procesador IN (:...procesadores)', {
procesadores: filtros.procesadores
})
}
if (filtros?.sistemas?.length) {
qb.andWhere('sistemaOperativo.id_sistema_operativo IN (:...sistemas)', {
sistemas: filtros.sistemas
})
}
if (filtros?.usos?.length) {
qb.andWhere('tipoUso.id_uso IN (:...usos)', {
usos: filtros.usos
})
}
if (filtros?.antiguedad?.length && !filtros.antiguedad.includes("Todos")) {
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
antiguedad: filtros.antiguedad
})
}
return qb
.addSelect('COUNT(*)', 'total')
.addGroupBy('adscripcion.adscripcion')
.orderBy(`equipo.adscripcion`, "DESC")
.getRawMany()
}
async tablaExcel(filtros?: FiltrosTablaDto) {
const qb = this.equipoRepository
.createQueryBuilder('equipo')
.select([]);
qb.leftJoin('equipo.adscripcion', 'adscripcion');
qb.leftJoin('equipo.procesador', 'procesador');
qb.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo');
qb.leftJoin('equipo.tipoUso', 'tipoUso');
qb.addSelect('equipo.inventario', 'inventario');
qb.addSelect('adscripcion.adscripcion', 'adscripcion');
qb.addSelect('equipo.lugar', 'ubicacion');
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
});
}
}
// PROCESADOR
if (filtros?.procesadores?.length) {
qb.addSelect('procesador.procesador', 'procesador');
if (tieneFiltroReal(filtros.procesadores)) {
qb.andWhere('procesador.id_procesador IN (:...procesadores)', {
procesadores: filtros.procesadores
});
}
}
// SISTEMA OPERATIVO
if (filtros?.sistemas?.length) {
qb.addSelect('sistemaOperativo.sistema_operativo', 'so');
if (tieneFiltroReal(filtros.sistemas)) {
qb.andWhere('sistemaOperativo.id_sistema_operativo IN (:...sistemas)', {
sistemas: filtros.sistemas
});
}
}
// USO
if (filtros?.usos?.length) {
qb.addSelect('tipoUso.tipo_uso', 'uso');
if (tieneFiltroReal(filtros.usos)) {
qb.andWhere('tipoUso.id_uso IN (:...usos)', {
usos: filtros.usos
});
}
}
// ANTIGÜEDAD
if (filtros?.antiguedad?.length) {
qb.addSelect('equipo.antiguedad', 'antiguedad');
if (tieneFiltroReal(filtros.antiguedad)) {
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
antiguedad: filtros.antiguedad
});
}
}
const data = await qb
.orderBy(`equipo.adscripcion`, "DESC")
.getRawMany();
const workbook = new ExcelJS.Workbook();
const sheet = workbook.addWorksheet('Equipos');
const columns = [
{ header: 'Inventario', key: 'inventario', width: 20 },
{ header: 'Ubicación', key: 'ubicacion', width: 40 },
{ header: 'Adscripción', key: 'adscripcion', width: 40 },
];
if (data[0]?.procesador !== undefined) {
columns.push({ header: 'Procesador', key: 'procesador', width: 25 });
}
if (data[0]?.so !== undefined) {
columns.push({ header: 'Sistema Operativo', key: 'so', width: 25 });
}
if (data[0]?.uso !== undefined) {
columns.push({ header: 'Uso', key: 'uso', width: 20 });
}
if (data[0]?.antiguedad !== undefined) {
columns.push({ header: 'Antigüedad', key: 'antiguedad', width: 15 });
}
sheet.columns = columns;
data.forEach(row => {
sheet.addRow(row);
});
sheet.getRow(1).font = { bold: true };
return await workbook.xlsx.writeBuffer();
}
async tablaCountExcel(filtros?: FiltrosGraficaDto) {
const qb = this.equipoRepository
.createQueryBuilder('equipo')
.select([]);
qb.leftJoin('equipo.adscripcion', 'adscripcion');
qb.leftJoin('equipo.procesador', 'procesador');
qb.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo');
qb.leftJoin('equipo.tipoUso', 'tipoUso');
qb.addSelect('adscripcion.adscripcion', 'adscripcion');
qb.andWhere('equipo.id_periferico IS NULL')
if (filtros?.adscripciones?.length) {
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
adscripciones: filtros.adscripciones
});
}
if (filtros?.procesadores?.length) {
qb.andWhere('procesador.id_procesador IN (:...procesadores)', {
procesadores: filtros.procesadores
});
}
if (filtros?.sistemas?.length) {
qb.andWhere('sistemaOperativo.id_sistema_operativo IN (:...sistemas)', {
sistemas: filtros.sistemas
});
}
if (filtros?.usos?.length) {
qb.andWhere('tipoUso.id_uso IN (:...usos)', {
usos: filtros.usos
});
}
if (filtros?.antiguedad?.length && !filtros.antiguedad.includes("Todos")) {
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
antiguedad: filtros.antiguedad
});
}
const data = await qb
.addSelect('COUNT(*)', 'total')
.addGroupBy('adscripcion.adscripcion')
.orderBy(`equipo.adscripcion`, "DESC")
.getRawMany();
const workbook = new ExcelJS.Workbook();
const sheet = workbook.addWorksheet('Resumen');
sheet.columns = [
{ header: 'Adscripción', key: 'adscripcion', width: 30 },
{ header: 'Total', key: 'total', width: 15 },
];
data.forEach(row => {
sheet.addRow(row);
});
sheet.getRow(1).font = { bold: true };
return await workbook.xlsx.writeBuffer();
}
} }
let estado_excluidos = ['DE BAJA']; let estado_excluidos = ['DE BAJA'];