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

232 lines
8.4 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-06-28 21:37:53 -05:00
import { Repository } from 'typeorm';
2022-04-23 22:45:57 -05:00
import { InstitucionInfraccion } from '../institucion-infraccion/entity/institucion-infraccion.entity';
2022-04-17 22:11:55 -05:00
import { Multa } from './entity/multa.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-04-24 12:00:56 -05:00
import { EquipoService } from '../equipo/equipo.service';
2022-06-02 10:42:53 -05:00
import { InstitucionService } from '../institucion/institucion.service';
2022-04-24 12:00:56 -05:00
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-04-24 12:00:56 -05:00
import { OperadorService } from '../operador/operador.service';
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>,
private equipoService: EquipoService,
2022-06-02 10:42:53 -05:00
private institucionService: InstitucionService,
private institucionInfraccionService: InstitucionInfraccionService,
2022-06-27 16:35:36 -05:00
private institucionUsuarioService: InstitucionUsuarioService,
2022-04-23 22:45:57 -05:00
private operadorService: OperadorService,
private prestamoService: PrestamoService,
private usuarioService: UsuarioService,
) {}
async create(
2022-06-14 20:57:28 -05:00
id_prestamo: number | Prestamo,
id_operador: number | Operador,
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-06-14 16:49:10 -05:00
const ahora = moment();
2022-06-14 20:57:28 -05:00
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;
2022-06-14 16:49:10 -05:00
const data: {
2022-06-14 20:57:28 -05:00
descripcion: string;
2022-06-14 16:49:10 -05:00
fecha_inicio: Date;
2022-06-14 21:43:07 -05:00
opeardorMulta: Operador;
2022-06-14 20:57:28 -05:00
prestamo: Prestamo;
fecha_fin?: Date;
2022-06-14 16:49:10 -05:00
institucionInfraccion?: InstitucionInfraccion;
retraso?: boolean;
2022-06-14 21:43:07 -05:00
} = {
descripcion,
fecha_inicio: ahora.toDate(),
opeardorMulta: operador,
prestamo,
};
2022-04-23 22:45:57 -05:00
const institucionInfraccion = id_institucion_infraccion
2022-06-02 10:42:53 -05:00
? await this.institucionInfraccionService.findById(
2022-04-23 22:45:57 -05:00
id_institucion_infraccion,
)
: null;
2022-06-28 21:37:53 -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.',
);
2022-06-14 16:49:10 -05:00
if (!retraso && !institucionInfraccion)
throw new ConflictException(
'No se mandó ningún motivo para multar a este alumno.',
);
2022-06-14 21:43:07 -05:00
return this.repository
.findOne({ prestamo })
.then((existeMulta) => {
if (existeMulta)
throw new ConflictException(
2022-06-27 16:35:36 -05:00
'Ya existe una multa asignada a este préstamo.',
2022-06-14 21:43:07 -05:00
);
if (retraso) {
data.retraso = true;
ahora.add(retraso * operador.institucion.dias_multa_retraso, 'd');
}
if (institucionInfraccion) {
data.institucionInfraccion = institucionInfraccion;
ahora.add(institucionInfraccion.dias_multa, 'd');
}
data.fecha_fin = ahora.toDate();
return this.repository.save(this.repository.create(data));
})
.then((_) => {
2022-06-28 21:37:53 -05:00
for (let i = 0; prestamo.usuario.instituciones.length; i++) {
const institucionUsuario = prestamo.usuario.instituciones[i];
2022-06-27 16:35:36 -05:00
if (
2022-06-28 21:37:53 -05:00
institucionUsuario.institucionCarrera.institucion.id_institucion ===
operador.institucion.id_institucion
2022-06-27 16:35:36 -05:00
) {
2022-06-28 21:37:53 -05:00
institucionUsuario.multa = true;
return this.institucionUsuarioService.update(institucionUsuario);
2022-06-27 16:35:36 -05:00
}
2022-06-28 21:37:53 -05:00
}
2022-06-14 21:43:07 -05:00
});
2022-04-23 22:45:57 -05:00
}
2022-06-28 21:37:53 -05:00
desactivarMultas() {
const ahora = moment();
return this.repository.find({ activo: true }).then(async (multas) => {
for (let i = 0; i < multas.length; i++)
if (ahora.diff(moment(multas[i].fecha_fin)) > 0) {
const instituciones = multas[i].prestamo.usuario.instituciones;
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].opeardorMulta.institucion.id_institucion
) {
institucionUsuario.multa = false;
await this.institucionUsuarioService.update(institucionUsuario);
}
}
}
});
}
2022-06-14 16:49:10 -05:00
async findAll(filtros: {
pagina: string;
id_institucion?: string;
usuario?: string;
}) {
2022-06-28 21:37:53 -05:00
const query = this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('ii.infraccion', 'in')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('i.institucion')
.addOrderBy('u.usuario')
.addOrderBy('mu.id_multa', 'DESC')
.skip((parseInt(filtros.pagina) - 1) * 25)
.take(25);
2022-06-14 16:49:10 -05:00
const institucion = filtros.id_institucion
? await this.institucionService.findById(parseInt(filtros.id_institucion))
: null;
if (filtros.usuario)
2022-06-28 21:37:53 -05:00
query.andWhere('u.usuario LIKE :usuario', {
usuario: `%${filtros.usuario}%`,
});
2022-06-14 16:49:10 -05:00
if (institucion)
2022-06-28 21:37:53 -05:00
query.andWhere('i.id_institucion :id_institucion', {
id_institucion: institucion.id_institucion,
});
return query.getManyAndCount();
2022-06-02 10:42:53 -05:00
}
findAllByIdEquipo(id_equipo: number, pagina: number) {
return this.equipoService.findById(id_equipo).then((equipo) =>
2022-06-28 21:37:53 -05:00
this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('ii.infraccion', 'in')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', {
id_equipo: equipo.id_equipo,
})
.innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ca.nivel', 'n')
.orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25)
.take(25),
2022-06-02 10:42:53 -05:00
);
}
2022-04-23 22:45:57 -05:00
2022-06-02 10:42:53 -05:00
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
2022-06-28 21:37:53 -05:00
this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('ii.infraccion', 'in')
.innerJoinAndSelect('mu.opeardorMulta', 'om')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', {
id_usuario: usuario.id_usuario,
})
.orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25)
.take(25),
2022-06-02 10:42:53 -05:00
);
}
2022-06-16 08:02:37 -05:00
2022-06-28 21:37:53 -05:00
findMultasActivas(id_usuario: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
this.repository.find({
join: { alias: 'mu', innerJoin: { p: 'mu.prestamo' } },
where: { activo: true, prestamo: { usuario } },
}),
);
2022-06-16 08:02:37 -05:00
}
2022-04-04 20:53:32 -05:00
}