import { Body, Controller, Get, Post, Put, Query, Request, UseGuards, } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiQuery, ApiTags, } from '@nestjs/swagger'; import { Serealize } from '../interceptors/serialize.interceptor'; import { PrestamoService } from './prestamo.service'; import { ValidarUsuarioService } from '../validar-usuario/validar-usuario.service'; 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 { IdUsuarioPaginaDto } from '../dto/input/id-usuario-pagina.dto'; import { NumeroInventarioDto } from '../dto/numero-inventario.dto'; import { ActivosDto } from './dto/input/activos.dto'; import { CancelarOperadorDto } from './dto/input/cancelar-operador.dto'; import { HistorialDto } from './dto/input/historial.dto'; import { IdPrestamoDto } from './dto/input/id-prestamo.dto'; import { PedirDto } from './dto/input/pedir.dto'; import { EntregarDto } from './dto/input/entregar.dto'; import { RegresarIdPrestamoDto } from './dto/input/regresar-id-prestamo.dto'; import { RegresarNumeroInventarioDto } from './dto/input/regresar-numero-inventario.dto'; import { MessageOutputDto } from '../dto/output/message.dto'; import { ActivosOutputDto } from './dto/output/activos.dto'; import { EquipoMinOutputDto } from '../equipo/dto/output/equipo-min.dto'; import { PrestamoOutputDto } from './dto/output/prestamo.dto'; import { PrestamoEquipoOutputDto } from './dto/output/prestamo-equipo.dto'; import { PrestamosOutputDto } from './dto/output/prestamos.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, private validarUsuarioService: ValidarUsuarioService, ) {} @Serealize(ActivosOutputDto) @Get('activos') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna 25 prestamos activos dependiendo de la página en la que se encuentra el operador y sus filtros.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Página en la que se encuentra el usuario.', name: 'pagina', type: 'string', }) @ApiQuery({ description: 'Carrito que se quiere usar como filtro.', name: 'carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Equipo que se quiere usar como filtro.', name: 'equipo', type: 'string', required: false, }) @ApiQuery({ description: 'Id de la institución que se quiere usar como filtro.', name: 'id_institucion', type: 'string', required: false, }) @ApiQuery({ description: 'Id del modulo que se quiere usar como filtro.', name: 'id_modulo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del préstamo que se quiere usar como filtro.', name: 'id_prestamo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de carrito que se quiere usar como filtro.', name: 'id_tipo_carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de usuario que se quiere usar como filtro.', name: 'id_tipo_usuario', type: 'string', required: false, }) @ApiQuery({ description: 'Usuario que se quiere usar como filtro.', name: 'usuario', type: 'string', required: false, }) activos(@Request() req, @Query() query: ActivosDto) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); return this.prestamoService.findAll(query); } @Serealize(MessageOutputDto) @Put('cancelar-operador') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que cancela un prestamo por parte del operador.', }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Ambas variables son obligatorias.', examples: { ejemplo: { value: { id_prestamo: 1, motivo: '' } }, }, }) cancelarOperador(@Request() req, @Body() body: CancelarOperadorDto) { const operador: Operador = req.user.operador; const modulo: Modulo = req.user.modulo; this.validarUsuarioService.validarAdminOperador(operador); return this.prestamoService.cancelarOperador( operador, body.id_prestamo, body.motivo, modulo, ); } @Serealize(MessageOutputDto) @Put('cancelar-usuario') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que cancela el prestamo del usuario.', }) @ApiBearerAuth('jwt') @ApiBody({ description: 'La variable id_prestamo es obligatoria.', examples: { ejemplo: { value: { id_prestamo: 1 } } }, }) cancelarUsuario(@Request() req) { const usuario: Usuario = req.user.usuario; this.validarUsuarioService.validarUsuario(usuario); return this.prestamoService.cancelarUsuario(usuario); } @Serealize(EquipoMinOutputDto) @Put('entregar') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que actualiza el status del equipo a "En uso".', }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Ambas variables son obligatorias.', examples: { ejemplo: { value: { id_prestamo: 1 } } }, }) entregar(@Request() req, @Body() body: EntregarDto) { const operador: Operador = req.user.operador; const modulo: Modulo = req.user.modulo; this.validarUsuarioService.validarAdminOperador(operador); return this.prestamoService.entregar(operador, modulo, body.id_prestamo); } // @Serealize(PrestamosOutputDto) @Get('reporte') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna todos los prestamos dependiendo de la página en la que se encuentra el operador y sus filtros.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Carrito que se quiere usar como filtro.', name: 'carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Equipo que se quiere usar como filtro.', name: 'equipo', type: 'string', required: false, }) @ApiQuery({ description: 'Fecha inicio que se quiere usar como filtro.', name: 'fechaInicio', type: 'string', required: false, }) @ApiQuery({ description: 'Fecha fin se quiere usar como filtro.', name: 'fechaFin', type: 'string', required: false, }) @ApiQuery({ description: 'Id de la institución que se quiere usar como filtro.', name: 'id_institucion', type: 'string', required: false, }) @ApiQuery({ description: 'Id del modulo que se quiere usar como filtro.', name: 'id_modulo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del préstamo que se quiere usar como filtro.', name: 'id_prestamo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de carrito que se quiere usar como filtro.', name: 'id_tipo_carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de usuario que se quiere usar como filtro.', name: 'id_tipo_usuario', type: 'string', required: false, }) @ApiQuery({ description: 'Usuario que se quiere usar como filtro.', name: 'usuario', type: 'string', required: false, }) reporte(@Request() req, @Query() query: HistorialDto) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarOperador(operador); return this.prestamoService.findAll(query); } @Serealize(PrestamosOutputDto) @Get('historial') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna 25 prestamos dependiendo de la página en la que se encuentra el operador y sus filtros.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Página en la que se encuentra el usuario.', name: 'pagina', type: 'string', }) @ApiQuery({ description: 'Carrito que se quiere usar como filtro.', name: 'carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Equipo que se quiere usar como filtro.', name: 'equipo', type: 'string', required: false, }) @ApiQuery({ description: 'Fecha inicio que se quiere usar como filtro.', name: 'fechaInicio', type: 'string', required: false, }) @ApiQuery({ description: 'Fecha fin se quiere usar como filtro.', name: 'fechaFin', type: 'string', required: false, }) @ApiQuery({ description: 'Id de la institución que se quiere usar como filtro.', name: 'id_institucion', type: 'string', required: false, }) @ApiQuery({ description: 'Id del modulo que se quiere usar como filtro.', name: 'id_modulo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del préstamo que se quiere usar como filtro.', name: 'id_prestamo', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de carrito que se quiere usar como filtro.', name: 'id_tipo_carrito', type: 'string', required: false, }) @ApiQuery({ description: 'Id del tipo de usuario que se quiere usar como filtro.', name: 'id_tipo_usuario', type: 'string', required: false, }) @ApiQuery({ description: 'Usuario que se quiere usar como filtro.', name: 'usuario', type: 'string', required: false, }) historial(@Request() req, @Query() query: HistorialDto) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarOperador(operador); return this.prestamoService.findAll(query); } @Serealize(PrestamosEquipoOutputDto) @Get('historial-equipo') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna 25 prestamos de un usuario dependiendo de la página en la que se encuentra el operador y sus filtros.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id del equipo.', name: 'id_equipo', type: 'string', }) @ApiQuery({ description: 'Página en la que se encuentra el usuario.', name: 'pagina', type: 'string', }) historialEquipo(@Request() req, @Query() query: IdEquipoPaginaDto) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); return this.prestamoService.findAllByIdEquipo( parseInt(query.id_equipo), parseInt(query.pagina), ); } @Serealize(PrestamosUsuarioOutputDto) @Get('historial-usuario') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna 25 prestamos de un equipo dependiendo de la página en la que se encuentra el operador y sus filtros.', }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id del usuario.', name: 'id_usuario', type: 'string', }) @ApiQuery({ description: 'Página en la que se encuentra el usuario.', name: 'pagina', type: 'string', }) historialUsuario(@Request() req, @Query() query: IdUsuarioPaginaDto) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); return this.prestamoService.findAllByIdUsuario( parseInt(query.id_usuario), parseInt(query.pagina), ); } @Serealize(PrestamoOutputDto) @Post() @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que crea un prestamo nuevo.' }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Todas las variables a excepción de id_programa y id_tipo_entrada son obligatorios.', examples: { ejemplo: { value: { id_modulo: 1, id_tipo_carrito: 1, _id_programa: 1, _id_tipo_entrada: 1, }, }, }, }) pedir(@Request() req, @Body() body: PedirDto) { const usuario: Usuario = req.user.usuario; this.validarUsuarioService.validarUsuario(usuario); return this.prestamoService.create( usuario, body.id_modulo, body.id_tipo_carrito, body.id_programa, body.id_tipo_entrada, ); } @Serealize(PrestamoOutputDto) @Get('prestamo-id-prestamo') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna un préstamo por su id.' }) @ApiBearerAuth('jwt') @ApiQuery({ description: 'Id del préstamo.', name: 'id_prestamo', type: 'text', }) prestamoIdPrestamo(@Request() req, @Query() query: IdPrestamoDto) { const usuarioOperador: Operador | Usuario = req.user.operador || req.user.usuario; if (usuarioOperador instanceof Usuario) this.validarUsuarioService.validarUsuario(usuarioOperador); else this.validarUsuarioService.validarAdminOperador(usuarioOperador); return this.prestamoService.prestamoInfoById(parseInt(query.id_prestamo)); } @Serealize(PrestamoOutputDto) @Get('prestamo-id-usuario') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna un préstamo activo por el id del usuario.', }) @ApiBearerAuth('jwt') prestamoIdUsuario(@Request() req) { const usuario: Usuario = req.user.usuario; this.validarUsuarioService.validarUsuario(usuario); return this.prestamoService.prestamoInfoByUsuario(usuario, false); } @Serealize(PrestamoEquipoOutputDto) @Get('prestamo-numero-inventario') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que retorna un préstamo activo por el número de inventario de un equipo.', }) @ApiQuery({ description: 'El número de inventario del equipo.', name: 'numero_inventario', type: 'string', }) prestamoNumeroInventario( @Request() req, @Query() query: NumeroInventarioDto, ) { const operador: Operador = req.user.operador; this.validarUsuarioService.validarAdminOperador(operador); return this.prestamoService.prestamoInfoByNumeroInventario( operador, query.numero_inventario, ); } @Serealize(MessageOutputDto) @Put('regresar-id-prestamo') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que desactiva un préstamo.' }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Ambas variables son obligatorias.', examples: { ejemplo: { value: { id_prestamo: 1, id_status: 1, _descripcion: '', _motivo: '', _id_institucion_infraccion: 603, }, }, }, }) regresarIdPrestamo(@Request() req, @Body() body: RegresarIdPrestamoDto) { const operador: Operador = req.user.operador; const modulo: Modulo = req.user.modulo; this.validarUsuarioService.validarSoloOperador(operador); return this.prestamoService.regresarIdPrestamo( operador, modulo, body.id_prestamo, body.id_status, body.motivo, body.descripcion, body.id_institucion_infraccion, ); } @Serealize(MessageOutputDto) @Put('regresar-numero-inventario') @UseGuards(AuthGuard('jwt')) @ApiOperation({ description: 'Endpoint que desactiva un préstamo.' }) @ApiBearerAuth('jwt') @ApiBody({ description: 'Ambas variables son obligatorias.', examples: { ejemplo: { value: { numero_inventario: '', id_status: 1, _descripcion: '', _motivo: '', _id_institucion_infraccion: 603, }, }, }, }) regresarNumeroInventario( @Request() req, @Body() body: RegresarNumeroInventarioDto, ) { const operador: Operador = req.user.operador; const modulo: Modulo = req.user.modulo; this.validarUsuarioService.validarSoloOperador(operador); return this.prestamoService.regresarNumeroInventario( operador, modulo, body.numero_inventario, body.id_status, body.motivo, body.descripcion, body.id_institucion_infraccion, ); } }