diff --git a/src/dto/id-usuario.dto.ts b/src/dto/id-usuario.dto.ts new file mode 100644 index 0000000..4f89c4e --- /dev/null +++ b/src/dto/id-usuario.dto.ts @@ -0,0 +1,6 @@ +import { IsNumberString } from 'class-validator'; + +export class IdUsuarioDto { + @IsNumberString() + id_usuario: string; +} diff --git a/src/multa/dto/output/multas-equipo.dto.ts b/src/multa/dto/output/multas-equipo.dto.ts index 1e96401..d6b7c66 100644 --- a/src/multa/dto/output/multas-equipo.dto.ts +++ b/src/multa/dto/output/multas-equipo.dto.ts @@ -1,9 +1,12 @@ import { Expose, Type } from 'class-transformer'; import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto'; -import { PrestamoMinEquipoOutputDto } from '../../../prestamo/dto/output/prestamo-equipo-min.dto'; import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { PrestamoEquipoMinOutputDto } from '../../../prestamo/dto/output/prestamo-equipo-min.dto'; export class MultasEquipoOutputDto { + @Expose() + id_multa; + @Expose() activo; @@ -16,9 +19,6 @@ export class MultasEquipoOutputDto { @Expose() fecha_inicio; - @Expose() - id_multa; - @Expose() retraso; @@ -27,7 +27,7 @@ export class MultasEquipoOutputDto { opeardorMulta; @Expose() - @Type(() => PrestamoMinEquipoOutputDto) + @Type(() => PrestamoEquipoMinOutputDto) prestamo; @Expose() diff --git a/src/multa/dto/output/multas-min.dto.ts b/src/multa/dto/output/multas-min.dto.ts new file mode 100644 index 0000000..c116b64 --- /dev/null +++ b/src/multa/dto/output/multas-min.dto.ts @@ -0,0 +1,25 @@ +import { Expose, Type } from 'class-transformer'; +import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { PrestamoMinOutputDto } from '../../../prestamo/dto/output/prestamo-min.dto'; + +export class MultasMinOutputDto { + @Expose() + id_multa; + + @Expose() + descripcion; + + @Expose() + fecha_fin; + + @Expose() + fecha_inicio; + + @Expose() + retraso; + + @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 17783d2..2bf2d18 100644 --- a/src/multa/dto/output/multas-usuario.dto.ts +++ b/src/multa/dto/output/multas-usuario.dto.ts @@ -1,9 +1,12 @@ import { Expose, Type } from 'class-transformer'; import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto'; -import { PrestamoMinUsuarioOutputDto } from '../../../prestamo/dto/output/prestamo-usuario-min.dto'; import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { PrestamoUsuarioMinOutputDto } from '../../../prestamo/dto/output/prestamo-usuario-min.dto'; export class MultasUsuarioOutputDto { + @Expose() + id_multa; + @Expose() activo; @@ -16,9 +19,6 @@ export class MultasUsuarioOutputDto { @Expose() fecha_inicio; - @Expose() - id_multa; - @Expose() retraso; @@ -27,7 +27,7 @@ export class MultasUsuarioOutputDto { opeardorMulta; @Expose() - @Type(() => PrestamoMinUsuarioOutputDto) + @Type(() => PrestamoUsuarioMinOutputDto) prestamo; @Expose() diff --git a/src/multa/dto/output/multas.dto.ts b/src/multa/dto/output/multas.dto.ts index fa7adaa..ecfd495 100644 --- a/src/multa/dto/output/multas.dto.ts +++ b/src/multa/dto/output/multas.dto.ts @@ -1,9 +1,12 @@ import { Expose, Type } from 'class-transformer'; import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto'; -import { PrestamoMinOutputDto } from '../../../prestamo/dto/output/prestamo-min.dto'; import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { PrestamoMinOutputDto } from '../../../prestamo/dto/output/prestamo-min.dto'; export class MultasOutputDto { + @Expose() + id_multa; + @Expose() activo; @@ -16,9 +19,6 @@ export class MultasOutputDto { @Expose() fecha_inicio; - @Expose() - id_multa; - @Expose() retraso; diff --git a/src/multa/entity/multa.entity.ts b/src/multa/entity/multa.entity.ts index 8378540..f2a5596 100644 --- a/src/multa/entity/multa.entity.ts +++ b/src/multa/entity/multa.entity.ts @@ -3,7 +3,6 @@ import { Entity, JoinColumn, ManyToOne, - OneToOne, PrimaryGeneratedColumn, } from 'typeorm'; import { InstitucionInfraccion } from '../../institucion-infraccion/entity/institucion-infraccion.entity'; diff --git a/src/multa/multa.controller.ts b/src/multa/multa.controller.ts index 9d6da2f..82f0fb8 100644 --- a/src/multa/multa.controller.ts +++ b/src/multa/multa.controller.ts @@ -2,11 +2,13 @@ import { Controller, Get, Query } from '@nestjs/common'; import { 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 { MultasDto } from './dto/input/multas.dto'; import { MultasUsuarioDto } from './dto/input/multas-usuario.dto'; import { MultasOutputDto } from './dto/output/multas.dto'; import { MultasEquipoOutputDto } from './dto/output/multas-equipo.dto'; +import { MultasMinOutputDto } from './dto/output/multas-min.dto'; import { MultasUsuarioOutputDto } from './dto/output/multas-usuario.dto'; @Controller('multa') @@ -85,6 +87,20 @@ export class MultaController { ); } + @Serealize(MultasMinOutputDto) + @Get('multas-usuario-activas') + @ApiOperation({ + description: 'Endpoint que retorna todas las multas de un usuario .', + }) + @ApiQuery({ + description: 'Id del usuario.', + name: 'id_usuario', + type: 'string', + }) + multasActivas(@Query() query: IdUsuarioDto) { + return this.multaService.findMultasActivas(parseInt(query.id_usuario)); + } + // @Get('reporte') // reporte() {} } diff --git a/src/multa/multa.service.ts b/src/multa/multa.service.ts index 6f392b4..02e482c 100644 --- a/src/multa/multa.service.ts +++ b/src/multa/multa.service.ts @@ -1,8 +1,7 @@ import * as moment from 'moment'; import { ConflictException, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { FindOperator, Like, Repository } from 'typeorm'; -import { Institucion } from '../institucion/entity/institucion.entity'; +import { Repository } from 'typeorm'; import { InstitucionInfraccion } from '../institucion-infraccion/entity/institucion-infraccion.entity'; import { Multa } from './entity/multa.entity'; import { Operador } from '../operador/entity/operador.entity'; @@ -64,6 +63,10 @@ export class MultaService { ) : null; + if (prestamo.cancelado_operador || prestamo.cancelado_usuario) + throw new ConflictException( + 'No se puede multar a un usuario con un préstamo que fue cancelado.', + ); if (!retraso && !institucionInfraccion) throw new ConflictException( 'No se mandó ningún motivo para multar a este alumno.', @@ -87,125 +90,142 @@ export class MultaService { return this.repository.save(this.repository.create(data)); }) .then((_) => { - for (let i = 0; prestamo.usuario.instituciones.length; i++) + for (let i = 0; prestamo.usuario.instituciones.length; i++) { + const institucionUsuario = prestamo.usuario.instituciones[i]; + if ( - prestamo.usuario.instituciones[i].institucionCarrera.institucion - .id_institucion === - institucionInfraccion.institucion.id_institucion + institucionUsuario.institucionCarrera.institucion.id_institucion === + operador.institucion.id_institucion ) { - prestamo.usuario.instituciones[i].multa = true; - return this.institucionUsuarioService.update( - prestamo.usuario.instituciones[i], - ); + institucionUsuario.multa = true; + return this.institucionUsuarioService.update(institucionUsuario); } + } }); } - async findAll(filtros: { - pagina: string; - id_institucion?: string; - usuario?: string; - }) { - const busqueda: { - prestamo: { - equipo: { carrito: { modulo: { institucion?: Institucion } } }; - usuario: { usuario?: FindOperator }; - }; - } = { - prestamo: { equipo: { carrito: { modulo: {} } }, usuario: {} }, - }; - const institucion = filtros.id_institucion - ? await this.institucionService.findById(parseInt(filtros.id_institucion)) - : null; - - if (filtros.usuario) - busqueda.prestamo.usuario.usuario = Like(filtros.usuario); - if (institucion) - busqueda.prestamo.equipo.carrito.modulo.institucion = institucion; - return this.repository.findAndCount({ - join: { - alias: 'mu', - innerJoinAndSelect: { - p: 'mu.prestamo', - e: 'p.equipo', - c: 'e.carrito', - m: 'c.modulo', - i: 'm.institucion', - u: 'p.usuario', - ci: 'u.institucionCarrera', - ca: 'ci.carrera', - n: 'ca.nivel', - }, - }, - where: busqueda, - skip: (parseInt(filtros.pagina) - 1) * 25, - take: 25, - }); - } - - findAllByIdEquipo(id_equipo: number, pagina: number) { - return this.equipoService.findById(id_equipo).then((equipo) => - this.repository.findAndCount({ - join: { - alias: 'mu', - innerJoinAndSelect: { - p: 'mu.prestamo', - e: 'p.equipo', - u: 'p.usuario', - ci: 'u.institucionCarrera', - ca: 'ci.carrera', - n: 'ca.nivel', - }, - }, - where: { prestamo: { equipo } }, - skip: (pagina - 1) * 25, - take: 25, - }), - ); - } - - findAllByIdUsuario(id_usuario: number, pagina: number) { - return this.usuarioService.findById(id_usuario).then((usuario) => - this.repository.findAndCount({ - join: { - alias: 'mu', - innerJoinAndSelect: { - p: 'mu.prestamo', - e: 'p.equipo', - c: 'e.carrito', - m: 'c.modulo', - i: 'm.institucion', - }, - }, - where: { prestamo: { usuario } }, - skip: (pagina - 1) * 25, - take: 25, - }), - ); - } - desactivarMultas() { const ahora = moment(); return this.repository.find({ activo: true }).then(async (multas) => { for (let i = 0; i < multas.length; i++) if (ahora.diff(moment(multas[i].fecha_fin)) > 0) { + const instituciones = multas[i].prestamo.usuario.instituciones; + multas[i].activo = false; - await this.usuarioService - .update(multas[i].prestamo.usuario) - .then((_) => this.repository.save(multas[i])); - for (let j = 0; multas[i].prestamo.usuario.instituciones.length; j++) + await this.repository.save(multas[i]); + for (let j = 0; j < instituciones.length; j++) { + const institucionUsuario = instituciones[j]; + if ( - multas[i].prestamo.usuario.instituciones[j].institucionCarrera - .institucion.id_institucion === + institucionUsuario.institucionCarrera.institucion + .id_institucion === multas[i].opeardorMulta.institucion.id_institucion ) { - multas[i].prestamo.usuario.instituciones[j].multa = false; - await this.institucionUsuarioService.update( - multas[i].prestamo.usuario.instituciones[j], - ); + institucionUsuario.multa = false; + await this.institucionUsuarioService.update(institucionUsuario); } + } } }); } + + async findAll(filtros: { + pagina: string; + id_institucion?: string; + usuario?: string; + }) { + const query = this.repository + .createQueryBuilder('mu') + .innerJoinAndSelect('mu.institucionInfraccion', 'ii') + .innerJoinAndSelect('ii.infraccion', 'in') + .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', 'i') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .innerJoinAndSelect('p.usuario', 'u') + .innerJoinAndSelect('u.instituciones', 'is') + .innerJoinAndSelect('is.institucionCarrera', 'ic') + .innerJoinAndSelect('ic.institucion', 'in') + .innerJoinAndSelect('ic.carrera', 'ca') + .innerJoinAndSelect('ca.nivel', 'n') + .orderBy('i.institucion') + .addOrderBy('u.usuario') + .addOrderBy('mu.id_multa', 'DESC') + .skip((parseInt(filtros.pagina) - 1) * 25) + .take(25); + const institucion = filtros.id_institucion + ? await this.institucionService.findById(parseInt(filtros.id_institucion)) + : null; + + if (filtros.usuario) + query.andWhere('u.usuario LIKE :usuario', { + usuario: `%${filtros.usuario}%`, + }); + if (institucion) + query.andWhere('i.id_institucion :id_institucion', { + id_institucion: institucion.id_institucion, + }); + return query.getManyAndCount(); + } + + findAllByIdEquipo(id_equipo: number, pagina: number) { + return this.equipoService.findById(id_equipo).then((equipo) => + this.repository + .createQueryBuilder('mu') + .innerJoinAndSelect('mu.institucionInfraccion', 'ii') + .innerJoinAndSelect('ii.infraccion', 'in') + .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('ca.nivel', 'n') + .orderBy('mu.id_multa', 'DESC') + .skip((pagina - 1) * 25) + .take(25), + ); + } + + findAllByIdUsuario(id_usuario: number, pagina: number) { + return this.usuarioService.findById(id_usuario).then((usuario) => + this.repository + .createQueryBuilder('mu') + .innerJoinAndSelect('mu.institucionInfraccion', 'ii') + .innerJoinAndSelect('ii.infraccion', 'in') + .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', 'i') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', { + id_usuario: usuario.id_usuario, + }) + .orderBy('mu.id_multa', 'DESC') + .skip((pagina - 1) * 25) + .take(25), + ); + } + + findMultasActivas(id_usuario: number) { + return this.usuarioService.findById(id_usuario).then((usuario) => + this.repository.find({ + join: { alias: 'mu', innerJoin: { p: 'mu.prestamo' } }, + where: { activo: true, prestamo: { usuario } }, + }), + ); + } } diff --git a/src/prestamo/dto/output/prestamo-equipo-min.dto.ts b/src/prestamo/dto/output/prestamo-equipo-min.dto.ts index a0cb439..9be6d08 100644 --- a/src/prestamo/dto/output/prestamo-equipo-min.dto.ts +++ b/src/prestamo/dto/output/prestamo-equipo-min.dto.ts @@ -1,7 +1,7 @@ import { Expose, Type } from 'class-transformer'; import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; -export class PrestamoMinEquipoOutputDto { +export class PrestamoEquipoMinOutputDto { @Expose() id_prestamo; diff --git a/src/prestamo/dto/output/prestamo-min.dto.ts b/src/prestamo/dto/output/prestamo-min.dto.ts index 496296a..67a9710 100644 --- a/src/prestamo/dto/output/prestamo-min.dto.ts +++ b/src/prestamo/dto/output/prestamo-min.dto.ts @@ -12,9 +12,6 @@ export class PrestamoMinOutputDto { @Expose() fecha_inicio; - @Expose() - hora_fin; - @Expose() hora_inicio; diff --git a/src/prestamo/dto/output/prestamo-usuario-min.dto.ts b/src/prestamo/dto/output/prestamo-usuario-min.dto.ts index 239c37f..6483a28 100644 --- a/src/prestamo/dto/output/prestamo-usuario-min.dto.ts +++ b/src/prestamo/dto/output/prestamo-usuario-min.dto.ts @@ -1,7 +1,7 @@ import { Expose, Type } from 'class-transformer'; import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto'; -export class PrestamoMinUsuarioOutputDto { +export class PrestamoUsuarioMinOutputDto { @Expose() id_prestamo; @@ -14,9 +14,6 @@ export class PrestamoMinUsuarioOutputDto { @Expose() hora_fin; - @Expose() - hora_inicio; - @Expose() @Type(() => EquipoMinOutputDto) equipo; diff --git a/src/prestamo/dto/output/prestamo.dto.ts b/src/prestamo/dto/output/prestamo.dto.ts index ed947d7..c83aac2 100644 --- a/src/prestamo/dto/output/prestamo.dto.ts +++ b/src/prestamo/dto/output/prestamo.dto.ts @@ -8,9 +8,6 @@ export class PrestamoOutputDto { @Expose() activo; - @Expose() - fecha_entrega; - @Expose() fecha_inicio; diff --git a/src/prestamo/prestamo.module.ts b/src/prestamo/prestamo.module.ts index 3c0f950..52a6172 100644 --- a/src/prestamo/prestamo.module.ts +++ b/src/prestamo/prestamo.module.ts @@ -11,7 +11,6 @@ import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/instit import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/institucion-tipo-entrada.module'; import { OperadorModule } from '../operador/operador.module'; import { ModuloModule } from '../modulo/modulo.module'; -import { MotivoModule } from '../motivo/motivo.module'; import { MultaModule } from 'src/multa/multa.module'; import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module'; import { UsuarioModule } from '../usuario/usuario.module'; @@ -25,7 +24,6 @@ import { AppGateway } from '../app.gateway'; InstitucionTipoCarritoModule, InstitucionTipoEntradaModule, ModuloModule, - MotivoModule, forwardRef(() => MultaModule), OperadorModule, TipoUsuarioModule, diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 3b7f06c..9841e9f 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -19,7 +19,6 @@ import { InstitucionProgramaService } from '../institucion-programa/institucion- import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service'; import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service'; import { ModuloService } from '../modulo/modulo.service'; -import { MotivoService } from '../motivo/motivo.service'; import { MultaService } from '../multa/multa.service'; import { OperadorService } from '../operador/operador.service'; import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service'; @@ -36,7 +35,6 @@ export class PrestamoService { private institucionTipoCarritoService: InstitucionTipoCarritoService, private institucionTipoEntradaService: InstitucionTipoEntradaService, private moduloService: ModuloService, - private motivoService: MotivoService, @Inject(forwardRef(() => MultaService)) private multaService: MultaService, private operadorService: OperadorService, @@ -305,7 +303,6 @@ export class PrestamoService { .innerJoinAndSelect('ic.carrera', 'ca') .innerJoinAndSelect('ca.nivel', 'n') .innerJoinAndSelect('p.equipo', 'e') - .innerJoinAndSelect('e.status', 's') .innerJoinAndSelect('e.carrito', 'c') .innerJoinAndSelect('c.modulo', 'm') .innerJoinAndSelect('m.institucion', 'i') @@ -350,9 +347,11 @@ export class PrestamoService { : null; if (filtros.activo) { - if (typeof filtros.activo === 'boolean') - query.andWhere('p.activo = :activo', { activo: filtros.activo }); - else + if (typeof filtros.activo === 'boolean') { + query + .innerJoinAndSelect('e.status', 's') + .andWhere('p.activo = :activo', { activo: filtros.activo }); + } else query.andWhere('p.activo = :activo', { activo: filtros.activo === 'true', }); @@ -508,7 +507,7 @@ export class PrestamoService { .then((prestamo) => { if (!prestamo) throw new NotFoundException( - 'Este usuario no tiene un prestamo activo.', + 'Este usuario no tiene un préstamo activo.', ); return prestamo; });