utn-cli 2.1.54 → 2.1.56

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.
Files changed (42) hide show
  1. package/package.json +1 -1
  2. package/templates/backend/package.json +3 -3
  3. package/templates/backend/rutas/DatosMiscelaneos.js +50 -0
  4. package/templates/backend/rutas/misc.js +177 -5
  5. package/templates/backend/rutas/rutas.js +2 -0
  6. package/templates/backend/servicios/Nucleo/DatosMiscelaneos.js +36 -0
  7. package/templates/backend/servicios/Nucleo/Miscelaneas.js +192 -25
  8. package/templates/frontend/Dockerfile +1 -0
  9. package/templates/frontend/angular.json +5 -5
  10. package/templates/frontend/package.json +24 -25
  11. package/templates/frontend/src/app/Componentes/Nucleo/boton-ayuda/boton-ayuda.component.css +7 -0
  12. package/templates/frontend/src/app/Componentes/Nucleo/boton-ayuda/boton-ayuda.component.html +28 -0
  13. package/templates/frontend/src/app/Componentes/Nucleo/boton-ayuda/boton-ayuda.component.ts +78 -0
  14. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.html +43 -8
  15. package/templates/frontend/src/app/Componentes/Nucleo/estadisticas-del-modulo/estadisticas-del-modulo.component.ts +5 -4
  16. package/templates/frontend/src/app/Componentes/Nucleo/gestion-actividad/gestion-actividad.component.ts +1 -0
  17. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.component.css +4 -2
  18. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-institucional/mensaje-institucional.component.html +3 -3
  19. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-institucional/mensaje-institucional.component.ts +1 -1
  20. package/templates/frontend/src/app/Componentes/Nucleo/subir-archivo/subir-archivo.component.ts +1 -1
  21. package/templates/frontend/src/app/Paginas/Nucleo/accesibilidad/accesibilidad.component.css +25 -0
  22. package/templates/frontend/src/app/Paginas/Nucleo/accesibilidad/accesibilidad.component.html +2 -0
  23. package/templates/frontend/src/app/Paginas/Nucleo/accesibilidad/accesibilidad.component.ts +31 -2
  24. package/templates/frontend/src/app/Paginas/Nucleo/acercade/acercade.component.css +67 -18
  25. package/templates/frontend/src/app/Paginas/Nucleo/acercade/acercade.component.html +56 -46
  26. package/templates/frontend/src/app/Paginas/Nucleo/acercade/acercade.component.ts +21 -1
  27. package/templates/frontend/src/app/Paginas/Nucleo/conozcanos/conozcanos.component.css +190 -375
  28. package/templates/frontend/src/app/Paginas/Nucleo/conozcanos/conozcanos.component.html +92 -91
  29. package/templates/frontend/src/app/Paginas/Nucleo/conozcanos/conozcanos.component.ts +19 -2
  30. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.ts +2 -2
  31. package/templates/frontend/src/app/Paginas/Nucleo/declaracion-ia/declaracion-ia.component.css +25 -0
  32. package/templates/frontend/src/app/Paginas/Nucleo/declaracion-ia/declaracion-ia.component.html +2 -0
  33. package/templates/frontend/src/app/Paginas/Nucleo/declaracion-ia/declaracion-ia.component.ts +33 -3
  34. package/templates/frontend/src/app/Paginas/Nucleo/politicas/politicas.component.css +69 -15
  35. package/templates/frontend/src/app/Paginas/Nucleo/politicas/politicas.component.html +129 -107
  36. package/templates/frontend/src/app/Paginas/Nucleo/politicas/politicas.component.ts +51 -9
  37. package/templates/frontend/src/app/Paginas/Nucleo/preguntasFrecuentes/preguntasFrecuentes.component.css +68 -15
  38. package/templates/frontend/src/app/Paginas/Nucleo/preguntasFrecuentes/preguntasFrecuentes.component.html +161 -88
  39. package/templates/frontend/src/app/Paginas/Nucleo/preguntasFrecuentes/preguntasFrecuentes.component.ts +63 -10
  40. package/templates/frontend/src/app/Paginas/Nucleo/sabiasque/sabiasque.component.css +100 -24
  41. package/templates/frontend/src/app/Paginas/Nucleo/sabiasque/sabiasque.component.html +269 -339
  42. package/templates/frontend/src/app/Paginas/Nucleo/sabiasque/sabiasque.component.ts +94 -6
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "utn-cli",
3
- "version": "2.1.54",
3
+ "version": "2.1.56",
4
4
  "description": "Herramienta CLI unificada para la gestión de plantillas en SIGU.",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -20,12 +20,12 @@
20
20
  "dependencies": {
21
21
  "bcryptjs": "^2.4.3",
22
22
  "cors": "^2.8.6",
23
- "express": "^4.22.1",
23
+ "express": "^4.22.2",
24
24
  "google-auth-library": "^9.15.1",
25
25
  "helmet": "^7.2.0",
26
26
  "jsonwebtoken": "^9.0.3",
27
- "mysql2": "^3.22.3",
28
- "nodemailer": "^8.0.7",
27
+ "mysql2": "^3.22.5",
28
+ "nodemailer": "^8.0.11",
29
29
  "pdf-lib": "^1.17.1",
30
30
  "pdfkit": "^0.15.2"
31
31
  }
@@ -0,0 +1,50 @@
1
+ const express = require("express");
2
+ const Router = express.Router();
3
+
4
+ const DatosMiscelaneos = require('../servicios/Nucleo/DatosMiscelaneos.js');
5
+ const Miscelaneo = require('../servicios/Nucleo/Miscelaneas.js');
6
+ const ManejadorDeErrores = require('../servicios/Nucleo/ManejadorDeErrores.js');
7
+
8
+
9
+
10
+ Router.get("/detalle/:llave", async (solicitud, respuesta, next) => {
11
+ try {
12
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
13
+ try {
14
+ return respuesta.json({ body: await DatosMiscelaneos.obtener(solicitud.params.llave), error: undefined });
15
+ } catch (error) {
16
+ const MensajeDeError = "No fue posible obtener el dato misceláneo";
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
+
28
+
29
+ Router.post("/guardar", async (solicitud, respuesta, next) => {
30
+ try {
31
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
32
+ try {
33
+ const Datos = solicitud.body;
34
+ Datos.LastUser = await Miscelaneo.generarLastUser(solicitud);
35
+ return respuesta.json({ body: await DatosMiscelaneos.guardar(Datos), error: undefined });
36
+ } catch (error) {
37
+ const MensajeDeError = "No fue posible guardar el dato misceláneo";
38
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
39
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
40
+ }
41
+ }
42
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
43
+ } catch (error) {
44
+ next(error);
45
+ }
46
+ });
47
+
48
+
49
+
50
+ module.exports = Router;
@@ -1068,7 +1068,8 @@ Router.get('/VistaDePoliticas', async (solicitud, respuesta, next) => {
1068
1068
  try {
1069
1069
  if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1070
1070
  try {
1071
- await Miscelaneo.registrarVistaDePoliticas(solicitud.headers.authorization);
1071
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1072
+ await Miscelaneo.registrarVistaDePoliticas(lastUser);
1072
1073
  return respuesta.json({ body: undefined, error: undefined });
1073
1074
  } catch (error) {
1074
1075
  const MensajeDeError = 'No fue posible registrar la vista de políticas de seguridad';
@@ -1081,11 +1082,13 @@ Router.get('/VistaDePoliticas', async (solicitud, respuesta, next) => {
1081
1082
  next(error);
1082
1083
  }
1083
1084
  });
1085
+
1084
1086
  Router.get('/VistaDeAcercaDe', async (solicitud, respuesta, next) => {
1085
1087
  try {
1086
1088
  if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1087
1089
  try {
1088
- await Miscelaneo.registrarVistaDeAcercaDe(solicitud.headers.authorization);
1090
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1091
+ await Miscelaneo.registrarVistaDeAcercaDe(lastUser);
1089
1092
  return respuesta.json({ body: undefined, error: undefined });
1090
1093
  } catch (error) {
1091
1094
  const MensajeDeError = 'No fue posible registrar la vista de Acerca de';
@@ -1102,7 +1105,8 @@ Router.get('/VistaDeConozcanos', async (solicitud, respuesta, next) => {
1102
1105
  try {
1103
1106
  if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1104
1107
  try {
1105
- await Miscelaneo.registrarVistaDeConozcanos(solicitud.headers.authorization);
1108
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1109
+ await Miscelaneo.registrarVistaDeConozcanos(lastUser);
1106
1110
  return respuesta.json({ body: undefined, error: undefined });
1107
1111
  } catch (error) {
1108
1112
  const MensajeDeError = 'No fue posible registrar la vista de conozcanos';
@@ -1120,7 +1124,8 @@ Router.get('/VistaDeSabiasQue', async (solicitud, respuesta, next) => {
1120
1124
  try {
1121
1125
  if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1122
1126
  try {
1123
- await Miscelaneo.registrarVistaDeSabiasQue(solicitud.headers.authorization);
1127
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1128
+ await Miscelaneo.registrarVistaDeSabiasQue(lastUser);
1124
1129
  return respuesta.json({ body: undefined, error: undefined });
1125
1130
  } catch (error) {
1126
1131
  const MensajeDeError = 'No fue posible registrar la vista de sabías qué';
@@ -1138,7 +1143,8 @@ Router.get('/VistaDePreguntasFrecuentes', async (solicitud, respuesta, next) =>
1138
1143
  try {
1139
1144
  if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1140
1145
  try {
1141
- await Miscelaneo.registrarVistaDePreguntasFrecuentes(solicitud.headers.authorization);
1146
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1147
+ await Miscelaneo.registrarVistaDePreguntasFrecuentes(lastUser);
1142
1148
  return respuesta.json({ body: undefined, error: undefined });
1143
1149
  } catch (error) {
1144
1150
  const MensajeDeError = 'No fue posible registrar la vista de preguntas frecuentes';
@@ -1152,4 +1158,170 @@ Router.get('/VistaDePreguntasFrecuentes', async (solicitud, respuesta, next) =>
1152
1158
  }
1153
1159
  });
1154
1160
 
1161
+ Router.get('/VistaDeAccesibilidad', async (solicitud, respuesta, next) => {
1162
+ try {
1163
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1164
+ try {
1165
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1166
+ await Miscelaneo.registrarVistaDeAccesibilidad(lastUser);
1167
+ return respuesta.json({ body: undefined, error: undefined });
1168
+ } catch (error) {
1169
+ const MensajeDeError = 'No fue posible registrar la vista de accesibilidad';
1170
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1171
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1172
+ }
1173
+ }
1174
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1175
+ } catch (error) {
1176
+ next(error);
1177
+ }
1178
+ });
1179
+
1180
+ Router.get('/VistaDeDeclaracionIA', async (solicitud, respuesta, next) => {
1181
+ try {
1182
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1183
+ try {
1184
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1185
+ await Miscelaneo.registrarVistaDeDeclaracionIA(lastUser);
1186
+ return respuesta.json({ body: undefined, error: undefined });
1187
+ } catch (error) {
1188
+ const MensajeDeError = 'No fue posible registrar la vista de declaración de IA';
1189
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1190
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1191
+ }
1192
+ }
1193
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1194
+ } catch (error) {
1195
+ next(error);
1196
+ }
1197
+ });
1198
+
1199
+ Router.get('/VistaDeActividad', async (solicitud, respuesta, next) => {
1200
+ try {
1201
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1202
+ try {
1203
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1204
+ await Miscelaneo.registrarVistaDeActividad(lastUser);
1205
+ return respuesta.json({ body: undefined, error: undefined });
1206
+ } catch (error) {
1207
+ const MensajeDeError = 'No fue posible registrar la vista de actividad';
1208
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1209
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1210
+ }
1211
+ }
1212
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1213
+ } catch (error) {
1214
+ next(error);
1215
+ }
1216
+ });
1217
+
1218
+ Router.post('/registrarVistaDeItemsDePoliticas', async (solicitud, respuesta, next) => {
1219
+ try {
1220
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1221
+ try {
1222
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1223
+ await Miscelaneo.registrarVistaDeItemsDePoliticas(lastUser, solicitud.body.itemId);
1224
+ return respuesta.json({ body: undefined, error: undefined });
1225
+ } catch (error) {
1226
+ const MensajeDeError = 'No fue posible registrar la vista de la política';
1227
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1228
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1229
+ }
1230
+ }
1231
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1232
+ } catch (error) {
1233
+ next(error);
1234
+ }
1235
+ });
1236
+
1237
+ Router.get('/obtenerRankingDeItemsDePoliticas', async (solicitud, respuesta, next) => {
1238
+ try {
1239
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1240
+ try {
1241
+ return respuesta.json({ body: await Miscelaneo.obtenerRankingDeItemsDePoliticas(), error: undefined });
1242
+ } catch (error) {
1243
+ const MensajeDeError = 'No fue posible obtener el ranking de políticas';
1244
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1245
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1246
+ }
1247
+ }
1248
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1249
+ } catch (error) {
1250
+ next(error);
1251
+ }
1252
+ });
1253
+
1254
+
1255
+ Router.post('/registrarVistaDeItemsDeSabiasQue', async (solicitud, respuesta, next) => {
1256
+ try {
1257
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1258
+ try {
1259
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1260
+ await Miscelaneo.registrarVistaDeItemsDeSabiasQue(lastUser, solicitud.body.itemId);
1261
+ return respuesta.json({ body: undefined, error: undefined });
1262
+ } catch (error) {
1263
+ const MensajeDeError = 'No fue posible registrar la vista de sabías qué';
1264
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1265
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1266
+ }
1267
+ }
1268
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1269
+ } catch (error) {
1270
+ next(error);
1271
+ }
1272
+ });
1273
+
1274
+ Router.get('/obtenerRankingDeItemsDeSabiasQue', async (solicitud, respuesta, next) => {
1275
+ try {
1276
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1277
+ try {
1278
+ return respuesta.json({ body: await Miscelaneo.obtenerRankingDeItemsDeSabiasQue(), error: undefined });
1279
+ } catch (error) {
1280
+ const MensajeDeError = 'No fue posible obtener el ranking de sabías qué';
1281
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1282
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1283
+ }
1284
+ }
1285
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1286
+ } catch (error) {
1287
+ next(error);
1288
+ }
1289
+ });
1290
+
1291
+ Router.post('/registrarVistaDeItemsDePreguntaFrecuente', async (solicitud, respuesta, next) => {
1292
+ try {
1293
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1294
+ try {
1295
+ const lastUser = await Miscelaneo.generarLastUser(solicitud);
1296
+ await Miscelaneo.registrarVistaDeItemsDePreguntaFrecuente(lastUser, solicitud.body.itemId);
1297
+ return respuesta.json({ body: undefined, error: undefined });
1298
+ } catch (error) {
1299
+ const MensajeDeError = 'No fue posible registrar la vista de la pregunta frecuente';
1300
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1301
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1302
+ }
1303
+ }
1304
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1305
+ } catch (error) {
1306
+ next(error);
1307
+ }
1308
+ });
1309
+
1310
+ Router.get('/obtenerRankingDeItemsPreguntasFrecuentes', async (solicitud, respuesta, next) => {
1311
+ try {
1312
+ if (await Miscelaneo.validarTokenV2(solicitud.headers.authorization) && await Miscelaneo.validarAccesoDelOrigen(solicitud)) {
1313
+ try {
1314
+ return respuesta.json({ body: await Miscelaneo.obtenerRankingDeItemsPreguntasFrecuentes(), error: undefined });
1315
+ } catch (error) {
1316
+ const MensajeDeError = 'No fue posible obtener el ranking de preguntas frecuentes';
1317
+ console.error(new ManejadorDeErrores(MensajeDeError, ManejadorDeErrores.obtenerNumeroDeLinea(), true, `Dirección IP: ${solicitud.ip}`));
1318
+ return respuesta.status(500).json({ body: undefined, error: MensajeDeError });
1319
+ }
1320
+ }
1321
+ return respuesta.status(401).json({ body: undefined, error: ManejadorDeErrores.mensajeDeError401() });
1322
+ } catch (error) {
1323
+ next(error);
1324
+ }
1325
+ });
1326
+
1155
1327
  module.exports = Router;
@@ -2,6 +2,7 @@ const rutasMiscelaneas = require('./misc.js');
2
2
  const rutasDeAPI = require('./API.js');
3
3
  const rutasDeConsentimientoInformado = require('./ConsentimientoInformado.js');
4
4
  const rutasDeLaConfiguracionDeTarjetas = require('./ConfiguracionDeTarjetas.js');
5
+ const rutasDeDatosMiscelaneos = require('./DatosMiscelaneos.js');
5
6
  // const rutasDelServicio1 = require('./Servicio1.js');
6
7
 
7
8
  function asignarRutasAExpress(app) {
@@ -9,6 +10,7 @@ function asignarRutasAExpress(app) {
9
10
  app.use('/api', rutasDeAPI);
10
11
  app.use('/ConsentimientoInformado', rutasDeConsentimientoInformado);
11
12
  app.use('/ConfiguracionDeTarjetas', rutasDeLaConfiguracionDeTarjetas);
13
+ app.use('/DatosMiscelaneos', rutasDeDatosMiscelaneos);
12
14
  // app.use('/Servicio1', rutasDelServicio1);
13
15
  }
14
16
 
@@ -0,0 +1,36 @@
1
+ const { ejecutarConsulta } = require('./db.js');
2
+ const Miscelaneas = require('./Miscelaneas.js');
3
+
4
+ class DatosMiscelaneos {
5
+ constructor() {
6
+ // Miscelaneas.ejecucionDiferida(this.RegistrarElServicio);
7
+ }
8
+
9
+ // RegistrarElServicio() {
10
+ // const NombreDelSercicio = 'Gestión de datos misceláneos';
11
+ // Miscelaneas.RegistrarElServicio(NombreDelSercicio);
12
+ // console.log("Se ha creado el servicio: " + NombreDelSercicio);
13
+ // }
14
+
15
+ async obtener(llave) {
16
+ const resultado = await ejecutarConsulta(
17
+ "SELECT `Datos` FROM `" + Miscelaneas.obtenerNombreLaBaseDeDatos() + "`.`DatosMiscelaneos` WHERE `DatoMiscelaneo` = ?",
18
+ [llave]
19
+ );
20
+ const datos = resultado?.[0].Datos;
21
+ if (!datos) return null;
22
+ const parsed = typeof datos === 'string' ? JSON.parse(datos) : datos;
23
+ return parsed?.texto ?? null;
24
+ }
25
+
26
+ async guardar(Datos) {
27
+ const { Llave, Texto, LastUser } = Datos;
28
+ return await ejecutarConsulta(
29
+ "INSERT INTO `" + Miscelaneas.obtenerNombreLaBaseDeDatos() + "`.`DatosMiscelaneos` (`DatoMiscelaneo`, `Datos`, `LastUser`) " +
30
+ "VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE `Datos` = VALUES(`Datos`), `LastUser` = VALUES(`LastUser`)",
31
+ [Llave, JSON.stringify({ texto: Texto }), LastUser]
32
+ );
33
+ }
34
+ }
35
+
36
+ module.exports = new DatosMiscelaneos();
@@ -870,7 +870,13 @@ class Miscelaneo {
870
870
 
871
871
  async obtenerDetalleDelModulo() {
872
872
  const Modulos = await ejecutarConsultaSIGU("SELECT `a`.`Nombre`, `a`.`Padre`, `a`.`Descripcion`, `a`.`Detalle`,\
873
- `a`.`Tipo`, IF(`a`.`Icono` <> '', CONCAT('https://storage.sigu.utn.ac.cr/images/cards/', `a`.`Icono`), '') AS `Icono`, `a`.`Color`, `a`.`Correo`,\
873
+ `a`.`Tipo`, COALESCE(\
874
+ (SELECT CONCAT('https://framework-mantenimientosv2-storage.sigu.utn.ac.cr/', REPLACE(`adj`.`Ruta`, '/var/storage/public/', ''))\
875
+ FROM `SIGU`.`SIGU_Adjuntos` `adj`\
876
+ WHERE `adj`.`Modulo` = 'framework-mantenimientosv2' AND `adj`.`Etiqueta` = `a`.`Nombre`\
877
+ ORDER BY `adj`.`LastUpdate` DESC LIMIT 1),\
878
+ CONCAT('https://framework-mantenimientosv2-storage.sigu.utn.ac.cr/', 'framework-mantenimientosv2/', `a`.`Icono`)\
879
+ ) AS `Icono`, `a`.`Color`, `a`.`Correo`,\
874
880
  `a`.`Version`, `a`.`FechaDePublicacion`, `a`.`AcuerdoDeNivelDeServicio`, `a`.`DiccionarioDeDatos`, `a`.`Repositorios`,\
875
881
  `a`.`EnlaceDelVideo`,`a`.`EnlaceDelManual`\
876
882
  , `a`.`Estado`, REGEXP_SUBSTR(SUBSTRING_INDEX(`a`.`Repositorios`, '/', -1), '[^,]*front[^,]*') AS `Frontend`\
@@ -882,16 +888,18 @@ class Miscelaneo {
882
888
  });
883
889
  }
884
890
 
885
- async registrarVistaDelManual(Token) {
886
- const { uid } = await this.obtenerDatosDelUsuario(Token);
891
+ async registrarVistaDelManual(lastUser) {
887
892
  await ejecutarConsulta(
888
893
  "INSERT INTO `DatosMiscelaneos` (`DatoMiscelaneo`, `Datos`, `LastUser`) VALUES ('VistasDelManual', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE `Datos` = JSON_SET(`Datos`, '$.Total', CAST(JSON_VALUE(`Datos`, '$.Total') AS UNSIGNED) + 1), `LastUser` = ?",
889
- [uid, uid]
894
+ [lastUser, lastUser]
895
+ );
896
+ await ejecutarConsultaSIGU(
897
+ "INSERT INTO `DatosMiscelaneos` (`DatoMiscelaneo`, `Datos`, `LastUser`) VALUES ('VistasDelManual', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE `Datos` = JSON_SET(`Datos`, '$.Total', CAST(JSON_VALUE(`Datos`, '$.Total') AS UNSIGNED) + 1), `LastUser` = ?",
898
+ [lastUser, lastUser]
890
899
  );
891
900
  }
892
901
 
893
- async registrarVistaDelModulo(Token) {
894
- const { uid } = await this.obtenerDatosDelUsuario(Token);
902
+ async registrarVistaDelModulo(lastUser) {
895
903
  await ejecutarConsulta(
896
904
  `INSERT INTO \`DatosMiscelaneos\` (\`DatoMiscelaneo\`, \`Datos\`, \`LastUser\`)
897
905
  VALUES ('VistasDelModulo', JSON_OBJECT('Total', 1, 'PorFecha', JSON_OBJECT(CURDATE(), 1)), ?)
@@ -906,7 +914,23 @@ class Miscelaneo {
906
914
  )
907
915
  ),
908
916
  \`LastUser\` = ?`,
909
- [uid, uid]
917
+ [lastUser, lastUser]
918
+ );
919
+ await ejecutarConsultaSIGU(
920
+ `INSERT INTO \`DatosMiscelaneos\` (\`DatoMiscelaneo\`, \`Datos\`, \`LastUser\`)
921
+ VALUES ('VistasDelModulo', JSON_OBJECT('Total', 1, 'PorFecha', JSON_OBJECT(CURDATE(), 1)), ?)
922
+ ON DUPLICATE KEY UPDATE
923
+ \`Datos\` = JSON_SET(
924
+ \`Datos\`,
925
+ '$.Total', CAST(JSON_VALUE(\`Datos\`, '$.Total') AS UNSIGNED) + 1,
926
+ '$.PorFecha', JSON_SET(
927
+ COALESCE(JSON_EXTRACT(\`Datos\`, '$.PorFecha'), JSON_OBJECT()),
928
+ CONCAT('$."', CURDATE(), '"'),
929
+ COALESCE(CAST(JSON_EXTRACT(JSON_EXTRACT(\`Datos\`, '$.PorFecha'), CONCAT('$."', CURDATE(), '"')) AS UNSIGNED), 0) + 1
930
+ )
931
+ ),
932
+ \`LastUser\` = ?`,
933
+ [lastUser, lastUser]
910
934
  );
911
935
  }
912
936
 
@@ -980,7 +1004,13 @@ class Miscelaneo {
980
1004
  const Permisos = await ejecutarConsultaSIGU("SELECT `PermisoId` FROM `SIGU`.`SIGU_PermisosPersonasV2` WHERE `Identificador` = ?"
981
1005
  , [Resultado.Identificador]);
982
1006
  const Modulos = await ejecutarConsultaSIGU("SELECT `a`.`Nombre`, `a`.`Padre`, `a`.`Descripcion`, `a`.`Detalle`,\
983
- `a`.`Tipo`, IF(`a`.`Icono` <> '', CONCAT('https://storage.sigu.utn.ac.cr/images/cards/', `a`.`Icono`), '') AS `Icono`, `a`.`Color`, `a`.`Correo`,\
1007
+ `a`.`Tipo`, COALESCE(\
1008
+ (SELECT CONCAT('https://framework-mantenimientosv2-storage.sigu.utn.ac.cr/', REPLACE(`adj`.`Ruta`, '/var/storage/public/', ''))\
1009
+ FROM `SIGU`.`SIGU_Adjuntos` `adj`\
1010
+ WHERE `adj`.`Modulo` = 'framework-mantenimientosv2' AND `adj`.`Etiqueta` = `a`.`Nombre`\
1011
+ ORDER BY `adj`.`LastUpdate` DESC LIMIT 1),\
1012
+ CONCAT('https://framework-mantenimientosv2-storage.sigu.utn.ac.cr/', 'framework-mantenimientosv2/', `a`.`Icono`)\
1013
+ ) AS `Icono`, `a`.`Color`, `a`.`Correo`,\
984
1014
  `a`.`Version`, `a`.`FechaDePublicacion`, `a`.`AcuerdoDeNivelDeServicio`, `a`.`DiccionarioDeDatos`, `a`.`Repositorios`,\
985
1015
  `a`.`EnlaceDelVideo`,`a`.`EnlaceDelManual`\
986
1016
  , `a`.`Estado`, REGEXP_SUBSTR(SUBSTRING_INDEX(`a`.`Repositorios`, '/', -1), '[^,]*front[^,]*') AS `Frontend`\
@@ -999,7 +1029,6 @@ class Miscelaneo {
999
1029
  });
1000
1030
  }
1001
1031
 
1002
-
1003
1032
  async crearNotificacion(IdentificadorDelUsuario, IdentificadorDelDestinatario, Mensaje) {
1004
1033
  return await ejecutarConsultaSIGU("INSERT INTO `SIGU`.`SIGU_NotificacionesV2` VALUES (?, ?, 'Sin leer', NOW(4), NOW(4), ?)"
1005
1034
  , [IdentificadorDelDestinatario, Mensaje, IdentificadorDelUsuario]);
@@ -1049,11 +1078,20 @@ class Miscelaneo {
1049
1078
 
1050
1079
  async reporteDeSugerencia(Solicitud, Datos) {
1051
1080
  // const DatosDelArchivo = await this.cargarArchivo(Solicitud, Datos);
1081
+ const { uid } = await this.obtenerDatosDelUsuario(Solicitud.headers.authorization);
1052
1082
  await envioDeCorreo('msavatar@utn.ac.cr', "Reporte de sugerencia",
1053
1083
  "<p><b>Sistema: </b>" + this.NombreCanonicoDelModulo + "</p><br />"
1054
1084
  + "<p><b>Asunto: </b>Reporte de sugerencia</p><br />"
1055
1085
  + "<p><b>Detalle de la sugerencia: </b>" + Datos.detalle + "</p><br />"
1056
- + "<p><b>Información del usuario: </b>" + await this.obtenerDatosDelUsuario(Solicitud.headers.authorization) + "</p><br />");
1086
+ + "<p><b>Información del usuario: </b>" + uid + "</p><br />");
1087
+ await ejecutarConsulta(
1088
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('EnviosDeSugerencias', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
1089
+ [uid, uid]
1090
+ );
1091
+ await ejecutarConsultaSIGU(
1092
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('EnviosDeSugerencias', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
1093
+ [uid, uid]
1094
+ );
1057
1095
  return;
1058
1096
  }
1059
1097
 
@@ -2799,43 +2837,172 @@ class Miscelaneo {
2799
2837
  return desarrolladores;
2800
2838
  }
2801
2839
 
2802
- async registrarVistaDePoliticas(Token) {
2803
- const { uid } = await this.obtenerDatosDelUsuario(Token);
2840
+ async registrarVistaDePoliticas(lastUser) {
2804
2841
  await ejecutarConsulta(
2805
2842
  "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDePoliticas', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2806
- [uid, uid]
2843
+ [lastUser, lastUser]
2844
+ );
2845
+ await ejecutarConsultaSIGU(
2846
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDePoliticas', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2847
+ [lastUser, lastUser]
2807
2848
  );
2808
2849
  }
2809
2850
 
2810
- async registrarVistaDeAcercaDe(Token) {
2811
- const { uid } = await this.obtenerDatosDelUsuario(Token);
2851
+
2852
+ async registrarVistaDeItemsDePoliticas(lastUser, itemId) {
2853
+ await ejecutarConsultaSIGU(
2854
+ `INSERT INTO DatosMiscelaneos
2855
+ (DatoMiscelaneo, Datos, LastUser)
2856
+ VALUES
2857
+ ('RankingPoliticas', JSON_OBJECT(?, 1), ?)
2858
+ ON DUPLICATE KEY UPDATE
2859
+ Datos = JSON_SET(
2860
+ Datos,
2861
+ CONCAT('$.', ?),
2862
+ IFNULL(
2863
+ JSON_EXTRACT(Datos, CONCAT('$.', ?)),
2864
+ 0
2865
+ ) + 1
2866
+ ),
2867
+ LastUser = ?`,
2868
+ [itemId, lastUser, itemId, itemId, lastUser]
2869
+ );
2870
+ }
2871
+
2872
+ async obtenerRankingDeItemsDePoliticas() {
2873
+ const resultado = await ejecutarConsultaSIGU("SELECT Datos FROM `DatosMiscelaneos` WHERE `DatoMiscelaneo` = 'RankingPoliticas'");
2874
+ const datos = resultado[0]?.Datos ?? {};
2875
+ return typeof datos === 'string' ? JSON.parse(datos) : datos;
2876
+ }
2877
+
2878
+
2879
+ async registrarVistaDeAcercaDe(lastUser) {
2812
2880
  await ejecutarConsulta(
2813
2881
  "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeAcercaDe', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2814
- [uid, uid]
2882
+ [lastUser, lastUser]
2883
+ );
2884
+ await ejecutarConsultaSIGU(
2885
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeAcercaDe', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2886
+ [lastUser, lastUser]
2815
2887
  );
2816
2888
  }
2817
2889
 
2818
- async registrarVistaDeConozcanos(Token) {
2819
- const { uid } = await this.obtenerDatosDelUsuario(Token);
2890
+ async registrarVistaDeConozcanos(lastUser) {
2820
2891
  await ejecutarConsulta(
2821
2892
  "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeConozcanos', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2822
- [uid, uid]
2893
+ [lastUser, lastUser]
2894
+ );
2895
+ await ejecutarConsultaSIGU(
2896
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeConozcanos', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2897
+ [lastUser, lastUser]
2823
2898
  );
2824
2899
  }
2825
2900
 
2826
- async registrarVistaDeSabiasQue(Token) {
2827
- const { uid } = await this.obtenerDatosDelUsuario(Token);
2901
+ async registrarVistaDeSabiasQue(lastUser) {
2828
2902
  await ejecutarConsulta(
2829
2903
  "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeSabiasQue', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2830
- [uid, uid]
2904
+ [lastUser, lastUser]
2905
+ );
2906
+ await ejecutarConsultaSIGU(
2907
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeSabiasQue', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2908
+ [lastUser, lastUser]
2909
+ );
2910
+ }
2911
+
2912
+ async registrarVistaDeItemsDeSabiasQue(lastUser, itemId) {
2913
+ await ejecutarConsultaSIGU(
2914
+ `INSERT INTO DatosMiscelaneos
2915
+ (DatoMiscelaneo, Datos, LastUser)
2916
+ VALUES
2917
+ ('RankingSabiasque', JSON_OBJECT(?, 1), ?)
2918
+ ON DUPLICATE KEY UPDATE
2919
+ Datos = JSON_SET(
2920
+ Datos,
2921
+ CONCAT('$.', ?),
2922
+ IFNULL(
2923
+ JSON_EXTRACT(Datos, CONCAT('$.', ?)),
2924
+ 0
2925
+ ) + 1
2926
+ ),
2927
+ LastUser = ?`,
2928
+ [itemId, lastUser, itemId, itemId, lastUser]
2831
2929
  );
2832
2930
  }
2833
2931
 
2834
- async registrarVistaDePreguntasFrecuentes(Token) {
2835
- const { uid } = await this.obtenerDatosDelUsuario(Token);
2932
+ async obtenerRankingDeItemsDeSabiasQue() {
2933
+ const resultado = await ejecutarConsultaSIGU("SELECT Datos FROM `DatosMiscelaneos` WHERE `DatoMiscelaneo` = 'RankingSabiasque'");
2934
+ const datos = resultado[0]?.Datos ?? {};
2935
+ return typeof datos === 'string' ? JSON.parse(datos) : datos;
2936
+ }
2937
+
2938
+
2939
+ async registrarVistaDePreguntasFrecuentes(lastUser) {
2836
2940
  await ejecutarConsulta(
2837
2941
  "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDePreguntasFrecuentes', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2838
- [uid, uid]
2942
+ [lastUser, lastUser]
2943
+ );
2944
+ await ejecutarConsultaSIGU(
2945
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDePreguntasFrecuentes', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2946
+ [lastUser, lastUser]
2947
+ );
2948
+ }
2949
+
2950
+ async registrarVistaDeItemsDePreguntaFrecuente(lastUser, itemId) {
2951
+ await ejecutarConsultaSIGU(
2952
+ `INSERT INTO DatosMiscelaneos
2953
+ (DatoMiscelaneo, Datos, LastUser)
2954
+ VALUES
2955
+ ('RankingPreguntasFrecuentes', JSON_OBJECT(?, 1), ?)
2956
+ ON DUPLICATE KEY UPDATE
2957
+ Datos = JSON_SET(
2958
+ Datos,
2959
+ CONCAT('$.', ?),
2960
+ IFNULL(
2961
+ JSON_EXTRACT(Datos, CONCAT('$.', ?)),
2962
+ 0
2963
+ ) + 1
2964
+ ),
2965
+ LastUser = ?`,
2966
+ [itemId, lastUser, itemId, itemId, lastUser]
2967
+ );
2968
+ }
2969
+
2970
+ async obtenerRankingDeItemsPreguntasFrecuentes() {
2971
+ const resultado = await ejecutarConsultaSIGU("SELECT Datos FROM `DatosMiscelaneos` WHERE `DatoMiscelaneo` = 'RankingPreguntasFrecuentes'");
2972
+ const datos = resultado[0]?.Datos ?? {};
2973
+ return typeof datos === 'string' ? JSON.parse(datos) : datos;
2974
+ }
2975
+
2976
+ async registrarVistaDeAccesibilidad(lastUser) {
2977
+ await ejecutarConsulta(
2978
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeAccesibilidad', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2979
+ [lastUser, lastUser]
2980
+ );
2981
+ await ejecutarConsultaSIGU(
2982
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeAccesibilidad', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2983
+ [lastUser, lastUser]
2984
+ );
2985
+ }
2986
+
2987
+ async registrarVistaDeDeclaracionIA(lastUser) {
2988
+ await ejecutarConsulta(
2989
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeDeclaracionIA', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2990
+ [lastUser, lastUser]
2991
+ );
2992
+ await ejecutarConsultaSIGU(
2993
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeDeclaracionIA', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
2994
+ [lastUser, lastUser]
2995
+ );
2996
+ }
2997
+
2998
+ async registrarVistaDeActividad(lastUser) {
2999
+ await ejecutarConsulta(
3000
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeActividad', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
3001
+ [lastUser, lastUser]
3002
+ );
3003
+ await ejecutarConsultaSIGU(
3004
+ "INSERT INTO DatosMiscelaneos (DatoMiscelaneo, Datos, LastUser) VALUES ('VistasDeActividad', JSON_OBJECT('Total', 1), ?) ON DUPLICATE KEY UPDATE Datos = JSON_SET(Datos, '$.Total', CAST(JSON_VALUE(Datos, '$.Total') AS UNSIGNED) + 1), LastUser = ?",
3005
+ [lastUser, lastUser]
2839
3006
  );
2840
3007
  }
2841
3008
 
@@ -1,4 +1,5 @@
1
1
  FROM nginx:alpine-slim
2
+ RUN apk update && apk upgrade --no-cache libcrypto3 libssl3
2
3
  COPY ./dist/frontend /usr/share/nginx/html
3
4
  COPY nginx.conf /etc/nginx/conf.d/default.conf
4
5
  EXPOSE 80