casi listo

This commit is contained in:
xXpuma99Xx 2022-10-25 16:45:38 -05:00
parent 04f2f2948b
commit 9b5665b3e4
10 changed files with 308 additions and 306 deletions

View File

@ -1,9 +1,6 @@
import { IsNumberString, IsString } from 'class-validator';
export class NumeroInventarioDto {
@IsNumberString()
id_institucion: string;
@IsString()
numero_inventario: string;
}

View File

@ -43,11 +43,6 @@ export class EquipoController {
'Endpoint que retorna la información de un equipo por su número de inventario de una institución.',
})
@ApiBearerAuth('jwt')
@ApiQuery({
description: 'Id de la institución.',
name: 'id_institucion',
type: 'string',
})
@ApiQuery({
description: 'El número de inventario del equipo que se busca.',
name: 'numero_inventario',
@ -58,10 +53,7 @@ export class EquipoController {
this.validarUsuarioService.validarAdminOperador(operador);
return this.equipoService
.findFullInfoByNumeroInventario(
parseInt(query.id_institucion),
query.numero_inventario,
)
.findFullInfoByNumeroInventario(operador, query.numero_inventario)
.then((equipo) => {
if (
operador.tipoUsuario.id_tipo_usuario > 2 &&

View File

@ -316,86 +316,77 @@ export class EquipoService {
busquedaReseteo.id_tipo_entrada = tipoEntrada.id_tipo_entrada;
}
// Busaca un equipo
return (
this.informacionEquipoPrestamoView
.findOne({ where: busqueda })
.then((infoEquipo) => {
// Si no hay uno busca a todos los quipos que cumplan las mismas
// condiciones pero que ya hayan sido prestados
if (!infoEquipo)
return this.informacionEquipoPrestamoView
.find({ where: busquedaReseteo })
.then(async (infoEquipos) => {
// Los pasamos a no prestados para resetear los equipos
for (let i = 0; i < infoEquipos.length; i++)
await this.repository.save(
this.repository.create({
id_equipo: infoEquipos[i].id_equipo,
prestado: false,
}),
);
// Trata de buscar otro
return this.informacionEquipoPrestamoView.findOne({
where: busqueda,
});
})
.then((infoEquipo) => {
// Si no hay saca error
if (!infoEquipo)
throw new ConflictException(
'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.',
);
return infoEquipo;
return this.informacionEquipoPrestamoView
.findOne({ where: busqueda })
.then(async (infoEquipo) => {
// Si no hay uno busca a todos los quipos que cumplan las mismas
// condiciones pero que ya hayan sido prestados
if (!infoEquipo)
await this.informacionEquipoPrestamoView
.find({ where: busquedaReseteo })
.then(async (infoEquipos) => {
// Los pasamos a no prestados para resetear los equipos
for (let i = 0; i < infoEquipos.length; i++)
await this.repository.save(
this.repository.create({
id_equipo: infoEquipos[i].id_equipo,
prestado: false,
}),
);
// Trata de buscar otro
return this.informacionEquipoPrestamoView.findOne({
where: busqueda,
});
return infoEquipo;
})
.then((infoEquipo) => {
// Esta variable debe estar siempre en null antes de asignar el equipo
if (infoEquipo.u)
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
// Actualizo el status del equipo a apartado y gurado el id del usaurio
// al que se asignó
return this.repository.save(
this.repository.create({
id_equipo: infoEquipo.id_equipo,
u: id_usuario,
status: { id_status: 2 },
}),
})
.then((infoEquipoAux) => {
// Si no hay saca error
if (!infoEquipoAux)
throw new ConflictException(
'No hay un equipo de cómputo que cumpla con las caracteríasticas solicitadas o ya no hay equipos disponibles en este momento. Intenta más tarde o cambia las características.',
);
infoEquipo = infoEquipoAux;
});
// Esta variable debe estar siempre en null antes de asignar el equipo
if (infoEquipo.u)
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
})
// Una vez actualizado lo busco de nuvo
.then((equipo) => this.findById(equipo.id_equipo))
.then((equipo) => {
// Si el campo u no coincide con el id_usaurio saca error
if (equipo.u != id_usuario)
throw new ConflictException(
'Ocurrio un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
return equipo;
})
);
// Actualizo el status del equipo a apartado y gurado el id del usaurio
// al que se asignó
return this.repository.save(
this.repository.create({
id_equipo: infoEquipo.id_equipo,
u: id_usuario,
status: { id_status: 2 },
}),
);
})
.then((equipo) => this.findById(equipo.id_equipo)) // Una vez actualizado lo busco de nuevo
.then((equipo) => {
// Si el campo u no coincide con el id_usaurio saca error
if (equipo.u != id_usuario)
throw new ConflictException(
'Ocurrió un error al tratar de asignarte un equipo de cómputo, intenta de nuevo.',
);
return equipo;
});
}
findFullInfoByNumeroInventario(
id_institucion: number,
operador: Operador,
numero_inventario: string,
) {
return this.institucionService
.findById(id_institucion)
.then((institucion) =>
this.fullInformacionEquipoView.findOne({
where: {
id_institucion: institucion.id_institucion,
numero_inventario,
},
}),
)
return this.fullInformacionEquipoView
.findOne({
where: {
id_institucion: operador.institucion.id_institucion,
numero_inventario,
},
})
.then(async (infoEquipo) => {
if (!infoEquipo)
throw new NotFoundException(
'No existe un equipo de cómputo con este número de inventario.',
'No existe un equipo de cómputo con este número de inventario en esta institución.',
);
// Busco todos los programas de este equipo

View File

@ -1,6 +1,6 @@
import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { FindOptionsWhere, Repository } from 'typeorm';
import { Institucion } from 'src/institucion/entity/institucion.entity';
import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity';
import { InstitucionUsuario } from './entity/institucion-usuario.entity';
@ -82,9 +82,17 @@ export class InstitucionUsuarioService {
});
}
findFullInfoAllByUsuario(usuario: Usuario) {
findFullInfoAllByUsuario(usuario: Usuario, activosSinMulta = true) {
const busqueda: FindOptionsWhere<FullInformacionInstitucionUsuarioView> = {
id_usuario: usuario.id_usuario,
};
if (activosSinMulta) {
busqueda.activo = 1;
busqueda.multa = 0;
}
return this.fullInformacionInstitucionUsuarioView
.find({ where: { id_usuario: usuario.id_usuario, activo: 1, multa: 0 } })
.find({ where: busqueda })
.then((infoInstitucionesUsuario) => {
const institucionesUsuario: InstitucionUsuario[] = [];

View File

@ -1,7 +1,7 @@
import * as moment from 'moment';
import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { DeepPartial, FindOptionsWhere, Like, Repository } from 'typeorm';
import { 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';
@ -39,6 +39,7 @@ export class MultaService {
retraso?: number,
id_institucion_infraccion?: number,
) {
console.log('hola1');
const ahora = moment();
const prestamo =
typeof id_prestamo === 'number'
@ -48,51 +49,59 @@ export class MultaService {
typeof id_operador === 'number'
? await this.operadorService.findById(id_operador)
: id_operador;
const data: DeepPartial<Multa> = {
// 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.',
);
// 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,
);
}
// 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) {
data.retraso = true;
nuevaMulta.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));
nuevaMulta.institucionInfraccion = institucionInfraccion;
ahora.add(institucionInfraccion.dias_multa, 'd');
nuevaMulta.fecha_fin = ahora.toDate();
// Guardo la información
return this.repository.save(nuevaMulta);
})
.then((_) =>
// Actualizo multas del usuario
this.institucionUsuarioService.updateMulta(
operador.institucion.id_institucion,
prestamo.usuario.id_usuario,

View File

@ -1,6 +0,0 @@
import { IsInt } from 'class-validator';
export class CancelarUsuarioDto {
@IsInt()
id_prestamo: number;
}

View File

@ -49,6 +49,14 @@ export class HistorialDto {
@IsOptional()
id_modulo?: string;
@IsNumberString()
@IsOptional()
id_operador_entrega?: string;
@IsNumberString()
@IsOptional()
id_operador_regreso?: string;
@IsNumberString()
@IsOptional()
id_prestamo?: string;

View File

@ -23,11 +23,9 @@ import { Operador } from '../operador/entity/operador.entity';
import { Usuario } from '../usuario/entity/usuario.entity';
import { Modulo } from '../modulo/entity/modulo.entity';
import { IdEquipoPaginaDto } from '../dto/input/id-equipo-pagina.dto';
import { IdUsuarioDto } from '../dto/input/id-usuario.dto';
import { IdUsuarioPaginaDto } from '../dto/input/id-usuario-pagina.dto';
import { NumeroInventarioDto } from '../dto/numero-inventario.dto';
import { ActivosDto } from './dto/input/activos.dto';
import { CancelarUsuarioDto } from './dto/input/cancelar-usuario.dto';
import { CancelarOperadorDto } from './dto/input/cancelar-operador.dto';
import { HistorialDto } from './dto/input/historial.dto';
import { IdPrestamoDto } from './dto/input/id-prestamo.dto';
@ -117,7 +115,7 @@ export class PrestamoController {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.findFullInfoPrestamoAll(query);
return this.prestamoService.findAll(query);
}
@Serealize(MessageOutputDto)
@ -155,11 +153,11 @@ export class PrestamoController {
description: 'La variable id_prestamo es obligatoria.',
examples: { ejemplo: { value: { id_prestamo: 1 } } },
})
cancelarUsuario(@Request() req, @Body() body: CancelarUsuarioDto) {
cancelarUsuario(@Request() req) {
const usuario: Usuario = req.user.usuario;
this.validarUsuarioService.validarUsuario(usuario);
return this.prestamoService.cancelarUsuario(usuario, body.id_prestamo);
return this.prestamoService.cancelarUsuario(usuario);
}
@Serealize(EquipoMinOutputDto)
@ -257,7 +255,7 @@ export class PrestamoController {
const operador: Operador = req.user.operador;
this.validarUsuarioService.validarOperador(operador);
return this.prestamoService.findFullInfoPrestamoAll(query);
return this.prestamoService.findAll(query);
}
@Serealize(PrestamosEquipoOutputDto)
@ -376,18 +374,11 @@ export class PrestamoController {
'Endpoint que retorna un préstamo activo por el id del usuario.',
})
@ApiBearerAuth('jwt')
@ApiQuery({
description: 'Id del usuario.',
name: 'id_usuario',
type: 'string',
})
prestamoIdUsuario(@Request() req, @Query() query: IdUsuarioDto) {
prestamoIdUsuario(@Request() req) {
const usuario: Usuario = req.user.usuario;
this.validarUsuarioService.validarUsuario(usuario);
return this.prestamoService.prestamoInfoByIdUsuario(
parseInt(query.id_usuario),
);
return this.prestamoService.prestamoInfoByUsuario(usuario);
}
@Serealize(PrestamoEquipoOutputDto)
@ -397,12 +388,6 @@ export class PrestamoController {
description:
'Endpoint que retorna un préstamo activo por el número de inventario de un equipo.',
})
@ApiBearerAuth('jwt')
@ApiQuery({
description: 'Id de la institución.',
name: 'id_institucion',
type: 'string',
})
@ApiQuery({
description: 'El número de inventario del equipo.',
name: 'numero_inventario',
@ -416,7 +401,7 @@ export class PrestamoController {
this.validarUsuarioService.validarAdminOperador(operador);
return this.prestamoService.prestamoInfoByNumeroInventario(
parseInt(query.id_institucion),
operador,
query.numero_inventario,
);
}

View File

@ -14,6 +14,7 @@ import { InstitucionDiaModule } from '../institucion-dia/institucion-dia.module'
import { InstitucionProgramaModule } from '../institucion-programa/institucion-programa.module';
import { InstitucionTipoCarritoModule } from '../institucion-tipo-carrito/institucion-tipo-carrito.module';
import { InstitucionTipoEntradaModule } from '../institucion-tipo-entrada/institucion-tipo-entrada.module';
import { InstitucionUsuarioModule } from '../institucion-usuario/institucion-usuario.module';
import { OperadorModule } from '../operador/operador.module';
import { ModuloModule } from '../modulo/modulo.module';
import { MultaModule } from '../multa/multa.module';
@ -29,6 +30,7 @@ import { ValidarUsuarioModule } from '../validar-usuario/validar-usuario.module'
InstitucionProgramaModule,
InstitucionTipoCarritoModule,
InstitucionTipoEntradaModule,
InstitucionUsuarioModule,
ModuloModule,
forwardRef(() => MultaModule),
OperadorModule,

View File

@ -33,6 +33,7 @@ import { InstitucionDiaService } from '../institucion-dia/institucion-dia.servic
import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service';
import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service';
import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.service';
import { InstitucionUsuarioService } from '../institucion-usuario/institucion-usuario.service';
import { ModuloService } from '../modulo/modulo.service';
import { MultaService } from '../multa/multa.service';
import { OperadorService } from '../operador/operador.service';
@ -56,6 +57,7 @@ export class PrestamoService {
private institucionProgramaService: InstitucionProgramaService,
private institucionTipoCarritoService: InstitucionTipoCarritoService,
private institucionTipoEntradaService: InstitucionTipoEntradaService,
private institucionUsuarioService: InstitucionUsuarioService,
private moduloService: ModuloService,
@Inject(forwardRef(() => MultaService))
private multaService: MultaService,
@ -70,7 +72,7 @@ export class PrestamoService {
motivo: string,
) {
const ahora = moment();
const prestamo = await this.findInfoPrestamoById(id_prestamo);
const prestamo = await this.findById(id_prestamo);
this.validacionBasicaPrestamo(prestamo);
this.validacionOperadorPrestamo(prestamo, operadorRegreso);
@ -80,41 +82,45 @@ export class PrestamoService {
prestamo.operadorRegreso = operadorRegreso;
prestamo.equipo.u = null;
prestamo.equipo.status.id_status = 6;
return this.equipoService
.updateStatus(prestamo.equipo, operadorRegreso, motivo)
.then((_) => this.repository.save(prestamo))
.then((_) => {
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
this.appGateway.actualizarOperador(
operadorRegreso.institucion.id_institucion,
);
return { message: 'Se canceló correctamente este préstamo.' };
});
// Guardo cambios en el equipo, y envio el motivo de cancelación
return (
this.equipoService
.updateStatus(prestamo.equipo, operadorRegreso, motivo)
// Guardo cambios del prestamo
.then((_) => this.repository.save(prestamo))
.then((_) => {
// Actualizo interfaz de usaurios
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
this.appGateway.actualizarOperador(
operadorRegreso.institucion.id_institucion,
);
return { message: 'Se canceló correctamente este préstamo.' };
})
);
}
async cancelarUsuario(usuario: Usuario, id_prestamo: number) {
async cancelarUsuario(usuario: Usuario) {
const ahora = moment();
const prestamo = await this.findInfoPrestamoById(id_prestamo);
const prestamo = await this.prestamoInfoByUsuario(usuario);
this.validacionBasicaPrestamo(prestamo);
// Saco error en status de equipo 3
if (prestamo.equipo.status.id_status === 3)
throw new ConflictException(
'No puedes cancelar este préstamo una vez se te entregó el equipo.',
);
if (usuario.id_usuario != prestamo.usuario.id_usuario)
throw new ConflictException(
'No puedes cancelar este préstamo porque no te pretenece.',
'No puedes cancelar este préstamo una vez que se te entregó el equipo.',
);
prestamo.activo = false;
prestamo.fecha_entrega = ahora.toDate();
prestamo.cancelado_usuario = true;
prestamo.equipo.u = null;
prestamo.equipo.status.id_status = 1;
// Guardo cambios en el equipo
return this.equipoService
.updateStatus(prestamo.equipo)
.then((_) => this.repository.save(prestamo))
.then((_) => this.repository.save(prestamo)) // Guardo cambios del prestamo
.then((_) => {
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
// Actualizo interfaz de usaurios
this.appGateway.actualizarUsuario(usuario.id_usuario);
this.appGateway.actualizarOperador(
prestamo.equipo.carrito.modulo.institucion.id_institucion,
);
@ -157,21 +163,25 @@ export class PrestamoService {
)
: null;
// Valido que no sea domingo
if (ahora.weekday() === 0)
throw new ConflictException('No hay servicio los días domingo.');
this.validarInstitucionUsuario(usuario.instituciones, modulo);
// Valido si ese día se encuentra activo
if (!institucionDia.activo)
throw new ConflictException(
'El día de hoy no hay servicio de préstamo de equipos.',
);
// Si ahora es menor a horaMin significa que aun no inicio el horario de serivicio
if (ahora < horaMin)
throw new ConflictException(
`El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`,
);
// Si ahora es mayor o igual a horaExtra significa que ya acabo la hora de servicio
if (ahora >= horaExtra)
throw new ConflictException(
`El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`,
);
// Recorro el array de horasExcepcion del día en cuestión
for (let i = 0; i < institucionDia.horasExcepcion.length; i++) {
const horaFin = moment(
`${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`,
@ -180,18 +190,30 @@ export class PrestamoService {
`${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`,
);
// Si ahora esta entre horaInicio y horaFin significa que no hay servicio de préstamos
// temporalmente
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}.`,
`Se suspendió el servicio de préstamo temporalmente de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`,
);
}
return this.informacionPrestamoView
.findOne({ where: { activo: 1, id_usuario: usuario.id_usuario } })
// Busco instituciones activas y sin multa de este usuario
return this.institucionUsuarioService
.findFullInfoAllByUsuario(usuario, false)
.then((instituciones) => {
this.validarInstitucionUsuario(instituciones, modulo);
// Busco un prestamo activo con el id del usuario que realiza la acción
return this.informacionPrestamoView.findOne({
where: { activo: 1, id_usuario: usuario.id_usuario },
});
})
.then((existePrestamo) => {
// Saco error si lo encuentra
if (existePrestamo)
throw new ConflictException(
'Este usuario ya tiene un préstamo activo.',
);
// Busco un equipo con las caracteríasticas solicitadas
return this.equipoService.findEquipo(
usuario.id_usuario,
modulo,
@ -201,6 +223,7 @@ export class PrestamoService {
);
})
.then((equipo) =>
// Genero el registro y lo guardo
this.repository.save(
this.repository.create({
equipo,
@ -215,6 +238,7 @@ export class PrestamoService {
),
)
.then((prestamo) => {
// Actualizo la interfaz del operador
this.appGateway.actualizarOperador(modulo.institucion.id_institucion);
return prestamo;
});
@ -223,21 +247,27 @@ export class PrestamoService {
async desactivarPrestamos() {
const ahora = moment();
// Busco todos los préstamos activos y que esten apartadoss
return this.informacionPrestamoView
.find({ where: { activo: 1, id_status: 2 } })
.then(async (infoPrestamo) => {
// Recorro el array
for (let i = 0; i < infoPrestamo.length; i++) {
const prestamo = this.viewToPrestamo(infoPrestamo[i]);
// Si la resta ahora - hora_max_recoger es mayor a 0 significa que ya pasó
// el tiempo limite para recoger el equipo de cómputo
if (ahora.diff(moment(prestamo.hora_max_recoger)) > 0) {
prestamo.activo = false;
prestamo.cancelado_operador = true;
prestamo.equipo.u = null;
prestamo.equipo.status.id_status = 1;
// Guardo los cambios del préstamo
await this.repository
.save(prestamo)
.then((_) => this.equipoService.updateStatus(prestamo.equipo))
.then((_) => {
// Actualizo las interfazes del los usuarios
this.appGateway.actualizarOperador(
prestamo.equipo.carrito.modulo.institucion.id_institucion,
);
@ -255,7 +285,7 @@ export class PrestamoService {
) {
const ahora = moment();
const ahoraStr = ahora.format('YYYY-MM-DD');
const prestamo = await this.findInfoPrestamoById(id_prestamo);
const prestamo = await this.findById(id_prestamo);
const institucionDia =
await this.institucionDiaService.findByInstitucionDia(
operadorEntrega.institucion,
@ -270,6 +300,8 @@ export class PrestamoService {
this.validacionBasicaPrestamo(prestamo);
this.validacionOperadorPrestamo(prestamo, operadorEntrega, modulo);
// Si el equipo esta en status 3 ya no se puede ejecutar este endpoint de nuevo
// con este préstamo
if (prestamo.equipo.status.id_status === 3)
throw new ConflictException(
'Ya se entregó el equipo de cómputo al usuario.',
@ -282,10 +314,12 @@ export class PrestamoService {
prestamo.operadorEntrega = operadorEntrega;
prestamo.equipo.prestado = true;
prestamo.equipo.status.id_status = 3;
return this.repository
.save(prestamo)
.then((_) => this.equipoService.updateStatus(prestamo.equipo))
// Guardo los cambios del equipo
return this.equipoService
.updateStatus(prestamo.equipo)
.then((_) => this.repository.save(prestamo)) // Guardo los cambios del préstamo
.then((_) => {
// Actualizo la interfaz de los usuarios
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
this.appGateway.actualizarOperador(
prestamo.equipo.carrito.modulo.institucion.id_institucion,
@ -294,140 +328,7 @@ export class PrestamoService {
});
}
async findAllByIdEquipo(id_equipo: number, pagina: number) {
return this.fullInformacionPrestamoView
.findAndCount({
where: { id_equipo },
order: { id_prestamo: 'DESC' },
skip: (pagina - 1) * 25,
take: 25,
})
.then((infoPrestamos) => {
const prestamos: Prestamo[] = [];
for (let i = 0; i < infoPrestamos[0].length; i++)
prestamos.push(
this.repository.create({
id_prestamo: infoPrestamos[0][i].id_prestamo,
activo: infoPrestamos[0][i].activo === 1,
cancelado_operador: infoPrestamos[0][i].cancelado_operador === 1,
cancelado_usuario: infoPrestamos[0][i].cancelado_usuario === 1,
fecha_entrega: infoPrestamos[0][i].fecha_entrega,
fecha_inicio: infoPrestamos[0][i].fecha_inicio,
hora_fin: infoPrestamos[0][i].hora_fin,
hora_inicio: infoPrestamos[0][i].hora_inicio,
hora_max_recoger: infoPrestamos[0][i].hora_max_recoger,
usuario: {
id_usuario: infoPrestamos[0][i].id_usuario,
nombre: infoPrestamos[0][i].nombre,
usuario: infoPrestamos[0][i].usuario,
tipoUsuario: {
id_tipo_usuario: infoPrestamos[0][i].id_tipo_usuario,
},
},
operadorEntrega: {
id_operador: infoPrestamos[0][i].id_operador_entrega,
operador: infoPrestamos[0][i].operador_entrega,
},
operadorRegreso: {
id_operador: infoPrestamos[0][i].id_operador_regreso,
operador: infoPrestamos[0][i].operador_regreso,
},
}),
);
return [prestamos, infoPrestamos[1]];
});
}
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService
.findById(id_usuario)
.then((usuario) =>
this.fullInformacionPrestamoView.findAndCount({
where: { id_usuario: usuario.id_usuario },
order: { id_prestamo: 'DESC' },
skip: (pagina - 1) * 25,
take: 25,
}),
)
.then((infoPrestamos) => {
const prestamos: Prestamo[] = [];
for (let i = 0; i < infoPrestamos[0].length; i++)
prestamos.push(
this.repository.create({
id_prestamo: infoPrestamos[0][i].id_prestamo,
activo: infoPrestamos[0][i].activo === 1,
cancelado_operador: infoPrestamos[0][i].cancelado_operador === 1,
cancelado_usuario: infoPrestamos[0][i].cancelado_usuario === 1,
fecha_entrega: infoPrestamos[0][i].fecha_entrega,
fecha_inicio: infoPrestamos[0][i].fecha_inicio,
hora_fin: infoPrestamos[0][i].hora_fin,
hora_inicio: infoPrestamos[0][i].hora_inicio,
hora_max_recoger: infoPrestamos[0][i].hora_max_recoger,
equipo: {
id_equipo: infoPrestamos[0][i].id_equipo,
equipo: infoPrestamos[0][i].equipo,
numero_inventario: infoPrestamos[0][i].numero_inventario,
carrito: {
id_carrito: infoPrestamos[0][i].id_carrito,
carrito: infoPrestamos[0][i].carrito,
modulo: {
id_modulo: infoPrestamos[0][i].id_modulo,
modulo: infoPrestamos[0][i].modulo,
institucion: {
id_institucion: infoPrestamos[0][i].id_institucion,
institucion: infoPrestamos[0][i].institucion,
},
},
tipoCarrito: {
id_tipo_carrito: infoPrestamos[0][i].id_tipo_carrito,
tipo_carrito: infoPrestamos[0][i].tipo_carrito,
},
},
},
operadorEntrega: {
id_operador: infoPrestamos[0][i].id_operador_entrega,
operador: infoPrestamos[0][i].operador_entrega,
},
operadorRegreso: {
id_operador: infoPrestamos[0][i].id_operador_regreso,
operador: infoPrestamos[0][i].operador_regreso,
},
}),
);
return [prestamos, infoPrestamos[1]];
});
}
findById(id_prestamo: number) {
return this.repository
.createQueryBuilder('p')
.innerJoinAndSelect('p.equipo', 'e')
.innerJoinAndSelect('p.usuario', 'u')
.innerJoinAndSelect('e.carrito', 'c')
.innerJoinAndSelect('e.programas', 'ps')
.innerJoinAndSelect('e.status', 's')
.innerJoinAndSelect('e.tiposEntradas', 'tes')
.innerJoinAndSelect('u.instituciones', 'is')
.innerJoinAndSelect('c.modulo', 'm')
.innerJoinAndSelect('c.tipoCarrito', 'tc')
.innerJoinAndSelect('ps.programa', 'pr')
.innerJoinAndSelect('tes.tipoEntrada', 'te')
.innerJoinAndSelect('is.institucionCarrera', 'ic')
.innerJoinAndSelect('ic.carrera', 'ca')
.innerJoinAndSelect('ic.institucion', 'in')
.innerJoinAndSelect('m.institucion', 'i')
.where('p.id_prestamo = :id_prestamo', {
id_prestamo,
})
.getOne()
.then((prestamo) => {
if (!prestamo) throw new NotFoundException('No existe este préstamo.');
return prestamo;
});
}
async findFullInfoPrestamoAll(filtros: {
async findAll(filtros: {
pagina?: string;
activo?: string | boolean;
cancelado_operador?: string;
@ -570,7 +471,112 @@ export class PrestamoService {
});
}
findInfoPrestamoById(id_prestamo: number) {
findAllByIdEquipo(id_equipo: number, pagina: number) {
return this.fullInformacionPrestamoView
.findAndCount({
where: { id_equipo },
order: { id_prestamo: 'DESC' },
skip: (pagina - 1) * 25,
take: 25,
})
.then((infoPrestamos) => {
const prestamos: Prestamo[] = [];
for (let i = 0; i < infoPrestamos[0].length; i++)
prestamos.push(
this.repository.create({
id_prestamo: infoPrestamos[0][i].id_prestamo,
activo: infoPrestamos[0][i].activo === 1,
cancelado_operador: infoPrestamos[0][i].cancelado_operador === 1,
cancelado_usuario: infoPrestamos[0][i].cancelado_usuario === 1,
fecha_entrega: infoPrestamos[0][i].fecha_entrega,
fecha_inicio: infoPrestamos[0][i].fecha_inicio,
hora_fin: infoPrestamos[0][i].hora_fin,
hora_inicio: infoPrestamos[0][i].hora_inicio,
hora_max_recoger: infoPrestamos[0][i].hora_max_recoger,
usuario: {
id_usuario: infoPrestamos[0][i].id_usuario,
nombre: infoPrestamos[0][i].nombre,
usuario: infoPrestamos[0][i].usuario,
tipoUsuario: {
id_tipo_usuario: infoPrestamos[0][i].id_tipo_usuario,
},
},
operadorEntrega: {
id_operador: infoPrestamos[0][i].id_operador_entrega,
operador: infoPrestamos[0][i].operador_entrega,
},
operadorRegreso: {
id_operador: infoPrestamos[0][i].id_operador_regreso,
operador: infoPrestamos[0][i].operador_regreso,
},
}),
);
return [prestamos, infoPrestamos[1]];
});
}
findAllByIdUsuario(id_usuario: number, pagina: number) {
return this.usuarioService
.findById(id_usuario)
.then((usuario) =>
this.fullInformacionPrestamoView.findAndCount({
where: { id_usuario: usuario.id_usuario },
order: { id_prestamo: 'DESC' },
skip: (pagina - 1) * 25,
take: 25,
}),
)
.then((infoPrestamos) => {
const prestamos: Prestamo[] = [];
for (let i = 0; i < infoPrestamos[0].length; i++)
prestamos.push(
this.repository.create({
id_prestamo: infoPrestamos[0][i].id_prestamo,
activo: infoPrestamos[0][i].activo === 1,
cancelado_operador: infoPrestamos[0][i].cancelado_operador === 1,
cancelado_usuario: infoPrestamos[0][i].cancelado_usuario === 1,
fecha_entrega: infoPrestamos[0][i].fecha_entrega,
fecha_inicio: infoPrestamos[0][i].fecha_inicio,
hora_fin: infoPrestamos[0][i].hora_fin,
hora_inicio: infoPrestamos[0][i].hora_inicio,
hora_max_recoger: infoPrestamos[0][i].hora_max_recoger,
equipo: {
id_equipo: infoPrestamos[0][i].id_equipo,
equipo: infoPrestamos[0][i].equipo,
numero_inventario: infoPrestamos[0][i].numero_inventario,
carrito: {
id_carrito: infoPrestamos[0][i].id_carrito,
carrito: infoPrestamos[0][i].carrito,
modulo: {
id_modulo: infoPrestamos[0][i].id_modulo,
modulo: infoPrestamos[0][i].modulo,
institucion: {
id_institucion: infoPrestamos[0][i].id_institucion,
institucion: infoPrestamos[0][i].institucion,
},
},
tipoCarrito: {
id_tipo_carrito: infoPrestamos[0][i].id_tipo_carrito,
tipo_carrito: infoPrestamos[0][i].tipo_carrito,
},
},
},
operadorEntrega: {
id_operador: infoPrestamos[0][i].id_operador_entrega,
operador: infoPrestamos[0][i].operador_entrega,
},
operadorRegreso: {
id_operador: infoPrestamos[0][i].id_operador_regreso,
operador: infoPrestamos[0][i].operador_regreso,
},
}),
);
return [prestamos, infoPrestamos[1]];
});
}
findById(id_prestamo: number) {
return this.informacionPrestamoView
.findOne({ where: { id_prestamo } })
.then((infoPrestamo) => {
@ -580,10 +586,7 @@ export class PrestamoService {
});
}
findInfoPrestamoByNumeroInventario(
institucion: Institucion,
numero_inventario: string,
) {
findByNumeroInventario(institucion: Institucion, numero_inventario: string) {
return this.informacionPrestamoView
.findOne({
where: {
@ -646,9 +649,9 @@ export class PrestamoService {
});
}
prestamoInfoByIdUsuario(id_usuario: number) {
prestamoInfoByUsuario(usuario: Usuario) {
return this.prestamoInformacionView
.findOne({ where: { activo: 1, id_usuario } })
.findOne({ where: { activo: 1, id_usuario: usuario.id_usuario } })
.then((infoPrestamo) => {
if (!infoPrestamo)
throw new NotFoundException(
@ -688,17 +691,11 @@ export class PrestamoService {
}
prestamoInfoByNumeroInventario(
id_institucion: number,
operador: Operador,
numero_inventario: string,
) {
return this.institucionService
.findById(id_institucion)
.then((institucion) =>
this.equipoService.findByNumeroInventario(
institucion,
numero_inventario,
),
)
return this.equipoService
.findByNumeroInventario(operador.institucion, numero_inventario)
.then((equipo) =>
this.prestamoInformacionView.findOne({
where: { activo: 1, id_equipo: equipo.id_equipo },
@ -750,27 +747,36 @@ export class PrestamoService {
modulo?: Modulo,
) {
const ahora = moment();
// La resta ahora - hora_fin nos da la cantidad de tiempo que se paso el usuario
// en entregar el equipo a tiempo. Si es negativa es que fue antes de la hora_fin
const tardanza = Math.trunc(ahora.diff(moment(prestamo.hora_fin)) / 60000);
// Minutos que se tardo entre el tiempo configurable de la institución
const semanasCastigo = Math.trunc(
tardanza / operadorRegreso.institucion.tiempo_entrega,
);
this.validacionBasicaPrestamo(prestamo);
this.validacionOperadorPrestamo(prestamo, operadorRegreso, modulo);
// No se puede regresar el equipo si aun no se entrega
if (prestamo.equipo.status.id_status === 2)
throw new ConflictException(
'Aún no se ha entregado el equipo de cómputo al usuario.',
);
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;
prestamo.equipo.u = null;
prestamo.equipo.status.id_status = id_status;
// Si semanasCastigo es mayor a 0 significa que hay multa
if (semanasCastigo > 0) {
const mensajeTardanza = `El usaurio se tardó: ${tardanza} minutos en entregar el equipo de cómputo.`;
// Si se mando id_institucion_infraccion significa que ademas de entregar tarde,
// el usuario daño el equipo, por lo tanto tenemos que agregar la descripción del daño
// a motivo, y mandar la id_institucion_infraccion
if (id_institucion_infraccion)
await this.multaService.create(
prestamo,
@ -779,6 +785,7 @@ export class PrestamoService {
semanasCastigo,
id_institucion_infraccion,
);
// Multa normal
else
await this.multaService.create(
prestamo,
@ -787,6 +794,8 @@ export class PrestamoService {
semanasCastigo,
);
} else if (id_institucion_infraccion)
// 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,
@ -794,6 +803,8 @@ export class PrestamoService {
null,
id_institucion_infraccion,
);
console.log('hola');
// Guardo los cambios del préstamo
return this.repository
.save(prestamo)
.then((_) =>
@ -804,13 +815,12 @@ export class PrestamoService {
),
)
.then((_) => {
// Actualizo la interfaz del usuario
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
this.appGateway.actualizarOperador(
operadorRegreso.institucion.id_institucion,
);
return {
message: 'Se regresó el equipo de cómputo.',
};
return { message: 'Se regresó el equipo de cómputo.' };
});
}
@ -823,7 +833,8 @@ export class PrestamoService {
id_institucion_infraccion?: number,
modulo?: Modulo,
) {
return this.findInfoPrestamoById(id_prestamo).then((prestamo) =>
// Busco el prestamo por id prestamo y luego regreso el equipo
return this.findById(id_prestamo).then((prestamo) =>
this.regresar(
prestamo,
operador,
@ -845,7 +856,9 @@ export class PrestamoService {
id_institucion_infraccion?: number,
modulo?: Modulo,
) {
return this.findInfoPrestamoByNumeroInventario(
// Busco el prestamo por número de inventario y la institución del operador
// luego regreso el equipo
return this.findByNumeroInventario(
operador.institucion,
numero_inventario,
).then((prestamo) =>
@ -862,14 +875,17 @@ export class PrestamoService {
}
validacionBasicaPrestamo(prestamo: Prestamo) {
// Valido si el préstamo fue cancelado por el usuario
if (prestamo.cancelado_usuario)
throw new ConflictException(
'Este préstamo fue cancelado por el usuario.',
);
// Valido si el préstamo fue cancelado por el operador
if (prestamo.cancelado_operador)
throw new ConflictException(
'Este préstamo fue cancelado por un operador.',
);
// Valido si el préstamo esta inactivo
if (!prestamo.activo)
throw new ConflictException('Este préstamo ya no se encuentra activo.');
}