From 8115d7b48b442c9fb21401453c32fa0cb6713a3e Mon Sep 17 00:00:00 2001 From: xXpuma99Xx <51341582+xXpuma99Xx@users.noreply.github.com> Date: Mon, 19 Dec 2022 19:10:31 -0600 Subject: [PATCH] cron service final --- src/carrito/entity/carrito.entity.ts | 10 +-- src/cron/cron.module.ts | 5 +- src/cron/cron.service.ts | 77 +++++++++++++++++- src/equipo/equipo.service.ts | 18 +++-- .../entity/views/informacion-multa.view.ts | 10 +-- src/multa/multa.controller.ts | 2 +- src/multa/multa.service.ts | 61 +++++++------- src/prestamo/prestamo.service.ts | 81 +++++++------------ 8 files changed, 156 insertions(+), 108 deletions(-) diff --git a/src/carrito/entity/carrito.entity.ts b/src/carrito/entity/carrito.entity.ts index 675d80b..42f8c22 100644 --- a/src/carrito/entity/carrito.entity.ts +++ b/src/carrito/entity/carrito.entity.ts @@ -36,21 +36,19 @@ export class Carrito { @Column({ type: Number, nullable: true }) id_tipo_carrito: number; - @ManyToOne(() => Marca, (marca) => marca.carritos, { eager: true }) + @ManyToOne(() => Marca, (marca) => marca.carritos) @JoinColumn({ name: 'id_marca' }) marca: Marca; - @ManyToOne(() => Modelo, (modelo) => modelo.carritos, { eager: true }) + @ManyToOne(() => Modelo, (modelo) => modelo.carritos) @JoinColumn({ name: 'id_modelo' }) modelo: Modelo; - @ManyToOne(() => Modulo, (modulo) => modulo.carritos, { eager: true }) + @ManyToOne(() => Modulo, (modulo) => modulo.carritos) @JoinColumn({ name: 'id_modulo' }) modulo: Modulo; - @ManyToOne(() => TipoCarrito, (tipoCarrito) => tipoCarrito.carritos, { - eager: true, - }) + @ManyToOne(() => TipoCarrito, (tipoCarrito) => tipoCarrito.carritos) @JoinColumn({ name: 'id_tipo_carrito' }) tipoCarrito: TipoCarrito; diff --git a/src/cron/cron.module.ts b/src/cron/cron.module.ts index 9a69b0d..5c0206c 100644 --- a/src/cron/cron.module.ts +++ b/src/cron/cron.module.ts @@ -1,17 +1,20 @@ import { Module } from '@nestjs/common'; import { ScheduleModule } from '@nestjs/schedule'; +import { AppGateway } from '../app.gateway'; import { CronService } from './cron.service'; import { EquipoModule } from '../equipo/equipo.module'; +import { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usuario.module'; import { MultaModule } from '../multa/multa.module'; import { PrestamoModule } from '../prestamo/prestamo.module'; @Module({ imports: [ EquipoModule, + InstitucionUsuarioModule, MultaModule, PrestamoModule, ScheduleModule.forRoot(), ], - providers: [CronService], + providers: [AppGateway, CronService], }) export class CronModule {} diff --git a/src/cron/cron.service.ts b/src/cron/cron.service.ts index 3514878..4ff8e51 100644 --- a/src/cron/cron.service.ts +++ b/src/cron/cron.service.ts @@ -1,29 +1,98 @@ import { Injectable } from '@nestjs/common'; import { Cron } from '@nestjs/schedule'; +import { AppGateway } from '../app.gateway'; import { EquipoService } from '../equipo/equipo.service'; +import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service'; import { MultaService } from '../multa/multa.service'; import { PrestamoService } from '../prestamo/prestamo.service'; @Injectable() export class CronService { constructor( + private appGateway: AppGateway, private equipoService: EquipoService, private multaService: MultaService, private prestamoService: PrestamoService, + private institucionUsuarioService: InstitucionUsuarioService, ) {} @Cron('* 6-20 * * 1-6', { name: 'prestamos_desactivacion' }) - desactivarPrestamos() { - return this.prestamoService.desactivarPrestamos(); + async desactivarPrestamos() { + await this.prestamoService + .findAllEquiposRepetidos() + .then(async (prestamos) => { + // Recorremos el array de prestamos + for (let i = 0; i < prestamos.length; i++) { + // Desactivamos préstamo y registramos que fue por repetición de equipo + prestamos[i].activo = false; + prestamos[i].cancelado_repeticion = true; + // Guardamos cambios + await this.prestamoService.save(prestamos[i]).then((_) => { + // Actualizamos las interfaces del los usuarios + this.appGateway.actualizarOperador( + prestamos[i].equipo.carrito.modulo.institucion.id_institucion, + ); + this.appGateway.actualizarUsuario(prestamos[i].usuario.id_usuario); + }); + } + }); + await this.prestamoService + .findAllActivosExpirados() + .then(async (prestamos) => { + // Recorremos el array de prestamos + for (let i = 0; i < prestamos.length; i++) { + // Desactivamos préstamO y reseteamos campos + prestamos[i].activo = false; + prestamos[i].cancelado_operador = true; + prestamos[i].equipo.u = null; + prestamos[i].equipo.status.id_status = 1; + // Guardamos cambios + await this.prestamoService + .save(prestamos[i]) + .then((_) => this.equipoService.updateStatus(prestamos[i].equipo)) + .then((_) => { + // Actualizamos las interfaces del los usuarios + this.appGateway.actualizarOperador( + prestamos[i].equipo.carrito.modulo.institucion.id_institucion, + ); + this.appGateway.actualizarUsuario( + prestamos[i].usuario.id_usuario, + ); + }); + } + }); } @Cron('0 0 * * 1-6', { name: 'equipos_reseteo' }) resetearEquipos() { - return this.equipoService.reseteoTotal(); + return this.equipoService.findAllResetear().then(async (equipos) => { + // Recorremos el array de equipos + for (let i = 0; i < equipos.length; i++) { + // Reseteamos atributo prestado + equipos[i].prestado = false; + // Guardamos cambios + await this.equipoService.save(equipos[i]); + } + }); } @Cron('0 1 * * 1-6', { name: 'multas_reseteo' }) revisarMultas() { - return this.multaService.desactivarMultas(); + return this.multaService.findAllActivasExpiradas().then(async (multas) => { + // Recorremos el array de multas + for (let i = 0; i < multas.length; i++) { + // Desacrtivamos la multa + multas[i].activo = false; + // Guardamos cambios + await this.multaService.save(multas[i]).then((_) => + // Quitamos multas en institución usuario + this.institucionUsuarioService.updateMulta( + multas[i].institucionInfraccion.institucion.id_institucion, + multas[i].prestamo.usuario.id_usuario, + false, + ), + ); + } + }); } } diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index bf9d7ce..16c7502 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -7,7 +7,7 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { FindOptionsWhere, Repository } from 'typeorm'; +import { FindOptionsWhere, Not, Repository } from 'typeorm'; import { Carrito } from '../carrito/entity/carrito.entity'; import { Equipo } from './entity/equipo.entity'; import { Institucion } from '../institucion/entity/institucion.entity'; @@ -394,13 +394,15 @@ export class EquipoService { }); } - reseteoTotal() { - return this.repository - .createQueryBuilder() - .update() - .where('id_status != 3') - .set({ prestado: false }) - .execute(); + findAllResetear(): Promise { + return this.repository.find({ + select: ['id_equipo'], + where: { prestado: true, status: { id_status: Not(3) } }, + }); + } + + save(equipo: Equipo): Promise { + return this.repository.save(equipo); } update( diff --git a/src/multa/entity/views/informacion-multa.view.ts b/src/multa/entity/views/informacion-multa.view.ts index 541482b..f0ad78cb 100644 --- a/src/multa/entity/views/informacion-multa.view.ts +++ b/src/multa/entity/views/informacion-multa.view.ts @@ -10,9 +10,7 @@ import { Operador } from '../../../operador/entity/operador.entity'; .createQueryBuilder() .select('mu.id_multa', 'id_multa') .addSelect('mu.activo', 'activo') - .addSelect('mu.descripcion', 'descripcion') .addSelect('mu.fecha_fin', 'fecha_fin') - .addSelect('mu.fecha_inicio', 'fecha_inicio') .addSelect('mu.id_institucion_infraccion', 'id_institucion_infraccion') .addSelect('mu.id_operador', 'id_operador') .addSelect('mu.id_prestamo', 'id_prestamo') @@ -36,15 +34,9 @@ export class InformacionMultaView { @ViewColumn() activo: number; - @ViewColumn() - descripcion: string; - @ViewColumn() fecha_fin: Date; - @ViewColumn() - fecha_inicio: Date; - @ViewColumn() id_institucion: number; @@ -64,5 +56,5 @@ export class InformacionMultaView { id_usuario: number; @ViewColumn() - retraso: boolean; + retraso: number; } diff --git a/src/multa/multa.controller.ts b/src/multa/multa.controller.ts index ba80554..4b9d9f8 100644 --- a/src/multa/multa.controller.ts +++ b/src/multa/multa.controller.ts @@ -174,7 +174,7 @@ export class MultaController { const usuario: Usuario = req.user.usuario; this.validarUsuarioService.validarUsuario(usuario); - return this.multaService.findMultasActivas(usuario); + return this.multaService.findMultasActivasByUsuario(usuario); } @Serealize(MessageOutputDto) diff --git a/src/multa/multa.service.ts b/src/multa/multa.service.ts index a20bcbc..9ac21ae 100644 --- a/src/multa/multa.service.ts +++ b/src/multa/multa.service.ts @@ -1,7 +1,7 @@ import * as moment from 'moment'; import { ConflictException, Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { FindOptionsWhere, Like, Repository } from 'typeorm'; +import { FindOptionsWhere, LessThanOrEqual, 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'; @@ -141,34 +141,35 @@ export class MultaService { ); } - desactivarMultas() { - const ahora = moment(); - - // Busco todas las multas activas + findAllActivasExpiradas() { return this.informacionMultaView - .find({ where: { activo: 1 } }) - .then(async (infoMultas) => { - // recorro todo el array + .find({ + where: { activo: 1, fecha_fin: LessThanOrEqual(moment().toDate()) }, + }) + .then((infoMultas) => { + const multas: Multa[] = []; + for (let i = 0; i < infoMultas.length; i++) - // Si ya caducó - if (ahora.diff(moment(infoMultas[i].fecha_fin)) > 0) { - // Desactivo multa y guardo cambios - await this.repository - .save( - this.repository.create({ - id_multa: infoMultas[i].id_multa, - activo: false, - }), - ) - .then((_) => - // Quito multas en institución usuario - this.institucionUsuarioService.updateMulta( - infoMultas[i].id_institucion, - infoMultas[i].id_usuario, - false, - ), - ); - } + multas.push( + this.repository.create({ + id_multa: infoMultas[i].id_multa, + activo: infoMultas[i].activo === 1, + fecha_fin: infoMultas[i].fecha_fin, + retraso: infoMultas[i].retraso === 1, + institucionInfraccion: { + id_institucion_infraccion: + infoMultas[i].id_institucion_infraccion, + infraccion: { id_infraccion: infoMultas[i].id_infraccion }, + institucion: { id_institucion: infoMultas[i].id_institucion }, + }, + operadorMulta: { id_operador: infoMultas[i].id_operador }, + prestamo: { + id_prestamo: infoMultas[i].id_prestamo, + usuario: { id_usuario: infoMultas[i].id_usuario }, + }, + }), + ); + return multas; }); } @@ -266,7 +267,7 @@ export class MultaService { }); } - findMultasActivas(usuario: Usuario) { + findMultasActivasByUsuario(usuario: Usuario) { return this.repository .createQueryBuilder('mu') .innerJoin('mu.prestamo', 'p') @@ -313,6 +314,10 @@ export class MultaService { }); } + save(multa: Multa) { + return this.repository.save(multa); + } + private validacionMultaCancelacion(prestamo: Prestamo) { // Validamos que este prestamo no haya sido cancelado poer el usuario u operador if (prestamo.cancelado_operador || prestamo.cancelado_usuario) diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 24fefe3..3f637de 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -13,6 +13,7 @@ import { Between, FindManyOptions, FindOptionsWhere, + LessThanOrEqual, Like, MoreThanOrEqual, Repository, @@ -257,61 +258,35 @@ export class PrestamoService { }); } - async desactivarPrestamos() { - const ahora = moment(); - - // Busco todos los préstamos activos y cuyos equipos no esten asignados - // al usuario del préstamo + async findAllActivosExpirados(): Promise { return this.informacionPrestamoView - .createQueryBuilder('p') + .find({ + where: { + activo: 1, + hora_max_recoger: LessThanOrEqual(moment().toDate()), + id_status: 2, + }, + }) + .then((infoPrestamos) => { + const prestamos: Prestamo[] = []; + + for (let i = 0; i < infoPrestamos.length; i++) + prestamos.push(this.viewToPrestamo(infoPrestamos[i])); + return prestamos; + }); + } + + async findAllEquiposRepetidos(): Promise { + return this.informacionPrestamoView + .createQueryBuilder('ipv') .where('activo = 1 AND id_usuario != u') .getMany() - .then(async (infoPrestamos) => { - // Recorro el array - for (let i = 0; i < infoPrestamos.length; i++) { - const prestamo = this.viewToPrestamo(infoPrestamos[i]); + .then((infoPrestamos) => { + const prestamos: Prestamo[] = []; - prestamo.activo = false; - prestamo.cancelado_repeticion = true; - // Guardo los cambios del préstamo - await this.repository.save(prestamo).then((_) => { - // Actualizo las interfaces del los usuarios - this.appGateway.actualizarOperador( - prestamo.equipo.carrito.modulo.institucion.id_institucion, - ); - this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); - }); - } - // Busco todos los préstamos activos y que esten apartadoss - return this.informacionPrestamoView.find({ - where: { activo: 1, id_status: 2 }, - }); - }) - .then(async (infoPrestamos) => { - // Recorro el array - for (let i = 0; i < infoPrestamos.length; i++) { - const prestamo = this.viewToPrestamo(infoPrestamos[i]); - - // Si la resta ahora - hora_max_recoger es mayor a 0 significa que ya pasó - // el tiempo limite para recoger el equipo de cómputo - if (ahora.diff(moment(prestamo.hora_max_recoger)) > 0) { - prestamo.activo = false; - prestamo.cancelado_operador = true; - prestamo.equipo.u = null; - prestamo.equipo.status.id_status = 1; - // Guardo los cambios del préstamo - await this.repository - .save(prestamo) - .then((_) => this.equipoService.updateStatus(prestamo.equipo)) - .then((_) => { - // Actualizo las interfazes del los usuarios - this.appGateway.actualizarOperador( - prestamo.equipo.carrito.modulo.institucion.id_institucion, - ); - this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); - }); - } - } + for (let i = 0; i < infoPrestamos.length; i++) + prestamos.push(this.viewToPrestamo(infoPrestamos[i])); + return prestamos; }); } @@ -945,6 +920,10 @@ export class PrestamoService { ); } + save(prestamo: Prestamo) { + return this.repository.save(prestamo); + } + validacionBasicaPrestamo(prestamo: Prestamo) { // Validamos si el préstamo fue cancelado por el usuario if (prestamo.cancelado_usuario)