From 9b2e675afb20fe300b0b5f7720bc7b8be109576f Mon Sep 17 00:00:00 2001 From: Emilio Date: Wed, 26 Nov 2025 09:56:35 -0600 Subject: [PATCH] =?UTF-8?q?Se=20corrigieron=20el=20xlsx,=20validaci=C3=B3n?= =?UTF-8?q?=20de=20contrase=C3=B1as=20y=20cron?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mariadb/aria_log.00000001 | Bin 5185536 -> 5201920 bytes mariadb/aria_log_control | Bin 52 -> 52 bytes src/auth/auth.service.ts | 3 ++- src/equipo/equipo.controller.ts | 7 ++++++- src/equipo/equipo.service.ts | 24 +++++++++++++----------- src/usuarios/dto/update-usuario.dto.ts | 8 +++++++- src/usuarios/usuarios.service.ts | 21 ++++++++++++++++++--- 7 files changed, 46 insertions(+), 17 deletions(-) diff --git a/mariadb/aria_log.00000001 b/mariadb/aria_log.00000001 index 2824fc5044ab663f13dc8da4417508a7de0ca207..93dc80cc7657db987d753876e0d61ba41ad265b7 100644 GIT binary patch delta 10252 zcmZA5VN_pb0mpGRRHmp**~T`u{kO4=ZERy3+t|i7wy}+EY-1B0Q&dz`R8&+{R8*!s zii(Pgii(PgMn$y@iwX^kii(nqifR=a6%`d06%`eg_TqE8ukJaY`<&nR-96_y`sV8s zkG}cF#G_$Cm>8nN3E{+WQiutY!pY&35F1Vnr-jo)T$mir2xo@)FeOY4(?UX+9%h7@ zAu-Gfv%{Pa33J1|Fh3-P1z}-W6q3W@up}%EDPdVy9#(|ZurjO)t3z5?6V`@xAw8@Q z8^Xqr5jKU*VN1viTf?@nJ!FL)VQ1JCvcvAMC+rP5VPDuE4!o8-8ejj;TYFDFeKbBd zDk^IHgJ(+pg#5_V42YQ7Wz_>6INSR7iB9Jf40;+`Bz%gMC za9oH0G1C~I3#1A2fI?wDP$MJ(ZNdUzKv)RGB~Y~p$Pki&Vqq~*CoBOvgr&fckOCx3 zr)n9HB`gO@g%v=9kP37OD}fPV6%d(0)oLI|NCV1+H9(WF7U&Vy0b@cskUW#B^+2Am z0jLx<0xd!Y&?jsHq7xb445SKMfC3>Cs1~*Yt->~-U)T=B&Y~&{NEdbhMZ!*?R@eo! z3)#S+up5YRk=X6a1baH4grnASwOdt2aF15 z14$98&H-|T!$5_Q4>Su$fL`I;_aQQV>%^!D|M{iOj*40o_20K~KRS=oX>%zo01Ack zfg0fgpiQ_C7!V49xOt3U1Y`&o1I5B6K%GzobO@IML&9Z1!hEVO2eO1>pj5a5Xb`Rh zx`eBM5upT#BvExWkRx0Jlnd7aO+qQqBU}fJ3D*P33#hsQ$P>zdO5sMJMYsv*6K)2g z7cyQBqzbnH1;VXBwQw8IDpUad!tFrpBC75H(uF&LBB2tf6^;V!!d<|ia5oU2OjQ+- zDFmQIxCf{g?gcu9YG7En4@g{0)%`%W@BmOI)BugbgFv_N5HKn{3?wa~susu<9sw$Z zM}cPHF`!qd1IC5Nft00GJptqkPXbj!J#b8T3OFu24aB4{{tS>NGysLdvp|jT9MC2_ z4-5#6K-@B_UH~$L7lC5oC7@1d0y>13fg#})AYnOG9|E$3W}sB~Fwh`;1n3ez3XBLX zKx73~9|LlPj|1hxCx9m57|lptLkR}`l3WXm7HNsDTHsPnh zfY1-brBn3|kRiMa6bnBC>VyHHL-;u`B>VzMSWne2fh=JVC>4GMGzh;2x`f{VBf=06 z*+A8AfgIs?K)LXHph*}8dW83YG2stD@PPK&9{}phfsI&?o!_h|XYq6i5~R z3KR%`1FD6;1Fgas&@cQ0h}}fhKY?`NUqF#C4%7-!_3v(6^S^uXc3}cAC`<(6H&Yc2 zWC|w$CBlh7y>JrHDZ~K7!XzMZ3solr*}^G6nGg#!3a0|y!fC*$a5|8bNmU$>D@+C| zgfoC<;Y^@ch<_g<A-+61Blzk_)H)}NCb+7 zSwNjI8|V<`07F6qNZ3x*Tp&xB2b2o)fd(N7=n@tHBf>%;l10@bAV)|B%7w*1lduHn z5tagDLJE+)gQ{gfp0FIK6jlH&LMqTFtOTNWGQJ8(6;=ZULK;vltN~huwLrhH4v5`F zRXUI^tOtsO4M4515oi}OfI(ps5T8xeW*}480+a}uK)tXP=oGdA!@_nTaW_?2K(??0 zC=+%9jlwRVTgV1Rh222X9;)^Lxx!wcLdXG{g?&J;upbx~4ge{8smcZNg@Ztqa0oai zoCO>g@_?8e#?J=QgmZvG;V@7m#0g8lM zfm-1&tkUNZBLl2xlk&dk%8f~us;KkVi1-B5)2FgRQ&`_ 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; }