diff --git a/mariadb/aria_log.00000001 b/mariadb/aria_log.00000001 index 2824fc5..93dc80c 100644 Binary files a/mariadb/aria_log.00000001 and b/mariadb/aria_log.00000001 differ diff --git a/mariadb/aria_log_control b/mariadb/aria_log_control index afce688..2d29802 100644 Binary files a/mariadb/aria_log_control and b/mariadb/aria_log_control differ diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 2d2d897..7a7884f 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -23,8 +23,9 @@ export class AuthService { registroDto.id_User, { nombre: registroDto.nombre, - contraseña: registroDto.contraseña, + contraseñaN: registroDto.contraseñaN, id_tipo_usuario: registroDto.tipoUsuario, + contraseñaV: registroDto.contraseñaV, }, ); return update_data; diff --git a/src/equipo/equipo.controller.ts b/src/equipo/equipo.controller.ts index 8bda817..bb15c10 100644 --- a/src/equipo/equipo.controller.ts +++ b/src/equipo/equipo.controller.ts @@ -130,9 +130,14 @@ export class EquipoController { return this.equipoService.findAllProcesadorTipoEquipos(); } + // @Post('daily') + // async daily() { + // return await this.equipoService.llenadoDeAntiguedad(); + // } + @UseGuards(AuthGuard('jwt')) @Get('reporteXLSX') - async generarReporte(@Res() res: Response) { + async generarReporte(@Res({ passthrough: true }) res: Response) { try { await this.equipoService.createEcxel(res); } catch (error) { diff --git a/src/equipo/equipo.service.ts b/src/equipo/equipo.service.ts index c5429c4..b0f8462 100644 --- a/src/equipo/equipo.service.ts +++ b/src/equipo/equipo.service.ts @@ -365,7 +365,7 @@ export class EquipoService { @Cron('0 0 0 * * *') async llenadoDeAntiguedad() { - await this.equipoRepository + const result = await this.equipoRepository .createQueryBuilder() .update(Equipo) .set({ @@ -380,13 +380,21 @@ export class EquipoService { `, }) .execute(); + + return result; } async exportarReporteAExcel(data: any, res: Response) { const workbook = new ExcelJS.Workbook(); + let count = 1; for (const key of Object.keys(data)) { - const sheetName = key.substring(0, 30); // Excel limita a 30 caracteres + let sheetName = key.substring(0, 30); + + if (workbook.getWorksheet(sheetName)) { + sheetName = `${sheetName}_${count++}`; + } + const sheet = workbook.addWorksheet(sheetName); const rows = data[key]; @@ -396,34 +404,28 @@ export class EquipoService { continue; } - // Obtener columnas automáticamente const headers = Object.keys(rows[0]); - // Crear encabezado sheet.addRow(headers); - // Agregar filas for (const row of rows) { sheet.addRow(headers.map((h) => row[h])); } - // Estilo básico sheet.getRow(1).font = { bold: true }; sheet.getRow(1).alignment = { horizontal: 'center' }; - sheet.columns.forEach((col) => { - col.width = 35; - }); + sheet.columns.forEach((col) => (col.width = 35)); } - // Enviar el archivo al cliente res.setHeader( 'Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ); + res.setHeader('Content-Disposition', 'attachment; filename=reporte.xlsx'); await workbook.xlsx.write(res); - res.end(); + res.status(200).end(); } async createReport() { diff --git a/src/usuarios/dto/update-usuario.dto.ts b/src/usuarios/dto/update-usuario.dto.ts index 56453fa..594d085 100644 --- a/src/usuarios/dto/update-usuario.dto.ts +++ b/src/usuarios/dto/update-usuario.dto.ts @@ -21,9 +21,15 @@ export class UpdateUsuarioDto { @MinLength(5) @Transform(({ value }) => value.trim()) @IsOptional() - contraseña?: string; + contraseñaN?: string; @IsInt() @IsOptional() tipoUsuario?: number; + + @IsString() + @MinLength(5) + @Transform(({ value }) => value.trim()) + @IsOptional() + contraseñaV?: string; } diff --git a/src/usuarios/usuarios.service.ts b/src/usuarios/usuarios.service.ts index c69793d..5ce6645 100644 --- a/src/usuarios/usuarios.service.ts +++ b/src/usuarios/usuarios.service.ts @@ -2,6 +2,7 @@ import { BadRequestException, Injectable, NotFoundException, + UnauthorizedException, } from '@nestjs/common'; import { CreateUsuarioDto } from './dto/create-usuario.dto'; import { InjectRepository } from '@nestjs/typeorm'; @@ -25,7 +26,12 @@ export class UsuariosService { async actualizarUsuario( id: number, - datos: { nombre?: string; contraseña?: string; id_tipo_usuario?: number }, + datos: { + nombre?: string; + contraseñaN?: string; + id_tipo_usuario?: number; + contraseñaV?: string; + }, ) { // Buscar al usuario const usuario = await this.usuarioRepository.findOne({ @@ -43,8 +49,17 @@ export class UsuariosService { } // Actualizar contraseña con hash - if (datos.contraseña) { - const hashed = await bcrypt.hash(datos.contraseña, 10); + if (datos.contraseñaN && datos.contraseñaV) { + const contraseñaValida = await bcrypt.compare( + datos.contraseñaV, + usuario.contraseña, + ); + + if (!contraseñaValida) { + throw new UnauthorizedException('Contraseña inválida'); + } + + const hashed = await bcrypt.hash(datos.contraseñaN, 10); usuario.contraseña = hashed; }