From 18c899267a65d290259c6c25df8bfac804747da4 Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Tue, 25 Oct 2022 22:12:11 -0500 Subject: [PATCH] listo multa --- src/dto/input/id-usuario.dto.ts | 6 - .../institucion-usuario.service.ts | 1 + src/multa/dto/input/multas.dto.ts | 9 +- src/multa/multa.controller.ts | 16 +- src/multa/multa.module.ts | 5 +- src/multa/multa.service.ts | 300 +++++++++++------- src/prestamo/prestamo.service.ts | 30 +- 7 files changed, 207 insertions(+), 160 deletions(-) delete mode 100644 src/dto/input/id-usuario.dto.ts diff --git a/src/dto/input/id-usuario.dto.ts b/src/dto/input/id-usuario.dto.ts deleted file mode 100644 index 4f89c4e..0000000 --- a/src/dto/input/id-usuario.dto.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { IsNumberString } from 'class-validator'; - -export class IdUsuarioDto { - @IsNumberString() - id_usuario: string; -} diff --git a/src/institucion-usuario/institucion-usuario.service.ts b/src/institucion-usuario/institucion-usuario.service.ts index 6aa3c7c..9060c33 100644 --- a/src/institucion-usuario/institucion-usuario.service.ts +++ b/src/institucion-usuario/institucion-usuario.service.ts @@ -194,6 +194,7 @@ export class InstitucionUsuarioService { institucionesUsuario[i].multa = status; await this.repository.save(institucionesUsuario[i]); } + return { message: 'Se multó correctamente a este usuario' }; }); } diff --git a/src/multa/dto/input/multas.dto.ts b/src/multa/dto/input/multas.dto.ts index 2d97657..0163005 100644 --- a/src/multa/dto/input/multas.dto.ts +++ b/src/multa/dto/input/multas.dto.ts @@ -9,12 +9,13 @@ export class MultasDto { @IsNumberString() pagina: string; - @IsNumberString() - @IsOptional() - id_institucion?: string; - @IsString() @IsNotEmpty() @IsOptional() usuario?: string; + + @IsString() + @IsNotEmpty() + @IsOptional() + nombre?: string; } diff --git a/src/multa/multa.controller.ts b/src/multa/multa.controller.ts index e836aac..5348cbf 100644 --- a/src/multa/multa.controller.ts +++ b/src/multa/multa.controller.ts @@ -21,7 +21,6 @@ import { MultaService } from './multa.service'; import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service'; import { Operador } from '../operador/entity/operador.entity'; import { Usuario } from '../usuario/entity/usuario.entity'; -import { IdUsuarioDto } from '../dto/input/id-usuario.dto'; import { IdEquipoPaginaDto } from '../dto/input/id-equipo-pagina.dto'; import { MultarDto } from './dto/input/multar.dto'; import { MultasDto } from './dto/input/multas.dto'; @@ -62,11 +61,10 @@ export class MultaController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); - return this.multaService.create( - body.id_prestamo, + return this.multaService.multaExtemporanea( operador, + body.id_prestamo, body.descripcion, - null, body.id_institucion_infraccion, ); } @@ -100,7 +98,7 @@ export class MultaController { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); - return this.multaService.findFullInfoMultaAll(query); + return this.multaService.findAll(query); } @Serealize(MultasEquipoOutputDto) @@ -125,6 +123,7 @@ export class MultaController { this.validarUsuarioService.validarAdminOperador(operador); return this.multaService.findAllByIdEquipo( + operador, parseInt(query.id_equipo), parseInt(query.pagina), ); @@ -152,6 +151,7 @@ export class MultaController { this.validarUsuarioService.validarAdminOperador(operador); return this.multaService.findAllByIdUsuario( + operador, parseInt(query.id_usuario), parseInt(query.pagina), ); @@ -170,11 +170,11 @@ export class MultaController { name: 'id_usuario', type: 'string', }) - multasActivas(@Request() req, @Query() query: IdUsuarioDto) { + multasActivas(@Request() req) { const usuario: Usuario = req.user.usuario; this.validarUsuarioService.validarUsuario(usuario); - return this.multaService.findMultasActivas(parseInt(query.id_usuario)); + return this.multaService.findMultasActivas(usuario); } @Serealize(MessageOutputDto) @@ -193,7 +193,7 @@ export class MultaController { const admin: Operador = req.user.operador; this.validarUsuarioService.validarAdmin(admin); - return this.multaService.quitarMulta(body.id_institucion_usuario); + return this.multaService.quitarMulta(admin, body.id_institucion_usuario); } // @Get('reporte') diff --git a/src/multa/multa.module.ts b/src/multa/multa.module.ts index 01046ac..69fcb43 100644 --- a/src/multa/multa.module.ts +++ b/src/multa/multa.module.ts @@ -7,10 +7,8 @@ import { Multa } from './entity/multa.entity'; import { FullInformacionMultaView } from './entity/views/full-informacion-multa.view'; import { InformacionMultaView } from './entity/views/informacion-multa.view'; import { EquipoModule } from '../equipo/equipo.module'; -import { InstitucionModule } from '../institucion/institucion.module'; import { InstitucionInfraccionModule } from '../institucion-infraccion/institucion-infraccion.module'; import { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usuario.module'; -import { OperadorModule } from '../operador/operador.module'; import { PrestamoModule } from '../prestamo/prestamo.module'; import { UsuarioModule } from '../usuario/usuario.module'; import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'; @@ -18,12 +16,11 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module' @Module({ imports: [ EquipoModule, - InstitucionModule, InstitucionInfraccionModule, InstitucionUsuarioModule, PassportModule.register({ defaultStrategy: 'jwt' }), forwardRef(() => PrestamoModule), - OperadorModule, + TypeOrmModule.forFeature([ Multa, FullInformacionMultaView, diff --git a/src/multa/multa.service.ts b/src/multa/multa.service.ts index 90d6510..de12a34 100644 --- a/src/multa/multa.service.ts +++ b/src/multa/multa.service.ts @@ -7,11 +7,10 @@ import { FullInformacionMultaView } from './entity/views/full-informacion-multa. import { InformacionMultaView } from './entity/views/informacion-multa.view'; import { Operador } from '../operador/entity/operador.entity'; import { Prestamo } from '../prestamo/entity/prestamo.entity'; +import { Usuario } from '../usuario/entity/usuario.entity'; import { EquipoService } from '../equipo/equipo.service'; -import { InstitucionService } from '../institucion/institucion.service'; import { InstitucionInfraccionService } from '../institucion-infraccion/institucion-infraccion.service'; import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service'; -import { OperadorService } from '../operador/operador.service'; import { PrestamoService } from '../prestamo/prestamo.service'; import { UsuarioService } from '../usuario/usuario.service'; @@ -24,82 +23,112 @@ export class MultaService { @InjectRepository(InformacionMultaView) private informacionMultaView: Repository, private equipoService: EquipoService, - private institucionService: InstitucionService, private institucionInfraccionService: InstitucionInfraccionService, private institucionUsuarioService: InstitucionUsuarioService, - private operadorService: OperadorService, private prestamoService: PrestamoService, private usuarioService: UsuarioService, ) {} async create( - id_prestamo: number | Prestamo, - id_operador: number | Operador, + operadorMulta: Operador, + prestamo: Prestamo, descripcion: string, retraso?: number, id_institucion_infraccion?: number, ) { - console.log('hola1'); - const ahora = moment(); + const institucionInfraccion = id_institucion_infraccion + ? await this.institucionInfraccionService.findById( + id_institucion_infraccion, + ) + : // Asigno institucionInfraccion "Sin multa" por default + await this.institucionInfraccionService.findSinInfraccion( + operadorMulta.institucion, + ); + // Creo registro de multa + const nuevaMulta = this.repository.create({ + descripcion, + fecha_inicio: moment().toDate(), + operadorMulta, + prestamo, + institucionInfraccion, + }); + const existeMulta = await this.findByPrestamo(prestamo).catch((err) => { + if (err) true; + return false; + }); + const fecha_fin = moment(); + + // Si ya tiene multa es que hubo un error en otra ocasión pero se creo la multa + // correctamente esa vez + if (existeMulta) return; + this.validacionMultaCancelacion(prestamo); + // Si no se mando un id_institucion_infraccion ni retraso saco error + if (!institucionInfraccion && !retraso) + throw new ConflictException( + 'No se mandó ningún motivo para multar a este alumno.', + ); + // Si hay retraso lo agrego a la multa + if (retraso) { + nuevaMulta.retraso = true; + fecha_fin.add( + retraso * operadorMulta.institucion.dias_multa_retraso, + 'd', + ); + } + fecha_fin.add(institucionInfraccion.dias_multa, 'd'); + nuevaMulta.fecha_fin = fecha_fin.toDate(); + // Guardo la información + return this.repository.save(nuevaMulta).then((_) => + // Actualizo multas del usuario + this.institucionUsuarioService.updateMulta( + operadorMulta.institucion.id_institucion, + prestamo.usuario.id_usuario, + true, + ), + ); + } + + async multaExtemporanea( + operador: Operador, + id_prestamo: number, + descripcion: string, + id_institucion_infraccion: number, + ) { const prestamo = typeof id_prestamo === 'number' ? await this.prestamoService.findById(id_prestamo) : id_prestamo; - const operador = - typeof id_operador === 'number' - ? await this.operadorService.findById(id_operador) - : id_operador; - // Creo registro de multa - const nuevaMulta = this.repository.create({ - descripcion, - fecha_inicio: ahora.toDate(), - operadorMulta: operador, - prestamo, - }); - let institucionInfraccion = id_institucion_infraccion - ? await this.institucionInfraccionService.findById( - id_institucion_infraccion, - ) - : null; - - // Valido que este prestamo no haya sido cancelado poer el usuario u operador - if (prestamo.cancelado_operador || prestamo.cancelado_usuario) - throw new ConflictException( - 'No se puede multar a un usuario con un préstamo que fue cancelado.', + const institucionInfraccion = + await this.institucionInfraccionService.findById( + id_institucion_infraccion, ); - // Si no se mando un id_institucion_infraccion - if (!institucionInfraccion) { - // Si tampoco se mando retraso saco error - if (!retraso) - throw new ConflictException( - 'No se mandó ningún motivo para multar a este alumno.', - ); - // Asigno institucionInfraccion "Sin multa" por default - institucionInfraccion = - await this.institucionInfraccionService.findSinInfraccion( - operador.institucion, - ); - } + const fecha_fin = moment(); + + // Valido que este prestamo le pertenezca al operador + if ( + operador.institucion.id_institucion != + prestamo.equipo.carrito.modulo.institucion.id_institucion + ) + throw new ConflictException( + 'Este préstamo no pertenece a esta institución.', + ); + this.validacionMultaCancelacion(prestamo); + fecha_fin.add(institucionInfraccion.dias_multa, 'd'); // Busco una multa con este préstamo - return this.repository - .findOne({ where: { prestamo } }) - .then((existeMulta) => { - // Si existe saco error - if (existeMulta) - throw new ConflictException( - 'Ya existe una multa asignada a este préstamo.', - ); - // Si hay retraso lo agrego a la multa - if (retraso) { - nuevaMulta.retraso = true; - ahora.add(retraso * operador.institucion.dias_multa_retraso, 'd'); - } - nuevaMulta.institucionInfraccion = institucionInfraccion; - ahora.add(institucionInfraccion.dias_multa, 'd'); - nuevaMulta.fecha_fin = ahora.toDate(); - // Guardo la información - return this.repository.save(nuevaMulta); - }) + return this.findByPrestamo(prestamo) + .then((_) => + // Creo y guardo registro + this.repository.save( + this.repository.create({ + descripcion, + fecha_fin: fecha_fin.toDate(), + fecha_inicio: moment().toDate(), + institucionInfraccion, + operadorMulta: operador, + prestamo, + }), + ), + ) .then((_) => // Actualizo multas del usuario this.institucionUsuarioService.updateMulta( @@ -113,43 +142,48 @@ export class MultaService { desactivarMultas() { const ahora = moment(); + // Busco todas las multas desactivadas return this.repository - .find({ where: { activo: true } }) + .find({ + join: { + alias: 'mu', + innerJoinAndSelect: { p: 'mu.prestamo', u: 'p.usuario' }, + }, + where: { activo: true }, + }) .then(async (multas) => { + //recorro todo el array for (let i = 0; i < multas.length; i++) + // Si ya caducó if (ahora.diff(moment(multas[i].fecha_fin)) > 0) { - const instituciones = multas[i].prestamo.usuario.instituciones; - + // Desactivo multa multas[i].activo = false; - await this.repository.save(multas[i]); - for (let j = 0; j < instituciones.length; j++) { - const institucionUsuario = instituciones[j]; - - if ( - institucionUsuario.institucionCarrera.institucion - .id_institucion === - multas[i].operadorMulta.institucion.id_institucion - ) { - institucionUsuario.multa = false; - await this.institucionUsuarioService.save(institucionUsuario); - } - } + // Guardo cambios + await this.repository.save(multas[i]).then(() => + // Quito multas en institución usuario + this.institucionUsuarioService.updateMulta( + multas[i].operadorMulta.institucion.id_institucion, + multas[i].prestamo.usuario.id_usuario, + false, + ), + ); } }); } - async findFullInfoMultaAll(filtros: { - pagina: string; - id_institucion?: string; - usuario?: string; - }) { - const institucion = filtros.id_institucion - ? await this.institucionService.findById(parseInt(filtros.id_institucion)) - : null; + findAll( + filtros: { + pagina: string; + nombre?: string; + usuario?: string; + }, + operador?: Operador, + ) { const busqueda: FindOptionsWhere = {}; + if (filtros.nombre) busqueda.nombre = Like(`%${filtros.nombre}%`); if (filtros.usuario) busqueda.usuario = Like(`%${filtros.usuario}%`); - if (institucion) busqueda.id_institucion = institucion.id_institucion; + if (operador) busqueda.id_institucion = operador.institucion.id_institucion; return this.fullInformacionMultaView .findAndCount({ where: busqueda, @@ -173,11 +207,14 @@ export class MultaService { }); } - findAllByIdEquipo(id_equipo: number, pagina: number) { + findAllByIdEquipo(operador: Operador, id_equipo: number, pagina: number) { return this.equipoService.findById(id_equipo).then((equipo) => this.fullInformacionMultaView .findAndCount({ - where: { id_equipo: equipo.id_equipo }, + where: { + id_equipo: equipo.id_equipo, + id_institucion: operador.institucion.id_institucion, + }, skip: (pagina - 1) * 25, take: 25, }) @@ -193,11 +230,14 @@ export class MultaService { ); } - findAllByIdUsuario(id_usuario: number, pagina: number) { + findAllByIdUsuario(operador: Operador, id_usuario: number, pagina: number) { return this.usuarioService.findById(id_usuario).then((usuario) => this.fullInformacionMultaView .findAndCount({ - where: { id_usuario: usuario.id_usuario }, + where: { + id_usuario: usuario.id_usuario, + id_institucion: operador.institucion.id_institucion, + }, skip: (pagina - 1) * 25, take: 25, }) @@ -213,19 +253,29 @@ export class MultaService { ); } - findMultasActivas(id_usuario: number) { - return this.usuarioService.findById(id_usuario).then((usuario) => - this.repository - .createQueryBuilder('mu') - .innerJoin('mu.prestamo', 'p') - .innerJoin('p.usuario', 'u', 'u.id_usuario = :id_usuario', { - id_usuario: usuario.id_usuario, - }) - .innerJoinAndSelect('mu.institucionInfraccion', 'ii') - .innerJoinAndSelect('ii.institucion', 'i') - .andWhere('mu.activo = 1') - .getMany(), - ); + findByPrestamo(prestamo: Prestamo) { + return this.repository + .findOne({ select: ['id_multa'], where: { prestamo } }) + .then((existeMulta) => { + if (existeMulta) + throw new ConflictException( + 'Ya existe una multa asignada a este préstamo.', + ); + return existeMulta; + }); + } + + findMultasActivas(usuario: Usuario) { + return this.repository + .createQueryBuilder('mu') + .innerJoin('mu.prestamo', 'p') + .innerJoin('p.usuario', 'u', 'u.id_usuario = :id_usuario', { + id_usuario: usuario.id_usuario, + }) + .innerJoinAndSelect('mu.institucionInfraccion', 'ii') + .innerJoinAndSelect('ii.institucion', 'i') + .andWhere('mu.activo = 1') + .getMany(); } private fullViewToMulta(infoMulta: FullInformacionMultaView) { @@ -262,15 +312,22 @@ export class MultaService { }); } - async quitarMulta(id_institucion_usuario: number) { + private validacionMultaCancelacion(prestamo: Prestamo) { + // Valido que este prestamo no haya sido cancelado poer el usuario u operador + if (prestamo.cancelado_operador || prestamo.cancelado_usuario) + throw new ConflictException( + 'No se puede multar a un usuario con un préstamo que fue cancelado.', + ); + } + + async quitarMulta(admin: Operador, id_institucion_usuario: number) { const institucionUsuario = await this.institucionUsuarioService.findById( id_institucion_usuario, ); - - return this.repository + const multa = await this.repository .createQueryBuilder('mu') - .innerJoin('mu.prestamo', 'p') - .innerJoin('p.usuario', 'u') + .innerJoinAndSelect('mu.prestamo', 'p') + .innerJoinAndSelect('p.usuario', 'u') .innerJoin( 'u.instituciones', 'is', @@ -278,17 +335,22 @@ export class MultaService { { id_institucion_usuario: institucionUsuario.id_institucion_usuario }, ) .where('mu.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.save(institucionUsuario)) + .getOne(); + + if (!multa) + throw new ConflictException( + 'Este usuario no tiene una multa activa en esta institución.', + ); + multa.activo = false; + return this.repository + .save(multa) + .then((_) => + this.institucionUsuarioService.updateMulta( + admin.institucion.id_institucion, + multa.prestamo.usuario.id_usuario, + false, + ), + ) .then((_) => ({ message: 'Se guardaron los cambios correctamente.' })); } } diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 46b1bfa..1abd4d0 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -738,8 +738,8 @@ export class PrestamoService { } async regresar( - prestamo: Prestamo, operadorRegreso: Operador, + prestamo: Prestamo, id_status: number, motivo?: string, descripcion?: string, @@ -764,7 +764,6 @@ export class PrestamoService { ); if (id_institucion_infraccion && !descripcion) throw new ConflictException('No se mandó la descripción de lo ocurrido.'); - console.log('HOLA'); prestamo.activo = false; prestamo.fecha_entrega = ahora.toDate(); prestamo.operadorRegreso = operadorRegreso; @@ -779,8 +778,8 @@ export class PrestamoService { // a motivo, y mandar la id_institucion_infraccion if (id_institucion_infraccion) await this.multaService.create( - prestamo, operadorRegreso, + prestamo, `${mensajeTardanza} ${descripcion}`, semanasCastigo, id_institucion_infraccion, @@ -788,8 +787,8 @@ export class PrestamoService { // Multa normal else await this.multaService.create( - prestamo, operadorRegreso, + prestamo, mensajeTardanza, semanasCastigo, ); @@ -797,23 +796,16 @@ export class PrestamoService { // De lo contrario, si se mandó id_institucion_infraccion significa que // el usuario solo solo daño el equipo await this.multaService.create( - prestamo, operadorRegreso, + prestamo, descripcion, null, id_institucion_infraccion, ); - console.log('hola'); - // Guardo los cambios del préstamo - return this.repository - .save(prestamo) - .then((_) => - this.equipoService.updateStatus( - prestamo.equipo, - operadorRegreso, - motivo, - ), - ) + // Guardo los cambios del equipo + return this.equipoService + .updateStatus(prestamo.equipo, operadorRegreso, motivo) + .then((_) => this.repository.save(prestamo)) // Guardo los cambios del préstamo .then((_) => { // Actualizo la interfaz del usuario this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); @@ -836,8 +828,8 @@ export class PrestamoService { // Busco el prestamo por id prestamo y luego regreso el equipo return this.findById(id_prestamo).then((prestamo) => this.regresar( - prestamo, operador, + prestamo, id_status, motivo, descripcion, @@ -863,8 +855,8 @@ export class PrestamoService { numero_inventario, ).then((prestamo) => this.regresar( - prestamo, operador, + prestamo, id_status, motivo, descripcion, @@ -914,7 +906,7 @@ export class PrestamoService { ); } - validacionOperadorPrestamo( + private validacionOperadorPrestamo( prestamo: Prestamo, operador: Operador, modulo?: Modulo,