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-09-08 17:57:52 -05:00
|
|
|
operadorMulta: 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(),
|
2022-09-08 17:57:52 -05:00
|
|
|
operadorMulta: operador,
|
2022-06-14 21:43:07 -05:00
|
|
|
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
|
2022-08-23 17:12:09 -05:00
|
|
|
.findOne({ where: { prestamo } })
|
2022-06-14 21:43:07 -05:00
|
|
|
.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();
|
|
|
|
|
|
2022-08-23 17:12:09 -05:00
|
|
|
return this.repository
|
|
|
|
|
.find({ where: { 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;
|
2022-06-28 21:37:53 -05:00
|
|
|
|
2022-08-23 17:12:09 -05:00
|
|
|
multas[i].activo = false;
|
|
|
|
|
await this.repository.save(multas[i]);
|
|
|
|
|
for (let j = 0; j < instituciones.length; j++) {
|
|
|
|
|
const institucionUsuario = instituciones[j];
|
2022-06-28 21:37:53 -05:00
|
|
|
|
2022-08-23 17:12:09 -05:00
|
|
|
if (
|
|
|
|
|
institucionUsuario.institucionCarrera.institucion
|
|
|
|
|
.id_institucion ===
|
2022-09-08 17:57:52 -05:00
|
|
|
multas[i].operadorMulta.institucion.id_institucion
|
2022-08-23 17:12:09 -05:00
|
|
|
) {
|
|
|
|
|
institucionUsuario.multa = false;
|
|
|
|
|
await this.institucionUsuarioService.update(institucionUsuario);
|
|
|
|
|
}
|
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-06-14 16:49:10 -05:00
|
|
|
async findAll(filtros: {
|
|
|
|
|
pagina: string;
|
|
|
|
|
id_institucion?: string;
|
|
|
|
|
usuario?: string;
|
|
|
|
|
}) {
|
2022-07-24 22:35:00 -05:00
|
|
|
const institucion = filtros.id_institucion
|
2022-09-25 23:27:25 -05:00
|
|
|
? await this.institucionService.findInfoInstitucionById(
|
|
|
|
|
parseInt(filtros.id_institucion),
|
|
|
|
|
)
|
2022-07-24 22:35:00 -05:00
|
|
|
: null;
|
2022-06-28 21:37:53 -05:00
|
|
|
const query = this.repository
|
|
|
|
|
.createQueryBuilder('mu')
|
|
|
|
|
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
|
2022-09-08 17:57:52 -05:00
|
|
|
.innerJoinAndSelect('mu.operadorMulta', 'om')
|
2022-06-28 21:37:53 -05:00
|
|
|
.innerJoinAndSelect('mu.prestamo', 'p')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('ii.infraccion', 'inf')
|
|
|
|
|
.innerJoinAndSelect('om.tipoUsuario', 'tu')
|
2022-06-28 21:37:53 -05:00
|
|
|
.innerJoinAndSelect('p.equipo', 'e')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('p.usuario', 'u')
|
2022-06-28 21:37:53 -05:00
|
|
|
.innerJoinAndSelect('e.carrito', 'c')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('u.instituciones', 'is')
|
2022-06-28 21:37:53 -05:00
|
|
|
.innerJoinAndSelect('c.modulo', 'm')
|
|
|
|
|
.innerJoinAndSelect('c.tipoCarrito', 'tc')
|
|
|
|
|
.innerJoinAndSelect('is.institucionCarrera', 'ic')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('m.institucion', 'i')
|
2022-06-28 21:37:53 -05:00
|
|
|
.innerJoinAndSelect('ic.carrera', 'ca')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('ic.institucion', 'in')
|
2022-06-28 21:37:53 -05:00
|
|
|
.orderBy('i.institucion')
|
2022-09-05 17:38:18 -05:00
|
|
|
.addOrderBy('mu.activo', 'DESC')
|
2022-06-28 21:37:53 -05:00
|
|
|
.addOrderBy('mu.id_multa', 'DESC')
|
2022-09-05 17:38:18 -05:00
|
|
|
.addOrderBy('u.usuario')
|
2022-06-28 21:37:53 -05:00
|
|
|
.skip((parseInt(filtros.pagina) - 1) * 25)
|
|
|
|
|
.take(25);
|
2022-06-14 16:49:10 -05:00
|
|
|
|
|
|
|
|
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-07-10 22:17:32 -05:00
|
|
|
query.andWhere('i.id_institucion = :id_institucion', {
|
2022-06-28 21:37:53 -05:00
|
|
|
id_institucion: institucion.id_institucion,
|
|
|
|
|
});
|
|
|
|
|
return query.getManyAndCount();
|
2022-06-02 10:42:53 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
findAllByIdEquipo(id_equipo: number, pagina: number) {
|
2022-10-04 23:17:41 -05:00
|
|
|
return this.equipoService.findInfoEquipoById(id_equipo).then((equipo) =>
|
2022-06-28 21:37:53 -05:00
|
|
|
this.repository
|
|
|
|
|
.createQueryBuilder('mu')
|
|
|
|
|
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
|
2022-09-08 17:57:52 -05:00
|
|
|
.innerJoinAndSelect('mu.operadorMulta', 'om')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('mu.prestamo', 'p')
|
2022-07-01 16:49:56 -05:00
|
|
|
.innerJoinAndSelect('ii.infraccion', 'inf')
|
|
|
|
|
.innerJoinAndSelect('ii.institucion', 'i')
|
2022-06-28 21:37:53 -05:00
|
|
|
.innerJoinAndSelect('om.tipoUsuario', 'tu')
|
|
|
|
|
.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.carrera', 'ca')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('ic.institucion', 'in')
|
2022-06-28 21:37:53 -05:00
|
|
|
.orderBy('mu.id_multa', 'DESC')
|
|
|
|
|
.skip((pagina - 1) * 25)
|
2022-07-01 16:49:56 -05:00
|
|
|
.take(25)
|
|
|
|
|
.getManyAndCount(),
|
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')
|
2022-09-08 17:57:52 -05:00
|
|
|
.innerJoinAndSelect('mu.operadorMulta', 'om')
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('mu.prestamo', 'p')
|
2022-07-01 16:49:56 -05:00
|
|
|
.innerJoinAndSelect('ii.infraccion', 'inf')
|
|
|
|
|
.innerJoinAndSelect('ii.institucion', 'i')
|
2022-06-28 21:37:53 -05:00
|
|
|
.innerJoinAndSelect('om.tipoUsuario', 'tu')
|
|
|
|
|
.innerJoinAndSelect('p.equipo', 'e')
|
|
|
|
|
.innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', {
|
|
|
|
|
id_usuario: usuario.id_usuario,
|
|
|
|
|
})
|
2022-07-05 21:53:47 -05:00
|
|
|
.innerJoinAndSelect('e.carrito', 'c')
|
|
|
|
|
.innerJoinAndSelect('c.modulo', 'm')
|
|
|
|
|
.innerJoinAndSelect('c.tipoCarrito', 'tc')
|
|
|
|
|
.innerJoinAndSelect('m.institucion', 'in')
|
2022-06-28 21:37:53 -05:00
|
|
|
.orderBy('mu.id_multa', 'DESC')
|
|
|
|
|
.skip((pagina - 1) * 25)
|
2022-07-01 16:49:56 -05:00
|
|
|
.take(25)
|
|
|
|
|
.getManyAndCount(),
|
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) =>
|
2022-07-01 16:49:56 -05:00
|
|
|
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-06-28 21:37:53 -05:00
|
|
|
);
|
2022-06-16 08:02:37 -05:00
|
|
|
}
|
2022-07-05 21:53:47 -05:00
|
|
|
|
|
|
|
|
async quitarMulta(id_institucion_usuario: number) {
|
|
|
|
|
const institucionUsuario = await this.institucionUsuarioService.findById(
|
|
|
|
|
id_institucion_usuario,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return this.repository
|
|
|
|
|
.createQueryBuilder('mu')
|
|
|
|
|
.innerJoin('mu.prestamo', 'p')
|
|
|
|
|
.innerJoin('p.usuario', 'u')
|
|
|
|
|
.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-07-05 21:53:47 -05:00
|
|
|
.getOne()
|
|
|
|
|
.then((multa) => {
|
|
|
|
|
if (!multa)
|
|
|
|
|
throw new ConflictException(
|
|
|
|
|
'Este usuario no tiene una multa activa en esta institución.',
|
|
|
|
|
);
|
|
|
|
|
multa.activo = false;
|
|
|
|
|
institucionUsuario.multa = false;
|
|
|
|
|
return this.repository.save(multa);
|
|
|
|
|
})
|
|
|
|
|
.then((_) => this.institucionUsuarioService.update(institucionUsuario))
|
|
|
|
|
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
|
|
|
|
|
}
|
2022-04-04 20:53:32 -05:00
|
|
|
}
|