191 lines
6.0 KiB
TypeScript
191 lines
6.0 KiB
TypeScript
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 { InstitucionInfraccion } from '../institucion-infraccion/entity/institucion-infraccion.entity';
|
|
import { Multa } from './entity/multa.entity';
|
|
import { Operador } from '../operador/entity/operador.entity';
|
|
import { Prestamo } from '../prestamo/entity/prestamo.entity';
|
|
import { EquipoService } from '../equipo/equipo.service';
|
|
import { InstitucionService } from '../institucion/institucion.service';
|
|
import { InstitucionInfraccionService } from '../institucion-infraccion/institucion-infraccion.service';
|
|
import { OperadorService } from '../operador/operador.service';
|
|
import { PrestamoService } from '../prestamo/prestamo.service';
|
|
import { UsuarioService } from '../usuario/usuario.service';
|
|
|
|
@Injectable()
|
|
export class MultaService {
|
|
constructor(
|
|
@InjectRepository(Multa) private repository: Repository<Multa>,
|
|
private equipoService: EquipoService,
|
|
private institucionService: InstitucionService,
|
|
private institucionInfraccionService: InstitucionInfraccionService,
|
|
private operadorService: OperadorService,
|
|
private prestamoService: PrestamoService,
|
|
private usuarioService: UsuarioService,
|
|
) {}
|
|
|
|
async create(
|
|
id_prestamo: number | Prestamo,
|
|
id_operador: number | Operador,
|
|
descripcion: string,
|
|
retraso?: number,
|
|
id_institucion_infraccion?: number,
|
|
) {
|
|
const ahora = moment();
|
|
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;
|
|
const data: {
|
|
descripcion: string;
|
|
fecha_inicio: Date;
|
|
opeardorMulta: Operador;
|
|
prestamo: Prestamo;
|
|
fecha_fin?: Date;
|
|
institucionInfraccion?: InstitucionInfraccion;
|
|
retraso?: boolean;
|
|
} = {
|
|
descripcion,
|
|
fecha_inicio: ahora.toDate(),
|
|
opeardorMulta: operador,
|
|
prestamo,
|
|
};
|
|
const institucionInfraccion = id_institucion_infraccion
|
|
? await this.institucionInfraccionService.findById(
|
|
id_institucion_infraccion,
|
|
)
|
|
: null;
|
|
|
|
if (!retraso && !institucionInfraccion)
|
|
throw new ConflictException(
|
|
'No se mandó ningún motivo para multar a este alumno.',
|
|
);
|
|
return this.repository
|
|
.findOne({ prestamo })
|
|
.then((existeMulta) => {
|
|
if (existeMulta)
|
|
throw new ConflictException(
|
|
'Ya existe una multa asignada a este prestamo.',
|
|
);
|
|
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((_) => {
|
|
prestamo.usuario.multa = true;
|
|
return this.usuarioService.update(prestamo.usuario);
|
|
});
|
|
}
|
|
|
|
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) {
|
|
multas[i].activo = false;
|
|
multas[i].prestamo.usuario.multa = false;
|
|
await this.usuarioService
|
|
.update(multas[i].prestamo.usuario)
|
|
.then((_) => this.repository.save(multas[i]));
|
|
}
|
|
});
|
|
}
|
|
}
|