cron service final

This commit is contained in:
xXpuma99Xx
2022-12-19 19:10:31 -06:00
parent 07a66825b8
commit 8115d7b48b
8 changed files with 156 additions and 108 deletions
+4 -6
View File
@@ -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;
+4 -1
View File
@@ -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 {}
+73 -4
View File
@@ -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,
),
);
}
});
}
}
+10 -8
View File
@@ -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<Equipo[]> {
return this.repository.find({
select: ['id_equipo'],
where: { prestado: true, status: { id_status: Not(3) } },
});
}
save(equipo: Equipo): Promise<Equipo> {
return this.repository.save(equipo);
}
update(
@@ -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;
}
+1 -1
View File
@@ -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)
+33 -28
View File
@@ -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)
+30 -51
View File
@@ -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<Prestamo[]> {
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<Prestamo[]> {
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)