From fa5afd9531a1488ac4479bacad787e12cf0694eb Mon Sep 17 00:00:00 2001 From: lemuel Date: Tue, 28 Jun 2022 19:29:10 -0500 Subject: [PATCH] modulo prestamo final --- src/equipo/equipo.service.ts | 72 ++-- src/motivo/dto/output/motivo.dto.ts | 4 +- src/multa/dto/output/multas-equipo.dto.ts | 6 +- src/multa/dto/output/multas-usuario.dto.ts | 6 +- src/multa/dto/output/multas.dto.ts | 4 +- src/operador/dto/output/operador-min.dto.ts | 2 +- ...uipo.dto.ts => prestamo-equipo-min.dto.ts} | 6 +- .../dto/output/prestamo-equipo.dto.ts | 22 +- src/prestamo/dto/output/prestamo-min.dto.ts | 6 +- ...rio.dto.ts => prestamo-usuario-min.dto.ts} | 6 +- src/prestamo/dto/output/prestamo.dto.ts | 26 +- ...activo.dto.ts => prestamos-activos.dto.ts} | 16 +- .../dto/output/prestamos-equipo.dto.ts | 44 +++ ...suario.dto.ts => prestamos-usuario.dto.ts} | 17 +- src/prestamo/dto/output/prestamos.dto.ts | 49 +++ src/prestamo/prestamo.controller.ts | 19 +- src/prestamo/prestamo.service.ts | 359 ++++++++++++------ src/usuario/usuario.service.ts | 24 +- 18 files changed, 447 insertions(+), 241 deletions(-) rename src/prestamo/dto/output/{prestamo-min-equipo.dto.ts => prestamo-equipo-min.dto.ts} (100%) rename src/prestamo/dto/output/{prestamo-min-usuario.dto.ts => prestamo-usuario-min.dto.ts} (100%) rename src/prestamo/dto/output/{prestamo-activo.dto.ts => prestamos-activos.dto.ts} (74%) create mode 100644 src/prestamo/dto/output/prestamos-equipo.dto.ts rename src/prestamo/dto/output/{prestamo-usuario.dto.ts => prestamos-usuario.dto.ts} (63%) create mode 100644 src/prestamo/dto/output/prestamos.dto.ts diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index d29dbfb..67335ad 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -215,6 +215,24 @@ export class EquipoService { programa?: Programa, tipoEntrada?: TipoEntrada, ) { + const queryReseteo = this.repository + .createQueryBuilder('e') + .innerJoin('e.carrito', 'c', 'c.activo = 1') + .innerJoin('c.modulo', 'm', 'm.id_modulo = :id_modulo AND m.activo = 1', { + id_modulo: modulo.id_modulo, + }) + .innerJoin('m.institucion', 'i', 'i.activo = 1') + .innerJoin( + 'c.tipoCarrito', + 'tc', + 'tc.id_tipo_carrito = :id_tipo_carrito', + { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, + ) + .innerJoin('e.programas', 'ps') + .innerJoin('e.tiposEntradas', 'tes') + .andWhere('e.prestado = 1 AND e.id_status = 1') + .update() + .set({ prestado: false }); const query = this.repository .createQueryBuilder('e') .innerJoinAndSelect('e.carrito', 'c', 'c.activo = 1') @@ -242,51 +260,29 @@ export class EquipoService { .orderBy('c.carrito') .addOrderBy('e.equipo'); - if (programa) + if (programa) { query.andWhere('ps.id_programa = :id_programa', { id_programa: programa.id_programa, }); - else query.andWhere('ps.id_programa = 1'); - if (tipoEntrada) + queryReseteo.andWhere('ps.id_programa = :id_programa', { + id_programa: programa.id_programa, + }); + } else { + query.andWhere('ps.id_programa = 1'); + queryReseteo.andWhere('ps.id_programa = 1'); + } + if (tipoEntrada) { query.andWhere('tes.id_tipo_entrada = :id_tipo_entrada', { id_tipo_entrada: tipoEntrada.id_tipo_entrada, }); - return query; - } - - reseteo( - modulo: Modulo, - tipoCarrito: TipoCarrito, - programa?: Programa, - tipoEntrada?: TipoEntrada, - ) { - return this.findEquipo(modulo, tipoCarrito, programa, tipoEntrada) - .getCount() - .then((n) => { - if (n === 0) - return this.repository - .createQueryBuilder('e') - .innerJoin('e.carrito', 'c', 'c.activo = 1') - .innerJoin( - 'c.modulo', - 'm', - 'm.id_modulo = :id_modulo AND m.activo = 1', - { - id_modulo: modulo.id_modulo, - }, - ) - .innerJoin('m.institucion', 'i', 'i.activo = 1') - .innerJoin( - 'c.tipoCarrito', - 'tc', - 'tc.id_tipo_carrito = :id_tipo_carrito', - { id_tipo_carrito: tipoCarrito.id_tipo_carrito }, - ) - .andWhere('e.prestado = 1 AND e.id_status = 1') - .update() - .set({ prestado: false }) - .execute(); + queryReseteo.andWhere('tes.id_tipo_entrada = :id_tipo_entrada', { + id_tipo_entrada: tipoEntrada.id_tipo_entrada, }); + } + return query.getCount().then(async (n) => { + if (n === 0) await queryReseteo.execute(); + return query.getOne(); + }); } reseteoTotal() { diff --git a/src/motivo/dto/output/motivo.dto.ts b/src/motivo/dto/output/motivo.dto.ts index b46ed3c..53a4c6d 100644 --- a/src/motivo/dto/output/motivo.dto.ts +++ b/src/motivo/dto/output/motivo.dto.ts @@ -1,5 +1,5 @@ import { Expose, Type } from 'class-transformer'; -import { OperadorMinsOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; import { StatusOutputDto } from '../../../status/dto/output/status.dto'; export class MotivoOutputDto { @@ -13,7 +13,7 @@ export class MotivoOutputDto { motivo; @Expose() - @Type(() => OperadorMinsOutputDto) + @Type(() => OperadorMinOutputDto) operador; @Expose() diff --git a/src/multa/dto/output/multas-equipo.dto.ts b/src/multa/dto/output/multas-equipo.dto.ts index 168d48c..1e96401 100644 --- a/src/multa/dto/output/multas-equipo.dto.ts +++ b/src/multa/dto/output/multas-equipo.dto.ts @@ -1,7 +1,7 @@ import { Expose, Type } from 'class-transformer'; import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto'; -import { PrestamoMinEquipoOutputDto } from '../../../prestamo/dto/output/prestamo-min-equipo.dto'; -import { OperadorMinsOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { PrestamoMinEquipoOutputDto } from '../../../prestamo/dto/output/prestamo-equipo-min.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; export class MultasEquipoOutputDto { @Expose() @@ -23,7 +23,7 @@ export class MultasEquipoOutputDto { retraso; @Expose() - @Type(() => OperadorMinsOutputDto) + @Type(() => OperadorMinOutputDto) opeardorMulta; @Expose() diff --git a/src/multa/dto/output/multas-usuario.dto.ts b/src/multa/dto/output/multas-usuario.dto.ts index 3916047..17783d2 100644 --- a/src/multa/dto/output/multas-usuario.dto.ts +++ b/src/multa/dto/output/multas-usuario.dto.ts @@ -1,7 +1,7 @@ import { Expose, Type } from 'class-transformer'; import { InstitucionInfraccionOutputDto } from '../../../institucion-infraccion/dto/output/institucion-infraccion.dto'; -import { PrestamoMinUsuarioOutputDto } from '../../../prestamo/dto/output/prestamo-min-usuario.dto'; -import { OperadorMinsOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { PrestamoMinUsuarioOutputDto } from '../../../prestamo/dto/output/prestamo-usuario-min.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; export class MultasUsuarioOutputDto { @Expose() @@ -23,7 +23,7 @@ export class MultasUsuarioOutputDto { retraso; @Expose() - @Type(() => OperadorMinsOutputDto) + @Type(() => OperadorMinOutputDto) opeardorMulta; @Expose() diff --git a/src/multa/dto/output/multas.dto.ts b/src/multa/dto/output/multas.dto.ts index c3a0560..fa7adaa 100644 --- a/src/multa/dto/output/multas.dto.ts +++ b/src/multa/dto/output/multas.dto.ts @@ -1,7 +1,7 @@ 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 { OperadorMinsOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; export class MultasOutputDto { @Expose() @@ -23,7 +23,7 @@ export class MultasOutputDto { retraso; @Expose() - @Type(() => OperadorMinsOutputDto) + @Type(() => OperadorMinOutputDto) opeardorMulta; @Expose() diff --git a/src/operador/dto/output/operador-min.dto.ts b/src/operador/dto/output/operador-min.dto.ts index cd32b3a..69f6561 100644 --- a/src/operador/dto/output/operador-min.dto.ts +++ b/src/operador/dto/output/operador-min.dto.ts @@ -2,7 +2,7 @@ import { Expose, Type } from 'class-transformer'; import { InstitucionMinOutputDto } from '../../../institucion/dto/output/institucion-min.dto'; import { TipoUsuarioOutputDto } from '../../../tipo-usuario/dto/output/tipo-usuario.dto'; -export class OperadorMinsOutputDto { +export class OperadorMinOutputDto { @Expose() id_operador; diff --git a/src/prestamo/dto/output/prestamo-min-equipo.dto.ts b/src/prestamo/dto/output/prestamo-equipo-min.dto.ts similarity index 100% rename from src/prestamo/dto/output/prestamo-min-equipo.dto.ts rename to src/prestamo/dto/output/prestamo-equipo-min.dto.ts index 9fe4637..a0cb439 100644 --- a/src/prestamo/dto/output/prestamo-min-equipo.dto.ts +++ b/src/prestamo/dto/output/prestamo-equipo-min.dto.ts @@ -2,6 +2,9 @@ import { Expose, Type } from 'class-transformer'; import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; export class PrestamoMinEquipoOutputDto { + @Expose() + id_prestamo; + @Expose() fecha_entrega; @@ -14,9 +17,6 @@ export class PrestamoMinEquipoOutputDto { @Expose() hora_inicio; - @Expose() - id_prestamo; - @Expose() @Type(() => UsuariosOutputDto) usuario; diff --git a/src/prestamo/dto/output/prestamo-equipo.dto.ts b/src/prestamo/dto/output/prestamo-equipo.dto.ts index 2f35377..4765eb6 100644 --- a/src/prestamo/dto/output/prestamo-equipo.dto.ts +++ b/src/prestamo/dto/output/prestamo-equipo.dto.ts @@ -1,17 +1,14 @@ import { Expose, Type } from 'class-transformer'; -import { OperadorMinsOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto'; import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; export class PrestamoEquipoOutputDto { + @Expose() + id_prestamo; + @Expose() activo; - @Expose() - cancelado_operador; - - @Expose() - cancelado_usuario; - @Expose() fecha_entrega; @@ -28,15 +25,8 @@ export class PrestamoEquipoOutputDto { hora_max_recoger; @Expose() - id_prestamo; - - @Expose() - @Type(() => OperadorMinsOutputDto) - operadorEntrega; - - @Expose() - @Type(() => OperadorMinsOutputDto) - operadorRegreso; + @Type(() => EquipoMinOutputDto) + equipo; @Expose() @Type(() => UsuariosOutputDto) diff --git a/src/prestamo/dto/output/prestamo-min.dto.ts b/src/prestamo/dto/output/prestamo-min.dto.ts index 979df8d..496296a 100644 --- a/src/prestamo/dto/output/prestamo-min.dto.ts +++ b/src/prestamo/dto/output/prestamo-min.dto.ts @@ -3,6 +3,9 @@ import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto'; import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; export class PrestamoMinOutputDto { + @Expose() + id_prestamo; + @Expose() fecha_entrega; @@ -15,9 +18,6 @@ export class PrestamoMinOutputDto { @Expose() hora_inicio; - @Expose() - id_prestamo; - @Expose() @Type(() => EquipoMinOutputDto) equipo; diff --git a/src/prestamo/dto/output/prestamo-min-usuario.dto.ts b/src/prestamo/dto/output/prestamo-usuario-min.dto.ts similarity index 100% rename from src/prestamo/dto/output/prestamo-min-usuario.dto.ts rename to src/prestamo/dto/output/prestamo-usuario-min.dto.ts index 7452ecc..239c37f 100644 --- a/src/prestamo/dto/output/prestamo-min-usuario.dto.ts +++ b/src/prestamo/dto/output/prestamo-usuario-min.dto.ts @@ -2,6 +2,9 @@ import { Expose, Type } from 'class-transformer'; import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto'; export class PrestamoMinUsuarioOutputDto { + @Expose() + id_prestamo; + @Expose() fecha_entrega; @@ -14,9 +17,6 @@ export class PrestamoMinUsuarioOutputDto { @Expose() hora_inicio; - @Expose() - id_prestamo; - @Expose() @Type(() => EquipoMinOutputDto) equipo; diff --git a/src/prestamo/dto/output/prestamo.dto.ts b/src/prestamo/dto/output/prestamo.dto.ts index d79be43..ed947d7 100644 --- a/src/prestamo/dto/output/prestamo.dto.ts +++ b/src/prestamo/dto/output/prestamo.dto.ts @@ -1,18 +1,13 @@ import { Expose, Type } from 'class-transformer'; import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto'; -import { OperadorMinsOutputDto } from '../../../operador/dto/output/operador-min.dto'; -import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; export class PrestamoOutputDto { + @Expose() + id_prestamo; + @Expose() activo; - @Expose() - cancelado_operador; - - @Expose() - cancelado_usuario; - @Expose() fecha_entrega; @@ -28,22 +23,7 @@ export class PrestamoOutputDto { @Expose() hora_max_recoger; - @Expose() - id_prestamo; - @Expose() @Type(() => EquipoMinOutputDto) equipo; - - @Expose() - @Type(() => OperadorMinsOutputDto) - operadorEntrega; - - @Expose() - @Type(() => OperadorMinsOutputDto) - operadorRegreso; - - @Expose() - @Type(() => UsuariosOutputDto) - usuario; } diff --git a/src/prestamo/dto/output/prestamo-activo.dto.ts b/src/prestamo/dto/output/prestamos-activos.dto.ts similarity index 74% rename from src/prestamo/dto/output/prestamo-activo.dto.ts rename to src/prestamo/dto/output/prestamos-activos.dto.ts index d4ad07b..ca5c256 100644 --- a/src/prestamo/dto/output/prestamo-activo.dto.ts +++ b/src/prestamo/dto/output/prestamos-activos.dto.ts @@ -2,18 +2,9 @@ import { Expose, Type } from 'class-transformer'; import { EquiposOutputDto } from '../../../equipo/dto/output/equipos.dto'; import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; -export class PrestamoActivoOutputDto { +export class PrestamosActivosOutputDto { @Expose() - activo; - - @Expose() - cancelado_operador; - - @Expose() - cancelado_usuario; - - @Expose() - fecha_entrega; + id_prestamo; @Expose() fecha_inicio; @@ -27,9 +18,6 @@ export class PrestamoActivoOutputDto { @Expose() hora_max_recoger; - @Expose() - id_prestamo; - @Expose() @Type(() => EquiposOutputDto) equipo; diff --git a/src/prestamo/dto/output/prestamos-equipo.dto.ts b/src/prestamo/dto/output/prestamos-equipo.dto.ts new file mode 100644 index 0000000..5db113b --- /dev/null +++ b/src/prestamo/dto/output/prestamos-equipo.dto.ts @@ -0,0 +1,44 @@ +import { Expose, Type } from 'class-transformer'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; + +export class PrestamosEquipoOutputDto { + @Expose() + id_prestamo; + + @Expose() + activo; + + @Expose() + cancelado_operador; + + @Expose() + cancelado_usuario; + + @Expose() + fecha_entrega; + + @Expose() + fecha_inicio; + + @Expose() + hora_fin; + + @Expose() + hora_inicio; + + @Expose() + hora_max_recoger; + + @Expose() + @Type(() => OperadorMinOutputDto) + operadorEntrega; + + @Expose() + @Type(() => OperadorMinOutputDto) + operadorRegreso; + + @Expose() + @Type(() => UsuariosOutputDto) + usuario; +} diff --git a/src/prestamo/dto/output/prestamo-usuario.dto.ts b/src/prestamo/dto/output/prestamos-usuario.dto.ts similarity index 63% rename from src/prestamo/dto/output/prestamo-usuario.dto.ts rename to src/prestamo/dto/output/prestamos-usuario.dto.ts index 79544a2..130c675 100644 --- a/src/prestamo/dto/output/prestamo-usuario.dto.ts +++ b/src/prestamo/dto/output/prestamos-usuario.dto.ts @@ -1,7 +1,11 @@ import { Expose, Type } from 'class-transformer'; import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; + +export class PrestamosUsuarioOutputDto { + @Expose() + id_prestamo; -export class PrestamoUsuarioOutputDto { @Expose() activo; @@ -26,10 +30,15 @@ export class PrestamoUsuarioOutputDto { @Expose() hora_max_recoger; - @Expose() - id_prestamo; - @Expose() @Type(() => EquipoMinOutputDto) equipo; + + @Expose() + @Type(() => OperadorMinOutputDto) + operadorEntrega; + + @Expose() + @Type(() => OperadorMinOutputDto) + operadorRegreso; } diff --git a/src/prestamo/dto/output/prestamos.dto.ts b/src/prestamo/dto/output/prestamos.dto.ts new file mode 100644 index 0000000..577663e --- /dev/null +++ b/src/prestamo/dto/output/prestamos.dto.ts @@ -0,0 +1,49 @@ +import { Expose, Type } from 'class-transformer'; +import { EquipoMinOutputDto } from '../../../equipo/dto/output/equipo-min.dto'; +import { OperadorMinOutputDto } from '../../../operador/dto/output/operador-min.dto'; +import { UsuariosOutputDto } from '../../../usuario/dto/output/usuarios.dto'; + +export class PrestamosOutputDto { + @Expose() + id_prestamo; + + @Expose() + activo; + + @Expose() + cancelado_operador; + + @Expose() + cancelado_usuario; + + @Expose() + fecha_entrega; + + @Expose() + fecha_inicio; + + @Expose() + hora_fin; + + @Expose() + hora_inicio; + + @Expose() + hora_max_recoger; + + @Expose() + @Type(() => EquipoMinOutputDto) + equipo; + + @Expose() + @Type(() => OperadorMinOutputDto) + operadorEntrega; + + @Expose() + @Type(() => OperadorMinOutputDto) + operadorRegreso; + + @Expose() + @Type(() => UsuariosOutputDto) + usuario; +} diff --git a/src/prestamo/prestamo.controller.ts b/src/prestamo/prestamo.controller.ts index 2f8707e..5db1b5e 100644 --- a/src/prestamo/prestamo.controller.ts +++ b/src/prestamo/prestamo.controller.ts @@ -2,7 +2,6 @@ import { Body, Controller, Get, Post, Put, Query } from '@nestjs/common'; import { ApiBody, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { PrestamoService } from './prestamo.service'; - import { ActivosDto } from './dto/input/activos.dto'; import { CancelarUsuarioDto } from './dto/input/cancelar-usuario.dto'; import { CancelarOperadorDto } from './dto/input/cancelar-operador.dto'; @@ -18,16 +17,18 @@ import { RegresarIdPrestamoDto } from './dto/input/regresar-id-prestamo.dto'; import { RegresarNumeroInventarioDto } from './dto/input/regresar-numero-inventario.dto'; import { PrestamoOutputDto } from './dto/output/prestamo.dto'; -import { PrestamoActivoOutputDto } from './dto/output/prestamo-activo.dto'; -import { PrestamoUsuarioOutputDto } from './dto/output/prestamo-usuario.dto'; import { PrestamoEquipoOutputDto } from './dto/output/prestamo-equipo.dto'; +import { PrestamosOutputDto } from './dto/output/prestamos.dto'; +import { PrestamosActivosOutputDto } from './dto/output/prestamos-activos.dto'; +import { PrestamosEquipoOutputDto } from './dto/output/prestamos-equipo.dto'; +import { PrestamosUsuarioOutputDto } from './dto/output/prestamos-usuario.dto'; @Controller('prestamo') @ApiTags('prestamo') export class PrestamoController { constructor(private prestamoService: PrestamoService) {} - @Serealize(PrestamoActivoOutputDto) + @Serealize(PrestamosActivosOutputDto) @Get('activos') @ApiOperation({ description: @@ -130,7 +131,7 @@ export class PrestamoController { return this.prestamoService.entregar(body.id_prestamo, body.id_operador); } - @Serealize(PrestamoOutputDto) + @Serealize(PrestamosOutputDto) @Get('historial') @ApiOperation({ description: @@ -205,7 +206,7 @@ export class PrestamoController { return this.prestamoService.findAll(query); } - @Serealize(PrestamoEquipoOutputDto) + @Serealize(PrestamosEquipoOutputDto) @Get('historial-equipo') @ApiOperation({ description: @@ -228,7 +229,7 @@ export class PrestamoController { ); } - @Serealize(PrestamoUsuarioOutputDto) + @Serealize(PrestamosUsuarioOutputDto) @Get('historial-usuario') @ApiOperation({ description: @@ -251,7 +252,7 @@ export class PrestamoController { ); } - @Serealize(PrestamoUsuarioOutputDto) + @Serealize(PrestamosUsuarioOutputDto) @Post() @ApiOperation({ description: 'Endpoint que crea un prestamo nuevo.' }) @ApiBody({ @@ -287,7 +288,7 @@ export class PrestamoController { return this.prestamoService.findById(parseInt(query.id_prestamo)); } - @Serealize(PrestamoUsuarioOutputDto) + @Serealize(PrestamoOutputDto) @Get('prestamo-id-usuario') @ApiOperation({ description: diff --git a/src/prestamo/prestamo.service.ts b/src/prestamo/prestamo.service.ts index 3f3c2b5..3b7f06c 100644 --- a/src/prestamo/prestamo.service.ts +++ b/src/prestamo/prestamo.service.ts @@ -7,13 +7,11 @@ import { NotFoundException, } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { FindOperator, Like, Repository } from 'typeorm'; +import { Repository } from 'typeorm'; +import { AppGateway } from '../app.gateway'; import { Institucion } from '../institucion/entity/institucion.entity'; -import { Modulo } from '../modulo/entity/modulo.entity'; import { Operador } from '../operador/entity/operador.entity'; import { Prestamo } from './entity/prestamo.entity'; -import { TipoCarrito } from '../institucion-tipo-carrito/entity/tipo-carrito.entity'; -import { TipoUsuario } from '../tipo-usuario/entity/tipo-usuario.entity'; import { EquipoService } from '../equipo/equipo.service'; import { InstitucionService } from '../institucion/institucion.service'; import { InstitucionDiaService } from '../institucion-dia/institucion-dia.service'; @@ -26,7 +24,6 @@ import { MultaService } from '../multa/multa.service'; import { OperadorService } from '../operador/operador.service'; import { TipoUsuarioService } from '../tipo-usuario/tipo-usuario.service'; import { UsuarioService } from '../usuario/usuario.service'; -import { AppGateway } from '../app.gateway'; @Injectable() export class PrestamoService { @@ -106,6 +103,8 @@ export class PrestamoService { id_tipo_entrada?: number, ) { const ahora = moment(); + const mensajeNoPoderPedir = 'No puedes pedir equipos de cómputo porque:'; + const sistema = await this.operadorService.findById(1); const usuario = await this.usuarioService.findById(id_usuario, true, true); const modulo = await this.moduloService.findById(id_modulo); const tipoCarrito = @@ -120,41 +119,68 @@ export class PrestamoService { id_tipo_entrada, ) : null; + const institucionDia = await this.institucionDiaService.findInstitucionDia( + modulo.institucion, + ahora.weekday(), + ); + const horaMax = moment( + `${ahora.format('YYYY-MM-DD')} ${institucionDia.hora_fin}`, + ); + const horaMin = moment( + `${ahora.format('YYYY-MM-DD')} ${institucionDia.hora_inicio}`, + ); - if (ahora.weekday() === 0 || ahora.weekday() === 6) + if (!usuario.activo) throw new ConflictException( - 'No se puede pedir equipo de cómputo los sabados y domingos.', + `${mensajeNoPoderPedir} tu cuenta esta desactivada.`, ); - else { - const institucionDia = - await this.institucionDiaService.findInstitucionDia( - modulo.institucion, - ahora.weekday(), - ); - const horaMax = moment( - `${ahora.format('YYYY-MM-DD')} ${institucionDia.hora_fin}`, - ); - const horaMin = moment( - `${ahora.format('YYYY-MM-DD')} ${institucionDia.hora_inicio}`, - ); - if (!institucionDia.activo) - throw new ConflictException( - 'El día de hoy no se esta realizando préstamos de equipos.', - ); - if (ahora > horaMax) - throw new Error('Ya no se puede realizar un préstamo el día de hoy.'); - if (ahora < horaMin) - throw new Error('Aún es muy temprano para realizar un préstamo.'); + if (ahora.weekday() === 0 || ahora.weekday() === 6) + throw new ConflictException('No hay servicio los días sábado y domingo.'); + for (let i = 0; i < usuario.instituciones.length; i++) { + const institucion = + usuario.instituciones[i].institucionCarrera.institucion; + + if (institucion.id_institucion === modulo.institucion.id_institucion) { + if (!usuario.instituciones[i].activo) + throw new ConflictException( + `${mensajeNoPoderPedir} tu cuenta esta desactivada en esta institución.`, + ); + if (usuario.instituciones[i].multa) + throw new ConflictException( + `${mensajeNoPoderPedir} tienes una multa activa.`, + ); + break; + } } - for (let i = 0; i < usuario.instituciones.length; i++) - if ( - usuario.instituciones[i].institucionCarrera.institucion - .id_institucion === modulo.institucion.id_institucion && - usuario.instituciones[i].multa - ) + if (!institucionDia.activo) + throw new ConflictException( + 'El día de hoy no hay servicio de préstamo de equipos.', + ); + if (ahora < horaMin) + throw new ConflictException( + `El servicio inicia a las ${institucionDia.hora_inicio} el día de hoy.`, + ); + if (ahora > horaMax) + throw new ConflictException( + `El servicio terminó a las ${institucionDia.hora_fin} el día de hoy.`, + ); + for (let i = 0; i < institucionDia.horasExcepcion.length; i++) { + const horaFin = moment( + `${ahora.format('YYYY-MM-DD')} ${ + institucionDia.horasExcepcion[i].hora_fin + }`, + ); + const horaInicio = moment( + `${ahora.format('YYYY-MM-DD')} ${ + institucionDia.horasExcepcion[i].hora_inicio + }`, + ); + + if (ahora > horaInicio && ahora < horaFin) throw new ConflictException( - 'Este usuario tiene una multa activa. No puede pedir equipos de cómputo.', + `Se suspendió temporalmente el servicio de ${institucionDia.horasExcepcion[i].hora_inicio} a ${institucionDia.horasExcepcion[i].hora_fin}.`, ); + } return this.repository .findOne({ activo: true, usuario }) .then((existePrestamo) => { @@ -162,18 +188,13 @@ export class PrestamoService { throw new ConflictException( 'Este usuario ya tiene un préstamo activo.', ); - return this.equipoService.reseteo( + return this.equipoService.findEquipo( modulo, tipoCarrito, programa, tipoEntrada, ); }) - .then((_) => - this.equipoService - .findEquipo(modulo, tipoCarrito, programa, tipoEntrada) - .getOne(), - ) .then(async (equipo) => { if (!equipo) throw new ConflictException( @@ -189,6 +210,8 @@ export class PrestamoService { hora_max_recoger: ahora .add(modulo.institucion.tiempo_recoger, 'm') .toDate(), + operadorEntrega: sistema, + operadorRegreso: sistema, usuario, }), ), @@ -201,11 +224,10 @@ export class PrestamoService { async desactivarPrestamos() { const ahora = moment(); - const sistema = await this.operadorService.findById(1); return this.repository .find({ - join: { alias: 'p', innerJoin: { e: 'p.equipo' } }, + join: { alias: 'p', innerJoin: { e: 'p.equipo', s: 'e.status' } }, where: { activo: true, equipo: { status: { id_status: 2 } } }, }) .then(async (prestamos) => { @@ -213,7 +235,6 @@ export class PrestamoService { if (ahora.diff(moment(prestamos[i].hora_max_recoger)) > 0) { prestamos[i].activo = false; prestamos[i].cancelado_operador = true; - prestamos[i].operadorRegreso = sistema; await this.repository .save(prestamos[i]) .then((_) => @@ -253,7 +274,7 @@ export class PrestamoService { .then((_) => { this.appGateway.actualizarUsuario(prestamo.usuario.id_usuario); return { - message: 'Se entregó el equipo de cómputo correctamente.', + message: 'Se entregó el equipo de cómputo al usuario.', equipo: prestamo.equipo, }; }); @@ -275,29 +296,32 @@ export class PrestamoService { id_tipo_usuario?: string; usuario?: string; }) { - const busqueda: { - activo?: boolean; - fechaInicio?: Date; - fechaFin?: Date; - id_prestamo?: FindOperator; - equipo: { - equipo?: FindOperator; - carrito: { - carrito?: FindOperator; - modulo?: Modulo | { institucion: Institucion }; - tipoCarrito?: TipoCarrito; - }; - }; - usuario: { - usuario?: FindOperator; - tipoUsuario?: TipoUsuario; - }; - operadorEntrega?: Operador; - operadorRegreso?: Operador; - } = { - equipo: { carrito: {} }, - usuario: {}, - }; + const query = this.repository + .createQueryBuilder('p') + .innerJoinAndSelect('p.usuario', 'u') + .innerJoinAndSelect('u.instituciones', 'is') + .innerJoinAndSelect('is.institucionCarrera', 'ic') + .innerJoinAndSelect('ic.institucion', 'in') + .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') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .innerJoinAndSelect('p.operadorEntrega', 'oe') + .innerJoinAndSelect('oe.tipoUsuario', 'tuoe') + .innerJoinAndSelect('p.operadorRegreso', 'or') + .innerJoinAndSelect('or.tipoUsuario', 'tuor') + .orderBy('i.institucion') + .addOrderBy('m.modulo') + .addOrderBy('tc.tipo_carrito') + .addOrderBy('c.carrito') + .addOrderBy('e.equipo') + .addOrderBy('p.id_prestamo', 'DESC') + .skip((parseInt(filtros.pagina) - 1) * 25) + .take(25); const institucion = filtros.id_institucion ? await this.institucionService.findById(parseInt(filtros.id_institucion)) : null; @@ -326,71 +350,161 @@ export class PrestamoService { : null; if (filtros.activo) { - if (typeof filtros.activo === 'boolean') busqueda.activo = filtros.activo; - else busqueda.activo = filtros.activo === 'true'; + if (typeof filtros.activo === 'boolean') + query.andWhere('p.activo = :activo', { activo: filtros.activo }); + else + query.andWhere('p.activo = :activo', { + activo: filtros.activo === 'true', + }); } + if (filtros.id_prestamo) + query.andWhere('p.id_prestamo LIKE :id_prestamo', { + id_prestamo: `%${filtros.id_prestamo}%`, + }); if (filtros.carrito) - busqueda.equipo.carrito.carrito = Like(`%${filtros.carrito}%`); - if (filtros.equipo) busqueda.equipo.equipo = Like(`%${filtros.equipo}%`); - if (filtros.id_prestamo) busqueda.id_prestamo = Like(filtros.id_prestamo); + query.andWhere('c.carrito LIKE :carrito', { + carrito: `%${filtros.carrito}%`, + }); + if (filtros.equipo) + query.andWhere('e.equipo LIKE :equipo', { + equipo: `%${filtros.equipo}%`, + }); if (filtros.usuario) - busqueda.usuario.usuario = Like(`%${filtros.usuario}%`); - if (institucion) busqueda.equipo.carrito.modulo = { institucion }; - if (modulo) busqueda.equipo.carrito.modulo = modulo; - if (operadorEntrega) busqueda.operadorEntrega = operadorEntrega; - if (operadorRegreso) busqueda.operadorRegreso = operadorRegreso; - if (tipoCarrito) busqueda.equipo.carrito.tipoCarrito = tipoCarrito; - if (tipoUsuario) busqueda.usuario.tipoUsuario = tipoUsuario; - return this.repository.findAndCount({ - join: { - alias: 'p', - innerJoinAndSelect: { - e: 'p.equipo', - u: 'p.usuario', - c: 'e.carrito', - m: 'c.modulo', - tc: 'c.tipoCarrito', - }, - }, - where: busqueda, - skip: (parseInt(filtros.pagina) - 1) * 25, - take: 25, - }); + query.andWhere('u.usuario LIKE :usuario', { + usuario: `%${filtros.usuario}%`, + }); + if (institucion) + query.andWhere('i.id_institucion = :id_institucion', { + id_institucion: institucion.id_institucion, + }); + if (modulo) + query.andWhere('m.id_modulo = :id_modulo', { + id_modulo: modulo.id_modulo, + }); + if (tipoCarrito) + query.andWhere('tc.id_tipo_carrito = :id_tipo_carrito', { + id_tipo_carrito: tipoCarrito.id_tipo_carrito, + }); + if (tipoUsuario) + query.andWhere('tu.id_tipo_usuario = :id_tipo_usuario', { + id_tipo_usuario: tipoUsuario.id_tipo_usuario, + }); + if (operadorEntrega) + query.andWhere('p.id_operador_entrega = :id_operador_entrega', { + id_operador_entrega: operadorEntrega.id_operador, + }); + if (operadorRegreso) + query.andWhere('p.id_operador_regreso = :id_operador_regreso', { + id_operador_regreso: operadorRegreso.id_operador, + }); + return query.getManyAndCount(); } findAllByIdUsuario(id_usuario: number, pagina: number) { return this.usuarioService .findById(id_usuario, true, true) .then((usuario) => - this.repository.findAndCount({ - where: { usuario }, - skip: (pagina - 1) * 25, - take: 25, - }), + this.repository + .createQueryBuilder('p') + .innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', { + id_usuario: usuario.id_usuario, + }) + .innerJoinAndSelect('p.equipo', 'e') + .innerJoinAndSelect('e.status', 's') + .innerJoinAndSelect('e.carrito', 'c') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('m.institucion', 'i') + .innerJoinAndSelect('p.operadorEntrega', 'oe') + .innerJoinAndSelect('oe.tipoUsuario', 'tuoe') + .innerJoinAndSelect('p.operadorRegreso', 'or') + .innerJoinAndSelect('or.tipoUsuario', 'tuor') + .skip((pagina - 1) * 25) + .take(25) + .getManyAndCount(), ); } async findAllByIdEquipo(id_equipo: number, pagina: number) { return this.equipoService.findById(id_equipo).then((equipo) => - this.repository.findAndCount({ - where: { equipo }, - skip: (pagina - 1) * 25, - take: 25, - }), + this.repository + .createQueryBuilder('p') + .innerJoinAndSelect('p.usuario', 'u') + .innerJoinAndSelect('u.instituciones', 'is') + .innerJoinAndSelect('is.institucionCarrera', 'ic') + .innerJoinAndSelect('ic.institucion', 'in') + .innerJoinAndSelect('ic.carrera', 'ca') + .innerJoinAndSelect('ca.nivel', 'n') + .innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', { + id_equipo: equipo.id_equipo, + }) + .innerJoinAndSelect('e.status', 's') + .innerJoinAndSelect('e.carrito', 'c') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('m.institucion', 'i') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .innerJoinAndSelect('p.operadorEntrega', 'oe') + .innerJoinAndSelect('oe.tipoUsuario', 'tuoe') + .innerJoinAndSelect('p.operadorRegreso', 'or') + .innerJoinAndSelect('or.tipoUsuario', 'tuor') + .orderBy('p.id_prestamo', 'DESC') + .skip((pagina - 1) * 25) + .take(25) + .getManyAndCount(), ); } findById(id_prestamo: number) { - return this.repository.findOne({ id_prestamo }).then((prestamo) => { - if (!prestamo) throw new NotFoundException('No existe este préstamo.'); - return prestamo; - }); + return this.repository + .createQueryBuilder('p') + .innerJoinAndSelect('p.usuario', 'u') + .innerJoinAndSelect('u.instituciones', 'is') + .innerJoinAndSelect('is.institucionCarrera', 'ic') + .innerJoinAndSelect('ic.institucion', 'in') + .innerJoinAndSelect('ic.carrera', 'ca') + .innerJoinAndSelect('ca.nivel', 'n') + .innerJoinAndSelect('p.equipo', 'e') + .innerJoinAndSelect('e.carrito', 'c') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('m.institucion', 'i') + .innerJoinAndSelect('e.status', 's') + .innerJoinAndSelect('e.tiposEntradas', 'tes') + .innerJoinAndSelect('tes.tipoEntrada', 'te') + .innerJoinAndSelect('e.programas', 'ps') + .innerJoinAndSelect('ps.programa', 'pr') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .where('p.id_prestamo = :id_prestamo', { + id_prestamo, + }) + .getOne() + .then((prestamo) => { + if (!prestamo) throw new NotFoundException('No existe este préstamo.'); + return prestamo; + }); } findByIdUsuario(id_usuario: number) { return this.usuarioService .findById(id_usuario, true, true) - .then((usuario) => this.repository.findOne({ usuario, activo: true })) + .then((usuario) => + this.repository + .createQueryBuilder('p') + .innerJoinAndSelect('p.usuario', 'u', 'u.id_usuario = :id_usuario', { + id_usuario: usuario.id_usuario, + }) + .innerJoinAndSelect('p.equipo', 'e') + .innerJoinAndSelect('e.carrito', 'c') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('m.institucion', 'i') + .innerJoinAndSelect('e.status', 's') + .innerJoinAndSelect('e.tiposEntradas', 'tes') + .innerJoinAndSelect('tes.tipoEntrada', 'te') + .innerJoinAndSelect('e.programas', 'ps') + .innerJoinAndSelect('ps.programa', 'pr') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .where('p.activo = 1') + .getOne(), + ) .then((prestamo) => { if (!prestamo) throw new NotFoundException( @@ -411,11 +525,30 @@ export class PrestamoService { return this.equipoService .findByNumeroInventario(institucion, numero_inventario) - .then((equipo) => this.repository.findOne({ equipo, activo: true })) + .then((equipo) => + this.repository + .createQueryBuilder('p') + .innerJoinAndSelect('p.usuario', 'u') + .innerJoinAndSelect('u.instituciones', 'is') + .innerJoinAndSelect('is.institucionCarrera', 'ic') + .innerJoinAndSelect('ic.institucion', 'in') + .innerJoinAndSelect('ic.carrera', 'ca') + .innerJoinAndSelect('ca.nivel', 'n') + .innerJoinAndSelect('p.equipo', 'e', 'e.id_equipo = :id_equipo', { + id_equipo: equipo.id_equipo, + }) + .innerJoinAndSelect('e.status', 's') + .innerJoinAndSelect('e.carrito', 'c') + .innerJoinAndSelect('c.modulo', 'm') + .innerJoinAndSelect('m.institucion', 'i') + .innerJoinAndSelect('c.tipoCarrito', 'tc') + .where('p.activo = 1') + .getOne(), + ) .then((prestamo) => { if (!prestamo) throw new NotFoundException( - 'No existe este un préstamo activo con este equipo de cómputo.', + 'No existe un préstamo activo con este equipo de cómputo.', ); return prestamo; }); @@ -435,7 +568,9 @@ export class PrestamoService { this.validacionBasicaPrestamo(prestamo); if (prestamo.equipo.status.id_status === 2) - throw new ConflictException('Aun no se entrega el equipo al usuario.'); + 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.'); prestamo.activo = false; diff --git a/src/usuario/usuario.service.ts b/src/usuario/usuario.service.ts index 864f77d..6edb6be 100644 --- a/src/usuario/usuario.service.ts +++ b/src/usuario/usuario.service.ts @@ -173,11 +173,25 @@ export class UsuarioService { } findById(id_usuario: number, validarNoExiste = true, password = false) { - return this.repository.findOne({ id_usuario }).then((usuario) => { - if (validarNoExiste && (!usuario || (password && !usuario.password))) - throw new NotFoundException('No existe este usuario.'); - return usuario; - }); + return this.repository + .findOne({ + join: { + alias: 'u', + innerJoinAndSelect: { + is: 'u.instituciones', + ic: 'is.institucionCarrera', + c: 'ic.carrera', + i: 'ic.institucion', + n: 'c.nivel', + }, + }, + where: { id_usuario }, + }) + .then((usuario) => { + if (validarNoExiste && (!usuario || (password && !usuario.password))) + throw new NotFoundException('No existe este usuario.'); + return usuario; + }); } findByUsuario(usuario: string, validarNoExiste = true, password = false) {