diff --git a/src/equipo/dto/equipo-update.dto.ts b/src/equipo/dto/equipo-update.dto.ts index 03dd18a..7e4db72 100644 --- a/src/equipo/dto/equipo-update.dto.ts +++ b/src/equipo/dto/equipo-update.dto.ts @@ -1,12 +1,31 @@ -import { IsInt } from 'class-validator'; +import { Optional } from '@nestjs/common'; +import { IsInt, IsString } from 'class-validator'; export class EquipoUpdateDto { @IsInt() id_equipo: number; - @IsInt() - id_carrito: number; + @IsString() + @Optional() + equipo?: string; @IsInt() - id_status: number; + @Optional() + id_carrito?: number; + + @IsInt() + @Optional() + id_status?: number; + + @IsString() + @Optional() + marca?: string; + + @IsString() + @Optional() + modelo?: string; + + @IsString() + @Optional() + numero_serie?: string; } diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index 1d176d3..da44af9 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -1,7 +1,7 @@ import { Body, Controller, Get, Put, Query } from '@nestjs/common'; +import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { EquipoService } from './equipo.service'; import { EquipoDto } from './dto/equipo.dto'; -import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { EquipoEquiposDto } from './dto/equipo-equipos.dto'; import { EquipoUpdateDto } from './dto/equipo-update.dto'; @@ -12,7 +12,8 @@ export class EquipoController { @Get('equipo') @ApiOperation({ - description: 'Endpoint que retorna la información de un equipo.', + description: + 'Endpoint que retorna la información de un equipo por su número de inventario de una institución.', }) @ApiQuery({ description: 'Id de la institución.', @@ -71,11 +72,11 @@ export class EquipoController { name: 'id_modulo', type: 'string', }) - // @ApiQuery({ - // description: 'Id del tipo de entrada que se quiere usar como filtro.', - // name: 'id_tipo_entrada', - // type: 'string', - // }) + @ApiQuery({ + description: 'Id del tipo de entrada que se quiere usar como filtro.', + name: 'id_tipo_entrada', + type: 'string', + }) equipos(@Query() query: EquipoEquiposDto) { return this.equipoService.findAll(query); } diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index c9e76f8..ea25c1b 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -1,4 +1,5 @@ import { + ConflictException, forwardRef, Inject, Injectable, @@ -6,9 +7,9 @@ import { } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; +import { Carrito } from '../carrito/entity/carrito.entity'; import { Equipo } from './entity/equipo.entity'; import { Institucion } from '../institucion/entity/institucion.entity'; -import { Carrito } from '../carrito/entity/carrito.entity'; import { Modulo } from '../modulo/entity/modulo.entity'; import { Programa } from '../institucion-programa/entity/programa.entity'; import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; @@ -45,7 +46,7 @@ export class EquipoService { numero_inventario: string, numero_serie: string, ) { - const e = await this.repository.save( + const equipoNuevo = await this.repository.save( this.repository.create({ carrito, equipo, @@ -57,8 +58,23 @@ export class EquipoService { }), ); - await this.equipoProgramaService.create(e, 1); - return e; + return this.equipoProgramaService + .create(equipoNuevo, 1) + .then((_) => equipoNuevo); + } + + async existeEquipo(id_carrito: number | Carrito, equipo: string) { + const carrito = + typeof id_carrito === 'number' + ? await this.carritoService.findById(id_carrito) + : id_carrito; + + return this.repository.findOne({ carrito, equipo }).then((existeEquipo) => { + if (existeEquipo) + throw new ConflictException( + 'Ya existe un equipo con este nombre, intenta con otro.', + ); + }); } async findAll(filtros: { @@ -98,6 +114,10 @@ export class EquipoService { .innerJoinAndSelect('e.status', 's') .innerJoinAndSelect('c.modulo', 'm') .innerJoinAndSelect('c.tipoCarrito', 'tc') + .innerJoinAndSelect('e.tiposEntradas', 'tes') + .innerJoinAndSelect('tes.tipoEntrada', 'te') + .innerJoinAndSelect('e.programas', 'ps') + .innerJoinAndSelect('ps.programa', 'p') .take(15) .skip((parseInt(filtros.pagina) - 1) * 15); @@ -113,23 +133,19 @@ export class EquipoService { query.andWhere('m.id_modulo = :id_modulo', { id_modulo: modulo.id_modulo, }); - if (programa) { - query.innerJoinAndSelect('e.programas', 'ps'); - query.innerJoinAndSelect('ps.programa', 'p'); + if (programa) query.andWhere('ps.id_programa = :id_programa', { id_programa: programa.id_programa, }); - } + else query.andWhere('ps.id_programa = 1'); if (tipoCarrito) query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', { id_tipo_carrito: tipoCarrito.id_tipo_carrito, }); - if (tipoEntrada) { - query.innerJoinAndSelect('e.tiposEntradas', 'tes'); + if (tipoEntrada) query.andWhere('tes.id_tipo_entrada = :id_tipo_entrada', { id_tipo_entrada: tipoEntrada.id_tipo_entrada, }); - } if (status) query.andWhere('s.id_status = :id_status', { id_status: status.id_status, @@ -181,7 +197,7 @@ export class EquipoService { ) { const query = this.repository .createQueryBuilder('e') - .innerJoinAndSelect('e.carrito', 'c', 'activo = 1') + .innerJoinAndSelect('e.carrito', 'c', 'c.activo = 1') .innerJoinAndSelect( 'c.modulo', 'm', @@ -196,12 +212,12 @@ export class EquipoService { 'tc.id_tipo_carrito = :id_tipo_carrito', { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, ) - .innerJoinAndSelect('e.status', 's') + .innerJoinAndSelect('e.status', 's', 's.id_status = 1') .innerJoinAndSelect('e.tiposEntradas', 'tes') .innerJoinAndSelect('tes.tipoEntrada', 'te') .innerJoinAndSelect('e.programas', 'ps') .innerJoinAndSelect('ps.programa', 'p') - .where('e.id_status = 1 AND e.prestado = 0'); + .where('e.prestado = 0'); if (programa) query.andWhere('ps.id_programa = :id_programa', { @@ -227,7 +243,7 @@ export class EquipoService { if (n === 0) { const query = this.repository .createQueryBuilder('e') - .innerJoinAndSelect('e.carrito', 'c', 'activo = 1') + .innerJoinAndSelect('e.carrito', 'c', 'c.activo = 1') .innerJoinAndSelect( 'c.modulo', 'm', @@ -242,8 +258,8 @@ export class EquipoService { 'tc.id_tipo_carrito = :id_tipo_carrito', { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, ) - .innerJoinAndSelect('e.status', 's') - .andWhere('id_status = 1 AND prestado = 1'); + .innerJoinAndSelect('e.status', 's', 's.id_status = 1') + .andWhere('prestado = 1'); return query.update().set({ prestado: false }).execute(); } @@ -267,10 +283,23 @@ export class EquipoService { }); } - update(attrs: Partial) { + update(attrs: Partial, id_carrito?: number, id_status?: number) { return this.findById(attrs.id_equipo) - .then((equipo) => { + .then(async (equipo) => { + const status = id_status + ? await this.statusService.findById(id_status) + : null; + const carrito = id_carrito + ? await this.carritoService.findById(id_carrito) + : null; + + if (attrs.equipo) { + if (carrito) this.existeEquipo(carrito, attrs.equipo); + else this.existeEquipo(equipo.carrito, attrs.equipo); + } Object.assign(equipo, attrs); + if (carrito) equipo.carrito = carrito; + if (status) equipo.status = status; return this.repository.save(equipo); }) .then((equipo) => ({