From 98794cc2eac7abb59b1418afc366f9eeac3bef5f Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Mon, 19 Dec 2022 21:20:52 -0600 Subject: [PATCH] equipo service final --- src/equipo/entity/equipo.entity.ts | 2 +- src/equipo/equipo.service.ts | 330 ++++++++++++------------- src/prestamo/prestamo.service.ts | 2 +- src/upload-file/upload-file.service.ts | 2 +- 4 files changed, 168 insertions(+), 168 deletions(-) diff --git a/src/equipo/entity/equipo.entity.ts b/src/equipo/entity/equipo.entity.ts index d38f26e..aee2a46 100644 --- a/src/equipo/entity/equipo.entity.ts +++ b/src/equipo/entity/equipo.entity.ts @@ -44,7 +44,7 @@ export class Equipo { @Column({ type: Number, nullable: true }) id_modelo: number; - @Column({ type: Number, nullable: true }) + @Column({ type: Number, nullable: true, default: 1 }) id_status: number; @ManyToOne(() => Carrito, (carrito) => carrito.equipos, { eager: true }) diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index 16c7502..8fd0994 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -18,10 +18,12 @@ import { Operador } from '../operador/entity/operador.entity'; import { Programa } from '../institucion-programa/entity/programa.entity'; import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; import { TipoEntrada } from '../institucion-tipo-entrada/entity/tipo-entrada.entity'; +import { Usuario } from '../usuario/entity/usuario.entity'; import { FullInformacionEquipoView } from './entity/views/full-informacion-equipo.view'; -import { InformacionEquipoPrestamoView } from './entity/views/informacion-equipo-prestamo.view'; import { InformacionEquipoView } from './entity/views/informacion-equipo.view'; +import { InformacionEquipoPrestamoView } from './entity/views/informacion-equipo-prestamo.view'; import { CarritoService } from '../carrito/carrito.service'; +import { EquipoMotivoService } from '../equipo-motivo/equipo-motivo.service'; import { EquipoProgramaService } from '../equipo-programa/equipo-programa.service'; import { EquipoTipoEntradaService } from '../equipo-tipo-entrada/equipo-tipo-entrada.service'; import { InstitucionService } from '../institucion/institucion.service'; @@ -31,7 +33,6 @@ import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/insti import { MarcaService } from '../marca/marca.service'; import { ModeloService } from '../modelo/modelo.service'; import { ModuloService } from '../modulo/modulo.service'; -import { EquipoMotivoService } from '../equipo-motivo/equipo-motivo.service'; import { StatusService } from '../status/status.service'; @Injectable() @@ -40,11 +41,13 @@ export class EquipoService { @InjectRepository(Equipo) private repository: Repository, @InjectRepository(FullInformacionEquipoView) private fullInformacionEquipoView: Repository, - @InjectRepository(InformacionEquipoPrestamoView) - private informacionEquipoPrestamoView: Repository, @InjectRepository(InformacionEquipoView) private informacionEquipoView: Repository, + @InjectRepository(InformacionEquipoPrestamoView) + private informacionEquipoPrestamoView: Repository, private carritoService: CarritoService, + @Inject(forwardRef(() => EquipoMotivoService)) + private equipoMotivoService: EquipoMotivoService, @Inject(forwardRef(() => EquipoProgramaService)) private equipoProgramaService: EquipoProgramaService, @Inject(forwardRef(() => EquipoTipoEntradaService)) @@ -56,36 +59,34 @@ export class EquipoService { private marcaService: MarcaService, private modeloService: ModeloService, private moduloService: ModuloService, - @Inject(forwardRef(() => EquipoMotivoService)) - private equipoMotivoService: EquipoMotivoService, private statusService: StatusService, ) {} async create( - carrito: Carrito, equipo: string, + carrito: Carrito, numero_inventario: string, numero_serie: string, marca: Marca, modelo: Modelo, - ) { - // Creo y guardo el registro - const equipoNuevo = await this.repository.save( - this.repository.create({ - carrito, - equipo, - marca, - modelo, - numero_inventario, - numero_serie, - status: { id_status: 1 }, - }), - ); - - // Le asigno programa "Sin programa" - return this.equipoProgramaService - .createSinPrograma(equipoNuevo) - .then((_) => equipoNuevo); + ): Promise { + // Creamos y guradamos registro + return this.repository + .save( + this.repository.create({ + equipo, + numero_inventario, + numero_serie, + carrito, + marca, + modelo, + }), + ) + .then(async (equipo) => { + // Asignamos programa "Sin programa" por default + await this.equipoProgramaService.createSinPrograma(equipo); + return equipo; + }); } async findAll( @@ -104,7 +105,7 @@ export class EquipoService { id_tipo_carrito?: string; id_tipo_entrada?: string; }, - ) { + ): Promise<[Equipo[], number]> { const carrito = filtros.id_carrito ? await this.carritoService.findById(parseInt(filtros.id_carrito)) : null; @@ -130,14 +131,14 @@ export class EquipoService { parseInt(filtros.id_tipo_carrito), ) : null; - const status = filtros.id_status - ? await this.statusService.findById(parseInt(filtros.id_status)) - : null; const tipoEntrada = filtros.id_tipo_entrada ? await this.institucionTipoEntradaService.findTipoEntradaById( parseInt(filtros.id_tipo_entrada), ) : null; + const status = filtros.id_status + ? await this.statusService.findById(parseInt(filtros.id_status)) + : null; const query = this.repository .createQueryBuilder('e') .innerJoinAndSelect('e.carrito', 'c') @@ -210,17 +211,18 @@ export class EquipoService { return query.getManyAndCount(); } - findById(id_equipo: number) { - return this.informacionEquipoView - .findOne({ where: { id_equipo } }) - .then((infoEquipo) => { - if (!infoEquipo) - throw new NotFoundException('No existe este id equipo.'); - return this.viewToEquipo(infoEquipo); - }); + findAllResetear(): Promise { + return this.repository.find({ + select: ['id_equipo'], + where: { prestado: true, status: { id_status: Not(3) } }, + }); } - findByEquipo(carrito: Carrito, equipo: string, validarNoExiste = true) { + findByEquipo( + carrito: Carrito, + equipo: string, + validarNoExiste = true, + ): Promise { return this.informacionEquipoView .findOne({ where: { @@ -237,11 +239,21 @@ export class EquipoService { }); } + findById(id_equipo: number): Promise { + return this.informacionEquipoView + .findOne({ where: { id_equipo } }) + .then((infoEquipo) => { + if (!infoEquipo) + throw new NotFoundException('No existe este id equipo.'); + return this.viewToEquipo(infoEquipo); + }); + } + findByNumeroInventario( institucion: Institucion, numero_inventario: string, validarNoExiste = true, - ) { + ): Promise { return this.informacionEquipoView .findOne({ where: { @@ -252,27 +264,29 @@ export class EquipoService { .then((infoEquipo) => { if (!infoEquipo && validarNoExiste) throw new NotFoundException( - 'No existe un equipo de cómputo con este número de inventario.', + 'No existe un equipo de cómputo con este número de inventario en esta institución.', ); return this.viewToEquipo(infoEquipo); }); } findEquipo( - id_usuario: number, + usuario: Usuario, modulo: Modulo, tipoCarrito: TipoCarrito, programa?: Programa, tipoEntrada?: TipoEntrada, - ) { + ): Promise { const busquedaReseteo: FindOptionsWhere = { prestado: 1, id_modulo: modulo.id_modulo, + id_programa: 1, id_tipo_carrito: tipoCarrito.id_tipo_carrito, }; const busqueda: FindOptionsWhere = { prestado: 0, id_modulo: modulo.id_modulo, + id_programa: 1, id_tipo_carrito: tipoCarrito.id_tipo_carrito, }; @@ -280,27 +294,22 @@ export class EquipoService { if (programa) { busqueda.id_programa = programa.id_programa; busquedaReseteo.id_programa = programa.id_programa; - } else { - // De lo contrario se asigna el valor por defaulta, "Sin programa" - busqueda.id_programa = 1; - busquedaReseteo.id_programa = 1; } // Si se mando un tipo de entrada se añade a la busqueda if (tipoEntrada) { busqueda.id_tipo_entrada = tipoEntrada.id_tipo_entrada; busquedaReseteo.id_tipo_entrada = tipoEntrada.id_tipo_entrada; } - // Busaca un equipo + // Intentamos encontrar un equipo return this.informacionEquipoPrestamoView .findOne({ where: busqueda }) .then(async (infoEquipo) => { - // Si no hay uno busca a todos los quipos que cumplan las mismas - // condiciones pero que ya hayan sido prestados + // Si no se encuentra un equipo reseteamos todos los equipos con las carecteríasticas solicitadas if (!infoEquipo) await this.informacionEquipoPrestamoView .find({ where: busquedaReseteo }) .then(async (infoEquipos) => { - // Los pasamos a no prestados para resetear los equipos + // Reseteamos prestado y guardamos los cambios for (let i = 0; i < infoEquipos.length; i++) await this.repository.save( this.repository.create({ @@ -308,7 +317,7 @@ export class EquipoService { prestado: false, }), ); - // Trata de buscar otro + // Intentamos buscar de nuevo return this.informacionEquipoPrestamoView.findOne({ where: busqueda, }); @@ -326,12 +335,11 @@ export class EquipoService { throw new ConflictException( 'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.', ); - // Actualizo el status del equipo a apartado y gurado el id del usaurio - // al que se asignó + // Cambiamos el equipo a apartado y guardamos el id del usuario al que le asignamos ese equipo return this.repository.save( this.repository.create({ id_equipo: infoEquipo.id_equipo, - u: id_usuario, + u: usuario.id_usuario, status: { id_status: 2 }, }), ); @@ -339,7 +347,7 @@ export class EquipoService { .then((equipo) => this.findFullInfoById(equipo.id_equipo)) // Una vez actualizado lo busco de nuevo .then((equipo) => { // Si el campo u no coincide con el id_usaurio saca error - if (equipo.u != id_usuario) + if (equipo.u != usuario.id_usuario) throw new ConflictException( 'Ocurrió un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.', ); @@ -347,10 +355,22 @@ export class EquipoService { }); } + findFullInfoById(id_equipo: number): Promise { + return this.fullInformacionEquipoView + .findOne({ where: { id_equipo } }) + .then((infoEquipo) => { + if (!infoEquipo) + throw new NotFoundException( + 'No existe un equipo de cómputo con este número de inventario en esta institución.', + ); + return this.fullViewToEquipo(infoEquipo); + }); + } + findFullInfoByNumeroInventario( operador: Operador, numero_inventario: string, - ) { + ): Promise { return this.fullInformacionEquipoView .findOne({ where: { @@ -365,12 +385,12 @@ export class EquipoService { ); const equipo = this.fullViewToEquipo(infoEquipo); - // Busco todos los programas de este equipo + // Buscamos todos los programas de este equipo const programas = await this.equipoProgramaService.findFullInfoAllByIdEquipo( equipo.id_equipo, ); - // Busco todos los tipos de entrada de este equipo + // Buscamos todos los tipos de entrada de este equipo const tiposEntradas = await this.equipoTipoEntradaService.findFullInfoAllByIdEquipo( equipo.id_equipo, @@ -382,113 +402,7 @@ export class EquipoService { }); } - findFullInfoById(id_equipo: number) { - return this.fullInformacionEquipoView - .findOne({ where: { id_equipo } }) - .then((infoEquipo) => { - if (!infoEquipo) - throw new NotFoundException( - 'No existe un equipo de cómputo con este número de inventario en esta institución.', - ); - return this.fullViewToEquipo(infoEquipo); - }); - } - - findAllResetear(): Promise { - return this.repository.find({ - select: ['id_equipo'], - where: { prestado: true, status: { id_status: Not(3) } }, - }); - } - - save(equipo: Equipo): Promise { - return this.repository.save(equipo); - } - - update( - operador: Operador, - attrs: Partial, - id_carrito?: number, - id_status?: number, - motivo?: string, - ) { - return this.findById(attrs.id_equipo) - .then(async (equipo) => { - const carrito = id_carrito - ? await this.carritoService.findById(id_carrito) - : null; - const status = id_status - ? await this.statusService.findById(id_status) - : null; - - // Validamos que el equipo pertenezca a la institución del operador - // que realiza esta acción - 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.', - ); - // Si se mandó id_status - if (status) { - // No se pude actualziar el status de lequipo cuando esta en uno de estos - if (equipo.status.id_status === 2 || equipo.status.id_status === 3) - throw new ConflictException( - 'No se puede cambiar el status de un equipo si esta apartada o en uso.', - ); - // El operador no puede cambiar el status de un equipo a uno de estos - if (status.id_status === 2 || status.id_status === 3) - throw new ConflictException( - 'No se puede cambiar manualmente el status de un equipo a apartado o en uso.', - ); - if (!motivo) - throw new ConflictException( - 'No se mandó el motivo para el cambio de status.', - ); - } - Object.assign(equipo, attrs); - if (status) { - equipo.status = status; - // Se crea registro de quien cambio el status del equipo, el motivo - // por el cual lo cambió, el status al que lo cmabió y cuando lo hizo - await this.equipoMotivoService.create( - equipo, - operador, - status, - motivo, - ); - } - if (carrito) equipo.carrito = carrito; - // Guardar - return this.repository.save(equipo); - }) - .then((_) => ({ message: 'Se guardaron los cambios correctamente.' })); - } - - async updateStatus(equipo: Equipo, operador?: Operador, motivo?: string) { - // Si el status al que se esta actualizando es mayo o igual a 4 - if (equipo.status.id_status >= 4) { - if (!operador) throw new ConflictException('No se mandó el id operador.'); - if (!motivo) - throw new ConflictException( - 'No se mandó el motivo para el cambio de status.', - ); - // Se crea registro de quien cambio el status del equipo, el motivo - // por el cual lo cambió, el status al que lo cmabió y cuando lo hizo - await this.equipoMotivoService.create( - equipo, - operador, - equipo.status, - motivo, - ); - } - // Guardo los cambios - return this.repository.save(equipo); - } - - private fullViewToEquipo(infoEquipo: FullInformacionEquipoView) { + private fullViewToEquipo(infoEquipo: FullInformacionEquipoView): Equipo { return this.repository.create({ id_equipo: infoEquipo.id_equipo, equipo: infoEquipo.equipo, @@ -527,6 +441,92 @@ export class EquipoService { }); } + save(equipo: Equipo): Promise { + return this.repository.save(equipo); + } + + update( + operador: Operador, + attrs: Partial, + id_carrito?: number, + id_status?: number, + motivo?: string, + ): Promise<{ message: string }> { + return this.findById(attrs.id_equipo) + .then(async (equipo) => { + const carrito = id_carrito + ? await this.carritoService.findById(id_carrito) + : null; + const status = id_status + ? await this.statusService.findById(id_status) + : null; + + // Validamos que el equipo pertenezca a la institución del operador + if ( + 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.', + ); + // Si se mandó id_status + if (status) { + // No se puede actualziar el status del equipo cuando esta apartado o en uso + if (equipo.status.id_status === 2 || equipo.status.id_status === 3) + throw new ConflictException( + 'No se puede cambiar el status de un equipo si esta apartada o en uso.', + ); + // El operador no puede cambiar el status de un equipo a apartado o en uso + if (status.id_status === 2 || status.id_status === 3) + throw new ConflictException( + 'No se puede cambiar manualmente el status de un equipo a apartado o en uso.', + ); + // Si no se mando motivo saca error + if (!motivo) + throw new ConflictException( + 'No se mandó el motivo para el cambio de status.', + ); + } + Object.assign(equipo, attrs); + if (status) { + equipo.status = status; + // Se crea un registro del cambio de status de este equipo + await this.equipoMotivoService.create( + equipo, + operador, + status, + motivo, + ); + } + if (carrito) equipo.carrito = carrito; + // Guardamos los cambios + return this.repository.save(equipo); + }) + .then((_) => ({ message: 'Se guardaron los cambios correctamente.' })); + } + + async updateStatus(equipo: Equipo, operador?: Operador, motivo?: string) { + // Si el status al que se esta actualizando es mayor a 3 + if (equipo.status.id_status > 3) { + // Si no se manda operador saca error + if (!operador) throw new ConflictException('No se mandó el id operador.'); + // Si no se mando motivo saca error + if (!motivo) + throw new ConflictException( + 'No se mandó el motivo de cambio de status.', + ); + // Se crea un registro del cambio de status de este equipo + await this.equipoMotivoService.create( + equipo, + operador, + equipo.status, + motivo, + ); + } + // Guardamos los cambios + return this.repository.save(equipo); + } + private viewToEquipo(infoEquipo: InformacionEquipoView) { if (!infoEquipo) return null; return this.repository.create({ diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 3f637de..09482db 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -222,7 +222,7 @@ export class PrestamoService { ); // Busco un equipo con las caracteríasticas solicitadas return this.equipoService.findEquipo( - usuario.id_usuario, + usuario, modulo, tipoCarrito, programa, diff --git a/src/upload-file/upload-file.service.ts b/src/upload-file/upload-file.service.ts index dee05c5..4295ec7 100644 --- a/src/upload-file/upload-file.service.ts +++ b/src/upload-file/upload-file.service.ts @@ -254,8 +254,8 @@ export class UploadFileService { } await this.equipoService .create( - carrito, dataEquipo.equipo, + carrito, dataEquipo.numero_inventario, dataEquipo.numero_serie, marca,