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,25 @@
1
+ <div>
2
+ <h3>Listado de incapacidades, licencias y permisos por persona</h3>
3
+ @if(cargando) {
4
+ <div class="cargando-overlay">
5
+ <mat-spinner diameter="50"></mat-spinner>
6
+ <p>Procesando, por favor espere...</p>
7
+ </div>
8
+ } @else {
9
+ @if(DatosParaPoblarLaTabla) {
10
+ <div class="borde">
11
+ <app-tabla [columnas]="columnas" [datos]="DatosParaPoblarLaTabla" [acciones]="acciones"
12
+ [mostrarElBotonDeGuardado]="true" [accionesSiempreClickeable]="accionesSiempreClickeable"
13
+ [estadosQuePermitenEdicion]="estadosQuePermitenEdicion" (GuardarAccion)="AbrirModal()"
14
+ (DescargarInformacion)="DescargarReporte()" (CambioDePagina)="onCambioDePagina($event)"
15
+ [paginarResultados]="PaginarResultados" [TotalDeRegistros]="TotalDeRegistros"></app-tabla>
16
+ </div>
17
+ <div class="pie">
18
+ </div>
19
+ } @else {
20
+ <div>
21
+ <mat-progress-bar mode="indeterminate"></mat-progress-bar>Cargando...
22
+ </div>
23
+ }
24
+ }
25
+ </div>
@@ -0,0 +1,245 @@
1
+ import { Component } from '@angular/core';
2
+ import { FormsModule } from '@angular/forms';
3
+ import { MatSelectModule } from '@angular/material/select';
4
+ import { MatFormFieldModule } from '@angular/material/form-field';
5
+ import { MatRadioModule } from '@angular/material/radio';
6
+ import { HttpClient, HttpHeaders } from '@angular/common/http';
7
+ import { MatProgressBarModule } from '@angular/material/progress-bar';
8
+ import { DatosGlobalesService } from '../../datos-globales.service';
9
+ import { MatDialog } from '@angular/material/dialog';
10
+ import { TablaComponent } from '../../Componentes/Nucleo/tabla/tabla.component';
11
+ import { MatButtonModule } from '@angular/material/button';
12
+ import { MensajeConfirmacionComponent } from '../../Componentes/Nucleo/mensaje-confirmacion/mensaje-confirmacion'
13
+ import { SubirArchivoComponent } from '../../Componentes/Nucleo/subir-archivo/subir-archivo.component';
14
+ import { MensajeInformacionComponent } from '../../Componentes/Nucleo/mensaje-informacion/mensaje-informacion';
15
+ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
16
+
17
+ @Component({
18
+ selector: 'app-gestion-tabla-jefe',
19
+ imports: [
20
+ TablaComponent,
21
+ MatFormFieldModule,
22
+ MatSelectModule,
23
+ FormsModule,
24
+ MatRadioModule,
25
+ MatProgressBarModule,
26
+ MatButtonModule,
27
+ MatProgressSpinnerModule
28
+ ],
29
+ templateUrl: './gestion-tabla-jefe.component.html',
30
+ styleUrls: ['./gestion-tabla-jefe.component.css'],
31
+ })
32
+ export class GestionTablaJefeComponent {
33
+ // public DatosParaPoblarLaTabla: any[] = [];
34
+ // Si se inicializa en vacío sí muestra la barra de "cargando"
35
+ // de lo contrario no, no se inicializa si los datos que carga son más de 15.000
36
+ public DatosParaPoblarLaTabla: any[] = [];
37
+ public cargando = false;
38
+
39
+ public columnas = [
40
+ { Llave: 'NumeroBoleta', Alias: 'N° de boleta', TipoDeFiltro: 'Tabla' },
41
+ { Llave: 'Descripcion', Alias: 'Tipo de ausencia', TipoDeFiltro: 'Tabla' },
42
+ { Llave: 'FechaDeInicio', Alias: 'Fecha de inicio', TipoDeFiltro: 'Tabla' },
43
+ { Llave: 'FechaDeFinal', Alias: 'Fecha final', TipoDeFiltro: 'Tabla' },
44
+ { Llave: 'TotalDeDias', Alias: 'Total de días', TipoDeFiltro: 'Tabla' },
45
+ { Llave: 'CodigoDeDoctor', Alias: 'Código y nombre del doctor', TipoDeFiltro: 'Tabla' },
46
+ { Llave: 'AreaDeSalud', Alias: 'Área de salud', TipoDeFiltro: 'Tabla' },
47
+ { Llave: 'Estado', Alias: 'Estado', TipoDeFiltro: 'Tabla' }
48
+ ];
49
+
50
+ public estadosQuePermitenEdicion = ['Tramitando'];
51
+ // https://fonts.google.com/icons
52
+ acciones = [
53
+ { icono: 'check', color: 'marino', textoAyuda: 'Firmar', ejecutar: (row: any) => this.confirmacionFirmaDelJefe(row), },
54
+ { icono: 'close', color: 'rojo', textoAyuda: 'Rechazar', ejecutar: (row: any) => this.confirmacionRechazoDelJefe(row), },
55
+ ];
56
+ public accionesSiempreClickeable = [
57
+ { icono: 'upload_file', color: 'verde', textoAyuda: 'Subir adjuntos', ejecutar: (row: any) => this.AbrirModalArchivo(row), },
58
+ { icono: 'info', color: 'verdeoscuro', textoAyuda: 'Información', ejecutar: (fila: any) => this.mostrarDetalleDelRegistro(fila.LicenciaId), }
59
+ ];
60
+ constructor(private http: HttpClient, private dialog: MatDialog, private datosGlobalesService: DatosGlobalesService) {
61
+ this.obtenerDatosParaPoblarLaTabla();
62
+ }
63
+
64
+ // PuntosPorColegioEnCantonConMIDH(fila: any): void {
65
+ // this.dialog.open(MensajeConfirmacionComponent, {
66
+ // data: {
67
+ // titulo: 'Confirmación',
68
+ // mensaje: `¿Confirma que desea actualizar las los púntos por colegio en cantón con MIDH?`,
69
+ // textoCerrar: 'Cancelar',
70
+ // textoAceptar: 'Actualizar',
71
+ // onClose: () => { },
72
+ // onAccept: () => {
73
+ // this.cargando = true;
74
+ // this.http.post(`${this.datosGlobalesService.ObtenerURL()}ParametrosAcciones/PuntosPorColegioEnCantonConMIDH`, { Periodo: fila.Periodo }).subscribe({
75
+ // next: (datos: any) => {
76
+ // this.dialog.open(MensajeConfirmacionComponent, {
77
+ // data: {
78
+ // titulo: 'Confirmación',
79
+ // mensaje: datos.body,
80
+ // textoCerrar: 'Cancelar',
81
+ // textoAceptar: 'Cerrar',
82
+ // onClose: () => { },
83
+ // onAccept: () => { },
84
+ // },
85
+ // });
86
+ // this.obtenerDatosParaPoblarLaTabla();
87
+ // },
88
+ // error: (error) => {
89
+ // this.obtenerDatosParaPoblarLaTabla();
90
+ // },
91
+ // complete: () => {
92
+ // this.cargando = false; // Ocultar spinner
93
+ // }
94
+ // });
95
+ // },
96
+ // },
97
+ // });
98
+ // }
99
+
100
+ mostrarDetalleDelRegistro(LicenciaId: any): void {
101
+ let data = {};
102
+ this.http
103
+ .get(`${this.datosGlobalesService.ObtenerURL()}licencias/datosDeUnaLicencia/${LicenciaId}`)
104
+ .subscribe({
105
+ next: (datos: any) => {
106
+ let data = datos.body[0];
107
+ this.dialog.open(MensajeInformacionComponent, { data });
108
+ },
109
+ });
110
+ }
111
+
112
+ confirmacionFirmaDelJefe(fila: any): void {
113
+ const dialogRef = this.dialog.open(MensajeConfirmacionComponent, {
114
+ data: {
115
+ titulo: 'Confirmación',
116
+ mensaje: `¿Realmente desea hacer la confirmación de este registro?`,
117
+ textoCerrar: 'Cancelar',
118
+ textoAceptar: 'Firmar',
119
+ SolicitaMensaje: true
120
+ },
121
+ });
122
+ dialogRef.afterClosed().subscribe((MensajeBrindado) => {
123
+ if (MensajeBrindado !== undefined && MensajeBrindado.trim() !== '') {
124
+ this.firmaDelJefe(fila.LicenciaId, MensajeBrindado);
125
+ }
126
+ });
127
+ }
128
+
129
+ confirmacionRechazoDelJefe(fila: any): void {
130
+ const dialogRef = this.dialog.open(MensajeConfirmacionComponent, {
131
+ data: {
132
+ titulo: 'Confirmación',
133
+ mensaje: `¿Realmente desea rechazar la confirmación de este registro?`,
134
+ textoCerrar: 'Cancelar',
135
+ textoAceptar: 'Rechazar',
136
+ SolicitaMensaje: true
137
+ },
138
+ });
139
+ dialogRef.afterClosed().subscribe((MensajeBrindado) => {
140
+ if (MensajeBrindado !== undefined && MensajeBrindado.trim() !== '') {
141
+ this.rechazoDelJefe(fila.LicenciaId, MensajeBrindado);
142
+ }
143
+ });
144
+ }
145
+
146
+ rechazoDelJefe(LicenciaId: any, MensajeBrindado: any): void {
147
+ let Datos = {
148
+ "LicenciaId": LicenciaId,
149
+ "Estado": "Rechazado",
150
+ "Observaciones": MensajeBrindado
151
+ };
152
+ this.http.post(`${this.datosGlobalesService.ObtenerURL()}licencias/firmaORechazoDelJefe`, Datos).subscribe({
153
+ next: (datos: any) => {
154
+ this.obtenerDatosParaPoblarLaTabla();
155
+ },
156
+ error: (error) => {
157
+ this.obtenerDatosParaPoblarLaTabla();
158
+ },
159
+ });
160
+ }
161
+ firmaDelJefe(LicenciaId: any, MensajeBrindado: any): void {
162
+ let Datos = {
163
+ "LicenciaId": LicenciaId,
164
+ "Estado": "Tramitada",
165
+ "Observaciones": MensajeBrindado
166
+ };
167
+ this.http.post(`${this.datosGlobalesService.ObtenerURL()}licencias/firmaORechazoDelJefe`, Datos).subscribe({
168
+ next: (datos: any) => {
169
+ this.obtenerDatosParaPoblarLaTabla();
170
+ },
171
+ error: (error) => {
172
+ this.obtenerDatosParaPoblarLaTabla();
173
+ },
174
+ });
175
+ }
176
+
177
+ public PaginarResultados: boolean = false;
178
+ public TotalDeRegistros: number = 0;
179
+ public PaginadorAccion: string = '-';
180
+ public PaginadorIndice: number = 0;
181
+ public PaginadorTamanio: number = 0;
182
+ public PaginadorFiltro: string = '&&&&';
183
+ public PaginadorColumnaParaFiltrar: string = '-';
184
+ public PaginadorColumnasParaFiltrar: string = '-';
185
+ onCambioDePagina(event: { accion: string, pageIndex: number, pageSize: number, valorParaFiltrar: string, columnaParaFiltrar: string, columnasParaFiltrar: string }) {
186
+ this.PaginadorAccion = event.accion;
187
+ this.PaginadorIndice = event.pageIndex;
188
+ this.PaginadorTamanio = event.pageSize;
189
+ this.PaginadorFiltro = event.valorParaFiltrar || '&&&&';
190
+ this.PaginadorColumnaParaFiltrar = event.columnaParaFiltrar || '-';
191
+ this.PaginadorColumnasParaFiltrar = event.columnasParaFiltrar || '-';
192
+ if (this.PaginarResultados) {
193
+ this.obtenerDatosParaPoblarLaTabla();
194
+ }
195
+ }
196
+
197
+ obtenerDatosParaPoblarLaTabla() {
198
+ this.http.get(`${this.datosGlobalesService.ObtenerURL()}licencias/listarDatosDeLaJefatura`).subscribe({
199
+ next: (datos: any) => {
200
+ if (datos.error) {
201
+ console.error('Problemas al obtener los registros:', datos.error);
202
+ return;
203
+ }
204
+ if (this.PaginarResultados) {
205
+ this.DatosParaPoblarLaTabla = datos.body.Registros || [];
206
+ this.TotalDeRegistros = datos.body.TotalDeRegistros || 0;
207
+ } else {
208
+ this.DatosParaPoblarLaTabla = datos.body || [];
209
+ this.TotalDeRegistros = datos.body.length || 0;
210
+ }
211
+ },
212
+ error: (error) => {
213
+ console.error('Problemas al obtener los registros: ', error);
214
+ },
215
+ });
216
+ }
217
+ DescargarReporte() {
218
+ this.http.get(`${this.datosGlobalesService.ObtenerURL()}licencias/reporteDeLaJefatura`, {
219
+ responseType: 'text'
220
+ }).subscribe({
221
+ next: (datos: any) => {
222
+ const blob = new Blob([decodeURIComponent(datos)], { type: 'text/csv;charset=utf-8;' });
223
+ const enlace = document.createElement('a');
224
+ enlace.href = URL.createObjectURL(blob);
225
+ enlace.download = 'datos.csv';
226
+ enlace.click();
227
+ },
228
+ error: (error) => {
229
+ console.error('Problemas al obtener los registros: ', error);
230
+ },
231
+ });
232
+ }
233
+ AbrirModal(incapacidad?: any): void {
234
+ alert("No es posible crear un registro");
235
+ }
236
+ async AbrirModalArchivo(incapacidad?: any): Promise<void> {
237
+ const dialogRef = this.dialog.open(SubirArchivoComponent, {
238
+ data: {
239
+ Etiqueta: incapacidad.LicenciaId
240
+ , EsEditable: false
241
+ , Permiso: 'Servicio'
242
+ },
243
+ });
244
+ }
245
+ }
@@ -0,0 +1,45 @@
1
+ import { NgModule, ModuleWithProviders, Injectable } from '@angular/core';
2
+ import { Router, NavigationEnd } from '@angular/router';
3
+ import { CommonModule } from '@angular/common';
4
+
5
+ declare let gtag: Function;
6
+
7
+ @Injectable({ providedIn: 'root' })
8
+ export class AnalyticsService {
9
+ constructor(private router: Router) {
10
+ // Escuchar cambios de ruta y mandar page_view
11
+ this.router.events.subscribe(event => {
12
+ if (event instanceof NavigationEnd) {
13
+ this.sendPageView(event.urlAfterRedirects);
14
+ }
15
+ });
16
+ }
17
+
18
+ private sendPageView(url: string) {
19
+ if (typeof gtag !== 'undefined') {
20
+ gtag('event', 'page_view', {
21
+ page_path: url,
22
+ page_location: window.location.href,
23
+ page_title: document.title,
24
+ });
25
+ }
26
+ }
27
+
28
+ public sendEvent(action: string, params: Record<string, any> = {}) {
29
+ if (typeof gtag !== 'undefined') {
30
+ gtag('event', action, params);
31
+ }
32
+ }
33
+ }
34
+
35
+ @NgModule({
36
+ imports: [CommonModule],
37
+ })
38
+ export class AnalyticsModule {
39
+ static forRoot(): ModuleWithProviders<AnalyticsModule> {
40
+ return {
41
+ ngModule: AnalyticsModule,
42
+ providers: [AnalyticsService],
43
+ };
44
+ }
45
+ }
File without changes
@@ -0,0 +1 @@
1
+ <app-contenedor-componentes />
@@ -0,0 +1,10 @@
1
+ import { Component } from '@angular/core';
2
+ import { ContenedorComponentesComponent } from './Paginas/Nucleo/contenedor-componentes/contenedor-componentes.component';
3
+
4
+ @Component({
5
+ selector: 'app-root',
6
+ imports: [ContenedorComponentesComponent],
7
+ templateUrl: './app.component.html',
8
+ styleUrl: './app.component.css'
9
+ })
10
+ export class AppComponent { }
@@ -0,0 +1,14 @@
1
+ import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
2
+ import { provideServerRendering } from '@angular/platform-server';
3
+ import { provideServerRoutesConfig } from '@angular/ssr';
4
+ import { appConfig } from './app.config';
5
+ import { serverRoutes } from './app.routes.server';
6
+
7
+ const serverConfig: ApplicationConfig = {
8
+ providers: [
9
+ provideServerRendering(),
10
+ provideServerRoutesConfig(serverRoutes)
11
+ ]
12
+ };
13
+
14
+ export const config = mergeApplicationConfig(appConfig, serverConfig);
@@ -0,0 +1,27 @@
1
+ import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
2
+ import { provideRouter } from '@angular/router';
3
+
4
+ import { routes } from './app.routes';
5
+ import { provideClientHydration, withEventReplay } from '@angular/platform-browser';
6
+ import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';
7
+ import { provideHttpClient, withFetch, withInterceptors } from '@angular/common/http';
8
+ import { MatPaginatorIntl } from '@angular/material/paginator';
9
+ import { PaginadorPersonalizado } from './Componentes/Nucleo/tabla/paginador-personalizado';
10
+ import { provideCharts, withDefaultRegisterables } from 'ng2-charts';
11
+ import { AnalyticsModule } from './analytics.module';
12
+ import { AuthInterceptor } from './auth.interceptor';
13
+
14
+ export const appConfig: ApplicationConfig = {
15
+ providers: [
16
+ { provide: MatPaginatorIntl, useClass: PaginadorPersonalizado },
17
+ provideZoneChangeDetection({ eventCoalescing: true }),
18
+ provideRouter(routes),
19
+ provideClientHydration(withEventReplay()),
20
+ provideAnimationsAsync(),
21
+ provideHttpClient(withFetch()),
22
+ provideClientHydration(),
23
+ provideCharts(withDefaultRegisterables()),
24
+ ...AnalyticsModule.forRoot().providers!,
25
+ provideHttpClient(withInterceptors([AuthInterceptor]))
26
+ ]
27
+ };
@@ -0,0 +1,16 @@
1
+ import { Routes } from '@angular/router';
2
+ import { GestionTablaComponent } from './Paginas/gestion-tabla/gestion-tabla.component';
3
+ import { ContenedorPrincipalComponent } from './Paginas/contenedor-principal/contenedor-principal.component';
4
+ import { GestionTablaJefeComponent } from './Paginas/gestion-tabla-jefe/gestion-tabla-jefe.component';
5
+ import { GestionGraficosComponent } from './Paginas/gestion-graficos/gestion-graficos.component';
6
+ import { GestionDeReportesComponent } from './Paginas/gestion-de-reportes/gestion-de-reportes.component';
7
+ import { GestionIframe1Component } from './Paginas/gestion-iframe1/gestion-iframe1.component';
8
+
9
+ export const routes: Routes = [
10
+ { path: '', component: ContenedorPrincipalComponent },
11
+ { path: 'tabla', component: GestionTablaComponent },
12
+ { path: 'aprobaciones', component: GestionTablaJefeComponent},
13
+ { path: 'graficoDeModulos', component: GestionGraficosComponent },
14
+ { path: 'parametros-reportes', component: GestionDeReportesComponent },
15
+ { path: 'gestionIframe1', component: GestionIframe1Component }
16
+ ];
@@ -0,0 +1,26 @@
1
+ import { HttpInterceptorFn } from '@angular/common/http';
2
+ import { inject } from '@angular/core';
3
+ import { DatosGlobalesService } from './datos-globales.service';
4
+ import { tap } from 'rxjs';
5
+
6
+ export const AuthInterceptor: HttpInterceptorFn = (req, next) => {
7
+ const datosGlobalesService = inject(DatosGlobalesService);
8
+
9
+ const token = datosGlobalesService.ObtenerToken();
10
+
11
+ const reqClone = req.clone({
12
+ setHeaders: {
13
+ Authorization: token ?? ''
14
+ }
15
+ });
16
+
17
+ return next(reqClone).pipe(
18
+ tap({
19
+ error: (err) => {
20
+ if (err.status === 401) {
21
+ datosGlobalesService.RedirigirALogin();
22
+ }
23
+ }
24
+ })
25
+ );
26
+ };
@@ -0,0 +1,45 @@
1
+ import { Injectable } from '@angular/core';
2
+
3
+ @Injectable({
4
+ providedIn: 'root'
5
+ })
6
+ export class DatosGlobalesService {
7
+
8
+ constructor() { }
9
+
10
+ ObtenerToken() {
11
+ const baseUrl = this.ObtenerURL();
12
+ if (baseUrl === 'http://localhost/') {
13
+ return 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiIxMiIsImlhdCI6MTc2MzEzMDc0NSwiZXhwIjoxNzYzMTY2NzQ1fQ.0Ferkg8T4bOGmpCR2RWdKxUwzOJr2xuqNBbX502D7vs';
14
+ }
15
+ const match = document.cookie.match(/(?:^|;\s*)_siguid=([^;]+)/);
16
+ let token = match ? decodeURIComponent(match[1]) : '';
17
+ if (token && !token.startsWith('Bearer ')) {
18
+ token = 'Bearer ' + token;
19
+ }
20
+ return token;
21
+ }
22
+
23
+ ObtenerURL(): string {
24
+ const { origin } = new URL(window.location.href);
25
+ if (origin === 'http://localhost:4200') {
26
+ return 'http://localhost/';
27
+ }
28
+ return origin.replace('front', 'back') + '/';
29
+ }
30
+
31
+ RedirigirALogin() {
32
+ document.cookie = "_siguid=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/";
33
+ // const url = window.location.href.toLowerCase();
34
+ // if (url.includes('calidad')) {
35
+ // this.claseDelContenedor = 'contenedor calidad';
36
+ // } else if (url.includes('pruebas')) {
37
+ // this.claseDelContenedor = 'contenedor pruebas';
38
+ // } else {
39
+ // this.claseDelContenedor = 'contenedor';
40
+ // }
41
+ // portalv2-frontend-pruebas.181.193.85.44.nip.io
42
+ // const protocolo = new URL(window.location.href).protocol
43
+ window.location.href = 'https://accesov2-frontend.sigu.utn.ac.cr/';
44
+ }
45
+ }
@@ -0,0 +1,94 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Created with Inkscape (http://www.inkscape.org/) -->
3
+
4
+ <svg
5
+ width="80mm"
6
+ height="116mm"
7
+ viewBox="0 0 80 116"
8
+ version="1.1"
9
+ id="svg1"
10
+ inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
11
+ sodipodi:docname="Puntos.svg"
12
+ inkscape:export-filename="puntos.png"
13
+ inkscape:export-xdpi="96"
14
+ inkscape:export-ydpi="96"
15
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
16
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
17
+ xmlns="http://www.w3.org/2000/svg"
18
+ xmlns:svg="http://www.w3.org/2000/svg">
19
+ <sodipodi:namedview
20
+ id="namedview1"
21
+ pagecolor="#ffffff"
22
+ bordercolor="#000000"
23
+ borderopacity="0.25"
24
+ inkscape:showpageshadow="2"
25
+ inkscape:pageopacity="0.0"
26
+ inkscape:pagecheckerboard="0"
27
+ inkscape:deskcolor="#d1d1d1"
28
+ inkscape:document-units="mm"
29
+ inkscape:zoom="1.8406789"
30
+ inkscape:cx="-66.279893"
31
+ inkscape:cy="219.2126"
32
+ inkscape:window-width="1850"
33
+ inkscape:window-height="1016"
34
+ inkscape:window-x="70"
35
+ inkscape:window-y="27"
36
+ inkscape:window-maximized="1"
37
+ inkscape:current-layer="g2"
38
+ inkscape:pageshadow="2"
39
+ showgrid="false" />
40
+ <defs
41
+ id="defs1" />
42
+ <g
43
+ inkscape:label="Capa 1"
44
+ inkscape:groupmode="layer"
45
+ id="layer1">
46
+ <g
47
+ id="g2"
48
+ transform="matrix(5.5513522,0,0,5.5513522,-355.67504,-240.3824)"
49
+ style="fill:#bccee8;fill-opacity:1">
50
+ <ellipse
51
+ style="opacity:1;fill:#bccee8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
52
+ id="path2-0"
53
+ cx="67.274971"
54
+ cy="53.889832"
55
+ rx="1.5811346"
56
+ ry="1.5286871" />
57
+ <ellipse
58
+ style="opacity:1;fill:#bccee8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
59
+ id="path2-0-7"
60
+ cx="67.339005"
61
+ cy="46.695816"
62
+ rx="1.5811346"
63
+ ry="1.5286871" />
64
+ <ellipse
65
+ style="opacity:1;fill:#bccee8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
66
+ id="path2-0-5"
67
+ cx="71.214226"
68
+ cy="57.160255"
69
+ rx="1.5811346"
70
+ ry="1.5286871" />
71
+ <ellipse
72
+ style="opacity:1;fill:#bccee8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
73
+ id="path2-0-5-0"
74
+ cx="75.084213"
75
+ cy="53.52586"
76
+ rx="1.5811346"
77
+ ry="1.5286871" />
78
+ <ellipse
79
+ style="opacity:1;fill:#bccee8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
80
+ id="path2-0-7-5"
81
+ cx="71.213684"
82
+ cy="49.933952"
83
+ rx="1.5811346"
84
+ ry="1.5286871" />
85
+ <ellipse
86
+ style="opacity:1;fill:#bccee8;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-dasharray:none"
87
+ id="path2-0-1"
88
+ cx="67.359634"
89
+ cy="61.055916"
90
+ rx="1.5810562"
91
+ ry="1.5286871" />
92
+ </g>
93
+ </g>
94
+ </svg>
@@ -0,0 +1,36 @@
1
+ <!doctype html>
2
+ <html lang="es">
3
+
4
+ <head>
5
+ <!-- Google tag (gtag.js) -->
6
+ <script async src="https://www.googletagmanager.com/gtag/js?id=G-GMD82WPD67"></script>
7
+ <script>
8
+ window.dataLayer = window.dataLayer || [];
9
+ function gtag() { dataLayer.push(arguments); }
10
+ gtag('js', new Date());
11
+ gtag('config', 'G-GMD82WPD67');
12
+ </script>
13
+ <meta charset="utf-8">
14
+ <title>Universidad Técnica Nacional</title>
15
+ <base href="/">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1">
17
+ <link rel="icon" type="image/x-icon" href="favicon.ico">
18
+ <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap" rel="stylesheet">
19
+ <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
20
+ </head>
21
+
22
+ <body>
23
+ <app-root></app-root>
24
+ <!-- ACCESIBILIDAD -->
25
+ <script type="text/javascript">
26
+ (function (d) {
27
+ var s = d.createElement("script");
28
+ s.setAttribute("data-account", "oDM5lWND5w");
29
+ s.setAttribute("src", "https://cdn.userway.org/widget.js");
30
+ (d.body || d.head).appendChild(s);
31
+ })(document);
32
+ </script>
33
+ <!-- ACCESIBILIDAD -->
34
+ </body>
35
+
36
+ </html>
@@ -0,0 +1,7 @@
1
+ import { bootstrapApplication } from '@angular/platform-browser';
2
+ import { AppComponent } from './app/app.component';
3
+ import { config } from './app/app.config.server';
4
+
5
+ const bootstrap = () => bootstrapApplication(AppComponent, config);
6
+
7
+ export default bootstrap;
@@ -0,0 +1,6 @@
1
+ import { bootstrapApplication } from '@angular/platform-browser';
2
+ import { appConfig } from './app/app.config';
3
+ import { AppComponent } from './app/app.component';
4
+
5
+ bootstrapApplication(AppComponent, appConfig)
6
+ .catch((err) => console.error(err));
@@ -0,0 +1,14 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ }
5
+
6
+ body {
7
+ margin: 0;
8
+ font-family: Roboto, "Helvetica Neue", sans-serif;
9
+ }
10
+
11
+ .cdk-overlay-pane.mat-mdc-dialog-panel{
12
+ max-width: 100vw !important;
13
+ max-height: 200vh !important;
14
+ }
@@ -0,0 +1,15 @@
1
+ /* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
2
+ /* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
3
+ {
4
+ "extends": "./tsconfig.json",
5
+ "compilerOptions": {
6
+ "outDir": "./out-tsc/app",
7
+ "types": []
8
+ },
9
+ "files": [
10
+ "src/main.ts"
11
+ ],
12
+ "include": [
13
+ "src/**/*.d.ts"
14
+ ]
15
+ }