diff --git a/src/equipo-motivo/equipo-motivo.service.ts b/src/equipo-motivo/equipo-motivo.service.ts index ef4dae5..fad8267 100644 --- a/src/equipo-motivo/equipo-motivo.service.ts +++ b/src/equipo-motivo/equipo-motivo.service.ts @@ -49,7 +49,7 @@ export class EquipoMotivoService { } findAllByIdEquipo(id_equipo: number, pagina: number) { - return this.equipoService.findInfoEquipoById(id_equipo).then((equipo) => + return this.equipoService.findById(id_equipo).then((equipo) => this.repository.findAndCount({ where: { equipo }, skip: (pagina - 1) * 25, diff --git a/src/equipo-programa/equipo-programa.service.ts b/src/equipo-programa/equipo-programa.service.ts index 422c07c..1c45d0c 100644 --- a/src/equipo-programa/equipo-programa.service.ts +++ b/src/equipo-programa/equipo-programa.service.ts @@ -31,7 +31,7 @@ export class EquipoProgramaService { ) {} async asignar(operador: Operador, id_equipo: number, id_programa: number) { - const equipo = await this.equipoService.findInfoEquipoById(id_equipo); + const equipo = await this.equipoService.findById(id_equipo); const programa = await this.institucionProgramaService.findProgramaById( id_programa, ); diff --git a/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts b/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts index b0e16e1..e68647a 100644 --- a/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts +++ b/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts @@ -31,7 +31,7 @@ export class EquipoTipoEntradaService { ) {} async asignar(id_equipo: number, id_tipo_entrada: number) { - const equipo = await this.equipoService.findInfoEquipoById(id_equipo); + const equipo = await this.equipoService.findById(id_equipo); const tipoEntrada = await this.institucionTipoEntradaService.findTipoEntradaById( id_tipo_entrada, diff --git a/src/equipo/entity/equipo.entity.ts b/src/equipo/entity/equipo.entity.ts index 396be96..d38f26e 100644 --- a/src/equipo/entity/equipo.entity.ts +++ b/src/equipo/entity/equipo.entity.ts @@ -35,6 +35,18 @@ export class Equipo { @Column({ type: Number, nullable: true, default: null }) u: number; + @Column({ type: Number, nullable: true }) + id_carrito: number; + + @Column({ type: Number, nullable: true }) + id_marca: number; + + @Column({ type: Number, nullable: true }) + id_modelo: number; + + @Column({ type: Number, nullable: true }) + id_status: number; + @ManyToOne(() => Carrito, (carrito) => carrito.equipos, { eager: true }) @JoinColumn({ name: 'id_carrito' }) carrito: Carrito; diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index a70c428..6c8c6a1 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -22,6 +22,7 @@ import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.servic import { Operador } from '../operador/entity/operador.entity'; import { NumeroInventarioDto } from '../dto/numero-inventario.dto'; import { EquiposDto } from './dto/input/equipos.dto'; +import { MessageOutputDto } from '../dto/output/message.dto'; import { UpdateEquipoDto } from './dto/input/update.dto'; import { EquipoOutputDto } from './dto/output/equipo.dto'; import { EquiposOutputDto } from './dto/output/equipos.dto'; @@ -57,7 +58,7 @@ export class EquipoController { this.validarUsuarioService.validarAdminOperador(operador); return this.equipoService - .findFullInfoEquipoByNumeroInventario( + .findFullInfoByNumeroInventario( parseInt(query.id_institucion), query.numero_inventario, ) @@ -160,6 +161,7 @@ export class EquipoController { return this.equipoService.findAll(operador, query); } + @Serealize(MessageOutputDto) @Put() @UseGuards(AuthGuard('jwt')) @ApiOperation({ diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index 9f3460d..4158a5e 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -69,6 +69,7 @@ export class EquipoService { marca: Marca, modelo: Modelo, ) { + // Creo y guardo el registro const equipoNuevo = await this.repository.save( this.repository.create({ carrito, @@ -81,6 +82,7 @@ export class EquipoService { }), ); + // Le asigno programa "Sin programa" return this.equipoProgramaService .createSinPrograma(equipoNuevo) .then((_) => equipoNuevo); @@ -159,7 +161,10 @@ export class EquipoService { .take(15) .skip((parseInt(filtros.pagina) - 1) * 15); + // Si se mando id modulo if (modulo) { + // Valido que el módulo le pertenezca a la institución del + // operador que solicita la información if ( operador.tipoUsuario.id_tipo_usuario > 2 && operador.institucion.id_institucion != modulo.institucion.id_institucion @@ -171,7 +176,10 @@ export class EquipoService { id_modulo: modulo.id_modulo, }); } + // Si se mando id carrito if (carrito) { + // Valido que el carrito le pertenezca a la institución del + // operador que solicita la información if ( operador.tipoUsuario.id_tipo_usuario > 2 && operador.institucion.id_institucion != @@ -223,87 +231,7 @@ export class EquipoService { return query.getManyAndCount(); } - async findEquipo( - id_usuario: number, - modulo: Modulo, - tipoCarrito: TipoCarrito, - programa?: Programa, - tipoEntrada?: TipoEntrada, - ) { - const busquedaReseteo: FindOptionsWhere = { - prestado: 1, - id_modulo: modulo.id_modulo, - id_tipo_carrito: tipoCarrito.id_tipo_carrito, - }; - const busqueda: FindOptionsWhere = { - prestado: 0, - id_modulo: modulo.id_modulo, - id_tipo_carrito: tipoCarrito.id_tipo_carrito, - }; - - if (programa) { - busqueda.id_programa = programa.id_programa; - busquedaReseteo.id_programa = programa.id_programa; - } else { - busqueda.id_programa = 1; - busquedaReseteo.id_programa = 1; - } - if (tipoEntrada) { - busqueda.id_tipo_entrada = tipoEntrada.id_tipo_entrada; - busquedaReseteo.id_tipo_entrada = tipoEntrada.id_tipo_entrada; - } - return this.informacionEquipoPrestamoView - .findOne({ where: busqueda }) - .then((infoEquipo) => { - if (!infoEquipo) - return this.informacionEquipoPrestamoView - .find({ where: busquedaReseteo }) - .then(async (infoEquipos) => { - for (let i = 0; i < infoEquipos.length; i++) - await this.repository.save( - this.repository.create({ - id_equipo: infoEquipos[i].id_equipo, - prestado: false, - }), - ); - return this.informacionEquipoPrestamoView.findOne({ - where: busqueda, - }); - }) - .then((infoEquipo) => { - if (!infoEquipo) - throw new ConflictException( - 'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.', - ); - return infoEquipo; - }); - return infoEquipo; - }) - .then((infoEquipo) => { - if (infoEquipo.u) - throw new ConflictException( - 'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.', - ); - - const equipo = this.repository.create({ - id_equipo: infoEquipo.id_equipo, - u: id_usuario, - status: { id_status: 2 }, - }); - - return this.repository.save(equipo); - }) - .then((equipo) => this.findInfoEquipoById(equipo.id_equipo)) - .then((equipo) => { - if (equipo.u != id_usuario) - throw new ConflictException( - 'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.', - ); - return equipo; - }); - } - - findInfoEquipoById(id_equipo: number) { + findById(id_equipo: number) { return this.informacionEquipoView .findOne({ where: { id_equipo } }) .then((infoEquipo) => { @@ -313,7 +241,27 @@ export class EquipoService { }); } - findInfoEquipoByNumeroInventario( + findByEquipo(carrito: Carrito, equipo: string, validarNoExiste = true) { + return this.informacionEquipoView + .findOne({ + where: { + id_carrito: carrito.id_carrito, + equipo, + }, + }) + .then((infoEquipo) => { + if (!infoEquipo) { + if (validarNoExiste) + throw new NotFoundException( + 'No existe un equipo de cómputo con este número de inventario.', + ); + return null; + } + return this.viewToEquipo(infoEquipo); + }); + } + + findByNumeroInventario( institucion: Institucion, numero_inventario: string, validarNoExiste = true, @@ -337,31 +285,102 @@ export class EquipoService { }); } - async findInfoEquipoByEquipo( - carrito: Carrito, - equipo: string, - validarNoExiste = true, + findEquipo( + id_usuario: number, + modulo: Modulo, + tipoCarrito: TipoCarrito, + programa?: Programa, + tipoEntrada?: TipoEntrada, ) { - return this.informacionEquipoView - .findOne({ - where: { - id_carrito: carrito.id_carrito, - equipo, - }, - }) - .then((infoEquipo) => { - if (!infoEquipo) { - if (validarNoExiste) - throw new NotFoundException( - 'No existe un equipo de cómputo con este número de inventario.', + const busquedaReseteo: FindOptionsWhere = { + prestado: 1, + id_modulo: modulo.id_modulo, + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }; + const busqueda: FindOptionsWhere = { + prestado: 0, + id_modulo: modulo.id_modulo, + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }; + + // Si se mando un programa se añade a la busqueda + 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 + return ( + this.informacionEquipoPrestamoView + .findOne({ where: busqueda }) + .then((infoEquipo) => { + // Si no hay uno busca a todos los quipos que cumplan las mismas + // condiciones pero que ya hayan sido prestados + if (!infoEquipo) + return this.informacionEquipoPrestamoView + .find({ where: busquedaReseteo }) + .then(async (infoEquipos) => { + // Los pasamos a no prestados para resetear los equipos + for (let i = 0; i < infoEquipos.length; i++) + await this.repository.save( + this.repository.create({ + id_equipo: infoEquipos[i].id_equipo, + prestado: false, + }), + ); + // Trata de buscar otro + return this.informacionEquipoPrestamoView.findOne({ + where: busqueda, + }); + }) + .then((infoEquipo) => { + // Si no hay saca error + if (!infoEquipo) + throw new ConflictException( + 'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.', + ); + return infoEquipo; + }); + return infoEquipo; + }) + .then((infoEquipo) => { + // Esta variable debe estar siempre en null antes de asignar el equipo + if (infoEquipo.u) + throw new ConflictException( + 'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.', ); - return null; - } - return this.viewToEquipo(infoEquipo); - }); + // Actualizo el status del equipo a apartado y gurado el id del usaurio + // al que se asignó + return this.repository.save( + this.repository.create({ + id_equipo: infoEquipo.id_equipo, + u: id_usuario, + status: { id_status: 2 }, + }), + ); + }) + // Una vez actualizado lo busco de nuvo + .then((equipo) => this.findById(equipo.id_equipo)) + .then((equipo) => { + // Si el campo u no coincide con el id_usaurio saca error + if (equipo.u != id_usuario) + throw new ConflictException( + 'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.', + ); + return equipo; + }) + ); } - findFullInfoEquipoByNumeroInventario( + findFullInfoByNumeroInventario( id_institucion: number, numero_inventario: string, ) { @@ -381,10 +400,12 @@ export class EquipoService { 'No existe un equipo de cómputo con este número de inventario.', ); + // Busco todos los programas de este equipo const programas = await this.equipoProgramaService.findFullInfoEquipoProgramaAllByIdEquipo( infoEquipo.id_equipo, ); + // Busco todos los tipos de entrada de este equipo const tiposEntradas = await this.equipoTipoEntradaService.findFullInfoEquipoTipoEntradaAllByIdEquipo( infoEquipo.id_equipo, @@ -451,8 +472,10 @@ export class EquipoService { ? await this.statusService.findById(id_status) : null; - return this.findInfoEquipoById(attrs.id_equipo) + return this.findById(attrs.id_equipo) .then(async (equipo) => { + // Valido 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 != @@ -461,11 +484,14 @@ export class EquipoService { 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 este status.', @@ -478,6 +504,8 @@ export class EquipoService { 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, @@ -486,14 +514,14 @@ export class EquipoService { ); } if (carrito) equipo.carrito = carrito; + // Guardar return this.repository.save(equipo); }) - .then((_) => ({ - message: 'Se guardaron los cambios correctamente.', - })); + .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) @@ -507,6 +535,7 @@ export class EquipoService { motivo, ); } + // Guardo los cambios return this.repository.save(equipo); } diff --git a/src/multa/multa.service.ts b/src/multa/multa.service.ts index 005f932..c5603cc 100644 --- a/src/multa/multa.service.ts +++ b/src/multa/multa.service.ts @@ -183,7 +183,7 @@ export class MultaService { } findAllByIdEquipo(id_equipo: number, pagina: number) { - return this.equipoService.findInfoEquipoById(id_equipo).then((equipo) => + return this.equipoService.findById(id_equipo).then((equipo) => this.fullInformacionMultaView .findAndCount({ where: { id_equipo: equipo.id_equipo }, diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 6256463..e2b00d5 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -696,7 +696,7 @@ export class PrestamoService { return this.institucionService .findInfoInstitucionById(id_institucion) .then((institucion) => - this.equipoService.findInfoEquipoByNumeroInventario( + this.equipoService.findByNumeroInventario( institucion, numero_inventario, ), diff --git a/src/upload-file/upload-file.service.ts b/src/upload-file/upload-file.service.ts index b8c9a34..0e701a0 100644 --- a/src/upload-file/upload-file.service.ts +++ b/src/upload-file/upload-file.service.ts @@ -214,11 +214,7 @@ export class UploadFileService { ) : null; let equipo = carrito - ? await this.equipoService.findInfoEquipoByEquipo( - carrito, - dataEquipo.equipo, - false, - ) + ? await this.equipoService.findByEquipo(carrito, dataEquipo.equipo, false) : null; if (!tipoCarrito || !marca || !modelo || !modulo || !carrito) { @@ -249,7 +245,7 @@ export class UploadFileService { ); return; } else { - equipo = await this.equipoService.findInfoEquipoByNumeroInventario( + equipo = await this.equipoService.findByNumeroInventario( institucion, dataEquipo.numero_inventario, false,