diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 0cde7e6..d9fb47c 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -43,9 +43,9 @@ export class AuthController { examples: { ejemplo: { value: { + id_modulo: 1, operador: '', password: '', - id_modulo: 1, }, }, }, diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 4d504c1..45bad22 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -44,9 +44,9 @@ export class AuthService { this.validarLogin(operador, password); const payload: JwtPayload = { + id_modulo: modulo.id_modulo, id_operador: operador.id_operador, id_tipo_usuario: operador.tipoUsuario.id_tipo_usuario, - id_modulo: modulo.id_modulo, }; return { operador, token: this.jwtService.sign(payload) }; @@ -62,7 +62,7 @@ export class AuthService { id_tipo_usuario: usuario.tipoUsuario.id_tipo_usuario, }; - return { usuario, token: this.jwtService.sign(payload) }; + return { token: this.jwtService.sign(payload), usuario }; }); } diff --git a/src/bcrypt/bcrypt.service.ts b/src/bcrypt/bcrypt.service.ts index 0bab564..6dffe0e 100644 --- a/src/bcrypt/bcrypt.service.ts +++ b/src/bcrypt/bcrypt.service.ts @@ -6,6 +6,10 @@ import { ConfigService } from '@nestjs/config'; export class BcryptService { constructor(private configService: ConfigService) {} + comparar(password: string, passwordDb: string) { + return bcrypt.compareSync(password, passwordDb); + } + encriptar(password: string) { const salt = bcrypt.genSaltSync( parseInt(this.configService.get('SALT_ROUNDS')), @@ -13,8 +17,4 @@ export class BcryptService { return bcrypt.hashSync(password, salt); } - - comparar(password: string, passwordDb: string) { - return bcrypt.compareSync(password, passwordDb); - } } diff --git a/src/carrera-programa/carrera-programa.controller.ts b/src/carrera-programa/carrera-programa.controller.ts index 40cc0b9..5a7d639 100644 --- a/src/carrera-programa/carrera-programa.controller.ts +++ b/src/carrera-programa/carrera-programa.controller.ts @@ -1,4 +1,13 @@ -import { Body, Controller, Delete, Get, Post, Query } from '@nestjs/common'; +import { + Body, + Controller, + Delete, + Get, + Post, + Query, + UseGuards, +} from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { CarreraProgramaService } from './carrera-programa.service'; @@ -13,9 +22,10 @@ export class CarreraProgramaController { constructor(private carreraProgramaService: CarreraProgramaService) {} @Post() + // @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: - 'Endpoint que crea una asociación entra una carrera y un programa.', + 'Endpoint que crea una asociación entre una carrera y un programa.', }) @ApiBody({ description: 'Ambas variables son obligatorios.', @@ -31,6 +41,7 @@ export class CarreraProgramaController { } @Delete() + // @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que borra la asociación entre una carrera y un programa.', diff --git a/src/carrito/carrito.controller.ts b/src/carrito/carrito.controller.ts index 516c77e..d950946 100644 --- a/src/carrito/carrito.controller.ts +++ b/src/carrito/carrito.controller.ts @@ -50,6 +50,18 @@ export class CarritoController { name: 'pagina', type: 'string', }) + @ApiQuery({ + description: 'Booleano en forma de string que se usará como filtro.', + name: 'activo', + type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Carrito que se esta buscando.', + name: 'carrito', + type: 'string', + required: false, + }) @ApiQuery({ description: 'Id de la institución.', name: 'id_institucion', @@ -68,18 +80,6 @@ export class CarritoController { type: 'string', required: false, }) - @ApiQuery({ - description: 'Booleano en forma de string que se usará como filtro.', - name: 'activo', - type: 'string', - required: false, - }) - @ApiQuery({ - description: 'Carrito que se esta buscando.', - name: 'carrito', - type: 'string', - required: false, - }) carritos(@Query() query: CarritosDto) { return this.carritoService.findAll(query); } @@ -93,7 +93,7 @@ export class CarritoController { description: 'Todas las variables son obligatorias.', examples: { ejemplo: { - value: { id_tipo_carrito: 1, id_modulo: 1, marca: '', modelo: '' }, + value: { id_modulo: 1, id_tipo_carrito: 1, marca: '', modelo: '' }, }, }, }) @@ -119,9 +119,9 @@ export class CarritoController { value: { id_carrito: 1, _activo: true, + _carrito: '', _id_modulo: 1, _id_tipo_carrito: 1, - _carrito: '', _marca: '', _modelo: '', }, @@ -129,8 +129,12 @@ export class CarritoController { }, }) update(@Body() body: UpdateCarritoDto) { + const data = { ...body }; + + delete data.id_modulo; + delete data.id_tipo_carrito; return this.carritoService.update( - body, + data, body.id_modulo, body.id_tipo_carrito, ); diff --git a/src/carrito/carrito.module.ts b/src/carrito/carrito.module.ts index 4cfcfb5..1f66a14 100644 --- a/src/carrito/carrito.module.ts +++ b/src/carrito/carrito.module.ts @@ -6,6 +6,7 @@ import { Carrito } from './entity/carrito.entity'; import { InstitucionModule } from '../institucion/institucion.module'; import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module'; import { ModuloModule } from '../modulo/modulo.module'; + @Module({ imports: [ InstitucionModule, diff --git a/src/carrito/carrito.service.ts b/src/carrito/carrito.service.ts index f98d5f1..37befeb 100644 --- a/src/carrito/carrito.service.ts +++ b/src/carrito/carrito.service.ts @@ -4,9 +4,8 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { FindOperator, Like, Repository } from 'typeorm'; +import { Repository } from 'typeorm'; import { Carrito } from './entity/carrito.entity'; -import { Institucion } from '../institucion/entity/institucion.entity'; import { Modulo } from '../modulo/entity/modulo.entity'; import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; import { InstitucionService } from '../institucion/institucion.service'; @@ -120,10 +119,6 @@ export class CarritoService { query.andWhere('c.carrito LIKE :carrito', { carrito: `%${filtros.carrito}%`, }); - if (tipoCarrito) - query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', { - id_tipo_carrito: tipoCarrito.id_tipo_carrito, - }); if (institucion) query.andWhere('i.id_institucion = :id_institucion', { id_institucion: institucion.id_institucion, @@ -132,6 +127,10 @@ export class CarritoService { query.andWhere('m.id_modulo = :id_modulo', { id_modulo: modulo.id_modulo, }); + if (tipoCarrito) + query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', { + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }); return query.getManyAndCount(); } @@ -173,17 +172,17 @@ export class CarritoService { id_modulo?: number, id_tipo_carrito?: number, ) { + const modulo = id_modulo + ? await this.moduloService.findById(id_modulo) + : null; + const tipoCarrito = id_modulo + ? await this.institucionTipoCarritoService.findTipoCarritoById( + id_tipo_carrito, + ) + : null; + return this.findById(attrs.id_carrito) .then(async (carrito) => { - const modulo = id_modulo - ? await this.moduloService.findById(id_modulo) - : null; - const tipoCarrito = id_modulo - ? await this.institucionTipoCarritoService.findTipoCarritoById( - id_tipo_carrito, - ) - : null; - if (attrs.carrito || modulo || tipoCarrito) await this.existeCarrito( modulo ? modulo : carrito.modulo, diff --git a/src/equipo-programa/equipo-programa.controller.ts b/src/equipo-programa/equipo-programa.controller.ts index ac8c9db..bf74a4e 100644 --- a/src/equipo-programa/equipo-programa.controller.ts +++ b/src/equipo-programa/equipo-programa.controller.ts @@ -4,6 +4,7 @@ import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger'; import { EquipoProgramaService } from './equipo-programa.service'; import { CreateEquipoProgramaDto } from './dto/input/create.dto'; import { DeleteEquipoProgramaDto } from './dto/input/delete.dto'; + @Controller('equipo-programa') @ApiTags('equipo-programa') export class EquipoProgramaController { diff --git a/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts b/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts index d1b1e8e..fcf3351 100644 --- a/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts +++ b/src/equipo-tipo-entrada/equipo-tipo-entrada.service.ts @@ -3,9 +3,9 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { Equipo } from 'src/equipo/entity/equipo.entity'; import { EquipoTipoEntrada } from './entity/equipo-tipo-entrada.entity'; +import { TipoEntrada } from 'src/institucion-tipo-entrada/entity/tipo-entrada.entity'; import { EquipoService } from '../equipo/equipo.service'; import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service'; -import { TipoEntrada } from 'src/institucion-tipo-entrada/entity/tipo-entrada.entity'; @Injectable() export class EquipoTipoEntradaService { diff --git a/src/equipo/dto/input/update.dto.ts b/src/equipo/dto/input/update.dto.ts index 3b7e0f2..dd4cb0c 100644 --- a/src/equipo/dto/input/update.dto.ts +++ b/src/equipo/dto/input/update.dto.ts @@ -1,39 +1,38 @@ -import { Optional } from '@nestjs/common'; -import { IsInt, IsString } from 'class-validator'; +import { IsInt, IsOptional, IsString } from 'class-validator'; export class UpdateEquipoDto { @IsInt() id_equipo: number; @IsString() - @Optional() + @IsOptional() equipo?: string; @IsInt() - @Optional() + @IsOptional() id_carrito?: number; @IsInt() - @Optional() + @IsOptional() id_operador?: number; @IsInt() - @Optional() + @IsOptional() id_status?: number; @IsString() - @Optional() + @IsOptional() marca?: string; @IsString() - @Optional() + @IsOptional() modelo?: string; @IsString() - @Optional() + @IsOptional() motivo?: string; @IsString() - @Optional() + @IsOptional() numero_serie?: string; } diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index 2465594..f525d98 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -1,6 +1,6 @@ import { Body, Controller, Get, Put, Query, UseGuards } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; -import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; +import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { EquipoService } from './equipo.service'; import { EquipoDto } from './dto/input/equipo.dto'; @@ -54,41 +54,49 @@ export class EquipoController { description: 'Carrito que se quiere usar como filtro.', name: 'carrito', type: 'string', + required: false, }) @ApiQuery({ description: 'Equipo que se quiere usar como filtro.', name: 'equipo', type: 'string', + required: false, }) @ApiQuery({ description: 'Id de la institución que se quiere usar como filtro.', name: 'id_institucion', type: 'string', - }) - @ApiQuery({ - description: 'Id del tipo de carrito que se quiere usar como filtro.', - name: 'id_tipo_carrito', - type: 'string', - }) - @ApiQuery({ - description: 'Id del status que se quiere usar como filtro.', - name: 'id_status', - type: 'string', - }) - @ApiQuery({ - description: 'Id del programa que se quiere usar como filtro.', - name: 'id_programa', - type: 'string', + required: false, }) @ApiQuery({ description: 'Id del módulo que se quiere usar como filtro.', name: 'id_modulo', type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Id del programa que se quiere usar como filtro.', + name: 'id_programa', + type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Id del status que se quiere usar como filtro.', + name: 'id_status', + type: 'string', + required: false, + }) + @ApiQuery({ + description: 'Id del tipo de carrito que se quiere usar como filtro.', + name: 'id_tipo_carrito', + type: 'string', + required: false, }) @ApiQuery({ description: 'Id del tipo de entrada que se quiere usar como filtro.', name: 'id_tipo_entrada', type: 'string', + required: false, }) equipos(@Query() query: EquiposDto) { return this.equipoService.findAll(query); @@ -96,6 +104,28 @@ export class EquipoController { @Put() // @UseGuards(AuthGuard('jwt')) + @ApiOperation({ + description: 'Endpoint que actualiza lan información de un equipo.', + }) + @ApiBody({ + description: + 'Todas las variables a excepción de id_carrito son opcionales.', + examples: { + ejemplo: { + value: { + id_equipo: 1, + _equipo: true, + _id_carrito: '', + _id_operador: 1, + _id_status: 1, + _marca: '', + _modelo: '', + _motivo: '', + _numero_serie: '', + }, + }, + }, + }) update(@Body() body: UpdateEquipoDto) { const data = { ...body }; diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index d53176d..a5112b0 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -92,9 +92,9 @@ export class EquipoService { id_institucion?: string; id_modulo?: string; id_programa?: string; + id_status?: string; id_tipo_carrito?: string; id_tipo_entrada?: string; - id_status?: string; }) { const carrito = filtros.id_carrito ? await this.carritoService.findById(parseInt(filtros.id_carrito)) @@ -115,24 +115,24 @@ 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') + .innerJoinAndSelect('e.programas', 'ps') .innerJoinAndSelect('e.status', 's') + .innerJoinAndSelect('e.tiposEntradas', 'tes') .innerJoinAndSelect('c.modulo', 'm') .innerJoinAndSelect('c.tipoCarrito', 'tc') - .innerJoinAndSelect('e.tiposEntradas', 'tes') - .innerJoinAndSelect('tes.tipoEntrada', 'te') - .innerJoinAndSelect('e.programas', 'ps') .innerJoinAndSelect('ps.programa', 'p') + .innerJoinAndSelect('tes.tipoEntrada', 'te') .innerJoinAndSelect('m.institucion', 'i') .orderBy('i.institucion') .addOrderBy('m.modulo') @@ -183,7 +183,7 @@ export class EquipoService { findById(id_equipo: number) { return this.repository.findOne({ id_equipo }).then((equipo) => { - if (!equipo) throw new NotFoundException('No existe este equipo.'); + if (!equipo) throw new NotFoundException('No existe este id equipo.'); return equipo; }); } @@ -212,7 +212,9 @@ export class EquipoService { }) .then((equipo) => { if (validarNoExiste && !equipo) - throw new NotFoundException('No existe este equipo.'); + throw new NotFoundException( + 'No existe este un equipo de cómputo con este número de inventario.', + ); return equipo; }); } @@ -226,24 +228,25 @@ export class EquipoService { const queryReseteo = this.repository .createQueryBuilder('e') .innerJoin('e.carrito', 'c', 'c.activo = 1') + .innerJoin('e.programas', 'ps') + .innerJoin('e.tiposEntradas', 'tes') .innerJoin('c.modulo', 'm', 'm.id_modulo = :id_modulo AND m.activo = 1', { id_modulo: modulo.id_modulo, }) - .innerJoin('m.institucion', 'i', 'i.activo = 1') .innerJoin( 'c.tipoCarrito', 'tc', 'tc.id_tipo_carrito = :id_tipo_carrito', { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, ) - .innerJoin('e.programas', 'ps') - .innerJoin('e.tiposEntradas', 'tes') - .andWhere('e.prestado = 1 AND e.id_status = 1') - .update() - .set({ prestado: false }); + .innerJoin('m.institucion', 'i', 'i.activo = 1') + .andWhere('e.prestado = 1 AND e.id_status = 1'); const query = this.repository .createQueryBuilder('e') .innerJoinAndSelect('e.carrito', 'c', 'c.activo = 1') + .innerJoinAndSelect('e.programas', 'ps') + .innerJoinAndSelect('e.status', 's', 's.id_status = 1') + .innerJoinAndSelect('e.tiposEntradas', 'tes') .innerJoinAndSelect( 'c.modulo', 'm', @@ -252,19 +255,16 @@ export class EquipoService { id_modulo: modulo.id_modulo, }, ) - .innerJoinAndSelect('m.institucion', 'i', 'i.activo = 1') .innerJoinAndSelect( 'c.tipoCarrito', 'tc', 'tc.id_tipo_carrito = :id_tipo_carrito', { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, ) - .innerJoinAndSelect('e.status', 's') - .innerJoinAndSelect('e.tiposEntradas', 'tes') - .innerJoinAndSelect('tes.tipoEntrada', 'te') - .innerJoinAndSelect('e.programas', 'ps') + .innerJoinAndSelect('m.institucion', 'i', 'i.activo = 1') .innerJoinAndSelect('ps.programa', 'p') - .where('e.prestado = 0 AND e.id_status = 1') + .innerJoinAndSelect('tes.tipoEntrada', 'te') + .where('e.prestado = 0') .orderBy('c.carrito') .addOrderBy('e.equipo'); @@ -288,7 +288,8 @@ export class EquipoService { }); } return query.getCount().then(async (n) => { - if (n === 0) await queryReseteo.execute(); + if (n === 0) + await queryReseteo.update().set({ prestado: false }).execute(); return query.getOne(); }); } @@ -318,27 +319,27 @@ export class EquipoService { }); } - update( + async update( attrs: Partial, id_carrito?: number, id_status?: number, id_operador?: number | Operador, motivo?: string, ) { + const carrito = id_carrito + ? await this.carritoService.findById(id_carrito) + : null; + const operador = id_operador + ? typeof id_operador === 'number' + ? await this.operadorService.findById(id_operador) + : id_operador + : null; + const status = id_status + ? await this.statusService.findById(id_status) + : null; + 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; - const operador = id_operador - ? typeof id_operador === 'number' - ? await this.operadorService.findById(id_operador) - : id_operador - : null; - if ((attrs.equipo && attrs.equipo != equipo.equipo) || carrito) await this.existeEquipo( carrito ? carrito : equipo.carrito, @@ -353,7 +354,7 @@ export class EquipoService { throw new ConflictException('No se mandó el id operador.'); if (!motivo) throw new ConflictException( - 'No se mandó el motivo por el cambio de status', + 'No se mandó el motivo para el cambio de status.', ); } Object.assign(equipo, attrs); diff --git a/src/hora-excepcion/hora-excepcion.controller.ts b/src/hora-excepcion/hora-excepcion.controller.ts index a0f5bb5..46319f4 100644 --- a/src/hora-excepcion/hora-excepcion.controller.ts +++ b/src/hora-excepcion/hora-excepcion.controller.ts @@ -9,7 +9,7 @@ import { UseGuards, } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; -import { ApiBody, ApiOperation, ApiTags } from '@nestjs/swagger'; +import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { HoraExcepcionService } from './hora-excepcion.service'; import { CreateHoraExcepcionDto } from './dto/input/create.dto'; @@ -68,6 +68,10 @@ export class HoraExcepcionController { description: 'Endpoint que retorna las horas excepcion de un día de una institución.', }) + @ApiQuery({ + description: 'Id de la institucion día', + name: 'id_institucion_dia', + }) get(@Query() query: GetHoraExcepcionDto) { return this.horaExcepcionService.findAllByIdInstitucionDia( parseInt(query.id_institucion_dia), @@ -85,7 +89,7 @@ export class HoraExcepcionController { 'Todoas las variables a excepción de id_hora_excepcion son opcionales pero se tiene que mandar forzosamente una hora.', examples: { ejemplo: { - value: { id_hora_excepcion: 1, hora_inicio: '', hora_fin: '' }, + value: { id_hora_excepcion: 1, _hora_fin: '', _hora_inicio: '' }, }, }, }) diff --git a/src/hora-excepcion/hora-excepcion.service.ts b/src/hora-excepcion/hora-excepcion.service.ts index f7696d9..5c512de 100644 --- a/src/hora-excepcion/hora-excepcion.service.ts +++ b/src/hora-excepcion/hora-excepcion.service.ts @@ -69,8 +69,6 @@ export class HoraExcepcionService { } update(attrs: Partial) { - if (!attrs.hora_inicio && !attrs.hora_fin) - throw new ConflictException('No se mandó nada para actualizar.'); return this.findById(attrs.id_hora_excepcion) .then(async (horaExecpcion) => { if ( diff --git a/src/institucion-carrera/institucion-carrera.service.ts b/src/institucion-carrera/institucion-carrera.service.ts index 4876501..511af5f 100644 --- a/src/institucion-carrera/institucion-carrera.service.ts +++ b/src/institucion-carrera/institucion-carrera.service.ts @@ -43,14 +43,14 @@ export class InstitucionCarreraService { id_institucion: number | Institucion, id_carrera: number | Carrera, ) { - const institucion = - typeof id_institucion === 'number' - ? await this.institucionService.findById(id_institucion) - : id_institucion; const carrera = typeof id_carrera === 'number' ? await this.findCarreraByIdCarrera(id_carrera) : id_carrera; + const institucion = + typeof id_institucion === 'number' + ? await this.institucionService.findById(id_institucion) + : id_institucion; return this.institucionCarreraRepository.findOne({ carrera, institucion }); } diff --git a/src/institucion-dia/institucion-dia.service.ts b/src/institucion-dia/institucion-dia.service.ts index 5aee93e..fc906bd 100644 --- a/src/institucion-dia/institucion-dia.service.ts +++ b/src/institucion-dia/institucion-dia.service.ts @@ -9,6 +9,7 @@ import { Repository } from 'typeorm'; import { Institucion } from '../institucion/entity/institucion.entity'; import { InstitucionDia } from './entity/institucion-dia.entity'; import { InstitucionService } from '../institucion/institucion.service'; + @Injectable() export class InstitucionDiaService { constructor( diff --git a/src/institucion-infraccion/institucion-infraccion.service.ts b/src/institucion-infraccion/institucion-infraccion.service.ts index 6504e75..5cb5a6d 100644 --- a/src/institucion-infraccion/institucion-infraccion.service.ts +++ b/src/institucion-infraccion/institucion-infraccion.service.ts @@ -53,8 +53,8 @@ export class InstitucionInfraccionService { .then((institucion) => this.institucionInfraccionRepository .createQueryBuilder('ii') - .innerJoinAndSelect('ii.institucion', 'in') .innerJoinAndSelect('ii.infraccion', 'i') + .innerJoinAndSelect('ii.institucion', 'in') .where('in.id_institucion = :id_institucion', { id_institucion: institucion.id_institucion, }) diff --git a/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts b/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts index 91ff5e3..7a1ae1f 100644 --- a/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts +++ b/src/institucion-tipo-carrito/institucion-tipo-carrito.service.ts @@ -68,14 +68,9 @@ export class InstitucionTipoCarritoService { ) .innerJoinAndSelect('itc.tipoCarrito', 'tc') .orderBy('tc.tipo_carrito'); - const busqueda: { institucion: Institucion; mostrar?: boolean } = { - institucion, - }; - if (mostrar) busqueda.mostrar = mostrar; if (mostrar) query.andWhere('itc.mostrar = 1'); return query.getMany(); - return this.institucionTipoCarritoRepository.find(busqueda); } findInstitucionTipoCarritoById(id_institucion_tipo_carrito) { diff --git a/src/institucion-tipo-entrada/entity/institucion-tipo-entrada.entity.ts b/src/institucion-tipo-entrada/entity/institucion-tipo-entrada.entity.ts index b482ed6..216191e 100644 --- a/src/institucion-tipo-entrada/entity/institucion-tipo-entrada.entity.ts +++ b/src/institucion-tipo-entrada/entity/institucion-tipo-entrada.entity.ts @@ -16,13 +16,13 @@ export class InstitucionTipoEntrada { @Column({ type: Boolean, nullable: false, default: false }) mostrar: boolean; + @ManyToOne(() => Institucion, (institucion) => institucion.tiposEntrada) + @JoinColumn({ name: 'id_institucion' }) + institucion: Institucion; + @ManyToOne(() => TipoEntrada, (tipoEntrada) => tipoEntrada.instituciones, { eager: true, }) @JoinColumn({ name: 'id_tipo_entrada' }) tipoEntrada: TipoEntrada; - - @ManyToOne(() => Institucion, (institucion) => institucion.tiposEntrada) - @JoinColumn({ name: 'id_institucion' }) - institucion: Institucion; } diff --git a/src/interceptors/serialize.interceptor.ts b/src/interceptors/serialize.interceptor.ts index 1f47ff9..6a3e991 100644 --- a/src/interceptors/serialize.interceptor.ts +++ b/src/interceptors/serialize.interceptor.ts @@ -1,8 +1,8 @@ import { - UseInterceptors, - NestInterceptor, - ExecutionContext, CallHandler, + ExecutionContext, + NestInterceptor, + UseInterceptors, } from '@nestjs/common'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; diff --git a/src/modulo/modulo.controller.ts b/src/modulo/modulo.controller.ts index a443360..c04e3cd 100644 --- a/src/modulo/modulo.controller.ts +++ b/src/modulo/modulo.controller.ts @@ -72,7 +72,7 @@ export class ModuloController { @ApiBody({ description: 'Todas las variables a excepción de id_modulo son opcionales.', examples: { - ejemplo: { value: { id_modulo: 1, activo: true, modulo: '' } }, + ejemplo: { value: { id_modulo: 1, _activo: true, _modulo: '' } }, }, }) update(@Body() body: UpdateModuloDto) { diff --git a/src/motivo/motivo.controller.ts b/src/motivo/motivo.controller.ts index 24394c0..e738604 100644 --- a/src/motivo/motivo.controller.ts +++ b/src/motivo/motivo.controller.ts @@ -23,6 +23,11 @@ export class MotivoController { name: 'id_equipo', type: 'string', }) + @ApiQuery({ + description: 'Página en la que se encuentra el usuario.', + name: 'pagina', + type: 'string', + }) get(@Query() query: IdEquipoPaginaDto) { return this.motivoService.findAllByIdEquipo( parseInt(query.id_equipo), diff --git a/src/multa/dto/input/multar.dto.ts b/src/multa/dto/input/multar.dto.ts new file mode 100644 index 0000000..bcfe4a0 --- /dev/null +++ b/src/multa/dto/input/multar.dto.ts @@ -0,0 +1,15 @@ +import { IsInt, IsString } from 'class-validator'; + +export class MultarDto { + @IsString() + descripcion: string; + + @IsInt() + id_institucion_infraccion: number; + + @IsInt() + id_operador: number; + + @IsInt() + id_prestamo: number; +} diff --git a/src/multa/dto/input/quitar.dto.ts b/src/multa/dto/input/quitar.dto.ts new file mode 100644 index 0000000..28a92d3 --- /dev/null +++ b/src/multa/dto/input/quitar.dto.ts @@ -0,0 +1,6 @@ +import { IsInt } from 'class-validator'; + +export class QuitarMultarDto { + @IsInt() + id_institucion_usuario: number; +} diff --git a/src/multa/dto/output/multas-equipo.dto.ts b/src/multa/dto/output/multas-equipo.dto.ts index d6b7c66..954162c 100644 --- a/src/multa/dto/output/multas-equipo.dto.ts +++ b/src/multa/dto/output/multas-equipo.dto.ts @@ -22,6 +22,10 @@ export class MultasEquipoOutputDto { @Expose() retraso; + @Expose() + @Type(() => InstitucionInfraccionOutputDto) + institucionInfraccion; + @Expose() @Type(() => OperadorMinOutputDto) opeardorMulta; @@ -29,8 +33,4 @@ export class MultasEquipoOutputDto { @Expose() @Type(() => PrestamoEquipoMinOutputDto) prestamo; - - @Expose() - @Type(() => InstitucionInfraccionOutputDto) - institucionInfraccion; } diff --git a/src/multa/dto/output/multas-usuario.dto.ts b/src/multa/dto/output/multas-usuario.dto.ts index 2bf2d18..13f55ef 100644 --- a/src/multa/dto/output/multas-usuario.dto.ts +++ b/src/multa/dto/output/multas-usuario.dto.ts @@ -22,6 +22,10 @@ export class MultasUsuarioOutputDto { @Expose() retraso; + @Expose() + @Type(() => InstitucionInfraccionOutputDto) + institucionInfraccion; + @Expose() @Type(() => OperadorMinOutputDto) opeardorMulta; @@ -29,8 +33,4 @@ export class MultasUsuarioOutputDto { @Expose() @Type(() => PrestamoUsuarioMinOutputDto) prestamo; - - @Expose() - @Type(() => InstitucionInfraccionOutputDto) - institucionInfraccion; } diff --git a/src/multa/dto/output/multas.dto.ts b/src/multa/dto/output/multas.dto.ts index ecfd495..539b17f 100644 --- a/src/multa/dto/output/multas.dto.ts +++ b/src/multa/dto/output/multas.dto.ts @@ -22,6 +22,10 @@ export class MultasOutputDto { @Expose() retraso; + @Expose() + @Type(() => InstitucionInfraccionOutputDto) + institucionInfraccion; + @Expose() @Type(() => OperadorMinOutputDto) opeardorMulta; @@ -29,8 +33,4 @@ export class MultasOutputDto { @Expose() @Type(() => PrestamoMinOutputDto) prestamo; - - @Expose() - @Type(() => InstitucionInfraccionOutputDto) - institucionInfraccion; } diff --git a/src/multa/multa.controller.ts b/src/multa/multa.controller.ts index 4176dd8..2dbfff5 100644 --- a/src/multa/multa.controller.ts +++ b/src/multa/multa.controller.ts @@ -1,10 +1,12 @@ -import { Controller, Get, Query } from '@nestjs/common'; -import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; +import { Body, Controller, Get, Post, Put, Query } from '@nestjs/common'; +import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { MultaService } from './multa.service'; import { IdUsuarioDto } from '../dto/id-usuario.dto'; import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto'; +import { MultarDto } from './dto/input/multar.dto'; import { MultasDto } from './dto/input/multas.dto'; +import { QuitarMultarDto } from './dto/input/quitar.dto'; import { MultasUsuarioDto } from './dto/input/multas-usuario.dto'; import { MultasOutputDto } from './dto/output/multas.dto'; import { MultasEquipoOutputDto } from './dto/output/multas-equipo.dto'; @@ -16,6 +18,31 @@ import { MultasUsuarioOutputDto } from './dto/output/multas-usuario.dto'; export class MultaController { constructor(private multaService: MultaService) {} + @Post() + @ApiOperation({ description: 'Endpoint utilizado para multar a un usuario.' }) + @ApiBody({ + description: 'Todas las vairales son obligatorias.', + examples: { + ejemplo: { + value: { + id_institucion_infraccion: 1, + id_operador: 1, + id_prestamo: 1, + descripcion: '', + }, + }, + }, + }) + multar(@Body() body: MultarDto) { + return this.multaService.create( + body.id_prestamo, + body.id_operador, + body.descripcion, + null, + body.id_institucion_infraccion, + ); + } + @Serealize(MultasOutputDto) @Get() @ApiOperation({ @@ -90,7 +117,8 @@ export class MultaController { @Serealize(MultasMinOutputDto) @Get('multas-usuario-activas') @ApiOperation({ - description: 'Endpoint que retorna todas las multas de un usuario que esten activas.', + description: + 'Endpoint que retorna todas las multas de un usuario que esten activas.', }) @ApiQuery({ description: 'Id del usuario.', @@ -101,6 +129,19 @@ export class MultaController { return this.multaService.findMultasActivas(parseInt(query.id_usuario)); } + @Put() + @ApiOperation({ + description: + 'Endpoint que se encarga de quitar la multa de un alumno de cierta una.', + }) + @ApiBody({ + description: 'La variable id_institucion_usuario es obligatoria.', + examples: { example: { value: { id_institucion_usuario: 1 } } }, + }) + quitarMulta(@Body() body: QuitarMultarDto) { + return this.multaService.quitarMulta(body.id_institucion_usuario); + } + // @Get('reporte') // reporte() {} } diff --git a/src/multa/multa.service.ts b/src/multa/multa.service.ts index 76af916..a4527e1 100644 --- a/src/multa/multa.service.ts +++ b/src/multa/multa.service.ts @@ -138,20 +138,20 @@ export class MultaService { const query = this.repository .createQueryBuilder('mu') .innerJoinAndSelect('mu.institucionInfraccion', 'ii') - .innerJoinAndSelect('ii.infraccion', 'inf') .innerJoinAndSelect('mu.opeardorMulta', 'om') - .innerJoinAndSelect('om.tipoUsuario', 'tu') .innerJoinAndSelect('mu.prestamo', 'p') + .innerJoinAndSelect('ii.infraccion', 'inf') + .innerJoinAndSelect('om.tipoUsuario', 'tu') .innerJoinAndSelect('p.equipo', 'e') - .innerJoinAndSelect('e.carrito', 'c') - .innerJoinAndSelect('c.modulo', 'm') - .innerJoinAndSelect('m.institucion', 'i') - .innerJoinAndSelect('c.tipoCarrito', 'tc') .innerJoinAndSelect('p.usuario', 'u') + .innerJoinAndSelect('e.carrito', 'c') .innerJoinAndSelect('u.instituciones', 'is') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('c.tipoCarrito', 'tc') .innerJoinAndSelect('is.institucionCarrera', 'ic') - .innerJoinAndSelect('ic.institucion', 'in') + .innerJoinAndSelect('m.institucion', 'i') .innerJoinAndSelect('ic.carrera', 'ca') + .innerJoinAndSelect('ic.institucion', 'in') .innerJoinAndSelect('ca.nivel', 'n') .orderBy('i.institucion') .addOrderBy('u.usuario') @@ -178,19 +178,19 @@ export class MultaService { this.repository .createQueryBuilder('mu') .innerJoinAndSelect('mu.institucionInfraccion', 'ii') + .innerJoinAndSelect('mu.opeardorMulta', 'om') + .innerJoinAndSelect('mu.prestamo', 'p') .innerJoinAndSelect('ii.infraccion', 'inf') .innerJoinAndSelect('ii.institucion', 'i') - .innerJoinAndSelect('mu.opeardorMulta', 'om') .innerJoinAndSelect('om.tipoUsuario', 'tu') - .innerJoinAndSelect('mu.prestamo', 'p') .innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', { id_equipo: equipo.id_equipo, }) .innerJoinAndSelect('p.usuario', 'u') .innerJoinAndSelect('u.instituciones', 'is') .innerJoinAndSelect('is.institucionCarrera', 'ic') - .innerJoinAndSelect('ic.institucion', 'in') .innerJoinAndSelect('ic.carrera', 'ca') + .innerJoinAndSelect('ic.institucion', 'in') .innerJoinAndSelect('ca.nivel', 'n') .orderBy('mu.id_multa', 'DESC') .skip((pagina - 1) * 25) @@ -204,19 +204,19 @@ export class MultaService { this.repository .createQueryBuilder('mu') .innerJoinAndSelect('mu.institucionInfraccion', 'ii') + .innerJoinAndSelect('mu.opeardorMulta', 'om') + .innerJoinAndSelect('mu.prestamo', 'p') .innerJoinAndSelect('ii.infraccion', 'inf') .innerJoinAndSelect('ii.institucion', 'i') - .innerJoinAndSelect('mu.opeardorMulta', 'om') .innerJoinAndSelect('om.tipoUsuario', 'tu') - .innerJoinAndSelect('mu.prestamo', 'p') .innerJoinAndSelect('p.equipo', 'e') - .innerJoinAndSelect('e.carrito', 'c') - .innerJoinAndSelect('c.modulo', 'm') - .innerJoinAndSelect('m.institucion', 'in') - .innerJoinAndSelect('c.tipoCarrito', 'tc') .innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', { id_usuario: usuario.id_usuario, }) + .innerJoinAndSelect('e.carrito', 'c') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .innerJoinAndSelect('m.institucion', 'in') .orderBy('mu.id_multa', 'DESC') .skip((pagina - 1) * 25) .take(25) @@ -238,4 +238,36 @@ export class MultaService { .getMany(), ); } + + async quitarMulta(id_institucion_usuario: number) { + const institucionUsuario = await this.institucionUsuarioService.findById( + id_institucion_usuario, + ); + + return this.repository + .createQueryBuilder('mu') + .innerJoin('mu.prestamo', 'p') + .innerJoin('p.usuario', 'u') + .innerJoin( + 'u.instituciones', + 'is', + 'is.id_institucion_usuario = :id_institucion_usuario', + { + id_institucion_usuario: institucionUsuario.id_institucion_usuario, + }, + ) + .where('activo = 1') + .getOne() + .then((multa) => { + if (!multa) + throw new ConflictException( + 'Este usuario no tiene una multa activa en esta institución.', + ); + multa.activo = false; + institucionUsuario.multa = false; + return this.repository.save(multa); + }) + .then((_) => this.institucionUsuarioService.update(institucionUsuario)) + .then((_) => ({ message: 'Se guardaron los cambios correctamente.' })); + } } diff --git a/src/operador/operador.controller.ts b/src/operador/operador.controller.ts index 1c6ea7f..77db025 100644 --- a/src/operador/operador.controller.ts +++ b/src/operador/operador.controller.ts @@ -109,7 +109,7 @@ export class OperadorController { description: 'Todas las variables a excepción de id_operador son opcionales.', examples: { - ejemplo: { value: { id_operador: 3, activo: true, password: '' } }, + ejemplo: { value: { id_operador: 3, _activo: true, _password: '' } }, }, }) update(@Body() body: UpdateOperadorDto) { diff --git a/src/usuario/dto/output/usuarios.dto.ts b/src/usuario/dto/output/usuarios.dto.ts index 2619aa3..d761ce2 100644 --- a/src/usuario/dto/output/usuarios.dto.ts +++ b/src/usuario/dto/output/usuarios.dto.ts @@ -1,6 +1,6 @@ import { Expose, Type } from 'class-transformer'; -import { UsuarioInstitucionCarreraOutputDto } from '../../../institucion-usuario/dto/output/usuario-institucion-carrera.dto'; import { TipoUsuarioOutputDto } from '../../../tipo-usuario/dto/output/tipo-usuario.dto'; +import { UsuarioInstitucionCarreraOutputDto } from '../../../institucion-usuario/dto/output/usuario-institucion-carrera.dto'; export class UsuariosOutputDto { @Expose()