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
+5 -4
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;
}
+8 -8
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')
+1 -4
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,
+181 -119
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.' }));
}
}