From 0074bd1ddc46d1b4539ea31c92a9b4036702252a Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Wed, 5 Oct 2022 04:58:49 -0500 Subject: [PATCH] multa reparado --- src/app.gateway.ts | 8 +- src/equipo/equipo.service.ts | 34 +-- .../institucion-infraccion.service.ts | 12 + .../institucion-usuario.service.ts | 10 + src/institucion/institucion.service.ts | 1 + .../views/full-informacion-multa.view.ts | 8 +- src/multa/multa.controller.ts | 2 +- src/multa/multa.service.ts | 208 ++++++++++-------- src/prestamo/prestamo.service.ts | 54 ++--- src/upload-file/upload-file.service.ts | 2 + src/usuario/usuario.service.ts | 7 +- 11 files changed, 204 insertions(+), 142 deletions(-) diff --git a/src/app.gateway.ts b/src/app.gateway.ts index 8697a5e..30e4317 100644 --- a/src/app.gateway.ts +++ b/src/app.gateway.ts @@ -10,14 +10,14 @@ import { Socket, Server } from 'socket.io'; @WebSocketGateway({ cors: { origin: [ - // 'http://localhost:3176', - // 'http://localhost:3186', + 'http://localhost:3176', + 'http://localhost:3186', // 'http://132.248.80.196:3155', // 'http://132.248.80.196:3185', // 'https://pmodulospcpuma.unam.mx', // 'https://pmodulospcpuma.unam.mx:3015', - 'https://modulospcpuma.unam.mx', - 'https://modulospcpuma.unam.mx:3015', + // 'https://modulospcpuma.unam.mx', + // 'https://modulospcpuma.unam.mx:3015', ], }, }) diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index e3f92aa..0e8e536 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -318,6 +318,7 @@ export class EquipoService { findInfoEquipoByNumeroInventario( institucion: Institucion, numero_inventario: string, + validarNoExiste = true, ) { return this.informacionEquipoView .findOne({ @@ -327,20 +328,22 @@ export class EquipoService { }, }) .then((infoEquipo) => { - if (!infoEquipo) - throw new NotFoundException( - 'No existe un equipo de cómputo con este número de inventario.', - ); + 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); }); } - async findInfoEquipoByEquipo(id_carrito: number | Carrito, equipo: string) { - const carrito = - typeof id_carrito === 'number' - ? await this.carritoService.findInfoCarritoById(id_carrito) - : id_carrito; - + async findInfoEquipoByEquipo( + carrito: Carrito, + equipo: string, + validarNoExiste = true, + ) { return this.informacionEquipoView .findOne({ where: { @@ -349,10 +352,13 @@ export class EquipoService { }, }) .then((infoEquipo) => { - if (!infoEquipo) - throw new NotFoundException( - 'No existe un equipo de cómputo con este número de inventario.', - ); + 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); }); } diff --git a/src/institucion-infraccion/institucion-infraccion.service.ts b/src/institucion-infraccion/institucion-infraccion.service.ts index d1bcda1..f2205d3 100644 --- a/src/institucion-infraccion/institucion-infraccion.service.ts +++ b/src/institucion-infraccion/institucion-infraccion.service.ts @@ -9,6 +9,7 @@ import { Infraccion } from './entity/infraccion.entity'; import { InstitucionInfraccion } from './entity/institucion-infraccion.entity'; import { Operador } from '../operador/entity/operador.entity'; import { InstitucionService } from '../institucion/institucion.service'; +import { Institucion } from 'src/institucion/entity/institucion.entity'; @Injectable() export class InstitucionInfraccionService { @@ -87,6 +88,17 @@ export class InstitucionInfraccionService { }); } + findSinInfraccion(institucion: Institucion) { + return this.institucionInfraccionRepository + .createQueryBuilder('ii') + .innerJoinAndSelect('ii.infraccion', 'inf') + .innerJoinAndSelect('ii.institucion', 'i') + .where('i.id_institucion = :id_institucion && inf.id_infraccion = 1', { + id_institucion: institucion.id_institucion, + }) + .getOne(); + } + update(admin: Operador, attrs: Partial) { return this.findById(attrs.id_institucion_infraccion) .then((institucionInfraccion) => { diff --git a/src/institucion-usuario/institucion-usuario.service.ts b/src/institucion-usuario/institucion-usuario.service.ts index 1352481..9ee2ae5 100644 --- a/src/institucion-usuario/institucion-usuario.service.ts +++ b/src/institucion-usuario/institucion-usuario.service.ts @@ -21,6 +21,16 @@ export class InstitucionUsuarioService { })); } + findAllByIdUsuario(id_usuario: number) { + return this.repository.find({ + join: { + alias: 'iu', + innerJoinAndSelect: { ic: 'iu.institucionCarrera' }, + }, + where: { usuario: { id_usuario } }, + }); + } + findById(id_institucion_usuario: number) { return this.repository .findOne({ where: { id_institucion_usuario } }) diff --git a/src/institucion/institucion.service.ts b/src/institucion/institucion.service.ts index 7b542bd..b91b184 100644 --- a/src/institucion/institucion.service.ts +++ b/src/institucion/institucion.service.ts @@ -53,6 +53,7 @@ export class InstitucionService { 'responsable', ], where: busqueda, + order: { institucion: 'ASC' }, }); } diff --git a/src/multa/entity/views/full-informacion-multa.view.ts b/src/multa/entity/views/full-informacion-multa.view.ts index 8dddd8e..86bc7d3 100644 --- a/src/multa/entity/views/full-informacion-multa.view.ts +++ b/src/multa/entity/views/full-informacion-multa.view.ts @@ -23,6 +23,7 @@ import { Usuario } from '../../../usuario/entity/usuario.entity'; .addSelect('ii.id_infraccion', 'id_infraccion') .addSelect('om.id_institucion', 'id_institucion') .addSelect('om.operador', 'operador') + .addSelect('p.id_equipo', 'id_equipo') .addSelect('p.id_usuario', 'id_usuario') .addSelect('inf.infraccion', 'infraccion') .addSelect('i.institucion', 'institucion') @@ -45,7 +46,7 @@ export class FullInformacionMultaView { id_multa: number; @ViewColumn() - activo: boolean; + activo: number; @ViewColumn() descripcion: string; @@ -56,6 +57,9 @@ export class FullInformacionMultaView { @ViewColumn() fecha_inicio: Date; + @ViewColumn() + id_equipo: number; + @ViewColumn() id_institucion: number; @@ -87,7 +91,7 @@ export class FullInformacionMultaView { operador: string; @ViewColumn() - retraso: boolean; + retraso: number; @ViewColumn() usuario: string; diff --git a/src/multa/multa.controller.ts b/src/multa/multa.controller.ts index 92435f5..8036942 100644 --- a/src/multa/multa.controller.ts +++ b/src/multa/multa.controller.ts @@ -98,7 +98,7 @@ export class MultaController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); - return this.multaService.findAll(query); + return this.multaService.findFullInfoMultaAll(query); } @Serealize(MultasEquipoOutputDto) diff --git a/src/multa/multa.service.ts b/src/multa/multa.service.ts index a1bcb4f..dfd2ce0 100644 --- a/src/multa/multa.service.ts +++ b/src/multa/multa.service.ts @@ -1,9 +1,10 @@ import * as moment from 'moment'; import { ConflictException, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; -import { InstitucionInfraccion } from '../institucion-infraccion/entity/institucion-infraccion.entity'; +import { DeepPartial, FindOptionsWhere, Like, Repository } from 'typeorm'; import { Multa } from './entity/multa.entity'; +import { FullInformacionMultaView } from './entity/views/full-informacion-multa.view'; +import { InformacionMultaView } from './entity/views/informacion-multa.view'; import { Operador } from '../operador/entity/operador.entity'; import { Prestamo } from '../prestamo/entity/prestamo.entity'; import { EquipoService } from '../equipo/equipo.service'; @@ -18,6 +19,10 @@ import { UsuarioService } from '../usuario/usuario.service'; export class MultaService { constructor( @InjectRepository(Multa) private repository: Repository, + @InjectRepository(FullInformacionMultaView) + private fullInformacionMultaView: Repository, + @InjectRepository(InformacionMultaView) + private informacionMultaView: Repository, private equipoService: EquipoService, private institucionService: InstitucionService, private institucionInfraccionService: InstitucionInfraccionService, @@ -43,21 +48,13 @@ export class MultaService { typeof id_operador === 'number' ? await this.operadorService.findById(id_operador) : id_operador; - const data: { - descripcion: string; - fecha_inicio: Date; - operadorMulta: Operador; - prestamo: Prestamo; - fecha_fin?: Date; - institucionInfraccion?: InstitucionInfraccion; - retraso?: boolean; - } = { + const data: DeepPartial = { descripcion, fecha_inicio: ahora.toDate(), operadorMulta: operador, prestamo, }; - const institucionInfraccion = id_institucion_infraccion + let institucionInfraccion = id_institucion_infraccion ? await this.institucionInfraccionService.findById( id_institucion_infraccion, ) @@ -67,10 +64,16 @@ export class MultaService { 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.', - ); + if (!institucionInfraccion) { + if (!retraso) + throw new ConflictException( + 'No se mandó ningún motivo para multar a este alumno.', + ); + institucionInfraccion = + await this.institucionInfraccionService.findSinInfraccion( + operador.institucion, + ); + } return this.repository .findOne({ where: { prestamo } }) .then((existeMulta) => { @@ -89,16 +92,19 @@ export class MultaService { data.fecha_fin = ahora.toDate(); return this.repository.save(this.repository.create(data)); }) - .then((_) => { - for (let i = 0; prestamo.usuario.instituciones.length; i++) { - const institucionUsuario = prestamo.usuario.instituciones[i]; - + .then((_) => + this.institucionUsuarioService.findAllByIdUsuario( + prestamo.usuario.id_usuario, + ), + ) + .then(async (instituciones) => { + for (let i = 0; i < instituciones.length; i++) { if ( - institucionUsuario.institucionCarrera.institucion.id_institucion === + instituciones[i].institucionCarrera.institucion.id_institucion === operador.institucion.id_institucion ) { - institucionUsuario.multa = true; - return this.institucionUsuarioService.update(institucionUsuario); + instituciones[i].multa = true; + await this.institucionUsuarioService.update(instituciones[i]); } } }); @@ -132,7 +138,7 @@ export class MultaService { }); } - async findAll(filtros: { + async findFullInfoMultaAll(filtros: { pagina: string; id_institucion?: string; usuario?: string; @@ -142,88 +148,70 @@ export class MultaService { parseInt(filtros.id_institucion), ) : null; - const query = this.repository - .createQueryBuilder('mu') - .innerJoinAndSelect('mu.institucionInfraccion', 'ii') - .innerJoinAndSelect('mu.operadorMulta', 'om') - .innerJoinAndSelect('mu.prestamo', 'p') - .innerJoinAndSelect('ii.infraccion', 'inf') - .innerJoinAndSelect('om.tipoUsuario', 'tu') - .innerJoinAndSelect('p.equipo', 'e') - .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('m.institucion', 'i') - .innerJoinAndSelect('ic.carrera', 'ca') - .innerJoinAndSelect('ic.institucion', 'in') - .orderBy('i.institucion') - .addOrderBy('mu.activo', 'DESC') - .addOrderBy('mu.id_multa', 'DESC') - .addOrderBy('u.usuario') - .skip((parseInt(filtros.pagina) - 1) * 25) - .take(25); + const busqueda: FindOptionsWhere = {}; - if (filtros.usuario) - query.andWhere('u.usuario LIKE :usuario', { - usuario: `%${filtros.usuario}%`, + if (filtros.usuario) busqueda.usuario = Like(`%${filtros.usuario}%`); + if (institucion) busqueda.id_institucion = institucion.id_institucion; + return this.fullInformacionMultaView + .findAndCount({ + where: busqueda, + order: { + institucion: 'ASC', + activo: 'DESC', + id_multa: 'DESC', + id_usuario: 'ASC', + }, + skip: (parseInt(filtros.pagina) - 1) * 25, + take: 25, + }) + .then((infoMultas) => { + const multas: Multa[] = []; + + for (let i = 0; i < infoMultas[0].length; i++) + multas.push( + this.repository.create(this.fullViewToMulta(infoMultas[0][i])), + ); + return [multas, infoMultas[1]]; }); - 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.findInfoEquipoById(id_equipo).then((equipo) => - this.repository - .createQueryBuilder('mu') - .innerJoinAndSelect('mu.institucionInfraccion', 'ii') - .innerJoinAndSelect('mu.operadorMulta', 'om') - .innerJoinAndSelect('mu.prestamo', 'p') - .innerJoinAndSelect('ii.infraccion', 'inf') - .innerJoinAndSelect('ii.institucion', 'i') - .innerJoinAndSelect('om.tipoUsuario', 'tu') - .innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', { - id_equipo: equipo.id_equipo, + this.fullInformacionMultaView + .findAndCount({ + where: { id_equipo: equipo.id_equipo }, + skip: (pagina - 1) * 25, + take: 25, }) - .innerJoinAndSelect('p.usuario', 'u') - .innerJoinAndSelect('u.instituciones', 'is') - .innerJoinAndSelect('is.institucionCarrera', 'ic') - .innerJoinAndSelect('ic.carrera', 'ca') - .innerJoinAndSelect('ic.institucion', 'in') - .orderBy('mu.id_multa', 'DESC') - .skip((pagina - 1) * 25) - .take(25) - .getManyAndCount(), + .then((infoMultas) => { + const multas: Multa[] = []; + + for (let i = 0; i < infoMultas[0].length; i++) + multas.push( + this.repository.create(this.fullViewToMulta(infoMultas[0][i])), + ); + return [multas, infoMultas[1]]; + }), ); } findAllByIdUsuario(id_usuario: number, pagina: number) { return this.usuarioService.findById(id_usuario).then((usuario) => - this.repository - .createQueryBuilder('mu') - .innerJoinAndSelect('mu.institucionInfraccion', 'ii') - .innerJoinAndSelect('mu.operadorMulta', 'om') - .innerJoinAndSelect('mu.prestamo', 'p') - .innerJoinAndSelect('ii.infraccion', 'inf') - .innerJoinAndSelect('ii.institucion', 'i') - .innerJoinAndSelect('om.tipoUsuario', 'tu') - .innerJoinAndSelect('p.equipo', 'e') - .innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', { - id_usuario: usuario.id_usuario, + this.fullInformacionMultaView + .findAndCount({ + where: { id_usuario: usuario.id_usuario }, + skip: (pagina - 1) * 25, + take: 25, }) - .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) - .getManyAndCount(), + .then((infoMultas) => { + const multas: Multa[] = []; + + for (let i = 0; i < infoMultas[0].length; i++) + multas.push( + this.repository.create(this.fullViewToMulta(infoMultas[0][i])), + ); + return [multas, infoMultas[1]]; + }), ); } @@ -242,6 +230,40 @@ export class MultaService { ); } + private fullViewToMulta(infoMulta: FullInformacionMultaView) { + return this.repository.create({ + id_multa: infoMulta.id_multa, + activo: infoMulta.activo === 1, + descripcion: infoMulta.descripcion, + fecha_fin: infoMulta.fecha_fin, + fecha_inicio: infoMulta.fecha_inicio, + retraso: infoMulta.retraso === 1, + institucionInfraccion: { + id_institucion_infraccion: infoMulta.id_institucion_infraccion, + infraccion: { + id_infraccion: infoMulta.id_infraccion, + infraccion: infoMulta.infraccion, + }, + }, + operadorMulta: { + id_operador: infoMulta.id_operador, + operador: infoMulta.operador, + institucion: { + id_institucion: infoMulta.id_institucion, + institucion: infoMulta.institucion, + }, + }, + prestamo: { + id_prestamo: infoMulta.id_prestamo, + usuario: { + id_usuario: infoMulta.id_usuario, + usuario: infoMulta.usuario, + nombre: infoMulta.nombre, + }, + }, + }); + } + async quitarMulta(id_institucion_usuario: number) { const institucionUsuario = await this.institucionUsuarioService.findById( id_institucion_usuario, diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 323c499..c9fcff0 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -157,34 +157,34 @@ export class PrestamoService { ) : null; - if (ahora.weekday() === 0) - throw new ConflictException('No hay servicio los días domingo.'); - this.validarInstitucionUsuario(usuario.instituciones, modulo); - if (!institucionDia.activo) - throw new ConflictException( - 'El día de hoy no hay servicio de préstamo de equipos.', - ); - if (ahora < horaMin) - throw new ConflictException( - `El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`, - ); - if (ahora >= horaExtra) - throw new ConflictException( - `El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`, - ); - for (let i = 0; i < institucionDia.horasExcepcion.length; i++) { - const horaFin = moment( - `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`, - ); - const horaInicio = moment( - `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`, - ); + // if (ahora.weekday() === 0) + // throw new ConflictException('No hay servicio los días domingo.'); + // this.validarInstitucionUsuario(usuario.instituciones, modulo); + // if (!institucionDia.activo) + // throw new ConflictException( + // 'El día de hoy no hay servicio de préstamo de equipos.', + // ); + // if (ahora < horaMin) + // throw new ConflictException( + // `El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`, + // ); + // if (ahora >= horaExtra) + // throw new ConflictException( + // `El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`, + // ); + // for (let i = 0; i < institucionDia.horasExcepcion.length; i++) { + // const horaFin = moment( + // `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`, + // ); + // const horaInicio = moment( + // `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`, + // ); - if (ahora > horaInicio && ahora < horaFin) - throw new ConflictException( - `Se suspendió temporalmente el servicio de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`, - ); - } + // if (ahora > horaInicio && ahora < horaFin) + // throw new ConflictException( + // `Se suspendió temporalmente el servicio de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`, + // ); + // } return this.informacionPrestamoView .findOne({ where: { activo: 1, id_usuario: usuario.id_usuario } }) .then((existePrestamo) => { diff --git a/src/upload-file/upload-file.service.ts b/src/upload-file/upload-file.service.ts index 0b7514c..4da2247 100644 --- a/src/upload-file/upload-file.service.ts +++ b/src/upload-file/upload-file.service.ts @@ -217,6 +217,7 @@ export class UploadFileService { ? await this.equipoService.findInfoEquipoByEquipo( carrito, dataEquipo.equipo, + false, ) : null; @@ -251,6 +252,7 @@ export class UploadFileService { equipo = await this.equipoService.findInfoEquipoByNumeroInventario( institucion, dataEquipo.numero_inventario, + false, ); if (equipo) { errores.push( diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts index 037347d..0d1af0e 100644 --- a/src/usuario/usuario.service.ts +++ b/src/usuario/usuario.service.ts @@ -261,7 +261,12 @@ export class UsuarioService { throw new ConflictException( 'Tu institución no te asignó un correo institucional, dirigete al módulo ', ); - message = `Se creó correctamente tu cuenta, mandamos un correo al email: ${usuario.correo} con tus credenciales para acceder a este servicio.`; + + const arrobaIndex = usuario.correo.indexOf('@'); + + message = `Se creó correctamente tu cuenta, mandamos un correo a ...${usuario.correo.slice( + arrobaIndex - 3, + )} con tus credenciales para acceder a este servicio.`; usuario.telefono = telefono; usuario.password = this.bcryptService.encriptar(password); return this.repository.save(usuario);