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

View File

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

View File

@ -1,6 +1,6 @@
import { ConflictException, Injectable } from '@nestjs/common'; import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm'; import { FindOptionsWhere, Repository } from 'typeorm';
import { Institucion } from 'src/institucion/entity/institucion.entity'; import { Institucion } from 'src/institucion/entity/institucion.entity';
import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity'; import { InstitucionCarrera } from '../institucion-carrera/entity/institucion-carrera.entity';
import { InstitucionUsuario } from './entity/institucion-usuario.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 return this.fullInformacionInstitucionUsuarioView
.find({ where: { id_usuario: usuario.id_usuario, activo: 1, multa: 0 } }) .find({ where: busqueda })
.then((infoInstitucionesUsuario) => { .then((infoInstitucionesUsuario) => {
const institucionesUsuario: InstitucionUsuario[] = []; const institucionesUsuario: InstitucionUsuario[] = [];

View File

@ -1,7 +1,7 @@
import * as moment from 'moment'; import * as moment from 'moment';
import { ConflictException, Injectable } from '@nestjs/common'; import { ConflictException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; 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 { Multa } from './entity/multa.entity';
import { FullInformacionMultaView } from './entity/views/full-informacion-multa.view'; import { FullInformacionMultaView } from './entity/views/full-informacion-multa.view';
import { InformacionMultaView } from './entity/views/informacion-multa.view'; import { InformacionMultaView } from './entity/views/informacion-multa.view';
@ -39,6 +39,7 @@ export class MultaService {
retraso?: number, retraso?: number,
id_institucion_infraccion?: number, id_institucion_infraccion?: number,
) { ) {
console.log('hola1');
const ahora = moment(); const ahora = moment();
const prestamo = const prestamo =
typeof id_prestamo === 'number' typeof id_prestamo === 'number'
@ -48,51 +49,59 @@ export class MultaService {
typeof id_operador === 'number' typeof id_operador === 'number'
? await this.operadorService.findById(id_operador) ? await this.operadorService.findById(id_operador)
: id_operador; : id_operador;
const data: DeepPartial<Multa> = { // Creo registro de multa
const nuevaMulta = this.repository.create({
descripcion, descripcion,
fecha_inicio: ahora.toDate(), fecha_inicio: ahora.toDate(),
operadorMulta: operador, operadorMulta: operador,
prestamo, prestamo,
}; });
let institucionInfraccion = id_institucion_infraccion let institucionInfraccion = id_institucion_infraccion
? await this.institucionInfraccionService.findById( ? await this.institucionInfraccionService.findById(
id_institucion_infraccion, id_institucion_infraccion,
) )
: null; : null;
// Valido que este prestamo no haya sido cancelado poer el usuario u operador
if (prestamo.cancelado_operador || prestamo.cancelado_usuario) if (prestamo.cancelado_operador || prestamo.cancelado_usuario)
throw new ConflictException( throw new ConflictException(
'No se puede multar a un usuario con un préstamo que fue cancelado.', 'No se puede multar a un usuario con un préstamo que fue cancelado.',
); );
// Si no se mando un id_institucion_infraccion
if (!institucionInfraccion) { if (!institucionInfraccion) {
// Si tampoco se mando retraso saco error
if (!retraso) if (!retraso)
throw new ConflictException( throw new ConflictException(
'No se mandó ningún motivo para multar a este alumno.', 'No se mandó ningún motivo para multar a este alumno.',
); );
// Asigno institucionInfraccion "Sin multa" por default
institucionInfraccion = institucionInfraccion =
await this.institucionInfraccionService.findSinInfraccion( await this.institucionInfraccionService.findSinInfraccion(
operador.institucion, operador.institucion,
); );
} }
// Busco una multa con este préstamo
return this.repository return this.repository
.findOne({ where: { prestamo } }) .findOne({ where: { prestamo } })
.then((existeMulta) => { .then((existeMulta) => {
// Si existe saco error
if (existeMulta) if (existeMulta)
throw new ConflictException( throw new ConflictException(
'Ya existe una multa asignada a este préstamo.', 'Ya existe una multa asignada a este préstamo.',
); );
// Si hay retraso lo agrego a la multa
if (retraso) { if (retraso) {
data.retraso = true; nuevaMulta.retraso = true;
ahora.add(retraso * operador.institucion.dias_multa_retraso, 'd'); ahora.add(retraso * operador.institucion.dias_multa_retraso, 'd');
} }
if (institucionInfraccion) { nuevaMulta.institucionInfraccion = institucionInfraccion;
data.institucionInfraccion = institucionInfraccion; ahora.add(institucionInfraccion.dias_multa, 'd');
ahora.add(institucionInfraccion.dias_multa, 'd'); nuevaMulta.fecha_fin = ahora.toDate();
} // Guardo la información
data.fecha_fin = ahora.toDate(); return this.repository.save(nuevaMulta);
return this.repository.save(this.repository.create(data));
}) })
.then((_) => .then((_) =>
// Actualizo multas del usuario
this.institucionUsuarioService.updateMulta( this.institucionUsuarioService.updateMulta(
operador.institucion.id_institucion, operador.institucion.id_institucion,
prestamo.usuario.id_usuario, 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() @IsOptional()
id_modulo?: string; id_modulo?: string;
@IsNumberString()
@IsOptional()
id_operador_entrega?: string;
@IsNumberString()
@IsOptional()
id_operador_regreso?: string;
@IsNumberString() @IsNumberString()
@IsOptional() @IsOptional()
id_prestamo?: string; id_prestamo?: string;

View File

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

View File

@ -33,6 +33,7 @@ import { InstitucionDiaService } from '../institucion-dia/institucion-dia.servic
import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service'; import { InstitucionProgramaService } from '../institucion-programa/institucion-programa.service';
import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service'; import { InstitucionTipoCarritoService } from '../institucion-tipo-carrito/institucion-tipo-carrito.service';
import { InstitucionTipoEntradaService } from '../institucion-tipo-entrada/institucion-tipo-entrada.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 { ModuloService } from '../modulo/modulo.service';
import { MultaService } from '../multa/multa.service'; import { MultaService } from '../multa/multa.service';
import { OperadorService } from '../operador/operador.service'; import { OperadorService } from '../operador/operador.service';
@ -56,6 +57,7 @@ export class PrestamoService {
private institucionProgramaService: InstitucionProgramaService, private institucionProgramaService: InstitucionProgramaService,
private institucionTipoCarritoService: InstitucionTipoCarritoService, private institucionTipoCarritoService: InstitucionTipoCarritoService,
private institucionTipoEntradaService: InstitucionTipoEntradaService, private institucionTipoEntradaService: InstitucionTipoEntradaService,
private institucionUsuarioService: InstitucionUsuarioService,
private moduloService: ModuloService, private moduloService: ModuloService,
@Inject(forwardRef(() => MultaService)) @Inject(forwardRef(() => MultaService))
private multaService: MultaService, private multaService: MultaService,
@ -70,7 +72,7 @@ export class PrestamoService {
motivo: string, motivo: string,
) { ) {
const ahora = moment(); const ahora = moment();
const prestamo = await this.findInfoPrestamoById(id_prestamo); const prestamo = await this.findById(id_prestamo);
this.validacionBasicaPrestamo(prestamo); this.validacionBasicaPrestamo(prestamo);
this.validacionOperadorPrestamo(prestamo, operadorRegreso); this.validacionOperadorPrestamo(prestamo, operadorRegreso);
@ -80,41 +82,45 @@ export class PrestamoService {
prestamo.operadorRegreso = operadorRegreso; prestamo.operadorRegreso = operadorRegreso;
prestamo.equipo.u = null; prestamo.equipo.u = null;
prestamo.equipo.status.id_status = 6; prestamo.equipo.status.id_status = 6;
return this.equipoService // Guardo cambios en el equipo, y envio el motivo de cancelación
.updateStatus(prestamo.equipo, operadorRegreso, motivo) return (
.then((_) => this.repository.save(prestamo)) this.equipoService
.then((_) => { .updateStatus(prestamo.equipo, operadorRegreso, motivo)
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); // Guardo cambios del prestamo
this.appGateway.actualizarOperador( .then((_) => this.repository.save(prestamo))
operadorRegreso.institucion.id_institucion, .then((_) => {
); // Actualizo interfaz de usaurios
return { message: 'Se canceló correctamente este préstamo.' }; 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 ahora = moment();
const prestamo = await this.findInfoPrestamoById(id_prestamo); const prestamo = await this.prestamoInfoByUsuario(usuario);
this.validacionBasicaPrestamo(prestamo); this.validacionBasicaPrestamo(prestamo);
// Saco error en status de equipo 3
if (prestamo.equipo.status.id_status === 3) if (prestamo.equipo.status.id_status === 3)
throw new ConflictException( throw new ConflictException(
'No puedes cancelar este préstamo una vez se te entregó el equipo.', 'No puedes cancelar este préstamo una vez que 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.',
); );
prestamo.activo = false; prestamo.activo = false;
prestamo.fecha_entrega = ahora.toDate(); prestamo.fecha_entrega = ahora.toDate();
prestamo.cancelado_usuario = true; prestamo.cancelado_usuario = true;
prestamo.equipo.u = null; prestamo.equipo.u = null;
prestamo.equipo.status.id_status = 1; prestamo.equipo.status.id_status = 1;
// Guardo cambios en el equipo
return this.equipoService return this.equipoService
.updateStatus(prestamo.equipo) .updateStatus(prestamo.equipo)
.then((_) => this.repository.save(prestamo)) .then((_) => this.repository.save(prestamo)) // Guardo cambios del prestamo
.then((_) => { .then((_) => {
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); // Actualizo interfaz de usaurios
this.appGateway.actualizarUsuario(usuario.id_usuario);
this.appGateway.actualizarOperador( this.appGateway.actualizarOperador(
prestamo.equipo.carrito.modulo.institucion.id_institucion, prestamo.equipo.carrito.modulo.institucion.id_institucion,
); );
@ -157,21 +163,25 @@ export class PrestamoService {
) )
: null; : null;
// Valido que no sea domingo
if (ahora.weekday() === 0) if (ahora.weekday() === 0)
throw new ConflictException('No hay servicio los días domingo.'); 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) if (!institucionDia.activo)
throw new ConflictException( throw new ConflictException(
'El día de hoy no hay servicio de préstamo de equipos.', '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) if (ahora < horaMin)
throw new ConflictException( throw new ConflictException(
`El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`, `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) if (ahora >= horaExtra)
throw new ConflictException( throw new ConflictException(
`El servicio terminó a las ${institucionDia.hora_extra} el día de hoy.`, `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++) { for (let i = 0; i < institucionDia.horasExcepcion.length; i++) {
const horaFin = moment( const horaFin = moment(
`${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`, `${ahoraStr} ${institucionDia.horasExcepcion[i].hora_fin}`,
@ -180,18 +190,30 @@ export class PrestamoService {
`${ahoraStr} ${institucionDia.horasExcepcion[i].hora_inicio}`, `${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) if (ahora > horaInicio && ahora < horaFin)
throw new ConflictException( 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 // Busco instituciones activas y sin multa de este usuario
.findOne({ where: { activo: 1, id_usuario: usuario.id_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) => { .then((existePrestamo) => {
// Saco error si lo encuentra
if (existePrestamo) if (existePrestamo)
throw new ConflictException( throw new ConflictException(
'Este usuario ya tiene un préstamo activo.', 'Este usuario ya tiene un préstamo activo.',
); );
// Busco un equipo con las caracteríasticas solicitadas
return this.equipoService.findEquipo( return this.equipoService.findEquipo(
usuario.id_usuario, usuario.id_usuario,
modulo, modulo,
@ -201,6 +223,7 @@ export class PrestamoService {
); );
}) })
.then((equipo) => .then((equipo) =>
// Genero el registro y lo guardo
this.repository.save( this.repository.save(
this.repository.create({ this.repository.create({
equipo, equipo,
@ -215,6 +238,7 @@ export class PrestamoService {
), ),
) )
.then((prestamo) => { .then((prestamo) => {
// Actualizo la interfaz del operador
this.appGateway.actualizarOperador(modulo.institucion.id_institucion); this.appGateway.actualizarOperador(modulo.institucion.id_institucion);
return prestamo; return prestamo;
}); });
@ -223,21 +247,27 @@ export class PrestamoService {
async desactivarPrestamos() { async desactivarPrestamos() {
const ahora = moment(); const ahora = moment();
// Busco todos los préstamos activos y que esten apartadoss
return this.informacionPrestamoView return this.informacionPrestamoView
.find({ where: { activo: 1, id_status: 2 } }) .find({ where: { activo: 1, id_status: 2 } })
.then(async (infoPrestamo) => { .then(async (infoPrestamo) => {
// Recorro el array
for (let i = 0; i < infoPrestamo.length; i++) { for (let i = 0; i < infoPrestamo.length; i++) {
const prestamo = this.viewToPrestamo(infoPrestamo[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) { if (ahora.diff(moment(prestamo.hora_max_recoger)) > 0) {
prestamo.activo = false; prestamo.activo = false;
prestamo.cancelado_operador = true; prestamo.cancelado_operador = true;
prestamo.equipo.u = null; prestamo.equipo.u = null;
prestamo.equipo.status.id_status = 1; prestamo.equipo.status.id_status = 1;
// Guardo los cambios del préstamo
await this.repository await this.repository
.save(prestamo) .save(prestamo)
.then((_) => this.equipoService.updateStatus(prestamo.equipo)) .then((_) => this.equipoService.updateStatus(prestamo.equipo))
.then((_) => { .then((_) => {
// Actualizo las interfazes del los usuarios
this.appGateway.actualizarOperador( this.appGateway.actualizarOperador(
prestamo.equipo.carrito.modulo.institucion.id_institucion, prestamo.equipo.carrito.modulo.institucion.id_institucion,
); );
@ -255,7 +285,7 @@ export class PrestamoService {
) { ) {
const ahora = moment(); const ahora = moment();
const ahoraStr = ahora.format('YYYY-MM-DD'); const ahoraStr = ahora.format('YYYY-MM-DD');
const prestamo = await this.findInfoPrestamoById(id_prestamo); const prestamo = await this.findById(id_prestamo);
const institucionDia = const institucionDia =
await this.institucionDiaService.findByInstitucionDia( await this.institucionDiaService.findByInstitucionDia(
operadorEntrega.institucion, operadorEntrega.institucion,
@ -270,6 +300,8 @@ export class PrestamoService {
this.validacionBasicaPrestamo(prestamo); this.validacionBasicaPrestamo(prestamo);
this.validacionOperadorPrestamo(prestamo, operadorEntrega, modulo); 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) if (prestamo.equipo.status.id_status === 3)
throw new ConflictException( throw new ConflictException(
'Ya se entregó el equipo de cómputo al usuario.', 'Ya se entregó el equipo de cómputo al usuario.',
@ -282,10 +314,12 @@ export class PrestamoService {
prestamo.operadorEntrega = operadorEntrega; prestamo.operadorEntrega = operadorEntrega;
prestamo.equipo.prestado = true; prestamo.equipo.prestado = true;
prestamo.equipo.status.id_status = 3; prestamo.equipo.status.id_status = 3;
return this.repository // Guardo los cambios del equipo
.save(prestamo) return this.equipoService
.then((_) => this.equipoService.updateStatus(prestamo.equipo)) .updateStatus(prestamo.equipo)
.then((_) => this.repository.save(prestamo)) // Guardo los cambios del préstamo
.then((_) => { .then((_) => {
// Actualizo la interfaz de los usuarios
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
this.appGateway.actualizarOperador( this.appGateway.actualizarOperador(
prestamo.equipo.carrito.modulo.institucion.id_institucion, prestamo.equipo.carrito.modulo.institucion.id_institucion,
@ -294,140 +328,7 @@ export class PrestamoService {
}); });
} }
async findAllByIdEquipo(id_equipo: number, pagina: number) { async findAll(filtros: {
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: {
pagina?: string; pagina?: string;
activo?: string | boolean; activo?: string | boolean;
cancelado_operador?: string; 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 return this.informacionPrestamoView
.findOne({ where: { id_prestamo } }) .findOne({ where: { id_prestamo } })
.then((infoPrestamo) => { .then((infoPrestamo) => {
@ -580,10 +586,7 @@ export class PrestamoService {
}); });
} }
findInfoPrestamoByNumeroInventario( findByNumeroInventario(institucion: Institucion, numero_inventario: string) {
institucion: Institucion,
numero_inventario: string,
) {
return this.informacionPrestamoView return this.informacionPrestamoView
.findOne({ .findOne({
where: { where: {
@ -646,9 +649,9 @@ export class PrestamoService {
}); });
} }
prestamoInfoByIdUsuario(id_usuario: number) { prestamoInfoByUsuario(usuario: Usuario) {
return this.prestamoInformacionView return this.prestamoInformacionView
.findOne({ where: { activo: 1, id_usuario } }) .findOne({ where: { activo: 1, id_usuario: usuario.id_usuario } })
.then((infoPrestamo) => { .then((infoPrestamo) => {
if (!infoPrestamo) if (!infoPrestamo)
throw new NotFoundException( throw new NotFoundException(
@ -688,17 +691,11 @@ export class PrestamoService {
} }
prestamoInfoByNumeroInventario( prestamoInfoByNumeroInventario(
id_institucion: number, operador: Operador,
numero_inventario: string, numero_inventario: string,
) { ) {
return this.institucionService return this.equipoService
.findById(id_institucion) .findByNumeroInventario(operador.institucion, numero_inventario)
.then((institucion) =>
this.equipoService.findByNumeroInventario(
institucion,
numero_inventario,
),
)
.then((equipo) => .then((equipo) =>
this.prestamoInformacionView.findOne({ this.prestamoInformacionView.findOne({
where: { activo: 1, id_equipo: equipo.id_equipo }, where: { activo: 1, id_equipo: equipo.id_equipo },
@ -750,27 +747,36 @@ export class PrestamoService {
modulo?: Modulo, modulo?: Modulo,
) { ) {
const ahora = moment(); 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); 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( const semanasCastigo = Math.trunc(
tardanza / operadorRegreso.institucion.tiempo_entrega, tardanza / operadorRegreso.institucion.tiempo_entrega,
); );
this.validacionBasicaPrestamo(prestamo); this.validacionBasicaPrestamo(prestamo);
this.validacionOperadorPrestamo(prestamo, operadorRegreso, modulo); this.validacionOperadorPrestamo(prestamo, operadorRegreso, modulo);
// No se puede regresar el equipo si aun no se entrega
if (prestamo.equipo.status.id_status === 2) if (prestamo.equipo.status.id_status === 2)
throw new ConflictException( throw new ConflictException(
'Aún no se ha entregado el equipo de cómputo al usuario.', 'Aún no se ha entregado el equipo de cómputo al usuario.',
); );
if (id_institucion_infraccion && !descripcion) if (id_institucion_infraccion && !descripcion)
throw new ConflictException('No se mandó la descripción de lo ocurrido.'); throw new ConflictException('No se mandó la descripción de lo ocurrido.');
console.log('HOLA');
prestamo.activo = false; prestamo.activo = false;
prestamo.fecha_entrega = ahora.toDate(); prestamo.fecha_entrega = ahora.toDate();
prestamo.operadorRegreso = operadorRegreso; prestamo.operadorRegreso = operadorRegreso;
prestamo.equipo.u = null; prestamo.equipo.u = null;
prestamo.equipo.status.id_status = id_status; prestamo.equipo.status.id_status = id_status;
// Si semanasCastigo es mayor a 0 significa que hay multa
if (semanasCastigo > 0) { if (semanasCastigo > 0) {
const mensajeTardanza = `El usaurio se tardó: ${tardanza} minutos en entregar el equipo de cómputo.`; 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) if (id_institucion_infraccion)
await this.multaService.create( await this.multaService.create(
prestamo, prestamo,
@ -779,6 +785,7 @@ export class PrestamoService {
semanasCastigo, semanasCastigo,
id_institucion_infraccion, id_institucion_infraccion,
); );
// Multa normal
else else
await this.multaService.create( await this.multaService.create(
prestamo, prestamo,
@ -787,6 +794,8 @@ export class PrestamoService {
semanasCastigo, semanasCastigo,
); );
} else if (id_institucion_infraccion) } 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( await this.multaService.create(
prestamo, prestamo,
operadorRegreso, operadorRegreso,
@ -794,6 +803,8 @@ export class PrestamoService {
null, null,
id_institucion_infraccion, id_institucion_infraccion,
); );
console.log('hola');
// Guardo los cambios del préstamo
return this.repository return this.repository
.save(prestamo) .save(prestamo)
.then((_) => .then((_) =>
@ -804,13 +815,12 @@ export class PrestamoService {
), ),
) )
.then((_) => { .then((_) => {
// Actualizo la interfaz del usuario
this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario);
this.appGateway.actualizarOperador( this.appGateway.actualizarOperador(
operadorRegreso.institucion.id_institucion, operadorRegreso.institucion.id_institucion,
); );
return { return { message: 'Se regresó el equipo de cómputo.' };
message: 'Se regresó el equipo de cómputo.',
};
}); });
} }
@ -823,7 +833,8 @@ export class PrestamoService {
id_institucion_infraccion?: number, id_institucion_infraccion?: number,
modulo?: Modulo, 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( this.regresar(
prestamo, prestamo,
operador, operador,
@ -845,7 +856,9 @@ export class PrestamoService {
id_institucion_infraccion?: number, id_institucion_infraccion?: number,
modulo?: Modulo, 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, operador.institucion,
numero_inventario, numero_inventario,
).then((prestamo) => ).then((prestamo) =>
@ -862,14 +875,17 @@ export class PrestamoService {
} }
validacionBasicaPrestamo(prestamo: Prestamo) { validacionBasicaPrestamo(prestamo: Prestamo) {
// Valido si el préstamo fue cancelado por el usuario
if (prestamo.cancelado_usuario) if (prestamo.cancelado_usuario)
throw new ConflictException( throw new ConflictException(
'Este préstamo fue cancelado por el usuario.', 'Este préstamo fue cancelado por el usuario.',
); );
// Valido si el préstamo fue cancelado por el operador
if (prestamo.cancelado_operador) if (prestamo.cancelado_operador)
throw new ConflictException( throw new ConflictException(
'Este préstamo fue cancelado por un operador.', 'Este préstamo fue cancelado por un operador.',
); );
// Valido si el préstamo esta inactivo
if (!prestamo.activo) if (!prestamo.activo)
throw new ConflictException('Este préstamo ya no se encuentra activo.'); throw new ConflictException('Este préstamo ya no se encuentra activo.');
} }