From 449e2acb5d9b7f53706b775df4ff071ad814e732 Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Sat, 15 Oct 2022 16:27:27 -0500 Subject: [PATCH] equipo programa actualizado --- .../entity/equipo-programa.entity.ts | 2 +- .../views/informacion-equipo-programa.view.ts | 24 ++- .../equipo-programa.controller.ts | 6 +- .../equipo-programa.service.ts | 170 ++++++++---------- src/equipo/equipo.service.ts | 2 +- .../full-informacion-equipo-programa.view.ts | 28 +++ .../views/informacion-equipo-programa.view.ts | 22 +++ src/upload-file/upload-file.service.ts | 4 +- 8 files changed, 161 insertions(+), 97 deletions(-) create mode 100644 src/institucion-usuario/entity/views/full-informacion-equipo-programa.view.ts create mode 100644 src/institucion-usuario/entity/views/informacion-equipo-programa.view.ts diff --git a/src/equipo-programa/entity/equipo-programa.entity.ts b/src/equipo-programa/entity/equipo-programa.entity.ts index 8e288de..2ec7730 100644 --- a/src/equipo-programa/entity/equipo-programa.entity.ts +++ b/src/equipo-programa/entity/equipo-programa.entity.ts @@ -11,7 +11,7 @@ export class EquipoPrograma { @JoinColumn({ name: 'id_equipo' }) equipo: Equipo; - @ManyToOne(() => Programa, (programa) => programa.equipos, { eager: true }) + @ManyToOne(() => Programa, (programa) => programa.equipos) @JoinColumn({ name: 'id_programa' }) programa: Programa; } diff --git a/src/equipo-programa/entity/views/informacion-equipo-programa.view.ts b/src/equipo-programa/entity/views/informacion-equipo-programa.view.ts index e22e5ba..e92d9a2 100644 --- a/src/equipo-programa/entity/views/informacion-equipo-programa.view.ts +++ b/src/equipo-programa/entity/views/informacion-equipo-programa.view.ts @@ -1,5 +1,8 @@ import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; import { EquipoPrograma } from '../equipo-programa.entity'; +import { Equipo } from '../../../equipo/entity/equipo.entity'; +import { Carrito } from '../../../carrito/entity/carrito.entity'; +import { Modulo } from '../../../modulo/entity/modulo.entity'; @ViewEntity({ expression: (dataSource: DataSource) => @@ -8,15 +11,34 @@ import { EquipoPrograma } from '../equipo-programa.entity'; .select('ep.id_equipo_programa', 'id_equipo_programa') .addSelect('ep.id_equipo', 'id_equipo') .addSelect('ep.id_programa', 'id_programa') - .from(EquipoPrograma, 'ep'), + .addSelect('e.id_carrito', 'id_carrito') + .addSelect('c.id_modulo', 'id_modulo') + .addSelect('c.id_tipo_carrito', 'id_tipo_carrito') + .addSelect('m.id_institucion', 'id_institucion') + .from(EquipoPrograma, 'ep') + .innerJoin(Equipo, 'e', 'e.id_equipo = ep.id_equipo') + .innerJoin(Carrito, 'c', 'c.id_carrito = e.id_carrito') + .innerJoin(Modulo, 'm', 'm.id_modulo = c.id_modulo'), }) export class InformacionEquipoProgramaView { @ViewColumn() id_equipo_programa: number; + @ViewColumn() + id_carrito: number; + @ViewColumn() id_equipo: number; + @ViewColumn() + id_institucion: number; + + @ViewColumn() + id_modulo: number; + @ViewColumn() id_programa: number; + + @ViewColumn() + id_tipo_carrito: number; } diff --git a/src/equipo-programa/equipo-programa.controller.ts b/src/equipo-programa/equipo-programa.controller.ts index 846c18d..2b7bb82 100644 --- a/src/equipo-programa/equipo-programa.controller.ts +++ b/src/equipo-programa/equipo-programa.controller.ts @@ -37,7 +37,11 @@ export class EquipoProgramaController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); - return this.equipoProgramaService.create(body.id_equipo, body.id_programa); + return this.equipoProgramaService.asignar( + operador, + body.id_equipo, + body.id_programa, + ); } @Delete() diff --git a/src/equipo-programa/equipo-programa.service.ts b/src/equipo-programa/equipo-programa.service.ts index 5599005..3d908df 100644 --- a/src/equipo-programa/equipo-programa.service.ts +++ b/src/equipo-programa/equipo-programa.service.ts @@ -30,36 +30,45 @@ export class EquipoProgramaService { private institucionProgramaService: InstitucionProgramaService, ) {} - async create( - // operador: Operador, - id_equipo: number | Equipo, - id_programa: number | Programa, - ) { - const equipo = - typeof id_equipo === 'number' - ? await this.equipoService.findInfoEquipoById(id_equipo) - : id_equipo; - const programa = - typeof id_programa === 'number' - ? await this.institucionProgramaService.findProgramaById(id_programa) - : id_programa; + async asignar(operador: Operador, id_equipo: number, id_programa: number) { + const equipo = await this.equipoService.findInfoEquipoById(id_equipo); + const programa = await this.institucionProgramaService.findProgramaById( + id_programa, + ); - return this.informacionEquipoPrograma( + // Valida que el equipo pertenezca a la institución del operador + if ( + operador.tipoUsuario.id_tipo_usuario > 2 && + operador.institucion.id_institucion != + equipo.carrito.modulo.institucion.id_institucion + ) + throw new ForbiddenException( + 'No puedes modificar la información este equipo porque no pertenece a tu institución.', + ); + // Verifica que no eixsta un registro con estos ids + return this.findInfoEquipoProgramaByIdEquipoIdPrograma( equipo.id_equipo, programa.id_programa, - ) - .then((existeEquipoPrograma) => { - if (existeEquipoPrograma) - throw new ConflictException( - 'Este software ya fue asignado a este equipo.', - ); - return this.informacionEquipoPrograma(equipo.id_equipo, 1); - }) + ).then((existeEquipoPrograma) => { + // Error si existe + if (existeEquipoPrograma) + throw new ConflictException( + 'Este software ya fue asignado a este equipo.', + ); + + // Creo registro + return this.create(equipo, programa); + }); + } + + async create(equipo: Equipo, programa: Programa) { + // Ver si tiene programa "Sin programa" + return this.findInfoEquipoProgramaByIdEquipoIdPrograma(equipo.id_equipo, 1) .then(async (existeEquipoSinPrograma) => { + // Si tiene lo elimino if (existeEquipoSinPrograma) - await this.repository.delete({ - id_equipo_programa: existeEquipoSinPrograma.id_equipo_programa, - }); + await this.repository.remove(existeEquipoSinPrograma); + // Creo el registro return this.repository.save( this.repository.create({ equipo, programa }), ); @@ -70,41 +79,33 @@ export class EquipoProgramaService { })); } - async createCargaMasiva(equipo: Equipo, programa: Programa) { - return this.informacionEquipoPrograma(equipo.id_equipo, 1) - .then(async (existeEquipoSinPrograma) => { - if (existeEquipoSinPrograma) - await this.repository.delete({ - id_equipo_programa: existeEquipoSinPrograma.id_equipo_programa, - }); - return this.repository.save( - this.repository.create({ equipo, programa }), - ); - }) - .then((equipoPrograma) => ({ - message: `Se asignó el software: ${equipoPrograma.programa.programa}, al equipo con número de inventario: ${equipo.numero_inventario}.`, - equipoPrograma, - })); + async createSinPrograma(equipo: Equipo) { + return this.repository.save( + this.repository.create({ equipo, programa: { id_programa: 1 } }), + ); } async delete(operador: Operador, id_equipo_programa: number) { - const equipoPrograma = await this.findById(id_equipo_programa); + const equipoPrograma = await this.findInfoEquipoProgramaById( + id_equipo_programa, + ); + // No se puede eliminar "Sin programa" manualmente + if (equipoPrograma.programa.id_programa === 1) + throw new ConflictException('No se puede eliminar esta opción.'); + // Valida que el equipo pertenezca a la institución del operador if ( operador.institucion.id_institucion != equipoPrograma.equipo.carrito.modulo.institucion.id_institucion ) throw new ForbiddenException( - 'No puedes eliminar el software de este equipo porque no pertenece a tu institución.', + 'No puedes modificar la información este equipo porque no pertenece a tu institución.', ); + // Ver cuantos programas tiene el equipo return this.repository .count({ where: { equipo: equipoPrograma.equipo } }) .then(async (n) => { - if (n === 1) { - if (equipoPrograma.programa.id_programa === 1) - throw new ConflictException('No se puede eliminar esta opción.'); - await this.create(equipoPrograma.equipo, 1); - } + if (n === 1) await this.createSinPrograma(equipoPrograma.equipo); return this.repository.remove(equipoPrograma); }) .then((_) => ({ @@ -112,49 +113,9 @@ export class EquipoProgramaService { })); } - findById(id_equipo_programa: number) { - return this.repository - .findOne({ - join: { - alias: 'ep', - innerJoinAndSelect: { - e: 'ep.equipo', - p: 'ep.programa', - c: 'e.carrito', - m: 'c.modulo', - i: 'm.institucion', - }, - }, - where: { id_equipo_programa }, - }) - .then((equipoPrograma) => { - if (!equipoPrograma) - throw new ConflictException('No existe este id equipo software.'); - return equipoPrograma; - }); - } - - findEquipoProgramaByEquipoPrograma( - equipo: Equipo, - programa: Programa, - validarExistencia = true, - ) { - return this.repository - .findOne({ where: { equipo, programa } }) - .then((equipoPrograma) => { - if (validarExistencia && equipoPrograma) - throw new ConflictException( - 'Este software ya fue asignado a este equipo.', - ); - return equipoPrograma; - }); - } - findFullInfoEquipoProgramaAllByIdEquipo(id_equipo: number) { return this.fullInformacionEquipoProgramaView - .find({ - where: { id_equipo }, - }) + .find({ where: { id_equipo } }) .then((infoEquipoProgramas) => { const equipoProgramas: EquipoPrograma[] = []; @@ -172,9 +133,36 @@ export class EquipoProgramaService { }); } - informacionEquipoPrograma(id_equipo: number, id_programa: number) { - return this.informacionEquipoProgramaView.findOne({ - where: { id_equipo, id_programa }, + findInfoEquipoProgramaById(id_equipo_programa: number) { + return this.informacionEquipoProgramaView + .findOne({ where: { id_equipo_programa } }) + .then((infoEquipoPrograma) => + this.repository.create({ + id_equipo_programa: infoEquipoPrograma.id_equipo_programa, + equipo: { + id_equipo: infoEquipoPrograma.id_equipo, + carrito: { + id_carrito: infoEquipoPrograma.id_carrito, + modulo: { + institucion: { + id_institucion: infoEquipoPrograma.id_institucion, + }, + }, + tipoCarrito: { + id_tipo_carrito: infoEquipoPrograma.id_tipo_carrito, + }, + }, + }, + }), + ); + } + + findInfoEquipoProgramaByIdEquipoIdPrograma( + id_equipo: number, + id_programa: number, + ) { + return this.repository.findOne({ + where: { equipo: { id_equipo }, programa: { id_programa } }, }); } } diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index 0e8e536..fa6b23b 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -82,7 +82,7 @@ export class EquipoService { ); return this.equipoProgramaService - .create(equipoNuevo, 1) + .createSinPrograma(equipoNuevo) .then((_) => equipoNuevo); } diff --git a/src/institucion-usuario/entity/views/full-informacion-equipo-programa.view.ts b/src/institucion-usuario/entity/views/full-informacion-equipo-programa.view.ts new file mode 100644 index 0000000..dba6f65 --- /dev/null +++ b/src/institucion-usuario/entity/views/full-informacion-equipo-programa.view.ts @@ -0,0 +1,28 @@ +// import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; +// import { EquipoPrograma } from '../equipo-programa.entity'; +// import { Programa } from '../../../institucion-programa/entity/programa.entity'; + +// @ViewEntity({ +// expression: (dataSource: DataSource) => +// dataSource +// .createQueryBuilder() +// .select('ep.id_equipo_programa', 'id_equipo_programa') +// .addSelect('ep.id_equipo', 'id_equipo') +// .addSelect('ep.id_programa', 'id_programa') +// .addSelect('p.programa', 'programa') +// .from(EquipoPrograma, 'ep') +// .innerJoin(Programa, 'p', 'p.id_programa = ep.id_programa'), +// }) +// export class FullInformacionEquipoProgramaView { +// @ViewColumn() +// id_equipo_programa: number; + +// @ViewColumn() +// id_equipo: number; + +// @ViewColumn() +// id_programa: number; + +// @ViewColumn() +// programa: string; +// } diff --git a/src/institucion-usuario/entity/views/informacion-equipo-programa.view.ts b/src/institucion-usuario/entity/views/informacion-equipo-programa.view.ts new file mode 100644 index 0000000..1c5acca --- /dev/null +++ b/src/institucion-usuario/entity/views/informacion-equipo-programa.view.ts @@ -0,0 +1,22 @@ +import { DataSource, ViewEntity, ViewColumn } from 'typeorm'; +import { InstitucionUsuario } from '../institucion-usuario.entity'; + +@ViewEntity({ + expression: (dataSource: DataSource) => + dataSource + .createQueryBuilder() + .select('ep.id_equipo_programa', 'id_equipo_programa') + .addSelect('ep.id_equipo', 'id_equipo') + .addSelect('ep.id_programa', 'id_programa') + .from(InstitucionUsuario, 'ep'), +}) +export class InformacionEquipoProgramaView { + @ViewColumn() + id_equipo_programa: number; + + @ViewColumn() + id_equipo: number; + + @ViewColumn() + id_programa: number; +} diff --git a/src/upload-file/upload-file.service.ts b/src/upload-file/upload-file.service.ts index 4da2247..6ab44df 100644 --- a/src/upload-file/upload-file.service.ts +++ b/src/upload-file/upload-file.service.ts @@ -321,7 +321,7 @@ export class UploadFileService { false, ); const existeEquipoPrograma = programa - ? await this.equipoProgramaService.informacionEquipoPrograma( + ? await this.equipoProgramaService.findInfoEquipoProgramaByIdEquipoIdPrograma( equipo.id_equipo, programa.id_programa, ) @@ -345,7 +345,7 @@ export class UploadFileService { continue; } await this.equipoProgramaService - .createCargaMasiva(equipo, programa) + .create(equipo, programa) .then((res) => { equipo.programas.push(res.equipoPrograma); mensajes.push(res.message);