utn-cli 2.0.8 → 2.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -159,6 +159,7 @@ export async function updateBackend() {
159
159
 
160
160
  copiarDirectorios(directoriodePlantillas, directorioDestino, archivosAExcluir);
161
161
  mostrarVersion(path.join(__dirname, '../package.json')); // Show main CLI version
162
+ fs.renameSync('gitignore', '.gitignore');
162
163
  await inicializarProyectoBackend();
163
164
  console.log('Proyecto de backend actualizado exitosamente.');
164
165
  closeReadLine();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utn-cli",
3
- "version": "2.0.8",
3
+ "version": "2.0.10",
4
4
  "description": "Herramienta CLI unificada para la gestión de plantillas en SIGU.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -0,0 +1,46 @@
1
+ const express = require("express");
2
+ const Router = express.Router();
3
+
4
+ const ConsentimientoInformado = require('../servicios/Nucleo/ConsentimientoInformado.js');
5
+ const Miscelaneo = require('../servicios/Nucleo/Miscelaneas.js');
6
+ const ManejadorDeErrores = require('../servicios/Nucleo/ManejadorDeErrores.js');
7
+
8
+ Router.post("/AceptarConsentimientoInformado", async (solicitud, respuesta, next) => {
9
+ try {
10
+ if (await Miscelaneo.validarToken(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
11
+ try {
12
+ const Datos = solicitud.body;
13
+ Datos.LastUser = await Miscelaneo.generarLastUser(solicitud);
14
+ return respuesta.json({ body: await ConsentimientoInformado.AceptarConsentimientoInformado(Datos), error: undefined });
15
+ } catch (error) {
16
+ const MensajeDeError = "No fue posible aceptar el consentimiento informado";
17
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
18
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
19
+ }
20
+ }
21
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
22
+ } catch (error) {
23
+ next(error)
24
+ }
25
+ });
26
+
27
+ Router.get("/ConsentimientoInformado", async (solicitud, respuesta, next) => {
28
+ try {
29
+ if (await Miscelaneo.validarToken(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
30
+ try {
31
+ const Datos = {};
32
+ Datos.LastUser = await Miscelaneo.generarLastUser(solicitud);
33
+ return respuesta.json({ body: await ConsentimientoInformado.ConsentimientoInformado(Datos), error: undefined });
34
+ } catch (error) {
35
+ const MensajeDeError = "No fue posible determiniar el consentimiento informado";
36
+ console.error(new ManejadorDeErrores(error, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
37
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
38
+ }
39
+ }
40
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
41
+ } catch (error) {
42
+ next(error);
43
+ }
44
+ });
45
+
46
+ module.exports = Router;
@@ -1,10 +1,12 @@
1
1
  const rutasMiscelaneas = require('./misc.js');
2
2
  const rutasDeAPI = require('./API.js');
3
+ const rutasDeConsentimientoInformado = require('./ConsentimientoInformado.js');
3
4
  const rutasDelServicio1 = require('./Servicio1.js');
4
5
 
5
6
  function asignarRutasAExpress(app) {
6
7
  app.use('/misc', rutasMiscelaneas);
7
8
  app.use('/api', rutasDeAPI);
9
+ app.use('/ConsentimientoInformado', rutasDeConsentimientoInformado);
8
10
  app.use('/Servicio1', rutasDelServicio1);
9
11
  }
10
12
 
@@ -0,0 +1,56 @@
1
+ const { ejecutarConsulta, ejecutarConsultaSIGU } = require('./db.js');
2
+ const Miscelaneas = require('./Miscelaneas.js');
3
+
4
+ class ConsentimientoInformado {
5
+
6
+ constructor() {
7
+ Miscelaneas.ejecucionDiferida(this.RegistrarElServicio);
8
+ Miscelaneas.ejecucionDiferida(this.creacionDeConsetimientoInformado);
9
+ };
10
+
11
+ RegistrarElServicio() {
12
+ const NombreDelServicio = 'Consentimiento informado';
13
+ Miscelaneas.RegistrarElServicio(NombreDelServicio);
14
+ console.log("Se ha creado el servicio: " + NombreDelServicio);
15
+ }
16
+
17
+ async ConsentimientoInformadoId() {
18
+ const ConsentimientoInformadoId = await ejecutarConsultaSIGU("SELECT `ConsentimientoInformadoId` FROM \
19
+ `SIGU`.`SIGU_ConsentimientosInformadosV2` WHERE `Titulo` LIKE 'Versión del módulo%' AND `Estado` = 'Activo' AND `Modulo` = ?"
20
+ , [Miscelaneas.obtenerNombreCanonicoDelModulo()]);
21
+ return ConsentimientoInformadoId[0]['ConsentimientoInformadoId'];
22
+ }
23
+
24
+ async AceptarConsentimientoInformado(Datos) {
25
+ return await ejecutarConsulta("INSERT INTO `framework-mantenimientosv2`.`AceptacionesDeConsentimientosInformados` VALUES \
26
+ (NULL, ?, ?, 'Aceptación de versión de módulo', UUID(), NOW(4), NOW(4), ?)"
27
+ , [await this.ConsentimientoInformadoId(), Datos.LastUser.split("@")[0], Datos.LastUser]);
28
+ }
29
+
30
+ async creacionDeConsetimientoInformado() {
31
+ const Consentimiento = "<h2>Aviso de actualización del Sistema SIGU</h2><p><strong>Estimada persona usuaria:</strong></p><p>Le informamos que el módulo del Sistema Integrado de Gestión Universitaria (SIGU) ha sido actualizado a una nueva versión, la cual incorpora mejoras funcionales, ajustes técnicos y actualizaciones orientadas a optimizar la experiencia de uso, fortalecer la seguridad de la información y garantizar el cumplimiento de los procesos institucionales.</p><p>Antes de continuar utilizando este módulo, le solicitamos leer atentamente y aceptar las siguientes condiciones:</p><ul><li>Reconozco que estoy utilizando una versión actualizada del sistema.</li><li>Comprendo que esta versión puede incluir cambios en funcionalidades, interfaces y flujos de trabajo.</li><li>Me comprometo a utilizar el sistema de manera responsable, ética y conforme a la normativa institucional vigente.</li><li>Acepto que el uso del sistema podrá ser monitoreado con fines administrativos, académicos y de seguridad.</li></ul><p>El uso continuo del sistema implica su conformidad con las presentes condiciones y con las políticas institucionales aplicables.</p><p>En caso de presentar dudas, consultas o inconvenientes, puede comunicarse con el área de soporte técnico institucional a través de los canales oficiales.</p><hr><p>Al seleccionar la opción <strong>“Aceptar”</strong>, usted manifiesta expresamente su conformidad con el uso de esta nueva versión del módulo correspondiente del Sistema SIGU.</p>";
32
+ return await ejecutarConsultaSIGU("UPDATE `SIGU`.`SIGU_ConsentimientosInformadosV2` SET `Estado` = 'Inactivo' WHERE\
33
+ `Modulo` = ? AND `Titulo` LIKE 'Versión del módulo%'; \
34
+ SELECT MAX(`ConsentimientoInformadoId`) + 1 INTO @`NuevoId` FROM `SIGU`.`SIGU_ConsentimientosInformadosV2`; \
35
+ INSERT INTO `SIGU`.`SIGU_ConsentimientosInformadosV2` VALUES\
36
+ (@`NuevoId`, CONCAT('Versión del módulo ', ?), ?, ?, 'Activo', ?, NOW(), USER())\
37
+ ON DUPLICATE KEY UPDATE `Estado` = 'Activo';"
38
+ , [Miscelaneas.obtenerNombreCanonicoDelModulo(), Miscelaneas.obtenerVersionDelModulo(), Consentimiento, "Aceptar", Miscelaneas.obtenerNombreCanonicoDelModulo()]);
39
+ }
40
+
41
+ async ConsentimientoInformado(Datos) {
42
+ const Aceptaciones = await ejecutarConsulta("SELECT COUNT(*) AS `Total` FROM `framework-mantenimientosv2`.`AceptacionesDeConsentimientosInformados` \
43
+ WHERE `ConsentimientoInformadoId` = ? AND `Identificador` = ?"
44
+ , [await this.ConsentimientoInformadoId(), Datos.LastUser.split("@")[0]]);
45
+ const ValoresARetornar = {};
46
+ ValoresARetornar.Aceptaciones = Aceptaciones[0]['Total'];
47
+ if (Aceptaciones[0]['Total'] === 0) {
48
+ ValoresARetornar.Aceptaciones = 0;
49
+ ValoresARetornar.Consentimiento = await ejecutarConsultaSIGU("SELECT * FROM `SIGU`.`SIGU_ConsentimientosInformadosV2` \
50
+ WHERE `Titulo` LIKE 'Versión del módulo%' AND `Estado` = 'Activo' AND `Modulo` = ?", [Miscelaneas.obtenerNombreCanonicoDelModulo()]);
51
+ }
52
+ return ValoresARetornar;
53
+ }
54
+ }
55
+
56
+ module.exports = new ConsentimientoInformado();
@@ -40,6 +40,14 @@ class Miscelaneo {
40
40
  this.EnlaceDeAcceso = undefined;
41
41
  };
42
42
 
43
+ obtenerNombreCanonicoDelModulo() {
44
+ return this.NombreCanonicoDelModulo;
45
+ }
46
+
47
+ obtenerVersionDelModulo() {
48
+ return this.Version;
49
+ }
50
+
43
51
  async convertirTextoEnArchivoLocal(Texto, Token, NombreDelArchivo, Etiquetas) {
44
52
  let EnlaceDelBack = 'http';
45
53
  EnlaceDelBack = EnlaceDelBack + ((process.env.ENV || 'local') === 'production' ? 's' : '');
@@ -404,18 +412,20 @@ class Miscelaneo {
404
412
  Modulo = this.NombreCanonicoDelModulo;
405
413
  }
406
414
  let Datos = await ejecutarConsultaSIGU("SELECT `ConsentimientoInformadoId`, `Titulo`, `Texto`, `TextoDeAceptacion` FROM `SIGU`.`SIGU_ConsentimientosInformadosV2`\
407
- WHERE `Estado` = 'Activo' AND `Modulo` = ?", [Modulo]);
415
+ WHERE `Estado` = 'Activo' AND `Modulo` = ? AND `Titulo` <> 'Versión del módulo", [Modulo]);
408
416
  if (Datos.length === 0) {
409
417
  Datos = await ejecutarConsultaSIGU("SELECT `ConsentimientoInformadoId`, `Titulo`, `Texto`, `TextoDeAceptacion` FROM `SIGU`.`SIGU_ConsentimientosInformadosV2`\
410
- WHERE `Estado` = 'Activo' AND `Modulo` = ?", [this.NombreCanonicoDelModulo]);
418
+ WHERE `Estado` = 'Activo' AND `Modulo` = ? AND `Titulo` <> 'Versión del módulo", [this.NombreCanonicoDelModulo]);
411
419
  }
412
420
  return Datos[0];
413
421
  }
414
422
 
415
423
  async creacionDeConsetimientoInformado(Titulo, Texto, TextoDeAceptacion) {
416
424
  return await ejecutarConsultaSIGU("UPDATE `SIGU`.`SIGU_ConsentimientosInformadosV2` SET `Estado` = 'Inactivo' WHERE\
417
- `Modulo` = ?; INSERT INTO `SIGU`.`SIGU_ConsentimientosInformadosV2` VALUES\
418
- (NULL, ?, ?, ?, 'Activo', ?, NOW(), USER())\
425
+ `Modulo` = ? AND `Titulo` <> 'Versión del módulo; \
426
+ SELECT MAX(`ConsentimientoInformadoId`) + 1 INTO @`NuevoId` FROM `SIGU`.`SIGU_ConsentimientosInformadosV2`; \
427
+ INSERT INTO `SIGU`.`SIGU_ConsentimientosInformadosV2` VALUES\
428
+ (@`NuevoId`, ?, ?, ?, 'Activo', ?, NOW(), USER())\
419
429
  ON DUPLICATE KEY UPDATE `Estado` = 'Activo';"
420
430
  , [this.NombreCanonicoDelModulo, Titulo, Texto, TextoDeAceptacion, this.NombreCanonicoDelModulo]);
421
431
  }
@@ -61,11 +61,37 @@ export class ContenedorComponentesComponent {
61
61
  }).subscribe((datos: any) => {
62
62
  this.Mensajes = datos.body;
63
63
  })
64
- })
64
+ });
65
65
  this.http.get(this.datosGlobalesService.ObtenerURL() + 'misc/obtenerDetalleDelModulo').subscribe((datos: any) => {
66
66
  this.EnlaceDelManual = datos.body[0].EnlaceDelManual;
67
67
  this.EnlaceDelVideo = datos.body[0].EnlaceDelVideo;
68
- })
68
+ });
69
+ this.http.get(this.datosGlobalesService.ObtenerURL() + 'ConsentimientoInformado/ConsentimientoInformado').subscribe((datos: any) => {
70
+ if (datos.body.Aceptaciones === 0) {
71
+ const ConsentimientoInformadoId = datos.body.Consentimiento[0].ConsentimientoInformadoId;
72
+ this.dialog.open(MensajeConfirmacionHTMLComponent, {
73
+ data: {
74
+ titulo: 'Actualización del módulo',
75
+ mensaje: datos.body.Consentimiento[0].Texto,
76
+ textoCerrar: 'Cancelar',
77
+ textoAceptar: 'Aceptar',
78
+ onClose: () => { this.datosGlobalesService.RedirigirALogin() },
79
+ onAccept: () => {
80
+ this.http.post(`${this.datosGlobalesService.ObtenerURL()}ConsentimientoInformado/AceptarConsentimientoInformado`
81
+ , { ConsentimientoInformadoId })
82
+ .subscribe({
83
+ next: (datos: any) => {
84
+ // this.obtenerDatosParaPoblarLaTabla();
85
+ },
86
+ error: (error) => {
87
+ this.datosGlobalesService.RedirigirALogin();
88
+ },
89
+ });
90
+ },
91
+ },
92
+ });
93
+ }
94
+ });
69
95
  }
70
96
 
71
97
  irAtras(): void {