cron service final
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user