listo multa

This commit is contained in:
xXpuma99Xx 2022-10-25 22:12:11 -05:00
parent 9b5665b3e4
commit 18c899267a
7 changed files with 207 additions and 160 deletions

View File

@ -1,6 +0,0 @@
import { IsNumberString } from 'class-validator';
export class IdUsuarioDto {
@IsNumberString()
id_usuario: string;
}

View File

@ -194,6 +194,7 @@ export class InstitucionUsuarioService {
institucionesUsuario[i].multa = status;
await this.repository.save(institucionesUsuario[i]);
}
return { message: 'Se multó correctamente a este usuario' };
});
}

View File

@ -9,12 +9,13 @@ export class MultasDto {
@IsNumberString()
pagina: string;
@IsNumberString()
@IsOptional()
id_institucion?: string;
@IsString()
@IsNotEmpty()
@IsOptional()
usuario?: string;
@IsString()
@IsNotEmpty()
@IsOptional()
nombre?: string;
}

View File

@ -21,7 +21,6 @@ import { MultaService } from './multa.service';
import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service';
import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { IdUsuarioDto } from '../dto/input/id-usuario.dto';
import { IdEquipoPaginaDto } from '../dto/input/id-equipo-pagina.dto';
import { MultarDto } from './dto/input/multar.dto';
import { MultasDto } from './dto/input/multas.dto';
@ -62,11 +61,10 @@ export class MultaController {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.create(
body.id_prestamo,
return this.multaService.multaExtemporanea(
operador,
body.id_prestamo,
body.descripcion,
null,
body.id_institucion_infraccion,
);
}
@ -100,7 +98,7 @@ export class MultaController {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.findFullInfoMultaAll(query);
return this.multaService.findAll(query);
}
@Serealize(MultasEquipoOutputDto)
@ -125,6 +123,7 @@ export class MultaController {
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.findAllByIdEquipo(
operador,
parseInt(query.id_equipo),
parseInt(query.pagina),
);
@ -152,6 +151,7 @@ export class MultaController {
this.validarUsuarioService.validarAdminOperador(operador);
return this.multaService.findAllByIdUsuario(
operador,
parseInt(query.id_usuario),
parseInt(query.pagina),
);
@ -170,11 +170,11 @@ export class MultaController {
name: 'id_usuario',
type: 'string',
})
multasActivas(@Request() req, @Query() query: IdUsuarioDto) {
multasActivas(@Request() req) {
const usuario: Usuario = req.user.usuario;
this.validarUsuarioService.validarUsuario(usuario);
return this.multaService.findMultasActivas(parseInt(query.id_usuario));
return this.multaService.findMultasActivas(usuario);
}
@Serealize(MessageOutputDto)
@ -193,7 +193,7 @@ export class MultaController {
const admin: Operador = req.user.operador;
this.validarUsuarioService.validarAdmin(admin);
return this.multaService.quitarMulta(body.id_institucion_usuario);
return this.multaService.quitarMulta(admin, body.id_institucion_usuario);
}
// @Get('reporte')

View File

@ -7,10 +7,8 @@ import { Multa } from './entity/multa.entity';
import { FullInformacionMultaView } from './entity/views/full-informacion-multa.view';
import { InformacionMultaView } from './entity/views/informacion-multa.view';
import { EquipoModule } from '../equipo/equipo.module';
import { InstitucionModule } from '../institucion/institucion.module';
import { InstitucionInfraccionModule } from '../institucion-infraccion/institucion-infraccion.module';
import { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usuario.module';
import { OperadorModule } from '../operador/operador.module';
import { PrestamoModule } from '../prestamo/prestamo.module';
import { UsuarioModule } from '../usuario/usuario.module';
import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module';
@ -18,12 +16,11 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'
@Module({
imports: [
EquipoModule,
InstitucionModule,
InstitucionInfraccionModule,
InstitucionUsuarioModule,
PassportModule.register({ defaultStrategy: 'jwt' }),
forwardRef(() => PrestamoModule),
OperadorModule,
TypeOrmModule.forFeature([
Multa,
FullInformacionMultaView,

View File

@ -7,11 +7,10 @@ import { FullInformacionMultaView } from './entity/views/full-informacion-multa.
import { InformacionMultaView } from './entity/views/informacion-multa.view';
import { Operador } from '../operador/entity/operador.entity';
import { Prestamo } from '../prestamo/entity/prestamo.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { EquipoService } from '../equipo/equipo.service';
import { InstitucionService } from '../institucion/institucion.service';
import { InstitucionInfraccionService } from '../institucion-infraccion/institucion-infraccion.service';
import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service';
import { OperadorService } from '../operador/operador.service';
import { PrestamoService } from '../prestamo/prestamo.service';
import { UsuarioService } from '../usuario/usuario.service';
@ -24,82 +23,112 @@ export class MultaService {
@InjectRepository(InformacionMultaView)
private informacionMultaView: Repository<InformacionMultaView>,
private equipoService: EquipoService,
private institucionService: InstitucionService,
private institucionInfraccionService: InstitucionInfraccionService,
private institucionUsuarioService: InstitucionUsuarioService,
private operadorService: OperadorService,
private prestamoService: PrestamoService,
private usuarioService: UsuarioService,
) {}
async create(
id_prestamo: number | Prestamo,
id_operador: number | Operador,
operadorMulta: Operador,
prestamo: Prestamo,
descripcion: string,
retraso?: number,
id_institucion_infraccion?: number,
) {
console.log('hola1');
const ahora = moment();
const institucionInfraccion = id_institucion_infraccion
? await this.institucionInfraccionService.findById(
id_institucion_infraccion,
)
: // Asigno institucionInfraccion "Sin multa" por default
await this.institucionInfraccionService.findSinInfraccion(
operadorMulta.institucion,
);
// Creo registro de multa
const nuevaMulta = this.repository.create({
descripcion,
fecha_inicio: moment().toDate(),
operadorMulta,
prestamo,
institucionInfraccion,
});
const existeMulta = await this.findByPrestamo(prestamo).catch((err) => {
if (err) true;
return false;
});
const fecha_fin = moment();
// 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
if (!institucionInfraccion && !retraso)
throw new ConflictException(
'No se mandó ningún motivo para multar a este alumno.',
);
// Si hay retraso lo agrego a la multa
if (retraso) {
nuevaMulta.retraso = true;
fecha_fin.add(
retraso * operadorMulta.institucion.dias_multa_retraso,
'd',
);
}
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 operador =
typeof id_operador === 'number'
? await this.operadorService.findById(id_operador)
: id_operador;
// Creo registro de multa
const nuevaMulta = this.repository.create({
descripcion,
fecha_inicio: ahora.toDate(),
operadorMulta: operador,
prestamo,
});
let institucionInfraccion = id_institucion_infraccion
? await this.institucionInfraccionService.findById(
id_institucion_infraccion,
)
: null;
// Valido que este prestamo no haya sido cancelado poer el usuario u operador
if (prestamo.cancelado_operador || prestamo.cancelado_usuario)
throw new ConflictException(
'No se puede multar a un usuario con un préstamo que fue cancelado.',
const institucionInfraccion =
await this.institucionInfraccionService.findById(
id_institucion_infraccion,
);
// Si no se mando un id_institucion_infraccion
if (!institucionInfraccion) {
// Si tampoco se mando retraso saco error
if (!retraso)
throw new ConflictException(
'No se mandó ningún motivo para multar a este alumno.',
);
// Asigno institucionInfraccion "Sin multa" por default
institucionInfraccion =
await this.institucionInfraccionService.findSinInfraccion(
operador.institucion,
);
}
const fecha_fin = moment();
// Valido que este prestamo le pertenezca al operador
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');
// Busco una multa con este préstamo
return this.repository
.findOne({ where: { prestamo } })
.then((existeMulta) => {
// Si existe saco error
if (existeMulta)
throw new ConflictException(
'Ya existe una multa asignada a este préstamo.',
);
// Si hay retraso lo agrego a la multa
if (retraso) {
nuevaMulta.retraso = true;
ahora.add(retraso * operador.institucion.dias_multa_retraso, 'd');
}
nuevaMulta.institucionInfraccion = institucionInfraccion;
ahora.add(institucionInfraccion.dias_multa, 'd');
nuevaMulta.fecha_fin = ahora.toDate();
// Guardo la información
return this.repository.save(nuevaMulta);
})
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,
}),
),
)
.then((_) =>
// Actualizo multas del usuario
this.institucionUsuarioService.updateMulta(
@ -113,43 +142,48 @@ export class MultaService {
desactivarMultas() {
const ahora = moment();
// Busco todas las multas desactivadas
return this.repository
.find({ where: { activo: true } })
.find({
join: {
alias: 'mu',
innerJoinAndSelect: { p: 'mu.prestamo', u: 'p.usuario' },
},
where: { activo: true },
})
.then(async (multas) => {
//recorro todo el array
for (let i = 0; i < multas.length; i++)
// Si ya caducó
if (ahora.diff(moment(multas[i].fecha_fin)) > 0) {
const instituciones = multas[i].prestamo.usuario.instituciones;
// Desactivo multa
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].operadorMulta.institucion.id_institucion
) {
institucionUsuario.multa = false;
await this.institucionUsuarioService.save(institucionUsuario);
}
}
// Guardo cambios
await this.repository.save(multas[i]).then(() =>
// Quito multas en institución usuario
this.institucionUsuarioService.updateMulta(
multas[i].operadorMulta.institucion.id_institucion,
multas[i].prestamo.usuario.id_usuario,
false,
),
);
}
});
}
async findFullInfoMultaAll(filtros: {
pagina: string;
id_institucion?: string;
usuario?: string;
}) {
const institucion = filtros.id_institucion
? await this.institucionService.findById(parseInt(filtros.id_institucion))
: null;
findAll(
filtros: {
pagina: string;
nombre?: string;
usuario?: string;
},
operador?: Operador,
) {
const busqueda: FindOptionsWhere<FullInformacionMultaView> = {};
if (filtros.nombre) busqueda.nombre = Like(`%${filtros.nombre}%`);
if (filtros.usuario) busqueda.usuario = Like(`%${filtros.usuario}%`);
if (institucion) busqueda.id_institucion = institucion.id_institucion;
if (operador) busqueda.id_institucion = operador.institucion.id_institucion;
return this.fullInformacionMultaView
.findAndCount({
where: busqueda,
@ -173,11 +207,14 @@ export class MultaService {
});
}
findAllByIdEquipo(id_equipo: number, pagina: number) {
findAllByIdEquipo(operador: Operador, id_equipo: number, pagina: number) {
return this.equipoService.findById(id_equipo).then((equipo) =>
this.fullInformacionMultaView
.findAndCount({
where: { id_equipo: equipo.id_equipo },
where: {
id_equipo: equipo.id_equipo,
id_institucion: operador.institucion.id_institucion,
},
skip: (pagina - 1) * 25,
take: 25,
})
@ -193,11 +230,14 @@ export class MultaService {
);
}
findAllByIdUsuario(id_usuario: number, pagina: number) {
findAllByIdUsuario(operador: Operador, id_usuario: number, pagina: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
this.fullInformacionMultaView
.findAndCount({
where: { id_usuario: usuario.id_usuario },
where: {
id_usuario: usuario.id_usuario,
id_institucion: operador.institucion.id_institucion,
},
skip: (pagina - 1) * 25,
take: 25,
})
@ -213,19 +253,29 @@ export class MultaService {
);
}
findMultasActivas(id_usuario: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
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(),
);
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();
}
private fullViewToMulta(infoMulta: FullInformacionMultaView) {
@ -262,15 +312,22 @@ export class MultaService {
});
}
async quitarMulta(id_institucion_usuario: number) {
private validacionMultaCancelacion(prestamo: Prestamo) {
// Valido que este prestamo no haya sido cancelado poer el usuario u operador
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) {
const institucionUsuario = await this.institucionUsuarioService.findById(
id_institucion_usuario,
);
return this.repository
const multa = await this.repository
.createQueryBuilder('mu')
.innerJoin('mu.prestamo', 'p')
.innerJoin('p.usuario', 'u')
.innerJoinAndSelect('mu.prestamo', 'p')
.innerJoinAndSelect('p.usuario', 'u')
.innerJoin(
'u.instituciones',
'is',
@ -278,17 +335,22 @@ export class MultaService {
{ id_institucion_usuario: institucionUsuario.id_institucion_usuario },
)
.where('mu.activo = 1')
.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.save(institucionUsuario))
.getOne();
if (!multa)
throw new ConflictException(
'Este usuario no tiene una multa activa en esta institución.',
);
multa.activo = false;
return this.repository
.save(multa)
.then((_) =>
this.institucionUsuarioService.updateMulta(
admin.institucion.id_institucion,
multa.prestamo.usuario.id_usuario,
false,
),
)
.then((_) => ({ message: 'Se guardaron los cambios correctamente.' }));
}
}

View File

@ -738,8 +738,8 @@ export class PrestamoService {
}
async regresar(
prestamo: Prestamo,
operadorRegreso: Operador,
prestamo: Prestamo,
id_status: number,
motivo?: string,
descripcion?: string,
@ -764,7 +764,6 @@ export class PrestamoService {
);
if (id_institucion_infraccion && !descripcion)
throw new ConflictException('No se mandó la descripción de lo ocurrido.');
console.log('HOLA');
prestamo.activo = false;
prestamo.fecha_entrega = ahora.toDate();
prestamo.operadorRegreso = operadorRegreso;
@ -779,8 +778,8 @@ export class PrestamoService {
// a motivo, y mandar la id_institucion_infraccion
if (id_institucion_infraccion)
await this.multaService.create(
prestamo,
operadorRegreso,
prestamo,
`${mensajeTardanza} ${descripcion}`,
semanasCastigo,
id_institucion_infraccion,
@ -788,8 +787,8 @@ export class PrestamoService {
// Multa normal
else
await this.multaService.create(
prestamo,
operadorRegreso,
prestamo,
mensajeTardanza,
semanasCastigo,
);
@ -797,23 +796,16 @@ export class PrestamoService {
// De lo contrario, si se mandó id_institucion_infraccion significa que
// el usuario solo solo daño el equipo
await this.multaService.create(
prestamo,
operadorRegreso,
prestamo,
descripcion,
null,
id_institucion_infraccion,
);
console.log('hola');
// Guardo los cambios del préstamo
return this.repository
.save(prestamo)
.then((_) =>
this.equipoService.updateStatus(
prestamo.equipo,
operadorRegreso,
motivo,
),
)
// Guardo los cambios del equipo
return this.equipoService
.updateStatus(prestamo.equipo, operadorRegreso, motivo)
.then((_) => this.repository.save(prestamo)) // Guardo los cambios del préstamo
.then((_) => {
// Actualizo la interfaz del usuario
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
@ -836,8 +828,8 @@ export class PrestamoService {
// Busco el prestamo por id prestamo y luego regreso el equipo
return this.findById(id_prestamo).then((prestamo) =>
this.regresar(
prestamo,
operador,
prestamo,
id_status,
motivo,
descripcion,
@ -863,8 +855,8 @@ export class PrestamoService {
numero_inventario,
).then((prestamo) =>
this.regresar(
prestamo,
operador,
prestamo,
id_status,
motivo,
descripcion,
@ -914,7 +906,7 @@ export class PrestamoService {
);
}
validacionOperadorPrestamo(
private validacionOperadorPrestamo(
prestamo: Prestamo,
operador: Operador,
modulo?: Modulo,