Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 47b3933079 | |||
| 1c6f92658d | |||
| 08ed18ff4b | |||
| 655e45a876 | |||
| 3c9a28a960 | |||
| 29ffb0e327 | |||
| 3dc49766cc | |||
| 36cf0d217b | |||
| 970a6acc0b | |||
| cd5f2efc54 | |||
| b76c98b7fc | |||
| a3eea6bf2e | |||
| d2910bbdd7 |
Generated
+1521
-1455
File diff suppressed because it is too large
Load Diff
+18
-18
@@ -20,14 +20,14 @@
|
|||||||
"test:e2e": "jest --config ./test/jest-e2e.json"
|
"test:e2e": "jest --config ./test/jest-e2e.json"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nestjs/common": "^11.1.6",
|
"@nestjs/common": "^11.1.28",
|
||||||
"@nestjs/core": "^11.0.1",
|
"@nestjs/core": "^11.0.1",
|
||||||
"@nestjs/jwt": "^11.0.1",
|
"@nestjs/jwt": "^11.0.2",
|
||||||
"@nestjs/mapped-types": "*",
|
"@nestjs/mapped-types": "^2.1.1",
|
||||||
"@nestjs/passport": "^11.0.5",
|
"@nestjs/passport": "^11.0.5",
|
||||||
"@nestjs/platform-express": "^11.0.1",
|
"@nestjs/platform-express": "^11.0.1",
|
||||||
"@nestjs/schedule": "^6.0.1",
|
"@nestjs/schedule": "^6.1.3",
|
||||||
"@nestjs/typeorm": "^11.0.0",
|
"@nestjs/typeorm": "^11.0.3",
|
||||||
"axios": "^1.13.1",
|
"axios": "^1.13.1",
|
||||||
"bcryptjs": "^3.0.2",
|
"bcryptjs": "^3.0.2",
|
||||||
"class-transformer": "0.5.1",
|
"class-transformer": "0.5.1",
|
||||||
@@ -42,32 +42,32 @@
|
|||||||
"typeorm": "^0.3.27"
|
"typeorm": "^0.3.27"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/eslintrc": "^3.2.0",
|
"@eslint/eslintrc": "^3.3.6",
|
||||||
"@eslint/js": "^9.18.0",
|
"@eslint/js": "^9.18.0",
|
||||||
"@nestjs/cli": "^11.0.0",
|
"@nestjs/cli": "^11.0.0",
|
||||||
"@nestjs/config": "^4.0.2",
|
"@nestjs/config": "^4.0.2",
|
||||||
"@nestjs/schematics": "^11.0.0",
|
"@nestjs/schematics": "^11.0.0",
|
||||||
"@nestjs/testing": "^11.0.1",
|
"@nestjs/testing": "^11.1.28",
|
||||||
"@types/bcrypt": "^6.0.0",
|
"@types/bcrypt": "^6.0.0",
|
||||||
"@types/express": "^5.0.0",
|
"@types/express": "^5.0.6",
|
||||||
"@types/jest": "^30.0.0",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/node": "^22.10.7",
|
"@types/node": "^22.20.1",
|
||||||
"@types/passport-jwt": "^4.0.1",
|
"@types/passport-jwt": "^4.0.1",
|
||||||
"@types/supertest": "^6.0.2",
|
"@types/supertest": "^6.0.2",
|
||||||
"eslint": "^9.18.0",
|
"eslint": "^10.8.0",
|
||||||
"eslint-config-prettier": "^10.0.1",
|
"eslint-config-prettier": "^10.0.1",
|
||||||
"eslint-plugin-prettier": "^5.2.2",
|
"eslint-plugin-prettier": "^5.5.6",
|
||||||
"globals": "^16.0.0",
|
"globals": "^16.5.0",
|
||||||
"jest": "^30.0.0",
|
"jest": "^30.4.2",
|
||||||
"prettier": "^3.4.2",
|
"prettier": "^3.9.6",
|
||||||
"source-map-support": "^0.5.21",
|
"source-map-support": "^0.5.21",
|
||||||
"supertest": "^7.0.0",
|
"supertest": "^7.2.2",
|
||||||
"ts-jest": "^29.2.5",
|
"ts-jest": "^29.4.12",
|
||||||
"ts-loader": "^9.5.2",
|
"ts-loader": "^9.6.2",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"tsconfig-paths": "^4.2.0",
|
"tsconfig-paths": "^4.2.0",
|
||||||
"typescript": "^5.7.3",
|
"typescript": "^5.7.3",
|
||||||
"typescript-eslint": "^8.20.0"
|
"typescript-eslint": "^8.65.0"
|
||||||
},
|
},
|
||||||
"jest": {
|
"jest": {
|
||||||
"moduleFileExtensions": [
|
"moduleFileExtensions": [
|
||||||
|
|||||||
+6
-2
@@ -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 { }
|
||||||
|
|||||||
@@ -28,3 +28,39 @@ export class FiltrosGraficaDto {
|
|||||||
antiguedad?: string[]
|
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[]
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export class FiltrosPolarDto {
|
||||||
|
@IsOptional()
|
||||||
|
@IsArray()
|
||||||
|
@IsString({ each: true })
|
||||||
|
adscripciones?: string[]
|
||||||
|
}
|
||||||
@@ -19,11 +19,12 @@ 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 } from './dto/grafica.dto';
|
import { FiltrosGraficaDto, FiltrosPolarDto, 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(
|
||||||
@@ -34,14 +35,82 @@ export class EquipoController {
|
|||||||
return this.equipoService.buscarEquipos(filtros, +page, +limit);
|
return this.equipoService.buscarEquipos(filtros, +page, +limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@UseGuards(AuthGuard('jwt'))
|
||||||
@Post('grafica/:tipo')
|
@Post('grafica/:tipo')
|
||||||
async graficaProcesador(
|
async grafica(
|
||||||
@Param("tipo") tipo: 'antiguedad' | 'uso' | 'so' | 'procesador',
|
@Param("tipo") tipo: 'antiguedad' | 'uso' | 'so' | 'procesador',
|
||||||
@Body() filtros: FiltrosGraficaDto
|
@Body() filtros: FiltrosGraficaDto
|
||||||
) {
|
) {
|
||||||
return this.equipoService.grafica(tipo, filtros);
|
return this.equipoService.grafica(tipo, filtros);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@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
|
||||||
|
) {
|
||||||
|
return this.equipoService.graficaPerifericos(tipo, filtros);
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseGuards(AuthGuard('jwt'))
|
||||||
|
@Post('tabla')
|
||||||
|
async tabla(
|
||||||
|
@Body() filtros: FiltrosTablaDto
|
||||||
|
) {
|
||||||
|
return this.equipoService.tabla(filtros);
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseGuards(AuthGuard('jwt'))
|
||||||
|
@Post('tabla/count')
|
||||||
|
async tablacount(
|
||||||
|
@Body() filtros: FiltrosTablaDto
|
||||||
|
) {
|
||||||
|
return this.equipoService.tablaCount(filtros);
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseGuards(AuthGuard('jwt'))
|
||||||
|
@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);
|
||||||
|
}
|
||||||
|
|
||||||
|
@UseGuards(AuthGuard('jwt'))
|
||||||
|
@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) {
|
||||||
|
|||||||
+626
-52
@@ -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,7 +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 } from './dto/grafica.dto';
|
import { FiltrosGraficaDto, FiltrosPolarDto, FiltrosTablaDto } from './dto/grafica.dto';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class EquipoService {
|
export class EquipoService {
|
||||||
@@ -1131,8 +1132,400 @@ export class EquipoService {
|
|||||||
.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo')
|
.leftJoin('equipo.sistemaOperativo', 'sistemaOperativo')
|
||||||
.leftJoin('equipo.tipoUso', 'tipoUso')
|
.leftJoin('equipo.tipoUso', 'tipoUso')
|
||||||
|
|
||||||
// filtros
|
// 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.inventario`, 'ASC')
|
||||||
|
.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) {
|
if (filtros?.adscripciones?.length) {
|
||||||
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
|
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
|
||||||
adscripciones: filtros.adscripciones
|
adscripciones: filtros.adscripciones
|
||||||
@@ -1157,61 +1550,242 @@ export class EquipoService {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if(filtros?.antiguedad?.length){
|
if (filtros?.antiguedad?.length && !filtros.antiguedad.includes("Todos")) {
|
||||||
qb.andWhere('equipo.antiguedad IN (:...antiguedad)',{
|
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
|
||||||
antiguedad:filtros.antiguedad
|
antiguedad: filtros.antiguedad
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// selector dinámico
|
return qb
|
||||||
|
.addSelect('COUNT(*)', 'total')
|
||||||
switch (tipo) {
|
.addGroupBy('adscripcion.adscripcion')
|
||||||
|
.orderBy(`equipo.adscripcion`, "DESC")
|
||||||
case 'antiguedad':
|
.getRawMany()
|
||||||
|
|
||||||
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
|
|
||||||
`)
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'uso':
|
|
||||||
|
|
||||||
qb.select('tipoUso.tipo_uso', 'uso')
|
|
||||||
.addSelect('COUNT(*)', 'total')
|
|
||||||
.groupBy('tipoUso.tipo_uso')
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'so':
|
|
||||||
|
|
||||||
qb.select('sistemaOperativo.sistema_operativo', 'so')
|
|
||||||
.addSelect('COUNT(*)', 'total')
|
|
||||||
.groupBy('sistemaOperativo.sistema_operativo')
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
case 'procesador':
|
|
||||||
|
|
||||||
qb.select('procesador.procesador', 'procesador')
|
|
||||||
.addSelect('COUNT(*)', 'total')
|
|
||||||
.groupBy('procesador.procesador')
|
|
||||||
|
|
||||||
break
|
|
||||||
|
|
||||||
}
|
|
||||||
return qb.getRawMany()
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async tablaExcel(filtros?: FiltrosTablaDto) {
|
||||||
|
const qb = this.equipoRepository
|
||||||
|
.createQueryBuilder('equipo')
|
||||||
|
.select('equipo')
|
||||||
|
.distinct(true);
|
||||||
|
|
||||||
|
qb.leftJoin('equipo.adscripcion', 'adscripcion');
|
||||||
|
qb.leftJoin('equipo.procesador', 'procesador');
|
||||||
|
qb.leftJoin('equipo.sistemaOperativo', 'so');
|
||||||
|
qb.leftJoin('equipo.tipoUso', 'tipoUso');
|
||||||
|
qb.leftJoin('equipo.estado', 'estado');
|
||||||
|
qb.leftJoin('equipo.tipoEquipo', 'tipoEquipo');
|
||||||
|
qb.leftJoin('equipo.marca', 'marca');
|
||||||
|
qb.leftJoin('equipo.laboratorio', 'laboratorio');
|
||||||
|
qb.leftJoin('equipo.proyecto', 'proyecto');
|
||||||
|
qb.leftJoin('equipo.mov', 'mov');
|
||||||
|
qb.leftJoin('mov.user', 'user');
|
||||||
|
|
||||||
|
|
||||||
|
const tieneFiltroReal = (arr?: string[]) => arr?.length && !arr.includes("0") && !arr.includes("Todos");
|
||||||
|
|
||||||
|
qb.andWhere('equipo.id_periferico IS NULL')
|
||||||
|
// ADSCRIPCIONES
|
||||||
|
if (filtros?.adscripciones?.length) {
|
||||||
|
|
||||||
|
if (tieneFiltroReal(filtros.adscripciones)) {
|
||||||
|
qb.andWhere('adscripcion.id_adscripcion IN (:...adscripciones)', {
|
||||||
|
adscripciones: filtros.adscripciones
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PROCESADOR
|
||||||
|
if (filtros?.procesadores?.length) {
|
||||||
|
|
||||||
|
if (tieneFiltroReal(filtros.procesadores)) {
|
||||||
|
qb.andWhere('procesador.id_procesador IN (:...procesadores)', {
|
||||||
|
procesadores: filtros.procesadores
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SISTEMA OPERATIVO
|
||||||
|
if (filtros?.sistemas?.length) {
|
||||||
|
|
||||||
|
if (tieneFiltroReal(filtros.sistemas)) {
|
||||||
|
qb.andWhere('so.id_sistema_operativo IN (:...sistemas)', {
|
||||||
|
sistemas: filtros.sistemas
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// USO
|
||||||
|
if (filtros?.usos?.length) {
|
||||||
|
|
||||||
|
if (tieneFiltroReal(filtros.usos)) {
|
||||||
|
qb.andWhere('tipoUso.id_uso IN (:...usos)', {
|
||||||
|
usos: filtros.usos
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ANTIGÜEDAD
|
||||||
|
if (filtros?.antiguedad?.length) {
|
||||||
|
|
||||||
|
if (tieneFiltroReal(filtros.antiguedad)) {
|
||||||
|
qb.andWhere('equipo.antiguedad IN (:...antiguedad)', {
|
||||||
|
antiguedad: filtros.antiguedad
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = await qb
|
||||||
|
.orderBy(`equipo.inventario`, 'ASC')
|
||||||
|
.addOrderBy('mov.fechaMovimiento', 'ASC')
|
||||||
|
.getRawMany();
|
||||||
|
|
||||||
|
const map = new Map(data.map(item => [item.inventario, item]));
|
||||||
|
|
||||||
|
|
||||||
|
const workbook = new ExcelJS.Workbook();
|
||||||
|
const sheet = workbook.addWorksheet('Equipos');
|
||||||
|
|
||||||
|
const columns = [
|
||||||
|
{ header: 'Inventario', key: 'inventario', width: 20 },
|
||||||
|
{ header: 'serie', key: 'serie', width: 20 },
|
||||||
|
{ header: 'Ubicación', key: 'lugar', width: 40 },
|
||||||
|
{ header: 'Fecha factura', key: 'fecha_factura', width: 10 },
|
||||||
|
{ header: 'Antigüedad', key: 'antiguedad', width: 15 },
|
||||||
|
|
||||||
|
{ header: 'Modelo', key: 'modelo', width: 30 },
|
||||||
|
{ header: 'Marca', key: 'marca', width: 15 },
|
||||||
|
{ header: 'Estado', key: 'estado', width: 15 },
|
||||||
|
{ header: 'Adscripción', key: 'adscripcion', width: 50 },
|
||||||
|
{ header: 'Tipo de Equipo', key: 'tipo_equipo', width: 20 },
|
||||||
|
{ header: 'Sistema Operativo', key: 'sistema_operativo', width: 30 },
|
||||||
|
{ header: 'Procesador', key: 'procesador', width: 45 },
|
||||||
|
{ header: 'Tipo de Uso', key: 'tipo_uso', width: 20 },
|
||||||
|
{ header: 'Proyecto', key: 'proyecto', width: 15 },
|
||||||
|
{ header: 'Laboratorio', key: 'laboratorio', width: 15 },
|
||||||
|
{ header: 'Observaciones', key: 'observaciones', width: 20 },
|
||||||
|
{ header: 'Fecha Movimiento', key: 'fecha_movimiento', width: 10 },
|
||||||
|
{ header: 'Usuario', key: 'nombre', width: 15 },
|
||||||
|
];
|
||||||
|
|
||||||
|
sheet.columns = columns;
|
||||||
|
|
||||||
|
map.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();
|
||||||
|
}
|
||||||
|
|
||||||
|
async graficaPolar(tipo: 'ALUMNO' | 'PROFESOR' | 'ADMINISTRATIVO', filtros?: FiltrosPolarDto) {
|
||||||
|
|
||||||
|
const usos =
|
||||||
|
tipo === 'PROFESOR'
|
||||||
|
? ['PROFESOR', 'TÉCNICO ACADEMICO']
|
||||||
|
: [tipo];
|
||||||
|
|
||||||
|
const qb = this.equipoRepository
|
||||||
|
.createQueryBuilder('equipo')
|
||||||
|
.leftJoin('equipo.tipoUso', 'tipoUso')
|
||||||
|
.leftJoin('equipo.adscripcion', 'adscripcion')
|
||||||
|
.andWhere('tipoUso.tipo_uso IN (:...usos)', { usos });
|
||||||
|
|
||||||
|
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'];
|
let estado_excluidos = ['DE BAJA'];
|
||||||
|
|||||||
Reference in New Issue
Block a user