multa reparado

This commit is contained in:
xXpuma99Xx
2022-10-05 04:58:49 -05:00
parent b34eb420e3
commit 0074bd1ddc
11 changed files with 204 additions and 142 deletions
+4 -4
View File
@@ -10,14 +10,14 @@ import { Socket, Server } from 'socket.io';
@WebSocketGateway({
cors: {
origin: [
// 'http://localhost:3176',
// 'http://localhost:3186',
'http://localhost:3176',
'http://localhost:3186',
// 'http://132.248.80.196:3155',
// 'http://132.248.80.196:3185',
// 'https://pmodulospcpuma.unam.mx',
// 'https://pmodulospcpuma.unam.mx:3015',
'https://modulospcpuma.unam.mx',
'https://modulospcpuma.unam.mx:3015',
// 'https://modulospcpuma.unam.mx',
// 'https://modulospcpuma.unam.mx:3015',
],
},
})
+20 -14
View File
@@ -318,6 +318,7 @@ export class EquipoService {
findInfoEquipoByNumeroInventario(
institucion: Institucion,
numero_inventario: string,
validarNoExiste = true,
) {
return this.informacionEquipoView
.findOne({
@@ -327,20 +328,22 @@ export class EquipoService {
},
})
.then((infoEquipo) => {
if (!infoEquipo)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
);
if (!infoEquipo) {
if (validarNoExiste)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
);
return null;
}
return this.viewToEquipo(infoEquipo);
});
}
async findInfoEquipoByEquipo(id_carrito: number | Carrito, equipo: string) {
const carrito =
typeof id_carrito === 'number'
? await this.carritoService.findInfoCarritoById(id_carrito)
: id_carrito;
async findInfoEquipoByEquipo(
carrito: Carrito,
equipo: string,
validarNoExiste = true,
) {
return this.informacionEquipoView
.findOne({
where: {
@@ -349,10 +352,13 @@ export class EquipoService {
},
})
.then((infoEquipo) => {
if (!infoEquipo)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
);
if (!infoEquipo) {
if (validarNoExiste)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
);
return null;
}
return this.viewToEquipo(infoEquipo);
});
}
@@ -9,6 +9,7 @@ import { Infraccion } from './entity/infraccion.entity';
import { InstitucionInfraccion } from './entity/institucion-infraccion.entity';
import { Operador } from '../operador/entity/operador.entity';
import { InstitucionService } from '../institucion/institucion.service';
import { Institucion } from 'src/institucion/entity/institucion.entity';
@Injectable()
export class InstitucionInfraccionService {
@@ -87,6 +88,17 @@ export class InstitucionInfraccionService {
});
}
findSinInfraccion(institucion: Institucion) {
return this.institucionInfraccionRepository
.createQueryBuilder('ii')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('ii.institucion', 'i')
.where('i.id_institucion = :id_institucion && inf.id_infraccion = 1', {
id_institucion: institucion.id_institucion,
})
.getOne();
}
update(admin: Operador, attrs: Partial<InstitucionInfraccion>) {
return this.findById(attrs.id_institucion_infraccion)
.then((institucionInfraccion) => {
@@ -21,6 +21,16 @@ export class InstitucionUsuarioService {
}));
}
findAllByIdUsuario(id_usuario: number) {
return this.repository.find({
join: {
alias: 'iu',
innerJoinAndSelect: { ic: 'iu.institucionCarrera' },
},
where: { usuario: { id_usuario } },
});
}
findById(id_institucion_usuario: number) {
return this.repository
.findOne({ where: { id_institucion_usuario } })
+1
View File
@@ -53,6 +53,7 @@ export class InstitucionService {
'responsable',
],
where: busqueda,
order: { institucion: 'ASC' },
});
}
@@ -23,6 +23,7 @@ import { Usuario } from '../../../usuario/entity/usuario.entity';
.addSelect('ii.id_infraccion', 'id_infraccion')
.addSelect('om.id_institucion', 'id_institucion')
.addSelect('om.operador', 'operador')
.addSelect('p.id_equipo', 'id_equipo')
.addSelect('p.id_usuario', 'id_usuario')
.addSelect('inf.infraccion', 'infraccion')
.addSelect('i.institucion', 'institucion')
@@ -45,7 +46,7 @@ export class FullInformacionMultaView {
id_multa: number;
@ViewColumn()
activo: boolean;
activo: number;
@ViewColumn()
descripcion: string;
@@ -56,6 +57,9 @@ export class FullInformacionMultaView {
@ViewColumn()
fecha_inicio: Date;
@ViewColumn()
id_equipo: number;
@ViewColumn()
id_institucion: number;
@@ -87,7 +91,7 @@ export class FullInformacionMultaView {
operador: string;
@ViewColumn()
retraso: boolean;
retraso: number;
@ViewColumn()
usuario: string;
+1 -1
View File
@@ -98,7 +98,7 @@ export class MultaController {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.findAll(query);
return this.multaService.findFullInfoMultaAll(query);
}
@Serealize(MultasEquipoOutputDto)
+115 -93
View File
@@ -1,9 +1,10 @@
import * as moment from 'moment';
import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { InstitucionInfraccion } from '../institucion-infraccion/entity/institucion-infraccion.entity';
import { DeepPartial, FindOptionsWhere, 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';
import { Operador } from '../operador/entity/operador.entity';
import { Prestamo } from '../prestamo/entity/prestamo.entity';
import { EquipoService } from '../equipo/equipo.service';
@@ -18,6 +19,10 @@ import { UsuarioService } from '../usuario/usuario.service';
export class MultaService {
constructor(
@InjectRepository(Multa) private repository: Repository<Multa>,
@InjectRepository(FullInformacionMultaView)
private fullInformacionMultaView: Repository<FullInformacionMultaView>,
@InjectRepository(InformacionMultaView)
private informacionMultaView: Repository<InformacionMultaView>,
private equipoService: EquipoService,
private institucionService: InstitucionService,
private institucionInfraccionService: InstitucionInfraccionService,
@@ -43,21 +48,13 @@ export class MultaService {
typeof id_operador === 'number'
? await this.operadorService.findById(id_operador)
: id_operador;
const data: {
descripcion: string;
fecha_inicio: Date;
operadorMulta: Operador;
prestamo: Prestamo;
fecha_fin?: Date;
institucionInfraccion?: InstitucionInfraccion;
retraso?: boolean;
} = {
const data: DeepPartial<Multa> = {
descripcion,
fecha_inicio: ahora.toDate(),
operadorMulta: operador,
prestamo,
};
const institucionInfraccion = id_institucion_infraccion
let institucionInfraccion = id_institucion_infraccion
? await this.institucionInfraccionService.findById(
id_institucion_infraccion,
)
@@ -67,10 +64,16 @@ export class MultaService {
throw new ConflictException(
'No se puede multar a un usuario con un préstamo que fue cancelado.',
);
if (!retraso && !institucionInfraccion)
throw new ConflictException(
'No se mandó ningún motivo para multar a este alumno.',
);
if (!institucionInfraccion) {
if (!retraso)
throw new ConflictException(
'No se mandó ningún motivo para multar a este alumno.',
);
institucionInfraccion =
await this.institucionInfraccionService.findSinInfraccion(
operador.institucion,
);
}
return this.repository
.findOne({ where: { prestamo } })
.then((existeMulta) => {
@@ -89,16 +92,19 @@ export class MultaService {
data.fecha_fin = ahora.toDate();
return this.repository.save(this.repository.create(data));
})
.then((_) => {
for (let i = 0; prestamo.usuario.instituciones.length; i++) {
const institucionUsuario = prestamo.usuario.instituciones[i];
.then((_) =>
this.institucionUsuarioService.findAllByIdUsuario(
prestamo.usuario.id_usuario,
),
)
.then(async (instituciones) => {
for (let i = 0; i < instituciones.length; i++) {
if (
institucionUsuario.institucionCarrera.institucion.id_institucion ===
instituciones[i].institucionCarrera.institucion.id_institucion ===
operador.institucion.id_institucion
) {
institucionUsuario.multa = true;
return this.institucionUsuarioService.update(institucionUsuario);
instituciones[i].multa = true;
await this.institucionUsuarioService.update(instituciones[i]);
}
}
});
@@ -132,7 +138,7 @@ export class MultaService {
});
}
async findAll(filtros: {
async findFullInfoMultaAll(filtros: {
pagina: string;
id_institucion?: string;
usuario?: string;
@@ -142,88 +148,70 @@ export class MultaService {
parseInt(filtros.id_institucion),
)
: null;
const query = this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('mu.operadorMulta', 'om')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('m.institucion', 'i')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.orderBy('i.institucion')
.addOrderBy('mu.activo', 'DESC')
.addOrderBy('mu.id_multa', 'DESC')
.addOrderBy('u.usuario')
.skip((parseInt(filtros.pagina) - 1) * 25)
.take(25);
const busqueda: FindOptionsWhere<FullInformacionMultaView> = {};
if (filtros.usuario)
query.andWhere('u.usuario LIKE :usuario', {
usuario: `%${filtros.usuario}%`,
if (filtros.usuario) busqueda.usuario = Like(`%${filtros.usuario}%`);
if (institucion) busqueda.id_institucion = institucion.id_institucion;
return this.fullInformacionMultaView
.findAndCount({
where: busqueda,
order: {
institucion: 'ASC',
activo: 'DESC',
id_multa: 'DESC',
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]];
});
if (institucion)
query.andWhere('i.id_institucion = :id_institucion', {
id_institucion: institucion.id_institucion,
});
return query.getManyAndCount();
}
findAllByIdEquipo(id_equipo: number, pagina: number) {
return this.equipoService.findInfoEquipoById(id_equipo).then((equipo) =>
this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('mu.operadorMulta', 'om')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('ii.institucion', 'i')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', {
id_equipo: equipo.id_equipo,
this.fullInformacionMultaView
.findAndCount({
where: { id_equipo: equipo.id_equipo },
skip: (pagina - 1) * 25,
take: 25,
})
.innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25)
.take(25)
.getManyAndCount(),
.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]];
}),
);
}
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
this.repository
.createQueryBuilder('mu')
.innerJoinAndSelect('mu.institucionInfraccion', 'ii')
.innerJoinAndSelect('mu.operadorMulta', 'om')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('ii.infraccion', 'inf')
.innerJoinAndSelect('ii.institucion', 'i')
.innerJoinAndSelect('om.tipoUsuario', 'tu')
.innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', {
id_usuario: usuario.id_usuario,
this.fullInformacionMultaView
.findAndCount({
where: { id_usuario: usuario.id_usuario },
skip: (pagina - 1) * 25,
take: 25,
})
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('m.institucion', 'in')
.orderBy('mu.id_multa', 'DESC')
.skip((pagina - 1) * 25)
.take(25)
.getManyAndCount(),
.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]];
}),
);
}
@@ -242,6 +230,40 @@ export class MultaService {
);
}
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,
},
},
});
}
async quitarMulta(id_institucion_usuario: number) {
const institucionUsuario = await this.institucionUsuarioService.findById(
id_institucion_usuario,
+27 -27
View File
@@ -157,34 +157,34 @@ export class PrestamoService {
)
: null;
if (ahora.weekday() === 0)
throw new ConflictException('No hay servicio los días domingo.');
this.validarInstitucionUsuario(usuario.instituciones, modulo);
if (!institucionDia.activo)
throw new ConflictException(
'El día de hoy no hay servicio de préstamo de equipos.',
);
if (ahora < horaMin)
throw new ConflictException(
`El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`,
);
if (ahora >= horaExtra)
throw new ConflictException(
`El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`,
);
for (let i = 0; i < institucionDia.horasExcepcion.length; i++) {
const horaFin = moment(
`${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`,
);
const horaInicio = moment(
`${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`,
);
// if (ahora.weekday() === 0)
// throw new ConflictException('No hay servicio los días domingo.');
// this.validarInstitucionUsuario(usuario.instituciones, modulo);
// if (!institucionDia.activo)
// throw new ConflictException(
// 'El día de hoy no hay servicio de préstamo de equipos.',
// );
// if (ahora < horaMin)
// throw new ConflictException(
// `El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`,
// );
// if (ahora >= horaExtra)
// throw new ConflictException(
// `El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`,
// );
// for (let i = 0; i < institucionDia.horasExcepcion.length; i++) {
// const horaFin = moment(
// `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`,
// );
// const horaInicio = moment(
// `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`,
// );
if (ahora > horaInicio && ahora < horaFin)
throw new ConflictException(
`Se suspendió temporalmente el servicio de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`,
);
}
// if (ahora > horaInicio && ahora < horaFin)
// throw new ConflictException(
// `Se suspendió temporalmente el servicio de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`,
// );
// }
return this.informacionPrestamoView
.findOne({ where: { activo: 1, id_usuario: usuario.id_usuario } })
.then((existePrestamo) => {
+2
View File
@@ -217,6 +217,7 @@ export class UploadFileService {
? await this.equipoService.findInfoEquipoByEquipo(
carrito,
dataEquipo.equipo,
false,
)
: null;
@@ -251,6 +252,7 @@ export class UploadFileService {
equipo = await this.equipoService.findInfoEquipoByNumeroInventario(
institucion,
dataEquipo.numero_inventario,
false,
);
if (equipo) {
errores.push(
+6 -1
View File
@@ -261,7 +261,12 @@ export class UsuarioService {
throw new ConflictException(
'Tu institución no te asignó un correo institucional, dirigete al módulo ',
);
message = `Se creó correctamente tu cuenta, mandamos un correo al email: ${usuario.correo} con tus credenciales para acceder a este servicio.`;
const arrobaIndex = usuario.correo.indexOf('@');
message = `Se creó correctamente tu cuenta, mandamos un correo a ...${usuario.correo.slice(
arrobaIndex - 3,
)} con tus credenciales para acceder a este servicio.`;
usuario.telefono = telefono;
usuario.password = this.bcryptService.encriptar(password);
return this.repository.save(usuario);