utn-cli 1.0.0

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 (140) hide show
  1. package/commands/backend.js +282 -0
  2. package/commands/db.js +49 -0
  3. package/commands/frontend.js +225 -0
  4. package/index.js +98 -0
  5. package/package.json +27 -0
  6. package/templates/backend/InformacionDelModulo.json +21 -0
  7. package/templates/backend/NOMBRE_DEL_CANONICO_DEL_PROYECTO.rest +74 -0
  8. package/templates/backend/README.md +0 -0
  9. package/templates/backend/gitignore +3 -0
  10. package/templates/backend/index.rest +288 -0
  11. package/templates/backend/package.json +30 -0
  12. package/templates/backend/reporte.pdf +0 -0
  13. package/templates/backend/rutas/API.js +49 -0
  14. package/templates/backend/rutas/Servicio1.js +184 -0
  15. package/templates/backend/rutas/misc.js +671 -0
  16. package/templates/backend/rutas/rutas.js +11 -0
  17. package/templates/backend/server.js +79 -0
  18. package/templates/backend/servicios/API.js +101 -0
  19. package/templates/backend/servicios/InformacionDelModulo.js +70 -0
  20. package/templates/backend/servicios/Nucleo/EnvioDeCorreos.js +45 -0
  21. package/templates/backend/servicios/Nucleo/ManejadorDeErrores.js +54 -0
  22. package/templates/backend/servicios/Nucleo/Miscelaneas.js +1901 -0
  23. package/templates/backend/servicios/Nucleo/Monitoreo.js +65 -0
  24. package/templates/backend/servicios/Nucleo/db.js +78 -0
  25. package/templates/backend/servicios/Servicio1.js +118 -0
  26. package/templates/backend/variables-calidad.env +6 -0
  27. package/templates/backend/variables-desarrollo.env +6 -0
  28. package/templates/backend/variables-pruebas.env +6 -0
  29. package/templates/bd/README.md +78 -0
  30. package/templates/bd/cumulodb-scripts/gitignore +1 -0
  31. package/templates/bd/docker-compose.yml +28 -0
  32. package/templates/bd/docker-scripts/1-crear estructura.sql +29 -0
  33. package/templates/bd/docker-scripts/2-cambios estructura original.sql +1 -0
  34. package/templates/bd/docker-scripts/3-insertar datos de prueba.sql +1 -0
  35. package/templates/bd/docker-scripts/4-crear eventos y rutinas.sql +1 -0
  36. package/templates/bd/docker-scripts/5-crear vistas.sql +1 -0
  37. package/templates/bd/docker-scripts/6-calidad.sql +1 -0
  38. package/templates/bd/docker-scripts/7-pruebas.sql +1 -0
  39. package/templates/bd/docker-scripts/8-local.sql +1 -0
  40. package/templates/bd/servidores-scripts/calidad.sql +1 -0
  41. package/templates/bd/servidores-scripts/datos_iniciales_produccion.sql +1 -0
  42. package/templates/bd/servidores-scripts/produccion.sql +1 -0
  43. package/templates/bd/servidores-scripts/pruebas.sql +1 -0
  44. package/templates/frontend/.vscode/extensions.json +4 -0
  45. package/templates/frontend/.vscode/launch.json +20 -0
  46. package/templates/frontend/.vscode/tasks.json +42 -0
  47. package/templates/frontend/Dockerfile +5 -0
  48. package/templates/frontend/README.md +59 -0
  49. package/templates/frontend/angular.json +101 -0
  50. package/templates/frontend/dist/frontend/3rdpartylicenses.txt +459 -0
  51. package/templates/frontend/dist/frontend/prerendered-routes.json +3 -0
  52. package/templates/frontend/docker-compose.yml +5 -0
  53. package/templates/frontend/editorconfig +17 -0
  54. package/templates/frontend/gitignore +45 -0
  55. package/templates/frontend/nginx.conf +12 -0
  56. package/templates/frontend/package.json +46 -0
  57. package/templates/frontend/public/favicon.ico +0 -0
  58. package/templates/frontend/src/app/Componentes/Nucleo/graficos/graficos.component.css +15 -0
  59. package/templates/frontend/src/app/Componentes/Nucleo/graficos/graficos.component.html +25 -0
  60. package/templates/frontend/src/app/Componentes/Nucleo/graficos/graficos.component.ts +80 -0
  61. package/templates/frontend/src/app/Componentes/Nucleo/iframe/iframe.ts +37 -0
  62. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.component.css +5 -0
  63. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.component.html +22 -0
  64. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion.ts +64 -0
  65. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion-html/mensaje-confirmacion-html.component.css +5 -0
  66. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion-html/mensaje-confirmacion-html.component.html +22 -0
  67. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-confirmacion-html/mensaje-confirmacion-html.ts +64 -0
  68. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-informacion/mensaje-informacion.component.css +5 -0
  69. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-informacion/mensaje-informacion.component.html +11 -0
  70. package/templates/frontend/src/app/Componentes/Nucleo/mensaje-informacion/mensaje-informacion.ts +46 -0
  71. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.css +11 -0
  72. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.html +17 -0
  73. package/templates/frontend/src/app/Componentes/Nucleo/mensajes/mensajes.component.ts +43 -0
  74. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.css +37 -0
  75. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.html +35 -0
  76. package/templates/frontend/src/app/Componentes/Nucleo/reporte-de-incidencias/reporte-de-incidencias.component.ts +103 -0
  77. package/templates/frontend/src/app/Componentes/Nucleo/subir-archivo/subir-archivo.component.css +90 -0
  78. package/templates/frontend/src/app/Componentes/Nucleo/subir-archivo/subir-archivo.component.html +39 -0
  79. package/templates/frontend/src/app/Componentes/Nucleo/subir-archivo/subir-archivo.component.ts +132 -0
  80. package/templates/frontend/src/app/Componentes/Nucleo/tabla/paginador-personalizado.ts +17 -0
  81. package/templates/frontend/src/app/Componentes/Nucleo/tabla/tabla.component.css +332 -0
  82. package/templates/frontend/src/app/Componentes/Nucleo/tabla/tabla.component.html +166 -0
  83. package/templates/frontend/src/app/Componentes/Nucleo/tabla/tabla.component.ts +228 -0
  84. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta/tarjeta.component.css +129 -0
  85. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta/tarjeta.component.html +35 -0
  86. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta/tarjeta.component.ts +46 -0
  87. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-modulo/tarjeta-modulo.component.css +92 -0
  88. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-modulo/tarjeta-modulo.component.html +17 -0
  89. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-modulo/tarjeta-modulo.component.ts +42 -0
  90. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-multiple/tarjeta-multiple.component.css +90 -0
  91. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-multiple/tarjeta-multiple.component.html +22 -0
  92. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-multiple/tarjeta-multiple.component.ts +46 -0
  93. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-reporte/tarjeta-reporte.component.css +129 -0
  94. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-reporte/tarjeta-reporte.component.html +20 -0
  95. package/templates/frontend/src/app/Componentes/Nucleo/tarjeta-reporte/tarjeta-reporte.component.ts +25 -0
  96. package/templates/frontend/src/app/Componentes/guardar-incapacidad/guardar-incapacidad.component.css +20 -0
  97. package/templates/frontend/src/app/Componentes/guardar-incapacidad/guardar-incapacidad.component.html +46 -0
  98. package/templates/frontend/src/app/Componentes/guardar-incapacidad/guardar-incapacidad.component.ts +64 -0
  99. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.css +142 -0
  100. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.html +90 -0
  101. package/templates/frontend/src/app/Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component.ts +139 -0
  102. package/templates/frontend/src/app/Paginas/contenedor-principal/contenedor-principal.component.css +4 -0
  103. package/templates/frontend/src/app/Paginas/contenedor-principal/contenedor-principal.component.html +17 -0
  104. package/templates/frontend/src/app/Paginas/contenedor-principal/contenedor-principal.component.ts +36 -0
  105. package/templates/frontend/src/app/Paginas/gestion-de-reportes/gestion-de-reportes.component.css +4 -0
  106. package/templates/frontend/src/app/Paginas/gestion-de-reportes/gestion-de-reportes.component.html +6 -0
  107. package/templates/frontend/src/app/Paginas/gestion-de-reportes/gestion-de-reportes.component.ts +36 -0
  108. package/templates/frontend/src/app/Paginas/gestion-graficos/gestion-graficos.component.css +13 -0
  109. package/templates/frontend/src/app/Paginas/gestion-graficos/gestion-graficos.component.html +13 -0
  110. package/templates/frontend/src/app/Paginas/gestion-graficos/gestion-graficos.component.ts +75 -0
  111. package/templates/frontend/src/app/Paginas/gestion-iframe1/gestion-iframe1.component.css +13 -0
  112. package/templates/frontend/src/app/Paginas/gestion-iframe1/gestion-iframe1.component.html +3 -0
  113. package/templates/frontend/src/app/Paginas/gestion-iframe1/gestion-iframe1.component.ts +14 -0
  114. package/templates/frontend/src/app/Paginas/gestion-tabla/gestion-tabla.component.css +13 -0
  115. package/templates/frontend/src/app/Paginas/gestion-tabla/gestion-tabla.component.html +24 -0
  116. package/templates/frontend/src/app/Paginas/gestion-tabla/gestion-tabla.component.ts +300 -0
  117. package/templates/frontend/src/app/Paginas/gestion-tabla-XYZ/gestion-tabla-XYZ.component.css +13 -0
  118. package/templates/frontend/src/app/Paginas/gestion-tabla-XYZ/gestion-tabla-XYZ.component.html +43 -0
  119. package/templates/frontend/src/app/Paginas/gestion-tabla-XYZ/gestion-tabla-XYZ.component.ts +305 -0
  120. package/templates/frontend/src/app/Paginas/gestion-tabla-jefe/gestion-tabla-jefe.component.css +13 -0
  121. package/templates/frontend/src/app/Paginas/gestion-tabla-jefe/gestion-tabla-jefe.component.html +25 -0
  122. package/templates/frontend/src/app/Paginas/gestion-tabla-jefe/gestion-tabla-jefe.component.ts +245 -0
  123. package/templates/frontend/src/app/analytics.module.ts +45 -0
  124. package/templates/frontend/src/app/app.component.css +0 -0
  125. package/templates/frontend/src/app/app.component.html +1 -0
  126. package/templates/frontend/src/app/app.component.ts +10 -0
  127. package/templates/frontend/src/app/app.config.server.ts +14 -0
  128. package/templates/frontend/src/app/app.config.ts +27 -0
  129. package/templates/frontend/src/app/app.routes.ts +16 -0
  130. package/templates/frontend/src/app/auth.interceptor.ts +26 -0
  131. package/templates/frontend/src/app/datos-globales.service.ts +45 -0
  132. package/templates/frontend/src/assets/Puntos.svg +94 -0
  133. package/templates/frontend/src/index.html +36 -0
  134. package/templates/frontend/src/main.server.ts +7 -0
  135. package/templates/frontend/src/main.ts +6 -0
  136. package/templates/frontend/src/styles.css +14 -0
  137. package/templates/frontend/tsconfig.app.json +15 -0
  138. package/templates/frontend/tsconfig.json +27 -0
  139. package/templates/frontend/tsconfig.spec.json +15 -0
  140. package/utils/index.js +105 -0
@@ -0,0 +1,65 @@
1
+ const Miscelaneo = require('./Miscelaneas.js');
2
+ const ManejadorDeErrores = require('./ManejadorDeErrores.js');
3
+ const API = require('../API.js');
4
+
5
+ async function moitoreo() {
6
+
7
+ try {
8
+ const Resultado = await Miscelaneo.obtenerSedes();
9
+ if (Resultado.length === 0) {
10
+ throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorAccesoAAPI(), ManejadorDeErrores.obtenerNumeroDeLinea(), false);
11
+ }
12
+ console.log('Monitoreo Paso 1 de 1: Ok. Miscelaneo.obtenerSedes()');
13
+ } catch (error) {
14
+ console.error(error);
15
+ return false;
16
+ }
17
+ // try {
18
+ // const Resultado = await Formularios.obtenerFormularios('Formación');
19
+ // if (Resultado.length === 0) {
20
+ // throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorAccesoAAPI(), ManejadorDeErrores.obtenerNumeroDeLinea(), false);
21
+ // }
22
+ // console.log('Monitoreo Paso 2 de 5: Ok. Formularios.obtenerFormularios()');
23
+ // } catch (error) {
24
+ // console.error(error);
25
+ // return false;
26
+ // }
27
+ // try {
28
+ // const Resultado = await API.obtenerCarreras();
29
+ // if (Resultado.length === 0) {
30
+ // throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorAccesoAAPI(), ManejadorDeErrores.obtenerNumeroDeLinea(), false);
31
+ // }
32
+ // console.log('Monitoreo Paso 3 de 5: Ok. Miscelaneo.obtenerCarreras()');
33
+ // } catch (error) {
34
+ // console.error(error);
35
+ // return false;
36
+ // }
37
+ // try {
38
+ // const Resultado = await API.obtenerOfertaAcademica(19);
39
+ // if (Resultado.length === 0) {
40
+ // throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorAccesoAAPI(), ManejadorDeErrores.obtenerNumeroDeLinea(), false);
41
+ // }
42
+ // console.log('Monitoreo Paso 4 de 5: Ok. Miscelaneo.obtenerOfertaAcademica(19)');
43
+ // } catch (error) {
44
+ // console.errorerror);
45
+ // return false;
46
+ // }
47
+ // try {
48
+ // Cuerpo = {
49
+ // "Identificacion": "111050570",
50
+ // "Anio": 2011,
51
+ // "Periodo": "I"
52
+ // };
53
+ // const Resultado = await API.cursosPorPersonaAnioYPeriodo(Cuerpo);
54
+ // if (Resultado.length === 0) {
55
+ // throw new ManejadorDeErrores(ManejadorDeErrores.mensajeDeErrorAccesoAAPI(), ManejadorDeErrores.obtenerNumeroDeLinea(), false);
56
+ // }
57
+ // console.log('Monitoreo Paso 5 de 5: Ok. API.cursosPorPersonaAnioYPeriodo(Cuerpo)');
58
+ // } catch (error) {
59
+ // console.error(error);
60
+ // return false;
61
+ // }
62
+ return true;
63
+ }
64
+
65
+ module.exports = { moitoreo };
@@ -0,0 +1,78 @@
1
+ const mysql = require ('mysql2/promise');
2
+ const ManejadorDeErrores = require('./ManejadorDeErrores.js');
3
+
4
+ async function crearObjetoConexion() {
5
+ return await mysql.createConnection({
6
+ host: process.env.DB_HOST || '127.0.0.1',
7
+ user: process.env.DB_USER || 'root',
8
+ password: process.env.MYSQLPASS || 'root',
9
+ database: process.env.DB_NAME || 'NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS',
10
+ port: process.env.MYSQLPORT || 3307,
11
+ multipleStatements: true,
12
+ charset: "utf8mb4"
13
+ });
14
+ }
15
+
16
+ async function ejecutarConsulta(consulta, parametrosDeLaConsulta) {
17
+ const conexion = await crearObjetoConexion();
18
+ let resultados = undefined;
19
+ try {
20
+ resultados = await conexion.query(consulta, parametrosDeLaConsulta);
21
+ return resultados[0];
22
+ } catch (error) {
23
+ console.error(new ManejadorDeErrores(error.message, ManejadorDeErrores.obtenerNumeroDeLinea()));
24
+ throw error;
25
+ } finally {
26
+ await conexion.end();
27
+ }
28
+ };
29
+
30
+ async function crearObjetoConexionSIGU() {
31
+ return await await mysql.createConnection({
32
+ host: process.env.DB_HOST_SIGU || '127.0.0.1',
33
+ user: process.env.DB_USER_SIGU || 'root',
34
+ password: process.env.MYSQLPASS_SIGU || 'root',
35
+ database: process.env.DB_NAME_SIGU || 'SIGU',
36
+ port: process.env.MYSQLPORT_SIGU || 3309,
37
+ multipleStatements: true,
38
+ charset: "utf8mb4"
39
+ });
40
+ }
41
+
42
+ async function ejecutarConsultaSIGU(consulta, parametrosDeLaConsulta) {
43
+ const conexion = await crearObjetoConexionSIGU();
44
+ let resultados = undefined;
45
+ try {
46
+ resultados = await conexion.query(consulta, parametrosDeLaConsulta);
47
+ return resultados[0];
48
+ } catch (error) {
49
+ console.error(new ManejadorDeErrores(error.message, ManejadorDeErrores.obtenerNumeroDeLinea()));
50
+ throw error;
51
+ } finally {
52
+ await conexion.end();
53
+ }
54
+ };
55
+
56
+ async function ejecutarConsultaCumulo(consulta, parametrosDeLaConsulta) {
57
+ const conexion = await mysql.createConnection({
58
+ host: process.env.DB_HOST_CUMULO || '127.0.0.1',
59
+ user: process.env.DB_USER_CUMULO || 'root',
60
+ password: process.env.MYSQLPASS_CUMULO || 'root',
61
+ database: process.env.DB_NAME_CUMULO || 'DatosFederados',
62
+ port: process.env.MYSQLPORT_CUMULO || 3308,
63
+ multipleStatements: true,
64
+ charset: "utf8mb4"
65
+ });
66
+ let resultados = undefined;
67
+ try {
68
+ resultados = await conexion.query(consulta, parametrosDeLaConsulta);
69
+ return resultados[0];
70
+ } catch (error) {
71
+ console.error(new ManejadorDeErrores(error.message, ManejadorDeErrores.obtenerNumeroDeLinea()));
72
+ throw error;
73
+ } finally {
74
+ await conexion.end();
75
+ }
76
+ };
77
+
78
+ module.exports = { ejecutarConsulta, ejecutarConsultaSIGU, ejecutarConsultaCumulo, crearObjetoConexion, crearObjetoConexionSIGU };
@@ -0,0 +1,118 @@
1
+ const { ejecutarConsulta } = require('./Nucleo/db.js');
2
+ const Miscelaneas = require('./Nucleo/Miscelaneas.js');
3
+
4
+ class Servicio1 {
5
+
6
+ constructor() {
7
+ Miscelaneas.ejecucionDiferida(this.RegistrarElServicio);
8
+ };
9
+
10
+ RegistrarElServicio() {
11
+ const NombreDelServicio = 'Servicio1';
12
+ Miscelaneas.RegistrarElServicio(NombreDelServicio);
13
+ console.log("Se ha creado el servicio: " + NombreDelServicio);
14
+ }
15
+
16
+ funcionDeEjemplo(ParametroDeEjemplo) {
17
+ return ejecutarConsulta("SELECT ?", [ParametroDeEjemplo]);
18
+ }
19
+
20
+ // async listar() {
21
+ // return await ejecutarConsulta("SELECT `BeneficioEstudiantilId`, `Nombre`, `Tipo`, `Estado` FROM `vve-bybe`.`BYBE_BeneficiosEstudiantiles`");
22
+ // }
23
+
24
+ // // Ejemplo de listar con paginador
25
+ // async listar(Parametros) {
26
+ // let Resultados = undefined;
27
+ // let ORDERBY = "";
28
+ // const SELECTBase = `WITH Datos AS (
29
+ // SELECT
30
+ // c.CorreoId,
31
+ // c.Identificador,
32
+ // p.Identificacion,
33
+ // CONCAT(p.Nombre, ' ', p.PrimerApellido, ' ', p.SegundoApellido) AS NombreCompleto,
34
+ // c.CorreoElectronico,
35
+ // CASE WHEN c.Principal = 1 THEN 'Sí' ELSE 'No' END AS Principal,
36
+ // CASE WHEN c.Activo = 1 THEN 'Sí' ELSE 'No' END AS Activo
37
+ // FROM SIGU_CorreosPersona c
38
+ // INNER JOIN SIGU_Personas p
39
+ // ON c.Identificador = p.Identificador
40
+ // )`;
41
+ // // Ordenamiento de los resultados
42
+ // const ordenValido = ['asc', 'desc'].includes(Parametros.TipoDeOrden);
43
+ // ORDERBY = (Parametros.ColumnaParaOrdenar !== '-' && ordenValido) ? ` ORDER BY ${Parametros.ColumnaParaOrdenar} ${Parametros.TipoDeOrden} `: '';
44
+ // // Filtrado de resultados por columna
45
+ // if (Parametros.PaginadorFiltro !== '&&&&') {
46
+ // if (Parametros.PaginadorColumnaParaFiltrar === 'Todas') {
47
+ // const WHERE = Parametros.PaginadorColumnasParaFiltrar.split(",")
48
+ // .map(col => `${col} COLLATE utf8mb4_spanish_ci LIKE '%${Parametros.PaginadorFiltro}%'`).join(" OR ");
49
+ // const Total = await ejecutarConsultaSIGU(SELECTBase + " SELECT COUNT(*) AS Total FROM Datos WHERE " + WHERE);
50
+ // Resultados = await ejecutarConsultaSIGU(SELECTBase + " SELECT * FROM Datos WHERE " + WHERE + ORDERBY + " LIMIT ? OFFSET ?", [parseInt(Parametros.PaginadorTamanio), parseInt(Parametros.PaginadorIndice)]);
51
+ // return { Registros: Resultados, TotalDeRegistros: Total[0]['Total'] };
52
+ // }
53
+ // // Filtrado de datos por una columna
54
+ // if (Parametros.PaginadorColumnaParaFiltrar !== '-' || Parametros.PaginadorColumnaParaFiltrar !== 'Todas') {
55
+ // const WHERE = Parametros.PaginadorColumnaParaFiltrar + " COLLATE utf8mb4_spanish_ci LIKE '%" + Parametros.PaginadorFiltro + "%'";
56
+ // const Total = await ejecutarConsultaSIGU(SELECTBase + " SELECT COUNT(*) AS Total FROM Datos WHERE " + WHERE);
57
+ // Resultados = await ejecutarConsultaSIGU(SELECTBase + " SELECT * FROM Datos WHERE " + WHERE + ORDERBY + " LIMIT ? OFFSET ?", [parseInt(Parametros.PaginadorTamanio), parseInt(Parametros.PaginadorIndice)]);
58
+ // return { Registros: Resultados, TotalDeRegistros: Total[0]['Total'] };
59
+ // }
60
+ // const ss = "";
61
+ // }
62
+ // // Predeterminadamente se retornan los datos paginados pero sin filtrar
63
+ // // Los símbolos &&&& se usan como valor predeterminado
64
+ // if (Parametros.PaginadorFiltro === '&&&&') {
65
+ // const Total = await ejecutarConsultaSIGU(SELECTBase + " SELECT COUNT(*) AS Total FROM Datos");
66
+ // Resultados = await ejecutarConsultaSIGU(SELECTBase + " SELECT * FROM Datos " + ORDERBY + " LIMIT ? OFFSET ?", [parseInt(Parametros.PaginadorTamanio), parseInt(Parametros.PaginadorIndice)]);
67
+ // return { Registros: Resultados, TotalDeRegistros: Total[0]['Total'] };
68
+ // }
69
+ // return Resultados;
70
+ // }
71
+
72
+ // async AgregarNombresALosResultados(Resultados) {
73
+ // const Nombres = await ejecutarConsultaSIGU("SELECT `Identificacion`, CONCAT(`Nombre`, ' ', `PrimerApellido`, ' ', `SegundoApellido`) AS `NombreCompleto` FROM `SIGU`.`SIGU_Personas` WHERE `Identificacion` IN (" + Resultados.map(item => `'${item.Identificacion}'`).join(",") + ")");
74
+ // Resultados = Resultados.map(item1 => {
75
+ // const item2 = Nombres.find(item => item.Identificacion === item1.Identificacion);
76
+ // return item2 ? { ...item1, ...item2 } : { ...item1, NombreCompleto: '-' };
77
+ // });
78
+ // return Resultados;
79
+ // }
80
+
81
+ // async agergar(Datos) {
82
+ // return ejecutarConsulta("INSERT INTO `vve-bybe`.`BYBE_BeneficiosEstudiantiles` VALUES (NULL,\
83
+ // ?, ?, 'Activo', NOW(4), ?)"
84
+ // , [Datos.Nombre, Datos.Tipo, Resultado.uid]);
85
+ // }
86
+
87
+ // async borrar(Datos) {
88
+ // return ejecutarConsulta("DELETE FROM `vve-bybe`.`BYBE_BeneficiosEstudiantiles` WHERE\
89
+ // `BeneficioEstudiantilId` = ?", [Datos.BeneficioEstudiantilId]);
90
+ // }
91
+
92
+ // async actualizar(Datos) {
93
+ // return ejecutarConsulta("UPDATE `vve-bybe`.`BYBE_BeneficiosEstudiantiles`\
94
+ // SET `Nombre` = ?, `Tipo` = ?, `Estado` = ?\
95
+ // , `LastUpdate` = NOW(4), `LastUser` = ?\
96
+ // WHERE `BeneficioEstudiantilId` = ?"
97
+ // , [Datos.Nombre, Datos.Tipo, Datos.Estado, Resultado.uid, Datos.BeneficioEstudiantilId]);
98
+ // }
99
+
100
+ // async detalle(BeneficioEstudiantilId) {
101
+ // return await ejecutarConsulta("SELECT `BeneficioEstudiantilId` AS `Beneficio estudiantil`, `Nombre`, `Tipo`, `Estado`\
102
+ // FROM `vve-bybe`.`BYBE_BeneficiosEstudiantiles`WHERE `BeneficioEstudiantilId` = ?"
103
+ // , [BeneficioEstudiantilId]);
104
+ // }
105
+
106
+ // async reporte() {
107
+ // return await Miscelaneo.convertirACSV(await this.listar());
108
+ // }
109
+
110
+ // async Estados() {
111
+ // let Resultado = await ejecutarConsulta("SELECT REPLACE(MID(`COLUMN_TYPE`, 6, CHAR_LENGTH(`COLUMN_TYPE`) - 6), \"'\", '') AS `Datos` FROM `information_schema`.`COLUMNS`\
112
+ // WHERE `TABLE_SCHEMA` = 'vve-bybe' AND `TABLE_NAME` = 'BYBE_BeneficiosEstudiantiles' AND\
113
+ // `COLUMN_NAME` = 'Estado'");
114
+ // return Resultado[0]['Datos'].split(',').sort();
115
+ // }
116
+ }
117
+
118
+ module.exports = new Servicio1();
@@ -0,0 +1,6 @@
1
+ ENV:"calidad"
2
+ PORT:"80"
3
+ BD:"GITLAB=NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS,VAR_NOMBRE=DB_NAME,VAR_USR=DB_USER,VAR_CLAVE=MYSQLPASS,VAR_HOST=DB_HOST,VAR_PORT=MYSQLPORT"
4
+ BD:"GITLAB=framework-base-de-datos,VAR_NOMBRE=DB_NAME_SIGU,VAR_USR=DB_USER_SIGU,VAR_CLAVE=MYSQLPASS_SIGU,VAR_HOST=DB_HOST_SIGU,VAR_PORT=MYSQLPORT_SIGU"
5
+ BD:"GITLAB=cumulo,VAR_NOMBRE=DB_NAME_CUMULO,VAR_USR=DB_USER_CUMULO,VAR_CLAVE=MYSQLPASS_CUMULO,VAR_HOST=DB_HOST_CUMULO,VAR_PORT=MYSQLPORT_CUMULO"
6
+ STORAGE:"/var/storage/public"
@@ -0,0 +1,6 @@
1
+ ENV:"desarrollo"
2
+ PORT:"80"
3
+ BD:"GITLAB=NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS,VAR_NOMBRE=DB_NAME,VAR_USR=DB_USER,VAR_CLAVE=MYSQLPASS,VAR_HOST=DB_HOST,VAR_PORT=MYSQLPORT"
4
+ BD:"GITLAB=framework-base-de-datos,VAR_NOMBRE=DB_NAME_SIGU,VAR_USR=DB_USER_SIGU,VAR_CLAVE=MYSQLPASS_SIGU,VAR_HOST=DB_HOST_SIGU,VAR_PORT=MYSQLPORT_SIGU"
5
+ BD:"GITLAB=cumulo,VAR_NOMBRE=DB_NAME_CUMULO,VAR_USR=DB_USER_CUMULO,VAR_CLAVE=MYSQLPASS_CUMULO,VAR_HOST=DB_HOST_CUMULO,VAR_PORT=MYSQLPORT_CUMULO"
6
+ STORAGE:"/var/storage/public"
@@ -0,0 +1,6 @@
1
+ ENV:"pruebas"
2
+ PORT:"80"
3
+ BD:"GITLAB=NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS,VAR_NOMBRE=DB_NAME,VAR_USR=DB_USER,VAR_CLAVE=MYSQLPASS,VAR_HOST=DB_HOST,VAR_PORT=MYSQLPORT"
4
+ BD:"GITLAB=framework-base-de-datos,VAR_NOMBRE=DB_NAME_SIGU,VAR_USR=DB_USER_SIGU,VAR_CLAVE=MYSQLPASS_SIGU,VAR_HOST=DB_HOST_SIGU,VAR_PORT=MYSQLPORT_SIGU"
5
+ BD:"GITLAB=cumulo,VAR_NOMBRE=DB_NAME_CUMULO,VAR_USR=DB_USER_CUMULO,VAR_CLAVE=MYSQLPASS_CUMULO,VAR_HOST=DB_HOST_CUMULO,VAR_PORT=MYSQLPORT_CUMULO"
6
+ STORAGE:"/var/storage/public"
@@ -0,0 +1,78 @@
1
+ # Generalidades
2
+ Este repositorio proporciona la estructura básica e inicial de la infraestructura de base de datos para el desarrollo de módulos en la UTN. Su principal objetivo es ofrecer un punto de partida sólido para la creación de bases de datos destinadas a los módulos en desarrollo. Siéntase libre de modificarlo según sus necesidades y para que se adapte a su forma de trabajo.
3
+
4
+ # Requisitos previos
5
+ - Contar con *docker* y *docker-compose* instalado en su computadora.
6
+ - Tener instalado el editor de código de su preferencia.
7
+ - Contar con algún software para interactuar con bases de datos de tipo MySQL/MariaDB.
8
+ - Crear la carpeta *registry.git.utn.ac.cr* en */etc/docker/certs.d* en Linux o en *C:\ProgramData\docker\certs.d* en Windows.
9
+ - Solicitar el archivo *ca.cert* y colocarlo en la carpeta creada en el paso anterior.
10
+
11
+ # Puesta en marcha del entorno de base de datos (fase inicial)
12
+ En una terminal ejecute los siguientes comandos.
13
+ - Registro del certificado en *docker*.
14
+
15
+ $ docker login registry.git.utn.ac.cr
16
+
17
+ - Clone este repositorio en su computadora. No olvide cambiar la ruta https por la ruta correcta.
18
+
19
+ $ git clone https://git.utn.ac.cr/sistema-integrado-de-gesti-n-universitaria-sigu/sigu-plantillas/plantillas-base-de-datos.git
20
+
21
+ - Ponga a correr el entorno. Ingrese a la carpeta en la que descargó el repositorio.
22
+
23
+ $ docker-compose --file docker-compose.yml up -d --build
24
+
25
+ - Para apagar el entorno ejecute el siguiente comando.
26
+
27
+ $ docker-compose down
28
+
29
+ # Resultado (inicial)
30
+ Si todo salió bien, tendremos disponible lo siguiente.
31
+ - Tres bases de datos para trabajar, nos podremos conectar a ellas haciendo uso de nuestro software favorito estableciendo 127.0.0.1 (no usar localhost) como el *host* y *3307* como el puerto de conexión, el nombre de usuario es *root* y la contraseña es *root*.
32
+ - El puerto 3307 corresponde a la primer instancia creada. Esta instancia se usa para almacenar la base de datos de su módulo.
33
+ - Si hace uso de los mismos parámetros pero cambia al puerto 3308, se conectará a otra instancia de base de datos, en ésta se semejarán los datos que podría necesitar del servidor cumulodb.utn.ac.cr.
34
+ - Si hace uso de los mismos parámetros pero cambia al puerto 3309, se conectará a la imagen de base de datos del *framework*. En *famewotk* se encuentran por ejemplo las tablas SIGU.SIGU_Personas y SIGU.SIGU_Localidades.
35
+
36
+ # Hacer uso del entorno de desarrollo
37
+ Hasta este momento, hemos configurado el entorno de trabajo y ya todo debería de estar listo para usarse, pero, ¿qué pasa si necesitamos crear las estructuras (base de datos, tablas, vistas, etc) de nuestro módulo?
38
+ En los puntos anteriores pusimos ha funcionar nuestro entorno de trabajo, pero, para utilizarlo debemos tener en consideración lo siguiente.
39
+
40
+ ## docker-scripts
41
+ - En la carpeta docker-scripts se encuentran una serie de archivos de tipo *.sql*, es en estos archivos en donde usted va a definir las diferentes estructuras de su base de datos que necesita su módulo, veamos el uso cada uno de ellos.
42
+
43
+ | Archivo | Uso |
44
+ |--|--|
45
+ | 1-crear estructura.sql | En este archivo van las instrucciones de tipo SQL para crear todas las estructuras de base de datos que necesita su módulo. |
46
+ | 2-cambios estructura original.sql | Una vez que su módulo llegó a Producción y si es que se torna necesario hacer cambios a la estructura original del módulo, es en este archivo en donde se escribirán las instrucciones de tipo SQL para crear o modificar las estructuras de base de datos que necesita su módulo. |
47
+ | 3-insertar datos de prueba.sql | En este archivo se crean las instrucciones de tipo SQL para llevar a cabo la inserción de los datos de prueba de su módulo. |
48
+ | 4-crear eventos y rutinas.sql | En este archivo se crean las instrucciones de tipo SQL para crear los eventos y rutinas (funciones y procedimientos) de su módulo. |
49
+ | 5-crear vistas.sql |En este archivo se crean las instrucciones de tipo SQL para crear las vistas de su módulo. |
50
+ | 6-calidad.sql | En este archivo se crean las instrucciones de tipo SQL que se necesitan ejecutar en el ambiente de Calidad. |
51
+ | 7-pruebas.sql | En este archivo se crean las instrucciones de tipo SQL que se necesitan ejecutar en el ambiente de Pruebas. |
52
+ | 8-local.sql | En este archivo se crean las instrucciones de tipo SQL que se necesitan ejecutar en el ambiente de Local. |
53
+
54
+ ## cumulodb-scripts
55
+ - La carpeta cumulodb-scripts se encuentra bacía de manera predeterminada, en esta carpeta debe colocar el archivo *.sql* que le brinden los compañeros de la Unidad de Datos y que contenga los datos para simular la conexión con el servidor cumulodb.utn.ac.cr.
56
+
57
+ # Puesta en marcha del entorno de base de datos (fase de trabajo)
58
+ Para este momento debemos haber cumplido con lo siguiente.
59
+ - Haber cumplido con la sección de [Requisitos previos](#requisitos-previos).
60
+ - Haber ingresado en los diferentes archivos de la carpeta *docker-scripts* las instrucciones de tipo SQL pertinentes.
61
+ - Haber pegado en la carpeta cumulodb-scripts el archivo brindado por los compañeros de la Unidad de Datos y que contiene los datos del servidor cumulodb.utn.ac.cr, esto si es que fuera necesario.
62
+
63
+ Ahora es necesario volver a crear nuestro entorno de trabajo, pero en esta oportunidad, se creará con las estructuras y bases de datos necesarias, para ello:
64
+ - Apague el entorno ejecute el siguiente comando.
65
+
66
+ $ docker-compose down
67
+
68
+ - Ponga a correr el entorno.
69
+
70
+ $ docker-compose --file docker-compose.yml up -d --build
71
+
72
+ # Resultado (final)
73
+ Si todo salió bien, tendremos disponible lo siguiente.
74
+ - Tres bases de datos para trabajar.
75
+ - El puerto 3307 corresponde a la primer instancia creada. En esta instancia estará la base de datos y diferentes estructuras creadas en *1-crear estructura.sql* y demás archivos de esa carpeta.
76
+ - En el puerto 3308, se conectará a otra instancia de base de datos, en ésta se semejarán los datos que podría necesitar del servidor cumulodb.utn.ac.cr. En esta instancia estará una base de datos llama *DatosFederados* y las tablas suministradas por la Unidad de Datos.
77
+ - En el puerto 3309, se conectará a la imagen de base de datos del *framework*. En *famewotk* se encuentran por ejemplo las tablas SIGU.SIGU_Personas y SIGU.SIGU_Localidades.
78
+
@@ -0,0 +1,28 @@
1
+ services:
2
+ NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS:
3
+ image: mariadb:lts
4
+ ports:
5
+ - "3307:3306"
6
+ environment:
7
+ MARIADB_ROOT_PASSWORD: root
8
+ MARIADB_GALERA_MARIABACKUP_PASSWORD: backup
9
+ volumes:
10
+ - ./docker-scripts:/docker-entrypoint-initdb.d
11
+
12
+ CumuloDB:
13
+ image: mariadb:lts
14
+ ports:
15
+ - "3308:3306"
16
+ environment:
17
+ MYSQL_ROOT_PASSWORD: root
18
+ MYSQL_DATABASE: DatosFederados
19
+ volumes:
20
+ - ./cumulodb-scripts:/docker-entrypoint-initdb.d
21
+
22
+ SIGU:
23
+ image: registry.git.utn.ac.cr/sistema-integrado-de-gesti-n-universitaria-sigu/sigu-framework/framework-base-de-datos:desarrollo-latest
24
+ ports:
25
+ - "3309:3306"
26
+ environment:
27
+ MARIADB_ROOT_PASSWORD: root
28
+ MARIADB_DATABASE: SIGU
@@ -0,0 +1,29 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
2
+
3
+ CREATE DATABASE `NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_spanish_ci;
4
+
5
+ CREATE OR REPLACE TABLE `NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS`.`Archivos` (
6
+ `ArchivoId` INT UNSIGNED NOT NULL COMMENT 'Llave foránea virtual correspondiente a `ArchivoId` en la tabla `SIGU`.`SIGU_Adjuntos`',
7
+ `Identificador` INT UNSIGNED NOT NULL COMMENT 'Llave foránea virtual correspondiente a `Identificador` en la tabla `SIGU`.`SIGU_Personas`',
8
+ `Ruta` VARCHAR(1000) COLLATE utf8mb4_spanish_ci NOT NULL COMMENT 'Ruta del archivo',
9
+ `Nombre` VARCHAR(500) NOT NULL DEFAULT '-' COMMENT 'Nombre del archivo',
10
+ `Etiquetas` VARCHAR(400) COLLATE utf8mb4_spanish_ci NOT NULL COMMENT 'Lista separada con los valores que identifican al archivo',
11
+ `LastUpdate` DATETIME(4) NOT NULL DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(4) COMMENT 'Fecha de la última actualización de la fila',
12
+ `LastUser` VARCHAR(1000) COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '-' COMMENT 'Último usuario que modificó la fila',
13
+ PRIMARY KEY (`ArchivoId`),
14
+ KEY (`Identificador`),
15
+ KEY (`Etiquetas`)
16
+ ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_spanish_ci COMMENT = 'Almacena los archivos adjuntos al módulo';
17
+
18
+ CREATE OR REPLACE TABLE `NOMBRE_DEL_REPOSITORIO_DE_BASE_DE_DATOS`.`AceptacionesDeConsentimientosInformados` (
19
+ `AceptacionDeConsentimientoInformadoId` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Llave primaria de la tabla',
20
+ `ConsentimientoInformadoId` SMALLINT UNSIGNED NOT NULL COMMENT 'Llave foránera virtual a la columna `ConsentimientoInformadoId` de la tabla `SIGU`.`SIGU_ConsentimientoInformadoV2`',
21
+ `Identificador` INT UNSIGNED NOT NULL COMMENT 'Llave foránea virtual correspondiente a `Identificador` en la tabla `SIGU`.`SIGU_Personas`',
22
+ `Etiquetas` VARCHAR(400) NOT NULL COMMENT 'Etiquetas de registro como Gestion y periodo en el que se acepto el consentimiento informado',
23
+ `UUID` VARCHAR(50) NOT NULL DEFAULT '-' COMMENT 'Código único',
24
+ `FechaDeAceptacion` DATETIME(4) NOT NULL COMMENT 'Fecha de aceptación del consentimiento informado',
25
+ `LastUpdate` DATETIME(4) NOT NULL DEFAULT CURRENT_TIMESTAMP(4) ON UPDATE CURRENT_TIMESTAMP(4) COMMENT 'Fecha de la última actualización de la fila',
26
+ `LastUser` VARCHAR(1000) COLLATE utf8mb4_spanish_ci NOT NULL DEFAULT '-' COMMENT 'Último usuario que modificó la fila',
27
+ PRIMARY KEY(`AceptacionDeConsentimientoInformadoId`),
28
+ KEY (`Identificador`)
29
+ ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_spanish_ci COMMENT = 'Almacena las aceptaciones de los consentimientos informados';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1 @@
1
+ SET NAMES 'utf8mb4' COLLATE 'utf8mb4_spanish_ci';
@@ -0,0 +1,4 @@
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
3
+ "recommendations": ["angular.ng-template"]
4
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
3
+ "version": "0.2.0",
4
+ "configurations": [
5
+ {
6
+ "name": "ng serve",
7
+ "type": "chrome",
8
+ "request": "launch",
9
+ "preLaunchTask": "npm: start",
10
+ "url": "http://localhost:4200/"
11
+ },
12
+ {
13
+ "name": "ng test",
14
+ "type": "chrome",
15
+ "request": "launch",
16
+ "preLaunchTask": "npm: test",
17
+ "url": "http://localhost:9876/debug.html"
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
3
+ "version": "2.0.0",
4
+ "tasks": [
5
+ {
6
+ "type": "npm",
7
+ "script": "start",
8
+ "isBackground": true,
9
+ "problemMatcher": {
10
+ "owner": "typescript",
11
+ "pattern": "$tsc",
12
+ "background": {
13
+ "activeOnStart": true,
14
+ "beginsPattern": {
15
+ "regexp": "(.*?)"
16
+ },
17
+ "endsPattern": {
18
+ "regexp": "bundle generation complete"
19
+ }
20
+ }
21
+ }
22
+ },
23
+ {
24
+ "type": "npm",
25
+ "script": "test",
26
+ "isBackground": true,
27
+ "problemMatcher": {
28
+ "owner": "typescript",
29
+ "pattern": "$tsc",
30
+ "background": {
31
+ "activeOnStart": true,
32
+ "beginsPattern": {
33
+ "regexp": "(.*?)"
34
+ },
35
+ "endsPattern": {
36
+ "regexp": "bundle generation complete"
37
+ }
38
+ }
39
+ }
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,5 @@
1
+ FROM nginx:alpine-slim
2
+ COPY ./dist/frontend /usr/share/nginx/html
3
+ COPY nginx.conf /etc/nginx/conf.d/default.conf
4
+ EXPOSE 80
5
+ CMD ["nginx", "-g", "daemon off;"]
@@ -0,0 +1,59 @@
1
+ # DgdhIncapacSFront
2
+
3
+ This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 19.1.8.
4
+
5
+ ## Development server
6
+
7
+ To start a local development server, run:
8
+
9
+ ```bash
10
+ ng serve
11
+ ```
12
+
13
+ Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
14
+
15
+ ## Code scaffolding
16
+
17
+ Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
18
+
19
+ ```bash
20
+ ng generate component component-name
21
+ ```
22
+
23
+ For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
24
+
25
+ ```bash
26
+ ng generate --help
27
+ ```
28
+
29
+ ## Building
30
+
31
+ To build the project run:
32
+
33
+ ```bash
34
+ ng build
35
+ ```
36
+
37
+ This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed.
38
+
39
+ ## Running unit tests
40
+
41
+ To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
42
+
43
+ ```bash
44
+ ng test
45
+ ```
46
+
47
+ ## Running end-to-end tests
48
+
49
+ For end-to-end (e2e) testing, run:
50
+
51
+ ```bash
52
+ ng e2e
53
+ ```
54
+
55
+ Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
56
+
57
+ ## Additional Resources
58
+
59
+ For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.