Files
pcpuma_unam_api/src/multa/multa.service.ts
T

356 lines
12 KiB
TypeScript
Raw Normal View History

2022-04-23 22:45:57 -05:00
import * as moment from 'moment';
2022-06-14 16:49:10 -05:00
import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
2022-10-25 16:45:38 -05:00
import { FindOptionsWhere, Like, Repository } from 'typeorm';
2022-04-17 22:11:55 -05:00
import { Multa } from './entity/multa.entity';
2022-10-05 04:58:49 -05:00
import { FullInformacionMultaView } from './entity/views/full-informacion-multa.view';
import { InformacionMultaView } from './entity/views/informacion-multa.view';
2022-11-03 03:20:49 -06:00
import { Modulo } from '../modulo/entity/modulo.entity';
2022-06-14 16:49:10 -05:00
import { Operador } from '../operador/entity/operador.entity';
2022-04-23 22:45:57 -05:00
import { Prestamo } from '../prestamo/entity/prestamo.entity';
2022-10-25 22:12:11 -05:00
import { Usuario } from '../usuario/entity/usuario.entity';
2022-04-24 12:00:56 -05:00
import { EquipoService } from '../equipo/equipo.service';
import { InstitucionInfraccionService } from '../institucion-infraccion/institucion-infraccion.service';
2022-06-27 16:35:36 -05:00
import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service';
2022-10-30 23:24:45 -06:00
import { OperadorService } from '../operador/operador.service';
2022-04-24 12:00:56 -05:00
import { PrestamoService } from '../prestamo/prestamo.service';
import { UsuarioService } from '../usuario/usuario.service';
2022-04-04 20:02:54 -05:00
@Injectable()
2022-04-04 20:53:32 -05:00
export class MultaService {
2022-04-23 22:45:57 -05:00
constructor(
@InjectRepository(Multa) private repository: Repository<Multa>,
2022-10-05 04:58:49 -05:00
@InjectRepository(FullInformacionMultaView)
private fullInformacionMultaView: Repository<FullInformacionMultaView>,
@InjectRepository(InformacionMultaView)
private informacionMultaView: Repository<InformacionMultaView>,
2022-04-23 22:45:57 -05:00
private equipoService: EquipoService,
2022-06-02 10:42:53 -05:00
private institucionInfraccionService: InstitucionInfraccionService,
2022-06-27 16:35:36 -05:00
private institucionUsuarioService: InstitucionUsuarioService,
2022-10-30 23:24:45 -06:00
private operadorService: OperadorService,
2022-04-23 22:45:57 -05:00
private prestamoService: PrestamoService,
private usuarioService: UsuarioService,
) {}
async create(
2022-10-25 22:12:11 -05:00
operadorMulta: Operador,
2022-11-03 03:20:49 -06:00
modulo: Modulo,
2022-10-25 22:12:11 -05:00
prestamo: Prestamo,
2022-06-14 20:57:28 -05:00
descripcion: string,
retraso?: number,
2022-06-14 16:49:10 -05:00
id_institucion_infraccion?: number,
2022-04-23 22:45:57 -05:00
) {
2022-10-25 22:12:11 -05:00
const institucionInfraccion = id_institucion_infraccion
? await this.institucionInfraccionService.findById(
id_institucion_infraccion,
)
2022-10-30 23:24:45 -06:00
: // Asigno institucionInfraccion "Sin infracción" por default
2022-10-25 22:12:11 -05:00
await this.institucionInfraccionService.findSinInfraccion(
operadorMulta.institucion,
);
2022-10-25 16:45:38 -05:00
// Creo registro de multa
const nuevaMulta = this.repository.create({
2022-06-14 21:43:07 -05:00
descripcion,
2022-10-25 22:12:11 -05:00
fecha_inicio: moment().toDate(),
2022-10-30 23:24:45 -06:00
operadorMulta: id_institucion_infraccion
? operadorMulta
: this.operadorService.sistema(),
2022-06-14 21:43:07 -05:00
prestamo,
2022-10-25 22:12:11 -05:00
institucionInfraccion,
2022-10-25 16:45:38 -05:00
});
2022-10-30 23:24:45 -06:00
const existeMulta = await this.findByPrestamo(prestamo).catch(
(err) => true,
);
2022-10-25 22:12:11 -05:00
const fecha_fin = moment();
2022-04-23 22:45:57 -05:00
2022-10-25 22:12:11 -05:00
// 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
2022-10-30 23:24:45 -06:00
if (!id_institucion_infraccion && !retraso)
2022-06-28 21:37:53 -05:00
throw new ConflictException(
2022-10-25 22:12:11 -05:00
'No se mandó ningún motivo para multar a este alumno.',
);
// Si hay retraso lo agrego a la multa
if (retraso) {
nuevaMulta.retraso = true;
2022-11-06 23:01:12 -06:00
fecha_fin.add(retraso * modulo.institucion.dias_multa_retraso, 'd');
2022-10-05 04:58:49 -05:00
}
2022-10-25 22:12:11 -05:00
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 institucionInfraccion =
await this.institucionInfraccionService.findById(
id_institucion_infraccion,
);
const fecha_fin = moment();
2022-12-19 11:29:36 -06:00
// Validamos que este prestamo le pertenezca al operador
2022-10-25 22:12:11 -05:00
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');
2022-10-25 16:45:38 -05:00
// Busco una multa con este préstamo
2022-10-25 22:12:11 -05:00
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,
}),
),
)
2022-10-05 04:58:49 -05:00
.then((_) =>
2022-10-25 16:45:38 -05:00
// Actualizo multas del usuario
2022-10-16 13:55:08 -05:00
this.institucionUsuarioService.updateMulta(
operador.institucion.id_institucion,
2022-10-05 04:58:49 -05:00
prestamo.usuario.id_usuario,
2022-10-16 13:55:08 -05:00
true,
2022-10-05 04:58:49 -05:00
),
2022-10-16 13:55:08 -05:00
);
2022-04-23 22:45:57 -05:00
}
2022-06-28 21:37:53 -05:00
desactivarMultas() {
const ahora = moment();
2022-10-26 20:57:56 -05:00
// Busco todas las multas activas
return this.informacionMultaView
.find({ where: { activo: 1 } })
.then(async (infoMultas) => {
// recorro todo el array
for (let i = 0; i < infoMultas.length; i++)
2022-10-25 22:12:11 -05:00
// Si ya caducó
2022-10-26 20:57:56 -05:00
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,
),
);
2022-06-28 21:37:53 -05:00
}
2022-08-23 17:12:09 -05:00
});
2022-06-28 21:37:53 -05:00
}
2022-10-25 22:12:11 -05:00
findAll(
2022-10-26 01:58:06 -05:00
operador: Operador,
2022-10-25 22:12:11 -05:00
filtros: {
pagina: string;
nombre?: string;
usuario?: string;
},
) {
2022-10-05 04:58:49 -05:00
const busqueda: FindOptionsWhere<FullInformacionMultaView> = {};
2022-10-25 22:12:11 -05:00
if (filtros.nombre) busqueda.nombre = Like(`%${filtros.nombre}%`);
2022-10-05 04:58:49 -05:00
if (filtros.usuario) busqueda.usuario = Like(`%${filtros.usuario}%`);
2022-10-25 22:12:11 -05:00
if (operador) busqueda.id_institucion = operador.institucion.id_institucion;
2022-10-05 04:58:49 -05:00
return this.fullInformacionMultaView
.findAndCount({
where: busqueda,
order: {
institucion: 'ASC',
activo: 'DESC',
2022-10-26 20:57:56 -05:00
fecha_fin: 'ASC',
2022-10-05 04:58:49 -05:00
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]];
2022-06-28 21:37:53 -05:00
});
2022-06-02 10:42:53 -05:00
}
2022-10-25 22:12:11 -05:00
findAllByIdEquipo(operador: Operador, id_equipo: number, pagina: number) {
2022-10-23 21:57:29 -05:00
return this.equipoService.findById(id_equipo).then((equipo) =>
2022-10-05 04:58:49 -05:00
this.fullInformacionMultaView
.findAndCount({
2022-10-25 22:12:11 -05:00
where: {
id_equipo: equipo.id_equipo,
id_institucion: operador.institucion.id_institucion,
},
2022-10-05 04:58:49 -05:00
skip: (pagina - 1) * 25,
take: 25,
2022-06-28 21:37:53 -05:00
})
2022-10-05 04:58:49 -05:00
.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]];
}),
2022-06-02 10:42:53 -05:00
);
}
2022-04-23 22:45:57 -05:00
2022-10-25 22:12:11 -05:00
findAllByIdUsuario(operador: Operador, id_usuario: number, pagina: number) {
2022-10-24 18:15:09 -05:00
return this.usuarioService.findById(id_usuario).then((usuario) =>
2022-10-05 04:58:49 -05:00
this.fullInformacionMultaView
.findAndCount({
2022-10-25 22:12:11 -05:00
where: {
id_usuario: usuario.id_usuario,
id_institucion: operador.institucion.id_institucion,
},
2022-10-05 04:58:49 -05:00
skip: (pagina - 1) * 25,
take: 25,
2022-06-28 21:37:53 -05:00
})
2022-10-05 04:58:49 -05:00
.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]];
}),
2022-06-02 10:42:53 -05:00
);
}
2022-06-16 08:02:37 -05:00
2022-10-25 22:12:11 -05:00
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();
2022-10-05 04:58:49 -05:00
}
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,
},
},
});
2022-06-16 08:02:37 -05:00
}
2022-07-05 21:53:47 -05:00
2022-10-25 22:12:11 -05:00
private validacionMultaCancelacion(prestamo: Prestamo) {
2022-12-19 11:29:36 -06:00
// Validamos que este prestamo no haya sido cancelado poer el usuario u operador
2022-10-25 22:12:11 -05:00
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) {
2022-10-16 22:45:31 -05:00
const institucionUsuario = await this.institucionUsuarioService.findById(
id_institucion_usuario,
);
2022-10-25 22:12:11 -05:00
const multa = await this.repository
2022-07-05 21:53:47 -05:00
.createQueryBuilder('mu')
2022-10-25 22:12:11 -05:00
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.usuario', 'u')
2022-07-05 21:53:47 -05:00
.innerJoin(
'u.instituciones',
'is',
'is.id_institucion_usuario = :id_institucion_usuario',
2022-08-22 11:26:14 -05:00
{ id_institucion_usuario: institucionUsuario.id_institucion_usuario },
2022-07-05 21:53:47 -05:00
)
2022-09-08 17:57:52 -05:00
.where('mu.activo = 1')
2022-10-25 22:12:11 -05:00
.getOne();
await this.institucionUsuarioService.updateMulta(
admin.institucion.id_institucion,
2022-11-22 23:19:20 -06:00
institucionUsuario.usuario.id_usuario,
false,
);
2022-10-25 22:12:11 -05:00
if (!multa)
throw new ConflictException(
'Este usuario no tiene una multa activa en esta institución.',
);
multa.activo = false;
return this.repository
.save(multa)
2022-07-05 21:53:47 -05:00
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
2022-04-04 20:53:32 -05:00
}