modulo multa final

This commit is contained in:
2022-06-28 21:37:53 -05:00
parent fa5afd9531
commit a78f1b6fc1
14 changed files with 192 additions and 138 deletions
+6
View File
@@ -0,0 +1,6 @@
import { IsNumberString } from 'class-validator';
export class IdUsuarioDto {
@IsNumberString()
id_usuario: string;
}
+5 -5
View File
@@ -1,9 +1,12 @@
import { Expose, Type } from 'class-transformer';
import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto';
import { PrestamoMinEquipoOutputDto } from '../../../prestamo/dto/output/prestamo-equipo-min.dto';
import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto';
import { PrestamoEquipoMinOutputDto } from '../../../prestamo/dto/output/prestamo-equipo-min.dto';
export class MultasEquipoOutputDto {
@Expose()
id_multa;
@Expose()
activo;
@@ -16,9 +19,6 @@ export class MultasEquipoOutputDto {
@Expose()
fecha_inicio;
@Expose()
id_multa;
@Expose()
retraso;
@@ -27,7 +27,7 @@ export class MultasEquipoOutputDto {
opeardorMulta;
@Expose()
@Type(() => PrestamoMinEquipoOutputDto)
@Type(() => PrestamoEquipoMinOutputDto)
prestamo;
@Expose()
+25
View File
@@ -0,0 +1,25 @@
import { Expose, Type } from 'class-transformer';
import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto';
import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto';
import { PrestamoMinOutputDto } from '../../../prestamo/dto/output/prestamo-min.dto';
export class MultasMinOutputDto {
@Expose()
id_multa;
@Expose()
descripcion;
@Expose()
fecha_fin;
@Expose()
fecha_inicio;
@Expose()
retraso;
@Expose()
@Type(() => InstitucionInfraccionOutputDto)
institucionInfraccion;
}
+5 -5
View File
@@ -1,9 +1,12 @@
import { Expose, Type } from 'class-transformer';
import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto';
import { PrestamoMinUsuarioOutputDto } from '../../../prestamo/dto/output/prestamo-usuario-min.dto';
import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto';
import { PrestamoUsuarioMinOutputDto } from '../../../prestamo/dto/output/prestamo-usuario-min.dto';
export class MultasUsuarioOutputDto {
@Expose()
id_multa;
@Expose()
activo;
@@ -16,9 +19,6 @@ export class MultasUsuarioOutputDto {
@Expose()
fecha_inicio;
@Expose()
id_multa;
@Expose()
retraso;
@@ -27,7 +27,7 @@ export class MultasUsuarioOutputDto {
opeardorMulta;
@Expose()
@Type(() => PrestamoMinUsuarioOutputDto)
@Type(() => PrestamoUsuarioMinOutputDto)
prestamo;
@Expose()
+4 -4
View File
@@ -1,9 +1,12 @@
import { Expose, Type } from 'class-transformer';
import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto';
import { PrestamoMinOutputDto } from '../../../prestamo/dto/output/prestamo-min.dto';
import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto';
import { PrestamoMinOutputDto } from '../../../prestamo/dto/output/prestamo-min.dto';
export class MultasOutputDto {
@Expose()
id_multa;
@Expose()
activo;
@@ -16,9 +19,6 @@ export class MultasOutputDto {
@Expose()
fecha_inicio;
@Expose()
id_multa;
@Expose()
retraso;
-1
View File
@@ -3,7 +3,6 @@ import {
Entity,
JoinColumn,
ManyToOne,
OneToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { InstitucionInfraccion } from '../../institucion-infraccion/entity/institucion-infraccion.entity';
+16
View File
@@ -2,11 +2,13 @@ import { Controller, Get, Query } from '@nestjs/common';
import { ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
import { Serealize } from '../interceptors/serialize.interceptor';
import { MultaService } from './multa.service';
import { IdUsuarioDto } from '../dto/id-usuario.dto';
import { IdEquipoPaginaDto } from '../dto/id-equipo-pagina.dto';
import { MultasDto } from './dto/input/multas.dto';
import { MultasUsuarioDto } from './dto/input/multas-usuario.dto';
import { MultasOutputDto } from './dto/output/multas.dto';
import { MultasEquipoOutputDto } from './dto/output/multas-equipo.dto';
import { MultasMinOutputDto } from './dto/output/multas-min.dto';
import { MultasUsuarioOutputDto } from './dto/output/multas-usuario.dto';
@Controller('multa')
@@ -85,6 +87,20 @@ export class MultaController {
);
}
@Serealize(MultasMinOutputDto)
@Get('multas-usuario-activas')
@ApiOperation({
description: 'Endpoint que retorna todas las multas de un usuario .',
})
@ApiQuery({
description: 'Id del usuario.',
name: 'id_usuario',
type: 'string',
})
multasActivas(@Query() query: IdUsuarioDto) {
return this.multaService.findMultasActivas(parseInt(query.id_usuario));
}
// @Get('reporte')
// reporte() {}
}
+123 -103
View File
@@ -1,8 +1,7 @@
import * as moment from 'moment';
import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { FindOperator, Like, Repository } from 'typeorm';
import { Institucion } from '../institucion/entity/institucion.entity';
import { Repository } from 'typeorm';
import { InstitucionInfraccion } from '../institucion-infraccion/entity/institucion-infraccion.entity';
import { Multa } from './entity/multa.entity';
import { Operador } from '../operador/entity/operador.entity';
@@ -64,6 +63,10 @@ export class MultaService {
)
: null;
if (prestamo.cancelado_operador || prestamo.cancelado_usuario)
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.',
@@ -87,125 +90,142 @@ export class MultaService {
return this.repository.save(this.repository.create(data));
})
.then((_) => {
for (let i = 0; prestamo.usuario.instituciones.length; i++)
for (let i = 0; prestamo.usuario.instituciones.length; i++) {
const institucionUsuario = prestamo.usuario.instituciones[i];
if (
prestamo.usuario.instituciones[i].institucionCarrera.institucion
.id_institucion ===
institucionInfraccion.institucion.id_institucion
institucionUsuario.institucionCarrera.institucion.id_institucion ===
operador.institucion.id_institucion
) {
prestamo.usuario.instituciones[i].multa = true;
return this.institucionUsuarioService.update(
prestamo.usuario.instituciones[i],
);
institucionUsuario.multa = true;
return this.institucionUsuarioService.update(institucionUsuario);
}
}
});
}
async findAll(filtros: {
pagina: string;
id_institucion?: string;
usuario?: string;
}) {
const busqueda: {
prestamo: {
equipo: { carrito: { modulo: { institucion?: Institucion } } };
usuario: { usuario?: FindOperator<string> };
};
} = {
prestamo: { equipo: { carrito: { modulo: {} } }, usuario: {} },
};
const institucion = filtros.id_institucion
? await this.institucionService.findById(parseInt(filtros.id_institucion))
: null;
if (filtros.usuario)
busqueda.prestamo.usuario.usuario = Like(filtros.usuario);
if (institucion)
busqueda.prestamo.equipo.carrito.modulo.institucion = institucion;
return this.repository.findAndCount({
join: {
alias: 'mu',
innerJoinAndSelect: {
p: 'mu.prestamo',
e: 'p.equipo',
c: 'e.carrito',
m: 'c.modulo',
i: 'm.institucion',
u: 'p.usuario',
ci: 'u.institucionCarrera',
ca: 'ci.carrera',
n: 'ca.nivel',
},
},
where: busqueda,
skip: (parseInt(filtros.pagina) - 1) * 25,
take: 25,
});
}
findAllByIdEquipo(id_equipo: number, pagina: number) {
return this.equipoService.findById(id_equipo).then((equipo) =>
this.repository.findAndCount({
join: {
alias: 'mu',
innerJoinAndSelect: {
p: 'mu.prestamo',
e: 'p.equipo',
u: 'p.usuario',
ci: 'u.institucionCarrera',
ca: 'ci.carrera',
n: 'ca.nivel',
},
},
where: { prestamo: { equipo } },
skip: (pagina - 1) * 25,
take: 25,
}),
);
}
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
this.repository.findAndCount({
join: {
alias: 'mu',
innerJoinAndSelect: {
p: 'mu.prestamo',
e: 'p.equipo',
c: 'e.carrito',
m: 'c.modulo',
i: 'm.institucion',
},
},
where: { prestamo: { usuario } },
skip: (pagina - 1) * 25,
take: 25,
}),
);
}
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.usuarioService
.update(multas[i].prestamo.usuario)
.then((_) => this.repository.save(multas[i]));
for (let j = 0; multas[i].prestamo.usuario.instituciones.length; j++)
await this.repository.save(multas[i]);
for (let j = 0; j < instituciones.length; j++) {
const institucionUsuario = instituciones[j];
if (
multas[i].prestamo.usuario.instituciones[j].institucionCarrera
.institucion.id_institucion ===
institucionUsuario.institucionCarrera.institucion
.id_institucion ===
multas[i].opeardorMulta.institucion.id_institucion
) {
multas[i].prestamo.usuario.instituciones[j].multa = false;
await this.institucionUsuarioService.update(
multas[i].prestamo.usuario.instituciones[j],
);
institucionUsuario.multa = false;
await this.institucionUsuarioService.update(institucionUsuario);
}
}
}
});
}
async findAll(filtros: {
pagina: string;
id_institucion?: string;
usuario?: string;
}) {
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);
const institucion = filtros.id_institucion
? await this.institucionService.findById(parseInt(filtros.id_institucion))
: null;
if (filtros.usuario)
query.andWhere('u.usuario LIKE :usuario', {
usuario: `%${filtros.usuario}%`,
});
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.findById(id_equipo).then((equipo) =>
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),
);
}
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService.findById(id_usuario).then((usuario) =>
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),
);
}
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 } },
}),
);
}
}
@@ -1,7 +1,7 @@
import { Expose, Type } from 'class-transformer';
import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto';
export class PrestamoMinEquipoOutputDto {
export class PrestamoEquipoMinOutputDto {
@Expose()
id_prestamo;
@@ -12,9 +12,6 @@ export class PrestamoMinOutputDto {
@Expose()
fecha_inicio;
@Expose()
hora_fin;
@Expose()
hora_inicio;
@@ -1,7 +1,7 @@
import { Expose, Type } from 'class-transformer';
import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto';
export class PrestamoMinUsuarioOutputDto {
export class PrestamoUsuarioMinOutputDto {
@Expose()
id_prestamo;
@@ -14,9 +14,6 @@ export class PrestamoMinUsuarioOutputDto {
@Expose()
hora_fin;
@Expose()
hora_inicio;
@Expose()
@Type(() => EquipoMinOutputDto)
equipo;
-3
View File
@@ -8,9 +8,6 @@ export class PrestamoOutputDto {
@Expose()
activo;
@Expose()
fecha_entrega;
@Expose()
fecha_inicio;
-2
View File
@@ -11,7 +11,6 @@ import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/instit
import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/institucion-tipo-entrada.module';
import { OperadorModule } from '../operador/operador.module';
import { ModuloModule } from '../modulo/modulo.module';
import { MotivoModule } from '../motivo/motivo.module';
import { MultaModule } from 'src/multa/multa.module';
import { TipoUsuarioModule } from '../tipo-usuario/tipo-usuario.module';
import { UsuarioModule } from '../usuario/usuario.module';
@@ -25,7 +24,6 @@ import { AppGateway } from '../app.gateway';
InstitucionTipoCarritoModule,
InstitucionTipoEntradaModule,
ModuloModule,
MotivoModule,
forwardRef(() => MultaModule),
OperadorModule,
TipoUsuarioModule,
+6 -7
View File
@@ -19,7 +19,6 @@ import { InstitucionProgramaService } from '../institucion-programa/institucion-
import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service';
import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service';
import { ModuloService } from '../modulo/modulo.service';
import { MotivoService } from '../motivo/motivo.service';
import { MultaService } from '../multa/multa.service';
import { OperadorService } from '../operador/operador.service';
import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service';
@@ -36,7 +35,6 @@ export class PrestamoService {
private institucionTipoCarritoService: InstitucionTipoCarritoService,
private institucionTipoEntradaService: InstitucionTipoEntradaService,
private moduloService: ModuloService,
private motivoService: MotivoService,
@Inject(forwardRef(() => MultaService))
private multaService: MultaService,
private operadorService: OperadorService,
@@ -305,7 +303,6 @@ export class PrestamoService {
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ca.nivel', 'n')
.innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('e.status', 's')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('m.institucion', 'i')
@@ -350,9 +347,11 @@ export class PrestamoService {
: null;
if (filtros.activo) {
if (typeof filtros.activo === 'boolean')
query.andWhere('p.activo = :activo', { activo: filtros.activo });
else
if (typeof filtros.activo === 'boolean') {
query
.innerJoinAndSelect('e.status', 's')
.andWhere('p.activo = :activo', { activo: filtros.activo });
} else
query.andWhere('p.activo = :activo', {
activo: filtros.activo === 'true',
});
@@ -508,7 +507,7 @@ export class PrestamoService {
.then((prestamo) => {
if (!prestamo)
throw new NotFoundException(
'Este usuario no tiene un prestamo activo.',
'Este usuario no tiene un préstamo activo.',
);
return prestamo;
});