ngx-dsxlibrary 1.21.13 → 1.21.16
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.
- package/fesm2022/ngx-dsxlibrary-src-lib-components.mjs +6 -6
- package/fesm2022/ngx-dsxlibrary-src-lib-pipe.mjs +6 -6
- package/fesm2022/ngx-dsxlibrary.mjs +580 -94
- package/fesm2022/ngx-dsxlibrary.mjs.map +1 -1
- package/ngx-dsxlibrary-1.21.16.tgz +0 -0
- package/package.json +1 -1
- package/types/ngx-dsxlibrary-src-lib-models.d.ts +61 -1
- package/types/ngx-dsxlibrary.d.ts +407 -21
- package/ngx-dsxlibrary-1.21.13.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngx-dsxlibrary.mjs","sources":["../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/services/icon-dsx.service.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.html","../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/lib/injections/environment.token.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.html","../../../projects/ngx-dsx/src/lib/services/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.html","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.html","../../../projects/ngx-dsx/src/lib/services/alerta.service.ts","../../../projects/ngx-dsx/src/lib/injections/parameterSecurity.ts","../../../projects/ngx-dsx/src/lib/services/security.service.ts","../../../projects/ngx-dsx/src/lib/services/parameter-values.service.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.html","../../../projects/ngx-dsx/src/lib/directives/only-rango-pattern.directive.ts","../../../projects/ngx-dsx/src/lib/directives/select-all-on-focus.directive.ts","../../../projects/ngx-dsx/src/lib/injections/cache.token.ts","../../../projects/ngx-dsx/src/lib/services/authorize.service.ts","../../../projects/ngx-dsx/src/lib/services/error-handler.service.ts","../../../projects/ngx-dsx/src/lib/interceptors/http-authorize.interceptor.ts","../../../projects/ngx-dsx/src/lib/models/src/cache.types.ts","../../../projects/ngx-dsx/src/lib/modules/src/dsx-add-tools.module.ts","../../../projects/ngx-dsx/src/lib/modules/src/prime-ng.module.ts","../../../projects/ngx-dsx/src/lib/pipe/truncate.pipe.ts","../../../projects/ngx-dsx/src/lib/services/cache.service.ts","../../../projects/ngx-dsx/src/lib/services/cache.provider.ts","../../../projects/ngx-dsx/src/lib/services/endpoint.service.ts","../../../projects/ngx-dsx/src/lib/services/utility-add.service.ts","../../../projects/ngx-dsx/src/lib/validations/addons.validators.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { DecimalPipe } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule, DecimalPipe],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.css',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidNIT']){\r\n <strong>{{ control?.errors?.['invalidNIT']?.message }}</strong\r\n >. }@else if(control?.errors?.['invalidCUI']){\r\n <strong>{{ control?.errors?.['invalidCUI']?.message }}</strong\r\n >. } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max | number:'1.2-2' }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpDirective } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpDirective],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer' | 'percent'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<\r\n | 'light'\r\n | 'dark'\r\n | 'aqua'\r\n | 'sunset'\r\n | 'mint'\r\n | 'peach'\r\n | 'plasma'\r\n | 'nebula'\r\n >('light');\r\n\r\n options: Record<'currency' | 'integer' | 'percent', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n //prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n percent: {\r\n startVal: 0,\r\n duration: 0.5,\r\n suffix: '%',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div [class]=\"`kpi-card ${color()} ${theme()}-theme`\">\r\n <div class=\"kpi-container\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [countUpOptions]=\"getSelectedOption()\"\r\n [class]=\"`card-value-${theme()}`\"\r\n >0</span\r\n >\r\n <span [class]=\"`card-text-${theme()}`\">{{ label() }}</span>\r\n </div>\r\n <i [class]=\"`${iconType()} icon icon-${theme()}`\"></i>\r\n</div>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { map, Observable, shareReplay } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IconDsxService {\r\n private cache = new Map<string, Observable<SafeHtml>>();\r\n\r\n constructor(private http: HttpClient, private sanitizer: DomSanitizer) {}\r\n\r\n /** Carga SVG desde assets/dsxResource/material-design-icons/outlined */\r\n getIcon(name: string): Observable<SafeHtml> {\r\n if (this.cache.has(name)) {\r\n return this.cache.get(name)!;\r\n }\r\n\r\n const iconPath = `mdio/${name}.svg`;\r\n\r\n const request$ = this.http.get(iconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n shareReplay(1)\r\n );\r\n\r\n this.cache.set(name, request$);\r\n return request$;\r\n }\r\n}\r\n","import { AsyncPipe } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { SafeHtml } from '@angular/platform-browser';\r\nimport { Observable } from 'rxjs';\r\nimport { IconDsxService } from '../../services/icon-dsx.service';\r\n\r\n@Component({\r\n selector: 'icon-dsx',\r\n imports: [AsyncPipe],\r\n templateUrl: './icon-dsx.component.html',\r\n styleUrl: './icon-dsx.component.css',\r\n})\r\nexport class IconDsxComponent {\r\n @Input() name!: string;\r\n\r\n svg$!: Observable<SafeHtml>; // 👈 AHORA es un Observable\r\n\r\n constructor(private iconService: IconDsxService) {}\r\n\r\n ngOnInit(): void {\r\n this.svg$ = this.iconService.getIcon(this.name); // 👈 AHORA CUADRA CON EL async\r\n }\r\n}\r\n","<span class=\"dsx-icon\" [innerHTML]=\"svg$ | async\"></span>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface EnvironmentConfig {\r\n production: boolean;\r\n myAppUrl: string;\r\n tokenName: string;\r\n tokenNameRF: string;\r\n sessionStatus: string;\r\n refreshTokenExpiry: string;\r\n}\r\n\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig'\r\n);\r\n","import { Component, inject, Input, signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { JsonHighlightPipe } from '../../pipe/json-highlight.pipe';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n})\r\nexport class JsonValuesDebujComponent {\r\n @Input() form!: FormGroup;\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n // Señal reactiva para indicar si estamos en modo de desarrollo\r\n private readonly isDevSignal = signal<boolean>(!this.environment.production);\r\n\r\n // Método para verificar el estado de desarrollo\r\n isDev(): boolean {\r\n return this.isDevSignal();\r\n }\r\n}\r\n","@if(isDev()){\r\n<div class=\"custom-container\">\r\n <pre\r\n class=\"custom-pre\"\r\n [innerHTML]=\"form.getRawValue() | jsonHighlight\"\r\n ></pre>\r\n</div>\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SpinnerLoadingService {\r\n // Creamos una señal para el estado de visibilidad\r\n spinnerVisible = signal(false);\r\n\r\n constructor() {}\r\n\r\n // Método para mostrar el spinner\r\n show() {\r\n this.spinnerVisible.set(true);\r\n }\r\n\r\n // Método para ocultar el spinner\r\n hide() {\r\n this.spinnerVisible.set(false);\r\n }\r\n}\r\n","import { Component, effect, inject, input } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\nimport { AnimationOptions, LottieComponent } from 'ngx-lottie';\r\n\r\n@Component({\r\n selector: 'app-loading-lottie',\r\n imports: [LottieComponent],\r\n templateUrl: './loading-lottie.component.html',\r\n styleUrl: './loading-lottie.component.css',\r\n})\r\nexport class LoadingLottieComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n jsonUrl = input<string>('Loader_Liquid4');\r\n size = input<string>('250px');\r\n options: AnimationOptions = { path: '' };\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n effect(() => {\r\n this.options = {\r\n path: `jsonlottie/${this.jsonUrl() + '.json'}`,\r\n };\r\n });\r\n }\r\n}\r\n","@if(_spinnerService.spinnerVisible()){\r\n<div class=\"loader-container\">\r\n <ng-lottie [options]=\"options\" [width]=\"size()\" [height]=\"size()\"></ng-lottie>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading',\r\n imports: [],\r\n templateUrl: './loading.component.html',\r\n styleUrl: './loading.component.css',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertResult,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n icono?: string;\r\n icon?: SweetAlertIcon;\r\n showConfirmButton?: boolean;\r\n confirmButtonText?: string;\r\n timer?: number;\r\n imageWidth?: number;\r\n imageHeight?: number;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n private toastrService = inject(ToastrService);\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Puedes cambiarlo desde tu app llamando a setDefaultTheme().\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n /**\r\n * Permite establecer el theme global para todas las alertas SweetAlert2.\r\n * @param theme - Valor de theme válido para SweetAlert2 (por ejemplo: 'dark', 'minimal', etc).\r\n */\r\n setDefaultTheme(theme: SweetAlertTheme) {\r\n this.defaultTheme = theme;\r\n }\r\n\r\n /**\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 4. bottom-center 5. bottom-right\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n //theme: 'borderless',\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed)\r\n );\r\n }\r\n\r\n alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'icon/notFound01.png',\r\n timer: number = 3500\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i>${message}</i> <span> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n * Muestra una alerta visual personalizada usando SweetAlert2.\r\n *\r\n * Permite configurar el mensaje, el título, el icono, la imagen, el botón de confirmación,\r\n * el temporizador y el tema visual, entre otras opciones.\r\n *\r\n * @param titleAlert - Título principal de la alerta (obligatorio).\r\n * @param messageHtml - Mensaje en formato HTML (obligatorio).\r\n * @param options - Opciones configurables de la alerta (opcional). Permite personalizar icono, imagen, botón, temporizador, etc.\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta o cuando se cierra automáticamente.\r\n *\r\n * @example\r\n * // Alerta básica con icono de éxito y cierre automático\r\n * alertaHtmlSuccess('Operación exitosa', 'Los datos se guardaron correctamente');\r\n *\r\n * @example\r\n * // Alerta de error con imagen personalizada y temporizador\r\n * alertaHtmlSuccess('Error crítico', 'No se pudo conectar al servidor', {\r\n * icono: 'error-icon.png',\r\n * icon: 'error',\r\n * timer: 5000\r\n * });\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón personalizado y sin imagen\r\n * alertaHtmlSuccess('Confirmar acción', '¿Está seguro de eliminar este registro?', {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Sí, eliminar',\r\n * icon: 'warning',\r\n * showImage: false\r\n * }).then((result) => {\r\n * if (result.isConfirmed) {\r\n * // Lógica cuando el usuario confirma\r\n * }\r\n * });\r\n */\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n messageHtml: string,\r\n options: AlertOptions = {}\r\n ): Promise<SweetAlertResult> {\r\n const {\r\n icono = 'icon/check02.png',\r\n icon,\r\n showConfirmButton = false,\r\n confirmButtonText = 'Ok',\r\n timer = 2000,\r\n imageWidth = 125,\r\n imageHeight = 125,\r\n showImage = true,\r\n theme, // Puede venir por options o usar el global\r\n } = options;\r\n\r\n // Usa el theme global si no se especifica uno en options\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n html: messageHtml,\r\n draggable: true,\r\n showConfirmButton,\r\n confirmButtonText,\r\n timer: showConfirmButton ? undefined : timer, // Timer solo si no hay botón\r\n timerProgressBar: !showConfirmButton && timer > 0,\r\n imageUrl: showImage && icono ? `/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\r\n // Aplica el theme global o el específico\r\n ...(alertTheme !== undefined && { theme: alertTheme }),\r\n };\r\n // Solo agrega el icono si está definido\r\n if (icon !== undefined) {\r\n alertConfig.icon = icon;\r\n }\r\n\r\n // Precargar imagen solo si es necesario\r\n if (showImage && icono) {\r\n return this.preloadImage(icono).then(() => Swal.fire(alertConfig));\r\n }\r\n\r\n return Swal.fire(alertConfig);\r\n }\r\n\r\n // private configureTimer(\r\n // config: SweetAlertOptions,\r\n // showConfirmButton: boolean,\r\n // timer: number\r\n // ) {\r\n // if (!showConfirmButton && timer > 0) {\r\n // config.timer = timer;\r\n // config.timerProgressBar = true;\r\n // }\r\n // }\r\n\r\n // No se puede utilizar por conflicto con primeng\r\n // notyfAlert(message: string) {\r\n // this.notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top',\r\n // },\r\n // });\r\n // }\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Muestra un mensaje tipo toast usando PrimeNG MessageService.\r\n *\r\n * @param severity - Tipo de severidad del mensaje. Valores posibles:\r\n * 'success' | 'info' | 'warn' | 'error' | 'contrast' | 'secondary'.\r\n * Por defecto: 'success'.\r\n * @param title - Título del mensaje (aparece como summary).\r\n * @param message - Detalle del mensaje (aparece como detail).\r\n * @param time - Duración en milisegundos que el mensaje estará visible. Por defecto: 1500 ms.\r\n *\r\n * @example\r\n * // Mensaje de éxito\r\n * alertaService.showPrimeMessage('success', 'Operación exitosa', 'El registro fue guardado correctamente');\r\n *\r\n * @example\r\n * // Mensaje de advertencia personalizado\r\n * alertaService.showPrimeMessage('warn', 'Advertencia', 'Faltan campos obligatorios', 3000);\r\n */\r\n // showPrimeMessage(\r\n // title: string,\r\n // message: string,\r\n // severity:\r\n // | 'success'\r\n // | 'info'\r\n // | 'warn'\r\n // | 'error'\r\n // | 'contrast'\r\n // | 'secondary' = 'success',\r\n // time: number = 1500\r\n // ) {\r\n // this.primeMessageService.add({\r\n // severity: severity,\r\n // summary: title,\r\n // detail: message,\r\n // life: time,\r\n // });\r\n // }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/parameterSecurity.model';\r\n\r\nexport const INITIAL_PARAMETERS = new InjectionToken<MyParameterValues[]>(\r\n 'InitialParameters'\r\n);\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { SeguridadITParameter } from '../models/src/parameterSecurity.model';\r\nimport { ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n // Inyecta el servicio HttpClient para realizar peticiones HTTP\r\n private http = inject(HttpClient);\r\n\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n // Construye la URL base de la API utilizando la URL de la aplicación desde la configuración del entorno\r\n private urlApi: string = `${this.environment.myAppUrl}api/auth`;\r\n\r\n /**\r\n * Método para obtener un nuevo token de acceso utilizando un refresh token.\r\n * @param refreshToken El refresh token que se utilizará para obtener un nuevo token de acceso.\r\n * @returns Un Observable que emite un objeto de tipo ModelToken.\r\n */\r\n tokenRefresh(refreshToken: string): Observable<ModelToken> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.post<ModelToken>(`${this.urlApi}/token-refresh/`, body, {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n });\r\n }\r\n\r\n /**\r\n * Método para obtener los parámetros de seguridad.\r\n * @param invalidCacheParam Indica si se debe invalidar la caché (opcional, por defecto es false).\r\n * @returns Un Observable que emite un objeto de tipo SeguridadITParameter.\r\n */\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false\r\n ): Observable<SeguridadITParameter> {\r\n // Crea los parámetros de la solicitud, incluyendo el parámetro invalidCacheParam,\r\n // parametro diseñado para invalidar la caché a traves del filtro\r\n const params = new HttpParams().set(\r\n 'invalidCacheParam',\r\n invalidCacheParam.toString()\r\n );\r\n\r\n // Realiza una solicitud GET al endpoint de parámetros de seguridad\r\n return this.http.get<SeguridadITParameter>(\r\n `${this.urlApi}/security-parameter/`,\r\n { params }\r\n );\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n catchError,\r\n delay,\r\n map,\r\n Observable,\r\n of,\r\n retry,\r\n throwError,\r\n} from 'rxjs';\r\nimport { INITIAL_PARAMETERS } from '../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n ParameterSecurity,\r\n} from '../models/src/parameterSecurity.model';\r\nimport { SecurityService } from './security.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio para gestionar los parámetros de seguridad de la aplicación.\r\n * Permite cargar los parámetros desde la API, mantenerlos en memoria, acceder y comparar valores de forma segura.\r\n * Utiliza tipado genérico para los nombres de parámetros y cache interno para optimizar consultas repetidas.\r\n *\r\n * @template T Tipo de los nombres de parámetros permitidos (usualmente un union type de string)\r\n */\r\nexport class ParameterValuesService<T extends string = string> {\r\n /**\r\n * Parámetros iniciales inyectados mediante INITIAL_PARAMETERS.\r\n * Se usan para validar y mapear los parámetros recibidos de la API.\r\n */\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n /**\r\n * Cache interno para optimizar la comparación de valores de parámetros.\r\n * La clave es una combinación de nombre e índice, el valor es el resultado de la consulta.\r\n */\r\n private parameterCache = new Map<string, any>();\r\n\r\n private alertedParams = new Set<string>();\r\n private alertedParamsIsParameterValue = new Set<string>();\r\n\r\n /**\r\n * Servicio que contiene el método getParameterSecurity() para obtener los parámetros desde la API.\r\n */\r\n private apiService = inject(SecurityService);\r\n\r\n /**\r\n * Señal reactiva que contiene los parámetros cargados y permite actualizaciones automáticas.\r\n */\r\n private _dataParameter = signal<MyParameterValues<T>[]>(\r\n this.initializeData()\r\n );\r\n\r\n /**\r\n * Flag que indica si ya se cargaron los parámetros desde la API.\r\n */\r\n private _loaded = signal(false);\r\n get loaded() {\r\n return this._loaded();\r\n }\r\n\r\n /**\r\n * Inicializa los datos de parámetros usando los valores inyectados.\r\n * @returns Array de parámetros iniciales tipados\r\n */\r\n private initializeData(): MyParameterValues<T>[] {\r\n return this.initialParameters.map((param) =>\r\n this.createMyParameterValue(param.parameterName as T, param.values)\r\n );\r\n }\r\n\r\n /**\r\n * Crea una instancia de MyParameterValues tipada y segura.\r\n * @param parameterName Nombre del parámetro\r\n * @param values Valores asociados al parámetro\r\n * @returns Objeto MyParameterValues\r\n */\r\n private createMyParameterValue(\r\n parameterName: T,\r\n values: any[]\r\n ): MyParameterValues<T> {\r\n return {\r\n parameterName,\r\n values: [...values],\r\n };\r\n }\r\n\r\n /**\r\n * Devuelve los parámetros actuales como un array de solo lectura.\r\n */\r\n get dataParameter(): Readonly<MyParameterValues<T>[]> {\r\n return this._dataParameter();\r\n }\r\n\r\n /**\r\n * Setter privado para actualizar los parámetros.\r\n * Solo puede ser usado dentro del servicio para mantener la integridad de los datos.\r\n * @param values Array de parámetros a almacenar\r\n */\r\n private setDataParameter(values: MyParameterValues<T>[]): void {\r\n if (!Array.isArray(values)) {\r\n console.error('Error: valores inválidos para dataParameter');\r\n return;\r\n }\r\n this._dataParameter.set(values);\r\n }\r\n\r\n /**\r\n * Carga los parámetros desde la API.\r\n * Si ya se cargaron y force=false, devuelve la copia en memoria.\r\n * @param force Indica si se debe forzar la recarga desde la API (default: false)\r\n * @returns Observable que emite los parámetros cargados como MyParameterValues[]\r\n */\r\n loadParameters(force = false): Observable<MyParameterValues<T>[]> {\r\n if (this._loaded() && !force) {\r\n return of([...this.dataParameter]); // copia mutable\r\n }\r\n\r\n return this.apiService.getParameterSecurity(force).pipe(\r\n map((response) => {\r\n const apiParameters = response.parameterSecurity ?? [];\r\n this.validateParameters(apiParameters);\r\n const values = this.mapToMyParameterValues(apiParameters);\r\n this.setDataParameter(values);\r\n this._loaded.set(true);\r\n return values;\r\n }),\r\n // 👇 fallback si falla la llamada pero ya teníamos data\r\n catchError((error) => {\r\n if (this._loaded() && this.dataParameter.length > 0) {\r\n return of([...this.dataParameter]);\r\n }\r\n this._loaded.set(false);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fuerza la recarga de los parámetros desde la API.\r\n * @returns Observable que emite los parámetros actualizados\r\n */\r\n refreshParameters(): Observable<MyParameterValues<T>[]> {\r\n return this.loadParameters(true);\r\n }\r\n\r\n /**\r\n * Crea una copia segura y mutable de los parámetros actuales.\r\n * @returns Array de parámetros\r\n */\r\n private createSafeCopy(): MyParameterValues<T>[] {\r\n return this.dataParameter.map((item) =>\r\n this.createMyParameterValue(item.parameterName, [...item.values])\r\n );\r\n }\r\n\r\n /**\r\n * Mapea los parámetros recibidos de la API a objetos tipados y seguros.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n * @returns Array de MyParameterValues\r\n */\r\n private mapToMyParameterValues(\r\n apiParameters: ParameterSecurity[]\r\n ): MyParameterValues<T>[] {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n\r\n return apiParameters\r\n .filter((param) => initialNames.includes(param.parameterName))\r\n .map((param) => {\r\n // Función de conversión type-safe\r\n return this.convertToTypedParameter(param);\r\n })\r\n .filter((param): param is MyParameterValues<T> => param !== null);\r\n }\r\n\r\n /**\r\n * Convierte un parámetro de la API a un objeto tipado, validando el nombre.\r\n * @param param Parámetro recibido de la API\r\n * @returns Objeto MyParameterValues o null si no es válido\r\n */\r\n private convertToTypedParameter(\r\n param: ParameterSecurity\r\n ): MyParameterValues<T> | null {\r\n const initialParam = this.initialParameters.find(\r\n (p) => p.parameterName === param.parameterName\r\n );\r\n\r\n if (!initialParam) {\r\n return null;\r\n }\r\n\r\n // Conversión segura con verificación\r\n if (this.isValidParameterName(param.parameterName)) {\r\n return this.createMyParameterValue(\r\n param.parameterName as T,\r\n param.parameterValues?.map((v) => v.value) ?? []\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Verifica si un nombre de parámetro es válido según los parámetros iniciales.\r\n * @param name Nombre a validar\r\n * @returns true si es válido\r\n */\r\n private isValidParameterName(name: string): name is T {\r\n // Verifica que el nombre esté en los parámetros iniciales\r\n return this.initialParameters.some((param) => param.parameterName === name);\r\n }\r\n\r\n /**\r\n * Valida que los parámetros devueltos por la API coincidan con los iniciales.\r\n * Muestra errores o advertencias en consola si existen diferencias.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n */\r\n private validateParameters(apiParameters: ParameterSecurity[]): void {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n const apiNames = apiParameters.map((p) => p.parameterName);\r\n\r\n const missing = initialNames.filter((name) => !apiNames.includes(name));\r\n const extra = apiNames.filter((name) => !initialNames.includes(name));\r\n\r\n if (missing.length) {\r\n console.warn(`Faltan en API: ${missing.join(', ')}`);\r\n const ok = confirm(`Faltan en API: ${missing.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (extra.length) {\r\n console.warn(`Extra en API: ${extra.join(', ')}`);\r\n const ok = confirm(`Extra en API: ${extra.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (initialNames.length !== apiNames.length) {\r\n console.warn(\r\n `Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor específico de un parámetro.\r\n * Devuelve `defaultValue` si no existe el parámetro o el índice es inválido.\r\n * Valida que el parámetro exista antes de acceder a su valor.\r\n * @param parameterName Nombre del parámetro\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @param defaultValue Valor por defecto si no existe (default: null)\r\n * @returns Valor del parámetro o defaultValue si no existe o el índice es inválido\r\n */\r\n getValue<U = any>(\r\n parameterName: T,\r\n index = 0,\r\n defaultValue: U | null = null\r\n ): U {\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParams.has(parameterName)) {\r\n alert(`Advertencia: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParams.add(parameterName);\r\n }\r\n return defaultValue as U;\r\n }\r\n\r\n if (index < 0 || index >= param.values.length) {\r\n alert(\r\n `Advertencia: Índice ${index} fuera de rango para el parámetro '${parameterName}'.`\r\n );\r\n return defaultValue as U;\r\n }\r\n\r\n return param.values[index] as U;\r\n }\r\n\r\n /**\r\n * Compara un valor específico con un valor esperado, usando cache para optimizar llamadas repetidas.\r\n * @param parameterName Nombre del parámetro\r\n * @param expectedValue Valor esperado\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @returns true si coincide, false en caso contrario\r\n */\r\n isParameterValue<U = any>(\r\n parameterName: T,\r\n expectedValue: U,\r\n index = 0\r\n ): boolean {\r\n const cacheKey = `${String(parameterName)}_${index}`;\r\n\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParamsIsParameterValue.has(parameterName)) {\r\n alert(`Error: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParamsIsParameterValue.add(parameterName);\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.parameterCache.has(cacheKey)) {\r\n const value = this.getValue<U>(parameterName, index);\r\n this.parameterCache.set(cacheKey, value);\r\n }\r\n\r\n return this.parameterCache.get(cacheKey) === expectedValue;\r\n }\r\n\r\n /**\r\n * Limpia el cache interno de comparaciones de parámetros.\r\n */\r\n clearParameterCache(): void {\r\n this.parameterCache.clear();\r\n }\r\n\r\n /**\r\n * Verifica si un parámetro tiene al menos un valor.\r\n * @param parameterName Nombre del parámetro\r\n * @returns true si tiene al menos un valor, false si no tiene\r\n */\r\n hasAnyValue(parameterName: T): boolean {\r\n return this.getAllValues(parameterName).length > 0;\r\n }\r\n\r\n /**\r\n * Devuelve todos los valores de un parámetro.\r\n * @param parameterName Nombre del parámetro\r\n * @returns Array de valores\r\n */\r\n getAllValues<U = any>(parameterName: T): U[] {\r\n return (this.dataParameter.find((p) => p.parameterName === parameterName)\r\n ?.values ?? []) as U[];\r\n }\r\n}\r\n","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { AlertaService } from '../../services/alerta.service';\r\nimport { ParameterValuesService } from '../../services/parameter-values.service';\r\n\r\n@Component({\r\n selector: 'app-navbar-dsx',\r\n imports: [MenubarModule, ImageModule, ButtonModule, FormsModule],\r\n templateUrl: './navbar-dsx.component.html',\r\n styleUrl: './navbar-dsx.component.css',\r\n})\r\nexport class NavbarDsxComponent implements OnInit {\r\n //private _securityService = inject(SecurityService);\r\n private _parameterSecurityService = inject(ParameterValuesService);\r\n private _alertaService = inject(AlertaService);\r\n logoWidth = input<string>('300');\r\n appVersion = input<string>('V1.0.0');\r\n urlLogo = input<string>('assets/image/logoApp.png');\r\n // Estado del interruptor (tema claro/oscuro)\r\n checked: boolean = false;\r\n\r\n ngOnInit(): void {\r\n // Inicializa el tema al cargar el componente\r\n this.initializeTheme();\r\n //throw new Error('Method not implemented.');\r\n }\r\n\r\n // Inicializa el tema y el estado del interruptor\r\n initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') || 'light'; // Obtén el tema guardado o usa 'light' por defecto\r\n this.checked = savedTheme === 'dark'; // Actualiza el estado del interruptor\r\n this.applyTheme(savedTheme); // Aplica el tema\r\n }\r\n\r\n // Cambia el tema y actualiza el estado del interruptor\r\n onThemeChange(isDarkMode: boolean): void {\r\n // Determina el tema basado en el estado del interruptor\r\n const theme = isDarkMode ? 'dark' : 'light';\r\n // Aplica el tema\r\n this.applyTheme(theme);\r\n }\r\n\r\n // Aplica el tema y guarda la preferencia en localStorage\r\n applyTheme(theme: string): void {\r\n const html = document.documentElement;\r\n\r\n // Elimina las clases previas y agrega la nueva clase\r\n html.classList.remove('my-app-dark', 'my-app-light');\r\n html.classList.add(theme === 'dark' ? 'my-app-dark' : 'my-app-light');\r\n\r\n // Guarda el tema en localStorage\r\n localStorage.setItem('theme', theme);\r\n }\r\n\r\n actualizarSeguridadIT() {\r\n this._parameterSecurityService.refreshParameters().subscribe({\r\n next: (values) => {\r\n this._alertaService.toastrAlerts(\r\n 2,\r\n 'SeguridadIT',\r\n 'Parametro actualizado!',\r\n 2\r\n );\r\n //console.log('Parámetros cargados:', values);\r\n },\r\n error: (err) => {\r\n console.error('Error al actualizar parámetros de SeguridadIT', err);\r\n this._alertaService.toastrAlerts(\r\n 3,\r\n 'SeguridadIT',\r\n 'Error al actualizar parámetros!',\r\n 2\r\n );\r\n },\r\n complete: () => this._parameterSecurityService.clearParameterCache(),\r\n });\r\n }\r\n}\r\n","<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n [src]=\"urlLogo()\"\r\n alt=\"Image\"\r\n [width]=\"logoWidth()\"\r\n />\r\n <span class=\"version-text\">{{ appVersion() }}</span>\r\n </ng-template>\r\n <ng-template #end>\r\n <div>\r\n <p-button\r\n class=\"mr-2\"\r\n label=\"Permisos\"\r\n variant=\"text\"\r\n severity=\"info\"\r\n (click)=\"actualizarSeguridadIT()\"\r\n >\r\n <span class=\"material-symbols-outlined mr-1\">local_police</span>\r\n </p-button>\r\n <label class=\"ui-switch\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"checked\"\r\n (click)=\"onThemeChange(!checked ? true : false)\"\r\n />\r\n <div class=\"slider\">\r\n <div class=\"circle\"></div>\r\n </div>\r\n </label>\r\n <!-- <p-inputSwitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-inputSwitch> -->\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva que permite solo la entrada de:\r\n * - Dígitos (0-9)\r\n * - Separadores punto (.)\r\n * - Rango con guión (-)\r\n *\r\n * Ejemplos válidos:\r\n * - 1.2.3\r\n * - 4-6\r\n * - 1.3.5-9\r\n *\r\n * Restringe:\r\n * - Letras\r\n * - Espacios\r\n * - Caracteres especiales\r\n * - Doble punto (..), doble guión (--), o combinaciones como (.-)\r\n */\r\n@Directive({\r\n selector: '[appOnlyRangoPattern]',\r\n})\r\nexport class OnlyRangoPatternDirective {\r\n constructor(private el: ElementRef<HTMLInputElement>) {}\r\n\r\n /**\r\n * Expresión regular para permitir caracteres válidos individualmente (tecla por tecla).\r\n */\r\n private keyRegex: RegExp = /^[0-9.\\-]$/;\r\n\r\n /**\r\n * Escucha el evento de teclado y permite únicamente teclas válidas.\r\n * También evita combinaciones inválidas como `..`, `--`, `.1`, etc.\r\n */\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const input = this.el.nativeElement;\r\n const currentValue = input.value;\r\n const cursorPos = input.selectionStart ?? 0;\r\n const nextValue =\r\n currentValue.slice(0, cursorPos) +\r\n event.key +\r\n currentValue.slice(cursorPos);\r\n\r\n const allowedKeys = [\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Tab',\r\n 'Home',\r\n 'End',\r\n ];\r\n\r\n if (allowedKeys.includes(event.key)) return;\r\n\r\n if (!this.keyRegex.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir más de un punto o guión seguido, o combinaciones como \".-\", \"-.\", etc.\r\n if (/(\\.\\.|--|-\\.)|(\\.-)/.test(nextValue)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir iniciar con punto o guión\r\n if (cursorPos === 0 && (event.key === '.' || event.key === '-')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Previene el pegado de cadenas que no cumplan con la estructura válida.\r\n * Solo permite: número o número separados por punto o guión correctamente.\r\n */\r\n @HostListener('paste', ['$event'])\r\n onPaste(event: ClipboardEvent): void {\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n const sanitized = pasted.trim();\r\n\r\n // Patrón completo de cadena válida: ej. 1.2.3.4-6\r\n const pattern = /^(\\d+(-\\d+)?)(\\.\\d+(-\\d+)?)*$/;\r\n\r\n if (!pattern.test(sanitized)) {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appSelectAllOnFocus]',\r\n})\r\nexport class SelectAllOnFocusDirective {\r\n @HostListener('onFocus', ['$event'])\r\n @HostListener('focus', ['$event'])\r\n selectAll(event: Event): void {\r\n const htmlInput = event.target as HTMLInputElement;\r\n if (htmlInput) {\r\n htmlInput.select();\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const CACHE_KEYS = new InjectionToken<Record<string, string>>(\r\n 'CACHE_KEYS'\r\n);\r\n","import { inject, Injectable, isDevMode } from '@angular/core';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CookieService } from 'ngx-cookie-service';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { jwtSecurityModel, ModelToken } from '../models/src/token.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n _cookieService = inject(CookieService);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n // Función para obtener opciones de cookies estándar\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isProduction,\r\n sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',\r\n };\r\n if (isProduction) {\r\n cookieOptions.domain = '.itgtxela.com';\r\n }\r\n return cookieOptions;\r\n }\r\n // Función para establecer una cookie\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n this._cookieService.set(name, value, options);\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n //return localStorage.getItem(environment.tokenName);\r\n }\r\n\r\n /**\r\n * Obtiene el Refresh Token almacenado en cookies.\r\n *\r\n * - En modo desarrollo (isDevMode):\r\n * Si no existe un refresh token en cookies, genera uno temporal\r\n * para evitar errores durante pruebas locales.\r\n *\r\n * - En modo producción:\r\n * Simplemente devuelve el refresh token real almacenado por el backend.\r\n *\r\n * @returns string | null - El refresh token o null si no existe.\r\n */\r\n getTokenRefresh(): string | null {\r\n // 🔹 MODO DESARROLLO: asegura que siempre haya un token de prueba\r\n if (isDevMode()) {\r\n const tokenRefresh = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n\r\n // Si no existe un refresh token, generamos uno de desarrollo\r\n if (!tokenRefresh) {\r\n const devTokens: ModelToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c', // Token dummy para testing\r\n refreshTokenExpiry: new Date(),\r\n };\r\n\r\n // Carga y guarda las cookies necesarias\r\n this.tokenReload(devTokens);\r\n }\r\n }\r\n\r\n // 🔹 DEVUELVE el refresh token real o de desarrollo\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate\r\n );\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: ModelToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n const refreshTokenExpiryDate = new Date();\r\n refreshTokenExpiryDate.setDate(refreshTokenExpiryDate.getDate() + 7); // Refresh token expiry: 7 days\r\n\r\n // Guardar el access token y refresh token\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n\r\n // Almacenar la fecha de expiración del refresh token en localStorage\r\n const expiryDate = new Date(tokens.refreshTokenExpiry).toISOString();\r\n localStorage.setItem(this.environment.refreshTokenExpiry, expiryDate);\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n\r\n /**\r\n * Obtiene los valores principales del JWT almacenado (usuario, roles y estado).\r\n *\r\n * Este getter:\r\n * - Lee el access token desde cookies.\r\n * - Devuelve un objeto tipado (jwtSecurityModel).\r\n * - Decodifica el token para obtener `unique_name` y `role`.\r\n * - Determina si el token está expirado usando JwtHelperService.\r\n *\r\n * Si no existe token:\r\n * - Devuelve un objeto vacío con valores en null y `isTokenExpired = true`.\r\n *\r\n * Uso:\r\n * const info = this.authorize.getTokenValues;\r\n */\r\n get getTokenValues(): jwtSecurityModel {\r\n // Obtener el token almacenado\r\n const token = this.getToken();\r\n\r\n // Si no existe token → devolver estructura vacía\r\n if (!token) {\r\n return {\r\n userName: null,\r\n role: null,\r\n isTokenExpired: true,\r\n };\r\n }\r\n\r\n // Decodificar JWT\r\n const decoded = this.helperJwt.decodeToken(token) || {};\r\n\r\n return {\r\n userName: decoded.unique_name ?? null,\r\n\r\n // JWT puede traer role como string o como array → convertir a array\r\n role: decoded.role\r\n ? Array.isArray(decoded.role)\r\n ? decoded.role\r\n : [decoded.role]\r\n : null,\r\n\r\n // Validación de expiración del JWT\r\n isTokenExpired: this.helperJwt.isTokenExpired(token),\r\n };\r\n }\r\n}\r\n","import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { throwError, timer } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\nimport { ErrorModel } from '../models/src/error.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n\r\n handleErrorResponse(error: HttpErrorResponse) {\r\n const err: ErrorModel = error as ErrorModel;\r\n const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;\r\n\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage =\r\n 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage = 'Un error inesperado ha ocurrido.';\r\n break;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n this._serviceAlerta.alertaHtml(\r\n 'Servicios de Errores',\r\n '<i>Código:</i> ' +\r\n err.status +\r\n ' <i>Message:</i> ' +\r\n userMessage +\r\n `.<strong class=\"alertMessageDsx\"> (${error.error})</strong>`\r\n );\r\n\r\n // Imprimir el mensaje técnico\r\n if (isDevMode()) {\r\n console.error(err);\r\n }\r\n\r\n // Retornar el error para continuar con el flujo de manejo de errores\r\n return throwError(() => new Error(technicalMessage));\r\n }\r\n}\r\n","// Interceptor HTTP para manejar autorización y refresco de tokens en peticiones HTTP.\r\n// Permite agregar el token de autorización, manejar errores 401 y refrescar el token automáticamente.\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n EMPTY,\r\n filter,\r\n finalize,\r\n switchMap,\r\n take,\r\n} from 'rxjs';\r\nimport { ModelToken } from '../models/src/token.model';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\n\r\n// Lleva el conteo de peticiones activas para mostrar/ocultar el spinner\r\nlet _activeRequest = 0;\r\n// Indica si se está realizando un refresh de token\r\nlet isRefreshing = false;\r\n// Subject para emitir el nuevo token tras el refresh\r\nlet refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n/**\r\n * Interceptor principal para autorización HTTP.\r\n * - Agrega el token de autorización a cada petición.\r\n * - Muestra/oculta el spinner de carga según el número de peticiones activas.\r\n * - Maneja errores 401 (Unauthorized) refrescando el token si es posible.\r\n * - Repite la petición original tras refrescar el token.\r\n */\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n const _token = _authorizeService.getToken();\r\n\r\n let authReq = req;\r\n\r\n // Si la URL de la petición es inválida, retorna un observable vacío\r\n // Surgio a partir de angular V21\r\n if (!req.url || req.url.trim() === '' || req.url === '/') {\r\n return EMPTY;\r\n }\r\n\r\n if (_token) {\r\n authReq = req.clone({\r\n setHeaders: { Authorization: `Bearer ${_token}` },\r\n });\r\n }\r\n\r\n // Para depuración: muestra el token agregado\r\n //console.log('Interceptor - Token agregado a la petición:', authReq);\r\n\r\n // Muestra el spinner si es la primera petición activa\r\n if (_activeRequest === 0) {\r\n _spinnerService.show();\r\n }\r\n _activeRequest++;\r\n\r\n // Ejecuta la petición HTTP\r\n return next(authReq).pipe(\r\n // Manejo de errores en la respuesta\r\n catchError((error: HttpErrorResponse) => {\r\n // Si el error es 401 (no autorizado), intenta refrescar el token\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n const refreshToken = _authorizeService.getTokenRefresh();\r\n // Si no hay refresh token, delega el manejo del error\r\n if (!refreshToken) {\r\n return _handleErrorService.handleErrorResponse(error);\r\n }\r\n\r\n // Si no se está refrescando el token, inicia el proceso de refresh\r\n if (!isRefreshing) {\r\n isRefreshing = true;\r\n refreshTokenSubject.next(null);\r\n\r\n // Solicita el refresh del token\r\n return _securityService.tokenRefresh(refreshToken).pipe(\r\n switchMap((response: ModelToken) => {\r\n isRefreshing = false;\r\n _authorizeService.tokenReload(response); // Actualiza el token en el servicio\r\n refreshTokenSubject.next(response.token); // Emite el nuevo token\r\n\r\n // Repite la petición original con el nuevo token\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.token}`,\r\n },\r\n })\r\n );\r\n }),\r\n catchError((err) => {\r\n isRefreshing = false;\r\n refreshTokenSubject.error(err); // Emite el error en el subject\r\n return _handleErrorService.handleErrorResponse(err);\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, espera a que el subject emita el nuevo token\r\n return refreshTokenSubject.pipe(\r\n filter((token) => token != null), // Espera a que el token sea válido\r\n take(1), // Toma solo la primera emisión válida\r\n switchMap((token) =>\r\n next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${token}` },\r\n })\r\n )\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Para otros errores, delega al servicio de manejo de errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n // Al finalizar la petición (éxito o error), actualiza el conteo y oculta el spinner si corresponde\r\n // comentarizar el hide para verificar el spinner en la aplicacion final\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n _spinnerService.hide();\r\n }\r\n })\r\n );\r\n};\r\n","export type InferCacheKeyType<T extends Record<string, string>> = keyof T;\r\n\r\n/**\r\n * Transforma un tipo de mapa `T` cuyas claves son simbólicas\r\n * y cuyos valores son nombres de propiedades reales de caché,\r\n * a un objeto donde esas propiedades reales son claves booleanas.\r\n *\r\n * @example\r\n * ```ts\r\n * type T = { cliente: 'invalidateCacheCliente' };\r\n * InferCacheOptions<T> // { invalidateCacheCliente: boolean }\r\n * ```\r\n */\r\nexport type InferCacheOptions<T extends Record<string, string>> = {\r\n [K in keyof T as T[K]]: boolean;\r\n};\r\n\r\nexport function createInitialCache<T extends Record<string, string>>(\r\n cacheKeys: T\r\n): {\r\n -readonly [K in keyof T as T[K]]: boolean;\r\n} {\r\n return Object.fromEntries(\r\n Object.values(cacheKeys).map((key) => [key, false])\r\n ) as any;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonValuesDebujComponent } from '../../components/json-values-debuj/json-values-debuj.component';\r\nimport { IconDsxComponent } from '../../components/icon-dsx/icon-dsx.component';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [IconDsxComponent, JsonValuesDebujComponent],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n ],\r\n providers: [],\r\n})\r\nexport class DsxAddToolsModule {}\r\n","import { NgModule } from '@angular/core';\r\n\r\n//PrimeNG\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { AutoCompleteModule } from 'primeng/autocomplete';\r\nimport { AutoFocusModule } from 'primeng/autofocus';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { AvatarGroupModule } from 'primeng/avatargroup';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { FieldsetModule } from 'primeng/fieldset';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { InputMaskModule } from 'primeng/inputmask';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { StepperModule } from 'primeng/stepper';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TextareaModule } from 'primeng/textarea';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\nconst PRIME_NG_MODULES = [\r\n AccordionModule,\r\n AutoCompleteModule,\r\n AutoFocusModule,\r\n AvatarGroupModule,\r\n AvatarModule,\r\n ButtonModule,\r\n CheckboxModule,\r\n DatePickerModule,\r\n DialogModule,\r\n DividerModule,\r\n DrawerModule,\r\n FieldsetModule,\r\n FileUploadModule,\r\n FloatLabelModule,\r\n IconFieldModule,\r\n ImageModule,\r\n InputIconModule,\r\n InputMaskModule,\r\n InputNumberModule,\r\n InputTextModule,\r\n MenubarModule,\r\n MessageModule,\r\n MultiSelectModule,\r\n PanelMenuModule,\r\n PasswordModule,\r\n RadioButtonModule,\r\n RippleModule,\r\n SelectModule,\r\n SplitButtonModule,\r\n StepperModule,\r\n TableModule,\r\n TabsModule,\r\n TagModule,\r\n TextareaModule,\r\n ToastModule,\r\n ToggleButtonModule,\r\n TooltipModule,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: [...PRIME_NG_MODULES],\r\n providers: [],\r\n})\r\nexport class PrimeNgModule {}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate',\r\n standalone: true,\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n /**\r\n * Transforma una cadena de texto truncándola según los parámetros proporcionados.\r\n *\r\n * @param value - La cadena de texto que se desea truncar.\r\n * @param limit - El número máximo de caracteres permitidos. Por defecto es 100. Si no se encuentra un espacio dentro del límite, usa el límite original (15).\r\n * @param completeWords - Si es true, evita cortar palabras a la mitad. Por defecto es false.\r\n * @param ellipsis - La cadena que se añadirá al final del texto truncado. Por defecto es '...'.\r\n * @returns La cadena truncada con el ellipsis añadido, si es necesario.\r\n */\r\n transform(\r\n value: string,\r\n limit: number = 20,\r\n completeWords: boolean = false,\r\n ellipsis: string = '...'\r\n ): string {\r\n // Si el valor es nulo o indefinido, devuelve una cadena vacía para evitar errores.\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n // Si completeWords es true, ajusta el límite para no cortar palabras.\r\n if (completeWords) {\r\n // Encuentra el último espacio dentro del límite para evitar cortar palabras.\r\n limit = value.slice(0, limit).lastIndexOf(' ');\r\n\r\n // Si no se encuentra un espacio dentro del límite, usa el límite original.\r\n if (limit < 0) {\r\n limit = 15; // Valor por defecto si no hay espacios.\r\n }\r\n }\r\n\r\n // Trunca el texto y añade el ellipsis si la longitud del texto supera el límite.\r\n return value.length > limit ? value.slice(0, limit) + ellipsis : value;\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { CACHE_KEYS } from '../injections/cache.token';\r\nimport { InferCacheOptions } from '../models/src/cache.types';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n\r\n/**\r\n * Servicio genérico para el manejo de caché reactivo basado en claves definidas por el consumidor.\r\n *\r\n * Este servicio utiliza señales (`signal`) para almacenar el estado de invalidación de caché\r\n * y permite marcar ciertas entradas como inválidas mediante una llamada a `invalidate`.\r\n *\r\n * ---\r\n * ## Uso básico\r\n * Si no se especifica el tipo genérico `T`, el servicio funcionará con un mapa genérico\r\n * `Record<string, string>` sin autocompletado.\r\n *\r\n * ```ts\r\n * const cacheService = inject(CacheService);\r\n * cacheService.invalidate(['cualquierClave']);\r\n * ```\r\n *\r\n * ---\r\n * ## Uso tipado (recomendado)\r\n * 1. Definir las claves de caché en el proyecto consumidor:\r\n * ```ts\r\n * export const INITIAL_CACHE_KEYS = {\r\n * cliente: 'invalidateCacheCliente',\r\n * empresa: 'invalidateCacheEmpresa'\r\n * } as const;\r\n *\r\n * export type ValueCacheKeys = typeof INITIAL_CACHE_KEYS;\r\n * ```\r\n *\r\n * 2. Proveer estas claves en `AppModule` o un módulo raíz:\r\n * ```ts\r\n * providers: [\r\n * { provide: CACHE_KEYS, useValue: INITIAL_CACHE_KEYS }\r\n * ]\r\n * ```\r\n *\r\n * 3. Inyectar el servicio especificando el tipo:\r\n * ```ts\r\n * const cacheService = inject<CacheService<ValueCacheKeys>>(CacheService);\r\n *\r\n * cacheService.options.invalidateCacheCliente; // ✅ boolean con autocompletado\r\n * cacheService.invalidate(['cliente']); // marca como invalidado\r\n * ```\r\n *\r\n * @typeParam T - Objeto con claves simbólicas (`keyof T`) como `cliente`, `empresa`,\r\n * y valores string literales usados como claves reales de caché.\r\n * Por defecto: `Record<string, string>`.\r\n */\r\nexport class CacheService<\r\n T extends Record<string, string> = Record<string, string>\r\n> {\r\n /**\r\n * Mapa de claves simbólicas a claves reales de caché.\r\n * Se inyecta desde el proyecto consumidor mediante `CACHE_KEYS`.\r\n */\r\n private keys = inject(CACHE_KEYS) as T;\r\n\r\n /**\r\n * Servicio de alerta utilizado para mostrar notificaciones al usuario.\r\n */\r\n private alert = inject(AlertaService);\r\n\r\n /**\r\n * Estado reactivo que contiene un objeto donde cada propiedad (clave real de caché)\r\n * tiene un valor booleano que indica si el caché ha sido invalidado (`true`)\r\n * o sigue siendo válido (`false`).\r\n *\r\n * Este estado es tipado automáticamente en función de los valores de `T`.\r\n */\r\n private _options = signal<InferCacheOptions<T>>(\r\n Object.fromEntries(\r\n Object.values(this.keys).map((k) => [k, false])\r\n ) as InferCacheOptions<T>\r\n );\r\n\r\n /**\r\n * Obtiene el estado actual del caché.\r\n * Cada propiedad representa una clave real de caché con su valor booleano.\r\n */\r\n get options(): InferCacheOptions<T> {\r\n return this._options();\r\n }\r\n\r\n /**\r\n * Invalida una o más claves simbólicas, marcando su correspondiente\r\n * propiedad de caché como `true` (invalidada).\r\n *\r\n * @param keysToInvalidate - Lista de claves simbólicas (`keyof T`) a invalidar.\r\n *\r\n * @example\r\n * ```ts\r\n * cacheService.invalidate(['cliente', 'empresa']);\r\n * ```\r\n */\r\n invalidate(keysToInvalidate: (keyof T)[] | null = null): void {\r\n if (!keysToInvalidate?.length) return;\r\n\r\n const current: InferCacheOptions<T> = { ...this._options() };\r\n\r\n keysToInvalidate.forEach((key) => {\r\n const prop = this.keys[key] as keyof InferCacheOptions<T>;\r\n current[prop] = true as InferCacheOptions<T>[typeof prop];\r\n });\r\n\r\n this._options.set(current);\r\n\r\n this.alert.toastrAlerts(\r\n 2,\r\n 'Estado',\r\n 'Datos actualizados (cache).',\r\n 2,\r\n 1000\r\n );\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport { CacheService } from './cache.service';\r\n\r\nexport function createTypedCacheProvider<T extends Record<string, string>>(\r\n tokenName: string\r\n): { token: InjectionToken<CacheService<T>>; provider: Provider } {\r\n const token = new InjectionToken<CacheService<T>>(tokenName);\r\n\r\n const provider: Provider = {\r\n provide: token,\r\n useFactory: () => new CacheService<T>(),\r\n deps: [],\r\n };\r\n\r\n return { token, provider };\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class EndpointService<T> {\r\n private http = inject(HttpClient);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private getUrl(endpoint: string): string {\r\n return `${this.environment.myAppUrl}api/${endpoint}`;\r\n }\r\n\r\n list(endpoint: string, invalidateCache: boolean = false): Observable<T[]> {\r\n return this.http.get<T[]>(\r\n `${this.getUrl(endpoint)}/listar/${invalidateCache}`\r\n );\r\n }\r\n\r\n edit(endpoint: string, id: number): Observable<T> {\r\n return this.http.get<T>(`${this.getUrl(endpoint)}/get-id/${id}`);\r\n }\r\n\r\n save(endpoint: string, values: T): Observable<ResponseHttpModel> {\r\n return this.http.put<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/save`,\r\n values\r\n );\r\n }\r\n\r\n delete(\r\n endpoint: string,\r\n id: number,\r\n softDelete: boolean = true\r\n ): Observable<ResponseHttpModel> {\r\n return this.http.delete<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/delete/${id}/${softDelete}`\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport moment from 'moment-timezone';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n} from '../models/src/extensions.model';\r\nimport { FieldConfig } from '../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UtilityAddService {\r\n private _serviceAlerta = inject(AlertaService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private _router = inject(Router);\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto formateada según la zona horaria especificada.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en la zona horaria especificada o null si la fecha es null.\r\n */\r\n convertirFechaSegunZonaHoraria(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Cambia esto a la zona horaria que desees\r\n const zonaHoraria = 'America/Guatemala';\r\n return moment(fecha).tz(zonaHoraria).format();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a un objeto Date en formato ISO, opcionalmente ajustando la hora al inicio del día.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {Date | null} - La fecha convertida en formato Date o null si la fecha es null.\r\n */\r\n convertirFechaISOString(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena en formato ISO 8601.\r\n *\r\n * @param {string | Date} fecha - La fecha a convertir. Puede ser un string o un objeto Date.\r\n * @param {boolean} initHour - Si es true, ajusta la hora al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha en formato ISO 8601 (ejemplo: '2025-09-05T00:00:00.000Z') o null si la fecha es inválida.\r\n *\r\n * @example\r\n * // Fecha como string\r\n * service.convertirFechaISO8601('2025-09-05'); // '2025-09-05T00:00:00.000Z'\r\n * // Fecha como Date y ajustando al inicio del día\r\n * service.convertirFechaISO8601(new Date(), true); // '2025-09-05T00:00:00.000Z'\r\n */\r\n convertirFechaISO8601(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toISOString();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato corto (YYYY-MM-DD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha formateada en formato corto (YYYY-MM-DD) o null si la fecha es null.\r\n */\r\n convertirFechaShort(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n const fechaMoment = moment(fecha).format('YYYY-MM-DD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto que representa solo la hora (HH:mm).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La hora formateada (HH:mm) o null si la fecha es null.\r\n */\r\n convertirFechaTime(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('HH:mm');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato timestamp (YYYYMMDD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en formato timestamp (YYYYMMDD) o null si la fecha es null.\r\n */\r\n convertirTimeStampString(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('YYYYMMDD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Crea un FormGroup tipado a partir de una configuración de campos.\r\n *\r\n * @param {FormBuilder} fb - Instancia de FormBuilder para crear el FormGroup.\r\n * @param {FieldConfig<T>} config - Configuración de los campos del formulario.\r\n * @param {ValidatorFn[]} groupValidators - Validadores adicionales a nivel de grupo.\r\n * @returns {FormGroup} - El FormGroup creado.\r\n */\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[]\r\n ): FormGroup {\r\n const formGroup: { [key in keyof T]?: FormControl } = {};\r\n\r\n // Crear controles de formulario individuales\r\n for (const key in config) {\r\n if (Object.prototype.hasOwnProperty.call(config, key)) {\r\n const { value, disabled = false, validators = [] } = config[key];\r\n formGroup[key] = new FormControl({ value, disabled }, validators);\r\n }\r\n }\r\n\r\n // Crear el FormGroup con validadores adicionales a nivel de grupo si existen\r\n const group = fb.group(\r\n formGroup,\r\n groupValidators ? { validators: groupValidators } : {}\r\n );\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Sanitiza un formulario obteniendo valores de un formulario, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del modelo a procesar.\r\n * @param form - El formulario reactivo de Angular del que se obtendrán los valores.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar. Cada objeto debe contener:\r\n * - `nombre`: El nombre del campo de fecha en el modelo.\r\n * - `tipo`: El tipo de conversión que se debe aplicar (por ejemplo, `'short'`, `'zh'`, `'iso').\r\n * @returns Un objeto del tipo `T` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo de fecha especificado no existe en los datos del formulario.\r\n *\r\n * @example\r\n * // Procesar varios campos de fecha\r\n * const precioValues = service.sanitizarModelo<ItemPrecioModel>(\r\n * form,\r\n * { nombre: 'fechaInicio', tipo: 'short' },\r\n * { nombre: 'fechaFin', tipo: 'zh' }\r\n * );\r\n */\r\n sanitizarForm<T>(form: any, ...campos: FechasConversion[]): T {\r\n // Obtén todos los valores del formulario\r\n const rawData = form.getRawValue();\r\n\r\n if (!rawData) {\r\n throw new Error('El formulario no tiene valores.');\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue = { ...rawData };\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo)\r\n : null;\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Sanitiza un objeto plano, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del objeto a procesar.\r\n * @param values - El objeto con los datos.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar.\r\n * @returns Un objeto del tipo T con las conversiones de fecha aplicadas.\r\n */\r\n sanitizarModel<T extends Record<string, any>>(\r\n values: T,\r\n ...campos: FechasConversion[]\r\n ): T {\r\n // Crear una copia del objeto para no modificar el original\r\n const updatedValue: Record<string, any> = { ...values };\r\n\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el objeto.`);\r\n }\r\n\r\n const valorActual = updatedValue[nombre];\r\n\r\n if (\r\n valorActual !== null &&\r\n valorActual !== undefined &&\r\n valorActual !== ''\r\n ) {\r\n updatedValue[nombre] = this.convertirFecha(valorActual, tipo);\r\n } else {\r\n updatedValue[nombre] = null;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Convierte una fecha al formato especificado.\r\n *\r\n * @param fecha - La fecha en formato string que se desea convertir.\r\n * Debe estar en un formato reconocible por `Date` o en ISO 8601.\r\n * @param tipo - El tipo de conversión a realizar. Soporta:\r\n * - `'short'`: Devuelve la fecha en formato corto (YYYY-MM-DD).\r\n * - `'zh'`: Devuelve la fecha ajustada a la zona horaria configurada.\r\n * - `'iso'`: Devuelve la fecha como objeto Date en formato ISO.\r\n * - `'iso8601'`: Devuelve la fecha como string en formato ISO 8601.\r\n * @returns La fecha convertida como string o Date según el tipo especificado, o null si la fecha es inválida.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n *\r\n * @example\r\n * // Formato corto\r\n * service.convertirFecha('2025-08-21', 'short'); // '2025-08-21'\r\n * // Zona horaria\r\n * service.convertirFecha('2025-08-21', 'zh'); // '2025-08-21T00:00:00-06:00' (ejemplo)\r\n * // Formato ISO (Date)\r\n * service.convertirFecha('2025-08-21', 'iso'); // Date { ... }\r\n * // Formato ISO 8601 (string)\r\n * service.convertirFecha('2025-08-21', 'iso8601'); // '2025-08-21T00:00:00.000Z'\r\n */\r\n private convertirFecha(\r\n fecha: string,\r\n tipo: TipoFechaConversion\r\n ): Date | string | null {\r\n switch (tipo) {\r\n case 'short':\r\n // Implementación para el formato corto\r\n return this.convertirFechaShort(fecha);\r\n case 'zh':\r\n // Implementación para zonas horarias\r\n return this.convertirFechaSegunZonaHoraria(fecha);\r\n case 'iso': {\r\n return this.convertirFechaISOString(fecha);\r\n }\r\n case 'iso8601': {\r\n return this.convertirFechaISO8601(fecha);\r\n }\r\n default:\r\n throw new Error(`Tipo de conversión desconocido: ${tipo}`);\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable\r\n * @param fileObservable Observable que emite el Blob del archivo\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fileName Nombre del archivo sin extensión\r\n */\r\n handleFileResponse(\r\n fileObservable: Observable<Blob>,\r\n actionId: number,\r\n fileName: string\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (fileBlob: Blob) => {\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(fileUrl, actionId, fileName, fileExtension);\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n private isExcelFile(fileType: string): boolean {\r\n return fileType.includes(\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n );\r\n }\r\n\r\n private getFileExtension(fileType: string): string {\r\n return fileType.includes('pdf') ? '.pdf' : '.xlsx';\r\n }\r\n\r\n private handleNonExcelFiles(\r\n fileUrl: string,\r\n actionId: number,\r\n fileName: string,\r\n fileExtension: string\r\n ): void {\r\n switch (actionId) {\r\n case 0: // Abrir en nueva ventana\r\n window.open(fileUrl, '_blank');\r\n break;\r\n case 1: // Descargar archivo\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n break;\r\n }\r\n }\r\n\r\n private forceDownload(fileUrl: string, fullFileName: string): void {\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n }\r\n\r\n private revokeObjectUrl(fileUrl: string): void {\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Muestra información en consola solo en desarrollo, permitiendo múltiples argumentos como console.log nativo.\r\n *\r\n * @param args - Argumentos a mostrar en consola (texto, objetos, etc).\r\n * @example\r\n * logIfNotProduction('Datos:', response);\r\n * logIfNotProduction('Error:', error, { extra: true });\r\n */\r\n logIfNotProduction(...args: any[]): void {\r\n if (!this.environment.production) {\r\n console.log(...args);\r\n }\r\n }\r\n\r\n /**\r\n * Marca todos los controles de un formulario como \"tocados\" y muestra un mensaje de alerta.\r\n * @param form - El formulario que se va a validar.\r\n */\r\n checkFormValid(form: FormGroup): void {\r\n // Marca todos los controles como tocados\r\n form.markAllAsTouched();\r\n\r\n // Muestra un mensaje de alerta\r\n this._serviceAlerta.toastrAlerts(\r\n 3,\r\n 'Formulario',\r\n 'Validaciones pendientes',\r\n 2\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene valores únicos de un campo específico de un array de objetos\r\n * @param data Array de objetos de tipo T\r\n * @param field Campo del objeto del cual extraer valores únicos\r\n * @returns FilterOption[] Listado filtrado, tipado y ordenado alfabéticamente\r\n */\r\n getUniqueValues<T>(data: T[], field: keyof T): FilterOption[] {\r\n const uniqueValues = data.reduce((acc: FilterOption[], current) => {\r\n const fieldValue = current[field];\r\n\r\n if (\r\n typeof fieldValue === 'string' &&\r\n !acc.some((item) => item.value === fieldValue)\r\n ) {\r\n acc.push({\r\n value: fieldValue,\r\n field: field.toString(),\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return uniqueValues.sort((a, b) => a.value.localeCompare(b.value));\r\n }\r\n\r\n /**\r\n * Helper function para parsear fechas para filtro de primeNg en table\r\n * @param date - Fecha en formato string, Date o null/undefined\r\n * @returns Date | null - Objeto Date válido o null\r\n */\r\n parseDate(date: string | Date | null): Date | null {\r\n if (!date) return null;\r\n return typeof date === 'string' ? new Date(date) : date;\r\n }\r\n\r\n /**\r\n * Función pura que procesa una cadena de texto conteniendo números individuales y/o rangos numéricos,\r\n * devolviendo un array con todos los números expandidos.\r\n *\r\n * @param input - Cadena de texto con el formato: número[.número][.inicio-fin][...]\r\n * @returns Array de números con todos los valores individuales y rangos expandidos\r\n *\r\n * @example\r\n * // Uso básico\r\n * const result = parseNumericRanges('1.5.7.10-12');\r\n * // Retorna: [1, 5, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Con espacios y caracteres especiales\r\n * const result = parseNumericRanges(' 3. 5-7 .10-12abc');\r\n * // Retorna: [3, 5, 6, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Rangos invertidos (serán ignorados)\r\n * const result = parseNumericRanges('10-8');\r\n * // Retorna: [] (array vacío)\r\n *\r\n * @note\r\n * Características especiales:\r\n * - Elimina automáticamente espacios y caracteres no numéricos\r\n * - Los números deben estar separados por puntos (.)\r\n * - Los rangos deben usar guión (-) sin espacios entre números\r\n * - Es tolerante a formatos inconsistentes\r\n * - Omite elementos inválidos sin generar errores\r\n */\r\n parseNumericRanges(input: string): number[] {\r\n const cleanString = input.replace(/[^\\d.\\- ]/g, '').replace(/\\s+/g, '');\r\n\r\n const parts = cleanString.split('.');\r\n const result: number[] = [];\r\n\r\n for (const part of parts) {\r\n if (!part) continue;\r\n\r\n if (part.includes('-')) {\r\n const [startStr, endStr] = part.split('-');\r\n const start = parseInt(startStr, 10);\r\n const end = parseInt(endStr, 10);\r\n\r\n if (!isNaN(start) && !isNaN(end) && start <= end) {\r\n for (let i = start; i <= end; i++) {\r\n result.push(i);\r\n }\r\n }\r\n } else {\r\n const number = parseInt(part, 10);\r\n if (!isNaN(number)) {\r\n result.push(number);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adaptador para procesar eventos de input y extraer rangos numéricos.\r\n *\r\n * @param event - Objeto Event del DOM, preferiblemente de un elemento input\r\n * @returns Array de números generado a partir del valor del input\r\n *\r\n * @example\r\n * // Uso en template Angular\r\n * <input (input)=\"processNumericRangesFromEvent($event)\">\r\n *\r\n * @example\r\n * // Uso directo\r\n * const result = processNumericRangesFromEvent(inputEvent);\r\n *\r\n * @note\r\n * Esta función es un wrapper que:\r\n * - Extrae el valor del input del evento\r\n * - Delega el procesamiento a parseNumericRanges()\r\n * - Mantiene compatibilidad con eventos de diferentes frameworks\r\n *\r\n * @dependencies\r\n * Requiere que el evento tenga la propiedad target.value (standard DOM)\r\n * Para otros tipos de eventos (ej. Angular Material) puede necesitar ajustes\r\n */\r\n processNumericRangesFromEvent(event: Event): number[] {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n return this.parseNumericRanges(inputValue);\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP, mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @param response - Respuesta de la operación (debe tener isSuccess, title, statusMessage).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n *\r\n * @example\r\n * // Uso típico en un componente\r\n * this.utilityAddService.handleResponse(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponse(\r\n response: ResponseHttpModel,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.statusMessage,\r\n 2\r\n );\r\n if (id > 0) {\r\n this._router.navigate([urlHome]);\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n response.statusMessage,\r\n {\r\n icono: 'icon2/hard_drive_error.png',\r\n showConfirmButton: true,\r\n }\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponse:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2\r\n );\r\n }\r\n }\r\n}\r\n","import { AbstractControl, FormGroup, ValidationErrors } from '@angular/forms';\r\n\r\n/**\r\n * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).\r\n */\r\nexport function dateRangeValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const dates: Date[] = control.value;\r\n\r\n // Verificar si el valor es un array con exactamente dos elementos\r\n if (Array.isArray(dates) && dates.length === 2) {\r\n const [startDate, endDate] = dates;\r\n\r\n // Verificar que las fechas sean válidas y no nulas\r\n if (\r\n startDate &&\r\n endDate &&\r\n !isNaN(new Date(startDate).getTime()) &&\r\n !isNaN(new Date(endDate).getTime())\r\n ) {\r\n return null; // Válido\r\n } else {\r\n return {\r\n invalidDateRange: {\r\n message: 'Ambas fechas deben ser válidas y no nulas.',\r\n requiredLength: 2,\r\n },\r\n }; // Error si alguna fecha es nula o inválida\r\n }\r\n }\r\n\r\n return null; // Si el control no contiene un array válido, no hay error\r\n}\r\n\r\n/**\r\n * Valida que una fecha única esté dentro de un rango mínimo y máximo.\r\n * @param minDate Fecha mínima permitida.\r\n * @param maxDate Fecha máxima permitida.\r\n */\r\nexport function dateMinMaxValidator(minDate: Date, maxDate: Date) {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const date: Date = control.value;\r\n\r\n // Verificar si el valor es una fecha válida\r\n if (date && !isNaN(new Date(date).getTime())) {\r\n const currentDate = new Date(date);\r\n\r\n // Validar si la fecha está fuera del rango permitido\r\n if (currentDate < minDate || currentDate > maxDate) {\r\n return {\r\n dateNotRange: {\r\n message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,\r\n minDate: minDate.toISOString(),\r\n maxDate: maxDate.toISOString(),\r\n },\r\n };\r\n }\r\n\r\n return null; // Fecha válida y dentro del rango\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que al menos uno de los campos especificados esté lleno.\r\n * @param fields Los nombres de los campos a validar.\r\n */\r\nexport function atLeastOneFieldRequiredValidator(fields: string[]) {\r\n return (formGroup: AbstractControl): ValidationErrors | null => {\r\n // Obtener el FormGroup para poder acceder a los controles\r\n const form = formGroup as FormGroup;\r\n\r\n // Verificar si al menos uno de los campos tiene un valor\r\n const isAnyFieldFilled = fields.some((field) => {\r\n const control = form.get(field);\r\n return control?.value !== null && control?.value !== '';\r\n });\r\n\r\n // Si al menos un campo tiene un valor, la validación es exitosa\r\n if (isAnyFieldFilled) {\r\n return null; // Validación pasada\r\n } else {\r\n // Construir el mensaje dinámico con los campos no llenados\r\n const emptyFields = fields.filter((field) => {\r\n const control = form.get(field);\r\n return control?.value === null || control?.value === '';\r\n });\r\n\r\n const fieldNames = emptyFields.join(', ');\r\n const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;\r\n\r\n // Si ninguno tiene valor, devolver el mensaje con el error\r\n return {\r\n atLeastOneRequired: {\r\n message: message,\r\n },\r\n };\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un NIT (Número de Identificación Tributaria) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del NIT.\r\n * @returns Un objeto de error si el NIT no es válido, o `null` si el NIT es válido.\r\n */\r\nexport function nitValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const nit = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!nit) {\r\n return null;\r\n }\r\n\r\n // Validar el NIT utilizando la función NITCorrecto\r\n const esValido = NITCorrecto(nit);\r\n\r\n // Si el NIT no es válido, retornar un objeto de error con el formato deseado\r\n if (!esValido) {\r\n return {\r\n invalidNIT: {\r\n message: 'El NIT ingresado no es válido.', // Mensaje de error personalizado\r\n requiredLength: nit.length, // Longitud del NIT ingresado (opcional)\r\n },\r\n };\r\n }\r\n\r\n // Si el NIT es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función auxiliar para validar un NIT según un algoritmo específico.\r\n *\r\n * @param nit - El NIT a validar.\r\n * @returns `true` si el NIT es válido, `false` en caso contrario.\r\n */\r\nfunction NITCorrecto(nit: string): boolean {\r\n try {\r\n const largo = nit.length;\r\n // Invertir el NIT (excepto el último dígito) para facilitar el cálculo\r\n const validar = nit\r\n .substring(0, largo - 1)\r\n .split('')\r\n .reverse()\r\n .join('');\r\n const cadena = validar.split('');\r\n const comparador = nit.substring(largo - 1, largo); // Último dígito del NIT\r\n let posicion = 2; // Factor de ponderación inicial\r\n let sumaValidar = 0; // Acumulador para la suma ponderada\r\n\r\n // Calcular la suma ponderada de los dígitos del NIT\r\n for (const c of cadena) {\r\n sumaValidar += parseInt(c, 10) * posicion;\r\n posicion += 1;\r\n }\r\n\r\n // Calcular el residuo de la operación de validación\r\n const residuo = operacionValidar(11 - operacionValidar(sumaValidar));\r\n\r\n // Validar el NIT según el residuo y el último dígito\r\n if (residuo === 10 && comparador.toUpperCase() === 'K') {\r\n return true; // El NIT es válido si el residuo es 10 y el último dígito es 'K'\r\n } else if (residuo.toString() === comparador) {\r\n return true; // El NIT es válido si el residuo coincide con el último dígito\r\n } else {\r\n return false; // El NIT no es válido\r\n }\r\n } catch (error) {\r\n // Si ocurre un error durante la validación, el NIT no es válido\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Función auxiliar para calcular el residuo de una operación aritmética.\r\n *\r\n * @param valor - El valor sobre el cual se calculará el residuo.\r\n * @returns El residuo de la división del valor entre 11.\r\n */\r\nfunction operacionValidar(valor: number): number {\r\n return valor % 11;\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un CUI (Código Único de Identificación) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del CUI.\r\n * @returns Un objeto de error si el CUI no es válido, o `null` si el CUI es válido.\r\n */\r\nexport function cuiValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const cui = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!cui) {\r\n return null;\r\n }\r\n\r\n // Validar el CUI\r\n const esValido = CUICorrecto(cui);\r\n\r\n // Si el CUI no es válido, retornar un objeto de error\r\n if (!esValido) {\r\n return {\r\n invalidCUI: {\r\n message: 'El CUI ingresado no es válido.',\r\n requiredLength: 13,\r\n actualLength: cui.length,\r\n },\r\n };\r\n }\r\n\r\n // Si el CUI es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función que implementa el algoritmo de validación del CUI\r\n * @param cui Número de CUI a validar (debe tener 13 dígitos)\r\n * @returns boolean indicando si el CUI es válido\r\n */\r\nfunction CUICorrecto(cui: string | number): boolean {\r\n // Convertir a string si es número\r\n const cuiStr = typeof cui === 'number' ? cui.toString() : cui;\r\n\r\n // Validar longitud y que sean solo dígitos\r\n if (cuiStr.length !== 13 || !/^\\d+$/.test(cuiStr)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const primeros8 = cuiStr.substring(0, 8);\r\n const digitoVerificador = parseInt(cuiStr.substring(8, 9), 10);\r\n let suma = 0;\r\n\r\n // Calcular la suma ponderada\r\n for (let i = 0; i < primeros8.length; i++) {\r\n const digito = parseInt(primeros8[i], 10);\r\n suma += digito * (i + 2); // Los pesos son 2, 3, 4, ..., 9\r\n }\r\n\r\n // Calcular residuo y validar\r\n const residuo = suma % 11;\r\n return residuo === digitoVerificador;\r\n } catch (error) {\r\n console.error('Error validando CUI:', error);\r\n return false;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/components';\r\nexport * from './lib/components/icon-dsx/icon-dsx.component';\r\nexport * from './lib/components/json-values-debuj/json-values-debuj.component';\r\nexport * from './lib/components/loading-lottie/loading-lottie.component';\r\nexport * from './lib/components/loading/loading.component';\r\nexport * from './lib/components/navbar-dsx/navbar-dsx.component';\r\nexport * from './lib/directives/only-rango-pattern.directive';\r\nexport * from './lib/directives/select-all-on-focus.directive';\r\nexport * from './lib/injections/cache.token';\r\nexport * from './lib/injections/environment.token';\r\nexport * from './lib/injections/parameterSecurity';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/models';\r\nexport * from './lib/models/src/parameterSecurity.model';\r\nexport * from './lib/modules/src/dsx-add-tools.module';\r\nexport * from './lib/modules/src/prime-ng.module';\r\nexport * from './lib/pipe';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/services/cache.provider';\r\nexport * from './lib/services/cache.service';\r\nexport * from './lib/services/endpoint.service';\r\nexport * from './lib/services/error-handler.service';\r\nexport * from './lib/services/parameter-values.service';\r\nexport * from './lib/services/security.service';\r\nexport * from './lib/services/utility-add.service';\r\nexport * from './lib/validations/addons.validators';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.IconDsxService","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngx-dsxlibrary.mjs","sources":["../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.ts","../../../projects/ngx-dsx/src/lib/components/app-message-error/app-message-error.component.html","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.ts","../../../projects/ngx-dsx/src/lib/components/kpicard/kpicard.component.html","../../../projects/ngx-dsx/src/lib/services/icon-dsx.service.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/icon-dsx/icon-dsx.component.html","../../../projects/ngx-dsx/src/lib/pipe/json-highlight.pipe.ts","../../../projects/ngx-dsx/src/lib/injections/environment.token.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.ts","../../../projects/ngx-dsx/src/lib/components/json-values-debuj/json-values-debuj.component.html","../../../projects/ngx-dsx/src/lib/services/spinner-loading.service.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.ts","../../../projects/ngx-dsx/src/lib/components/loading-lottie/loading-lottie.component.html","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.ts","../../../projects/ngx-dsx/src/lib/components/loading/loading.component.html","../../../projects/ngx-dsx/src/lib/services/alerta.service.ts","../../../projects/ngx-dsx/src/lib/injections/parameterSecurity.ts","../../../projects/ngx-dsx/src/lib/services/security.service.ts","../../../projects/ngx-dsx/src/lib/services/parameter-values.service.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.ts","../../../projects/ngx-dsx/src/lib/components/navbar-dsx/navbar-dsx.component.html","../../../projects/ngx-dsx/src/lib/directives/only-rango-pattern.directive.ts","../../../projects/ngx-dsx/src/lib/directives/select-all-on-focus.directive.ts","../../../projects/ngx-dsx/src/lib/injections/cache.token.ts","../../../projects/ngx-dsx/src/lib/services/authorize.service.ts","../../../projects/ngx-dsx/src/lib/services/error-handler.service.ts","../../../projects/ngx-dsx/src/lib/interceptors/http-authorize.interceptor.ts","../../../projects/ngx-dsx/src/lib/models/src/cache.types.ts","../../../projects/ngx-dsx/src/lib/modules/src/dsx-add-tools.module.ts","../../../projects/ngx-dsx/src/lib/modules/src/prime-ng.module.ts","../../../projects/ngx-dsx/src/lib/pipe/truncate.pipe.ts","../../../projects/ngx-dsx/src/lib/services/cache.service.ts","../../../projects/ngx-dsx/src/lib/services/cache.provider.ts","../../../projects/ngx-dsx/src/lib/services/endpoint.service.ts","../../../projects/ngx-dsx/src/lib/services/utility-add.service.ts","../../../projects/ngx-dsx/src/lib/validations/addons.validators.ts","../../../projects/ngx-dsx/src/public-api.ts","../../../projects/ngx-dsx/src/ngx-dsxlibrary.ts"],"sourcesContent":["import { DecimalPipe } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { AbstractControl, FormGroup } from '@angular/forms';\r\nimport { TagModule } from 'primeng/tag';\r\n\r\n@Component({\r\n selector: 'app-message-error',\r\n imports: [TagModule, DecimalPipe],\r\n templateUrl: './app-message-error.component.html',\r\n styleUrl: './app-message-error.component.css',\r\n})\r\nexport class AppMessageErrorComponent {\r\n // Control de formulario que se pasa como input\r\n @Input() control!: AbstractControl | null;\r\n @Input() form: FormGroup | null = null;\r\n}\r\n","@if(control?.touched && control?.invalid){\r\n<div class=\"absolute dsx-error-message\">\r\n @if(control?.errors?.['required']){ El campo <strong>es requerido.</strong>\r\n } @else if(control?.errors?.['invalidNIT']){\r\n <strong>{{ control?.errors?.['invalidNIT']?.message }}</strong\r\n >. }@else if(control?.errors?.['invalidCUI']){\r\n <strong>{{ control?.errors?.['invalidCUI']?.message }}</strong\r\n >. } @else if(control?.errors?.['invalidDateRange']){\r\n <strong>{{ control?.errors?.['invalidDateRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['dateNotRange']){\r\n <strong>{{ control?.errors?.['dateNotRange']?.message }}</strong\r\n >. } @else if(control?.errors?.['minlength']){ Debe tener al menos\r\n <strong>{{ control?.errors?.['minlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['maxlength']){ Debe tener como máximo\r\n <strong>{{ control?.errors?.['maxlength']?.requiredLength }}</strong>\r\n caracteres. } @else if(control?.errors?.['min']){ El valor mínimo permitido es\r\n <strong>{{ control?.errors?.['min']?.min }}</strong\r\n >. } @else if(control?.errors?.['max']){ El valor máximo permitido es\r\n <strong>{{ control?.errors?.['max']?.max | number:'1.2-2' }}</strong\r\n >. } @else if(control?.errors?.['email']){ Debe ser una dirección de correo\r\n válida. } @else if(control?.errors?.['pattern']){ El campo no tiene el formato\r\n requerido. } @else{ Existe un error aún no identificado. }\r\n</div>\r\n}\r\n<!-- mensaje para formulario en general -->\r\n@if(form?.invalid && form?.touched){\r\n<div class=\"mt-2 mb-2\">\r\n @if(this.form?.errors?.['atLeastOneRequired']){\r\n <p-tag severity=\"danger\" [rounded]=\"true\">\r\n {{ form?.getError(\"atLeastOneRequired\")?.message }}</p-tag\r\n >\r\n }\r\n</div>\r\n}\r\n","import { Component, input } from '@angular/core';\r\nimport { CountUpDirective } from 'ngx-countup';\r\n\r\n@Component({\r\n selector: 'app-kpicard',\r\n imports: [CountUpDirective],\r\n templateUrl: './kpicard.component.html',\r\n styleUrl: './kpicard.component.css',\r\n})\r\nexport class KpicardComponent {\r\n //type = input.required<string>();\r\n option = input.required<'currency' | 'integer' | 'percent'>();\r\n label = input.required<string>();\r\n iconType = input<string>('fa-regular fa-bell');\r\n color = input<string>();\r\n valor = input<number>(0);\r\n theme = input<\r\n | 'light'\r\n | 'dark'\r\n | 'aqua'\r\n | 'sunset'\r\n | 'mint'\r\n | 'peach'\r\n | 'plasma'\r\n | 'nebula'\r\n >('light');\r\n\r\n options: Record<'currency' | 'integer' | 'percent', any> = {\r\n currency: {\r\n startVal: 0,\r\n duration: 0.5,\r\n //prefix: 'Q',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n suffix: ' GTQ', // Sufijo\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n integer: {\r\n startVal: 0,\r\n duration: 0.5,\r\n prefix: 'Cant. ',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n percent: {\r\n startVal: 0,\r\n duration: 0.5,\r\n suffix: '%',\r\n decimalPlaces: 2, // Decimales\r\n useGrouping: true, // Separador de miles\r\n separator: ',', // Carácter separador\r\n decimal: '.', // Carácter decimal\r\n scrollSpyDelay: 200, // Retardo antes de la animación\r\n enableScrollSpy: true,\r\n scrollSpyOnce: true,\r\n },\r\n };\r\n\r\n // ✅ Método auxiliar para obtener la opción con seguridad\r\n getSelectedOption() {\r\n return this.options[this.option()] ?? this.options.currency; // Si no existe, usa `currency`\r\n }\r\n}\r\n","<div [class]=\"`kpi-card ${color()} ${theme()}-theme`\">\r\n <div class=\"kpi-container\">\r\n <span\r\n [countUp]=\"valor()\"\r\n [countUpOptions]=\"getSelectedOption()\"\r\n [class]=\"`card-value-${theme()}`\"\r\n >0</span\r\n >\r\n <span [class]=\"`card-text-${theme()}`\">{{ label() }}</span>\r\n </div>\r\n <i [class]=\"`${iconType()} icon icon-${theme()}`\"></i>\r\n</div>\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { map, Observable, shareReplay } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class IconDsxService {\r\n private cache = new Map<string, Observable<SafeHtml>>();\r\n\r\n constructor(private http: HttpClient, private sanitizer: DomSanitizer) {}\r\n\r\n /** Carga SVG desde assets/dsxResource/material-design-icons/outlined */\r\n getIcon(name: string): Observable<SafeHtml> {\r\n if (this.cache.has(name)) {\r\n return this.cache.get(name)!;\r\n }\r\n\r\n const iconPath = `mdio/${name}.svg`;\r\n\r\n const request$ = this.http.get(iconPath, { responseType: 'text' }).pipe(\r\n map((svg) => this.sanitizer.bypassSecurityTrustHtml(svg)),\r\n shareReplay(1)\r\n );\r\n\r\n this.cache.set(name, request$);\r\n return request$;\r\n }\r\n}\r\n","import { AsyncPipe } from '@angular/common';\r\nimport { Component, Input } from '@angular/core';\r\nimport { SafeHtml } from '@angular/platform-browser';\r\nimport { Observable } from 'rxjs';\r\nimport { IconDsxService } from '../../services/icon-dsx.service';\r\n\r\n@Component({\r\n selector: 'icon-dsx',\r\n imports: [AsyncPipe],\r\n templateUrl: './icon-dsx.component.html',\r\n styleUrl: './icon-dsx.component.css',\r\n})\r\nexport class IconDsxComponent {\r\n @Input() name!: string;\r\n\r\n svg$!: Observable<SafeHtml>; // 👈 AHORA es un Observable\r\n\r\n constructor(private iconService: IconDsxService) {}\r\n\r\n ngOnInit(): void {\r\n this.svg$ = this.iconService.getIcon(this.name); // 👈 AHORA CUADRA CON EL async\r\n }\r\n}\r\n","<span class=\"dsx-icon\" [innerHTML]=\"svg$ | async\"></span>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'jsonHighlight',\r\n})\r\nexport class JsonHighlightPipe implements PipeTransform {\r\n transform(value: any): string {\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n const json = JSON.stringify(value, null, 2); // Formatea el JSON con sangría\r\n\r\n // Aplica estilo y colores para diferenciar claves, valores, booleanos, números, etc.\r\n return json\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?)/g, (match) => {\r\n // Si es una clave (tiene dos puntos al final)\r\n if (/:$/.test(match)) {\r\n return `<span class=\"json-key\">${match}</span>`;\r\n }\r\n // Si es un string (no tiene dos puntos)\r\n return `<span class=\"json-string\">${match}</span>`;\r\n })\r\n .replace(/\\b(true|false|null)\\b/g, '<span class=\"json-boolean\">$1</span>')\r\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"json-number\">$1</span>')\r\n .replace(/[{}\\[\\]]/g, '<span class=\"json-bracket\">$&</span>')\r\n .replace(/,/g, '<span class=\"json-comma\">$&</span>')\r\n .replace(/:/g, '<span class=\"json-colon\">$&</span>');\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\n/**\r\n * Esquema de configuración del entorno - Fuente única de verdad (Single Source of Truth)\r\n *\r\n * Este objeto define todos los campos requeridos y sus tipos esperados para la configuración del entorno.\r\n * Sirve como referencia automática para:\r\n * - Generar el tipo TypeScript `EnvironmentConfig`\r\n * - Validar la presencia de campos requeridos\r\n * - Validar los tipos de datos en runtime\r\n * - Detectar automáticamente campos que requieren validación especial (URLs)\r\n *\r\n * **Cómo agregar una nueva propiedad:**\r\n * 1. Agrégala a este objeto con su tipo: 'string', 'boolean' o 'number'\r\n * 2. Todo lo demás se actualiza automáticamente (tipo TypeScript, validaciones, etc.)\r\n *\r\n * @example\r\n * ```typescript\r\n * const ENVIRONMENT_SCHEMA = {\r\n * production: 'boolean' as const,\r\n * myAppUrl: 'string' as const,\r\n * apiTimeout: 'number' as const, // ← Agregar nueva propiedad\r\n * } as const;\r\n * ```\r\n *\r\n * @internal\r\n */\r\nconst ENVIRONMENT_SCHEMA = {\r\n production: 'boolean' as const,\r\n myAppUrl: 'string' as const,\r\n SeguridadITApiUrl: 'string' as const,\r\n tokenName: 'string' as const,\r\n tokenNameRF: 'string' as const,\r\n sessionStatus: 'string' as const,\r\n refreshTokenExpiry: 'string' as const,\r\n} as const;\r\n\r\n/**\r\n * Tipo que define la configuración del entorno de la aplicación.\r\n *\r\n * Este tipo se genera automáticamente a partir de `ENVIRONMENT_SCHEMA` usando\r\n * TypeScript mapped types. No es necesario mantenerlo manualmente.\r\n *\r\n * **Características:**\r\n * - Se sincroniza automáticamente con ENVIRONMENT_SCHEMA\r\n * - Proporciona autocompletado en IDEs\r\n * - Garantiza type-safety en tiempo de compilación\r\n * - Se valida en runtime usando `provideEnvironment()`\r\n *\r\n * **Campos requeridos:**\r\n * @property production - Indica si la aplicación está en modo producción\r\n * @property myAppUrl - URL base de la aplicación principal (debe incluir protocolo http:// o https://)\r\n * @property SeguridadITApiUrl - URL base de la API de seguridad (debe incluir protocolo http:// o https://)\r\n * @property tokenName - Nombre del token de acceso en el almacenamiento local/sesión\r\n * @property tokenNameRF - Nombre del refresh token en el almacenamiento local/sesión\r\n * @property sessionStatus - Nombre de la clave para el estado de sesión\r\n * @property refreshTokenExpiry - Tiempo de expiración del refresh token (ej: \"7d\", \"24h\")\r\n *\r\n * @example\r\n * ```typescript\r\n * // En tu archivo environment.ts\r\n * import { EnvironmentConfig } from '@devsoftxela/ngx-dsx';\r\n *\r\n * export const environment: EnvironmentConfig = {\r\n * production: false,\r\n * myAppUrl: 'http://localhost:4200/',\r\n * SeguridadITApiUrl: 'http://localhost:5000/',\r\n * tokenName: 'access_token',\r\n * tokenNameRF: 'refresh_token',\r\n * sessionStatus: 'session_status',\r\n * refreshTokenExpiry: '7d'\r\n * };\r\n * ```\r\n */\r\nexport type EnvironmentConfig = {\r\n [K in keyof typeof ENVIRONMENT_SCHEMA]: (typeof ENVIRONMENT_SCHEMA)[K] extends 'string'\r\n ? string\r\n : (typeof ENVIRONMENT_SCHEMA)[K] extends 'boolean'\r\n ? boolean\r\n : (typeof ENVIRONMENT_SCHEMA)[K] extends 'number'\r\n ? number\r\n : never;\r\n};\r\n\r\n/**\r\n * Token de inyección de dependencias para la configuración del entorno.\r\n *\r\n * Este token se utiliza para inyectar la configuración del entorno en servicios y componentes.\r\n * **IMPORTANTE:** No uses este token directamente en providers. En su lugar, usa la función\r\n * `provideEnvironment()` que incluye validación automática.\r\n *\r\n * @example\r\n * ```typescript\r\n * // ✅ Forma correcta - En tu configuración de app\r\n * import { provideEnvironment } from '@devsoftxela/ngx-dsx';\r\n * import { environment } from './environments/environment';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideEnvironment(environment), // ← Con validación automática\r\n * ]\r\n * };\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // ✅ Forma correcta - Inyectar en servicios\r\n * import { inject } from '@angular/core';\r\n * import { ENVIRONMENT, EnvironmentConfig } from '@devsoftxela/ngx-dsx';\r\n *\r\n * export class MiServicio {\r\n * private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n * }\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // ❌ Forma incorrecta - Sin validación\r\n * providers: [\r\n * { provide: ENVIRONMENT, useValue: environment } // ← Sin validación\r\n * ]\r\n * ```\r\n *\r\n * @see {@link provideEnvironment} para configurar con validación\r\n * @see {@link EnvironmentConfig} para la estructura de datos\r\n */\r\nexport const ENVIRONMENT = new InjectionToken<EnvironmentConfig>(\r\n 'EnvironmentConfig'\r\n);\r\n\r\n/**\r\n * Valida que la configuración del entorno esté completa y correctamente configurada.\r\n *\r\n * Esta función verifica que:\r\n * - La configuración del entorno no sea null o undefined\r\n * - Todas las propiedades requeridas estén presentes y no estén vacías\r\n * - Las URLs tengan un formato válido\r\n *\r\n * @param environment - Configuración del entorno a validar\r\n * @throws Error si alguna validación falla, con un mensaje descriptivo del problema\r\n *\r\n * @example\r\n * ```typescript\r\n * const config: EnvironmentConfig = { ... };\r\n * validateEnvironmentConfig(config);\r\n * ```\r\n */\r\nexport function validateEnvironmentConfig(\r\n environment: EnvironmentConfig\r\n): void {\r\n if (!environment) {\r\n throw new Error(\r\n '[ENVIRONMENT] La configuración del entorno no está definida. ' +\r\n 'Asegúrate de proporcionar una configuración válida usando provideEnvironment().'\r\n );\r\n }\r\n\r\n // Obtener automáticamente todos los campos requeridos del schema\r\n const requiredFields = Object.keys(\r\n ENVIRONMENT_SCHEMA\r\n ) as (keyof EnvironmentConfig)[];\r\n\r\n const missingFields: string[] = [];\r\n const emptyFields: string[] = [];\r\n const wrongTypeFields: string[] = [];\r\n\r\n // Validar que todos los campos requeridos existan, no estén vacíos y tengan el tipo correcto\r\n requiredFields.forEach((field) => {\r\n const expectedType = ENVIRONMENT_SCHEMA[field];\r\n\r\n if (!(field in environment)) {\r\n missingFields.push(field);\r\n } else if (\r\n environment[field] === null ||\r\n environment[field] === undefined\r\n ) {\r\n emptyFields.push(field);\r\n } else {\r\n // Validar tipo de dato\r\n const actualType = typeof environment[field];\r\n if (actualType !== expectedType) {\r\n wrongTypeFields.push(\r\n `${field} (esperado: ${expectedType}, recibido: ${actualType})`\r\n );\r\n }\r\n\r\n // Validar que strings no estén vacíos\r\n if (\r\n expectedType === 'string' &&\r\n typeof environment[field] === 'string' &&\r\n (environment[field] as string).trim() === ''\r\n ) {\r\n emptyFields.push(field);\r\n }\r\n }\r\n });\r\n\r\n // Reportar campos faltantes\r\n if (missingFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Faltan los siguientes campos en la configuración del entorno: ${missingFields.join(\r\n ', '\r\n )}. ` + 'Por favor, verifica tu configuración de environment.'\r\n );\r\n }\r\n\r\n // Reportar campos vacíos\r\n if (emptyFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Los siguientes campos están vacíos en la configuración del entorno: ${emptyFields.join(\r\n ', '\r\n )}. ` + 'Por favor, proporciona valores válidos para estos campos.'\r\n );\r\n }\r\n\r\n // Reportar campos con tipo incorrecto\r\n if (wrongTypeFields.length > 0) {\r\n throw new Error(\r\n `[ENVIRONMENT] Los siguientes campos tienen un tipo de dato incorrecto: ${wrongTypeFields.join(\r\n ', '\r\n )}. ` + 'Por favor, corrige los tipos de datos.'\r\n );\r\n }\r\n\r\n // Validar formato de URLs (solo para campos que contengan 'url' en su nombre)\r\n requiredFields.forEach((field) => {\r\n if (\r\n field.toLowerCase().includes('url') &&\r\n typeof environment[field] === 'string'\r\n ) {\r\n validateUrl(field as string, environment[field] as string);\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Valida que una URL tenga un formato válido.\r\n *\r\n * @param fieldName - Nombre del campo para mensajes de error\r\n * @param url - URL a validar\r\n * @throws Error si la URL no tiene un formato válido\r\n */\r\nfunction validateUrl(fieldName: string, url: string): void {\r\n try {\r\n // Intentar crear un objeto URL para validar el formato\r\n new URL(url);\r\n } catch {\r\n // Si falla, verificar si al menos tiene un formato básico válido\r\n const urlPattern = /^https?:\\/\\/.+/;\r\n if (!urlPattern.test(url)) {\r\n throw new Error(\r\n `[ENVIRONMENT] El campo '${fieldName}' no tiene un formato de URL válido. ` +\r\n `Valor actual: '${url}'. Debe comenzar con http:// o https://`\r\n );\r\n }\r\n }\r\n\r\n // Validar que la URL termine con '/' para evitar problemas de concatenación\r\n if (!url.endsWith('/')) {\r\n console.warn(\r\n `[ENVIRONMENT] Advertencia: El campo '${fieldName}' no termina con '/'. ` +\r\n `Valor actual: '${url}'. Se recomienda que las URLs base terminen con '/' para evitar problemas de concatenación.`\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Proporciona una configuración de entorno validada para la inyección de dependencias.\r\n *\r\n * Esta función crea un provider que valida automáticamente la configuración del entorno\r\n * cuando la aplicación se inicializa. Si la configuración es inválida, lanza un error\r\n * descriptivo que indica qué está mal configurado.\r\n *\r\n * @param environment - Configuración del entorno a proporcionar\r\n * @returns Provider de Angular configurado con la validación integrada\r\n *\r\n * @example\r\n * ```typescript\r\n * // En app.config.ts o main.ts\r\n * import { provideEnvironment } from './path/to/environment.token';\r\n * import { environment } from './environments/environment';\r\n *\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideEnvironment(environment),\r\n * // ... otros providers\r\n * ]\r\n * };\r\n * ```\r\n *\r\n * @example\r\n * ```typescript\r\n * // Para módulos (NgModule)\r\n * import { provideEnvironment } from './path/to/environment.token';\r\n * import { environment } from './environments/environment';\r\n *\r\n * @NgModule({\r\n * providers: [\r\n * provideEnvironment(environment),\r\n * // ... otros providers\r\n * ]\r\n * })\r\n * export class AppModule { }\r\n * ```\r\n */\r\nexport function provideEnvironment(environment: EnvironmentConfig): Provider {\r\n return {\r\n provide: ENVIRONMENT,\r\n useFactory: () => {\r\n // Validar la configuración al momento de la inyección\r\n validateEnvironmentConfig(environment);\r\n return environment;\r\n },\r\n };\r\n}\r\n","import { Component, inject, Input, signal } from '@angular/core';\r\nimport { FormGroup } from '@angular/forms';\r\nimport { JsonHighlightPipe } from '../../pipe/json-highlight.pipe';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../../injections/environment.token';\r\n\r\n@Component({\r\n selector: 'app-json-values-debuj',\r\n imports: [JsonHighlightPipe],\r\n templateUrl: './json-values-debuj.component.html',\r\n styleUrl: './json-values-debuj.component.css',\r\n})\r\nexport class JsonValuesDebujComponent {\r\n @Input() form!: FormGroup;\r\n // Inyecta la configuración del entorno usando el token ENVIRONMENT\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n // Señal reactiva para indicar si estamos en modo de desarrollo\r\n private readonly isDevSignal = signal<boolean>(!this.environment.production);\r\n\r\n // Método para verificar el estado de desarrollo\r\n isDev(): boolean {\r\n return this.isDevSignal();\r\n }\r\n}\r\n","@if(isDev()){\r\n<div class=\"custom-container\">\r\n <pre\r\n class=\"custom-pre\"\r\n [innerHTML]=\"form.getRawValue() | jsonHighlight\"\r\n ></pre>\r\n</div>\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SpinnerLoadingService {\r\n // Creamos una señal para el estado de visibilidad\r\n spinnerVisible = signal(false);\r\n\r\n constructor() {}\r\n\r\n // Método para mostrar el spinner\r\n show() {\r\n this.spinnerVisible.set(true);\r\n }\r\n\r\n // Método para ocultar el spinner\r\n hide() {\r\n this.spinnerVisible.set(false);\r\n }\r\n}\r\n","import { Component, effect, inject, input } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\nimport { AnimationOptions, LottieComponent } from 'ngx-lottie';\r\n\r\n@Component({\r\n selector: 'app-loading-lottie',\r\n imports: [LottieComponent],\r\n templateUrl: './loading-lottie.component.html',\r\n styleUrl: './loading-lottie.component.css',\r\n})\r\nexport class LoadingLottieComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n jsonUrl = input<string>('Loader_Liquid4');\r\n size = input<string>('250px');\r\n options: AnimationOptions = { path: '' };\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n effect(() => {\r\n this.options = {\r\n path: `jsonlottie/${this.jsonUrl() + '.json'}`,\r\n };\r\n });\r\n }\r\n}\r\n","@if(_spinnerService.spinnerVisible()){\r\n<div class=\"loader-container\">\r\n <ng-lottie [options]=\"options\" [width]=\"size()\" [height]=\"size()\"></ng-lottie>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { Component, inject } from '@angular/core';\r\nimport { SpinnerLoadingService } from '../../services/spinner-loading.service';\r\n\r\n@Component({\r\n selector: 'app-loading',\r\n imports: [],\r\n templateUrl: './loading.component.html',\r\n styleUrl: './loading.component.css',\r\n})\r\nexport class LoadingComponent {\r\n // Accedemos directamente a la señal del servicio\r\n _spinnerService = inject(SpinnerLoadingService);\r\n currentYear: number;\r\n\r\n constructor() {\r\n this.currentYear = new Date().getFullYear(); // Asigna el año actual\r\n }\r\n}\r\n","<!-- Actualización 2025-31-01 12:00 -->\r\n@if(_spinnerService.spinnerVisible()){\r\n<div class=\"spinner-overlay\">\r\n <div class=\"loader\">\r\n <div class=\"external-shadow\">\r\n <div class=\"central\"></div>\r\n </div>\r\n <img src=\"/icon/secure.png\" class=\"spinner-image\" />\r\n </div>\r\n <p class=\"loading-text\">©DevsoftXela {{ currentYear }}</p>\r\n</div>\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport { ToastrService } from 'ngx-toastr';\r\nimport Swal, {\r\n SweetAlertIcon,\r\n SweetAlertOptions,\r\n SweetAlertResult,\r\n SweetAlertTheme,\r\n} from 'sweetalert2';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n/**\r\n * Opciones configurables para personalizar el comportamiento y apariencia de las alertas visuales.\r\n *\r\n * Permite definir iconos, imágenes, botones, temporizadores y temas para las alertas SweetAlert2.\r\n *\r\n * @property icono - Nombre del archivo de imagen ubicado en 'assets/dsxResource/'. Ejemplo: 'success-icon.png'. Por defecto: 'icon/check02.png'.\r\n * @property icon - Tipo de icono SweetAlert2 ('success' | 'error' | 'warning' | 'info' | 'question'). Opcional.\r\n * @property showConfirmButton - Si es true, muestra el botón de confirmación y desactiva el cierre automático. Por defecto: false.\r\n * @property confirmButtonText - Texto personalizado para el botón de confirmación. Por defecto: 'Ok'.\r\n * @property timer - Tiempo en milisegundos para el cierre automático de la alerta. Ignorado si showConfirmButton es true. Por defecto: 2000.\r\n * @property imageWidth - Ancho en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property imageHeight - Alto en píxeles de la imagen personalizada. Por defecto: 125.\r\n * @property showImage - Si es true, muestra la imagen personalizada; si es false, solo el icono SweetAlert2. Por defecto: true.\r\n * @property theme - Tema visual de SweetAlert2 (por ejemplo, 'dark', 'minimal', etc). Opcional.\r\n *\r\n * @example\r\n * // Alerta con icono personalizado y cierre automático\r\n * const options: AlertOptions = {\r\n * icono: 'custom-icon.png',\r\n * icon: 'warning',\r\n * timer: 3000\r\n * };\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón y sin imagen\r\n * const confirmOptions: AlertOptions = {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Aceptar',\r\n * showImage: false\r\n * };\r\n */\r\ninterface AlertOptions {\r\n icono?: string;\r\n icon?: SweetAlertIcon;\r\n showConfirmButton?: boolean;\r\n confirmButtonText?: string;\r\n timer?: number;\r\n imageWidth?: number;\r\n imageHeight?: number;\r\n showImage?: boolean;\r\n theme?: SweetAlertTheme;\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AlertaService {\r\n private toastrService = inject(ToastrService);\r\n\r\n /**\r\n * Tema visual por defecto para todas las alertas SweetAlert2.\r\n * Puedes cambiarlo desde tu app llamando a setDefaultTheme().\r\n */\r\n private defaultTheme: SweetAlertTheme | undefined = undefined;\r\n\r\n /**\r\n * Permite establecer el theme global para todas las alertas SweetAlert2.\r\n * @param theme - Valor de theme válido para SweetAlert2 (por ejemplo: 'dark', 'minimal', etc).\r\n */\r\n setDefaultTheme(theme: SweetAlertTheme) {\r\n this.defaultTheme = theme;\r\n }\r\n\r\n /**\r\n * @param {number} toastrType - 1. Success 2. Info 3. Warning 4. Error\r\n * @param {string} toastrTitle - Titulo de la alerta\r\n * @param {string} toastrMessage - Mensaje de la alerta\r\n * @param {number} toastrAlign - Alineación de la alerta, por defecto 1. OPCIONES: 0. top-left 1. top-center 2. top-right 3. bottom-left 4. bottom-center 5. bottom-right\r\n * @param {number} toastrTimer - Tiempo de la alerta default 3000\r\n * @returns - Retonar una alerta toastr\r\n * */\r\n\r\n toastrAlerts(\r\n toastrType: number,\r\n toastrTitle: string,\r\n toastrMessage: string,\r\n toastrAlign: number = 1,\r\n toastrTimer: number = 3000\r\n ) {\r\n const alignMessage = [\r\n { id: 0, align: 'toast-top-left' },\r\n { id: 1, align: 'toast-top-center' },\r\n { id: 2, align: 'toast-top-right' },\r\n { id: 3, align: 'toast-bottom-left' },\r\n { id: 4, align: 'toast-bottom-center' },\r\n { id: 5, align: 'toast-bottom-right' },\r\n ];\r\n\r\n const valueAlign: string | undefined = alignMessage.find(\r\n (c) => c.id == toastrAlign\r\n )?.align;\r\n\r\n const toastrMethods: {\r\n [key: number]: (message: string, title?: string, options?: any) => void;\r\n } = {\r\n 1: this.toastrService.success.bind(this.toastrService),\r\n 2: this.toastrService.info.bind(this.toastrService),\r\n 3: this.toastrService.warning.bind(this.toastrService),\r\n 4: this.toastrService.error.bind(this.toastrService),\r\n };\r\n\r\n const showToast = toastrMethods[toastrType];\r\n\r\n if (showToast) {\r\n showToast(toastrMessage, toastrTitle, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: valueAlign,\r\n timeOut: toastrTimer,\r\n });\r\n }\r\n }\r\n\r\n private preloadImage(icono: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const img = new Image();\r\n img.src = `/${icono}`;\r\n img.onload = () => resolve();\r\n img.onerror = (err) => reject(err);\r\n });\r\n }\r\n\r\n alertConfirm(title: string, text: string, icono: string): Promise<boolean> {\r\n return this.preloadImage(icono).then(() =>\r\n Swal.fire({\r\n title: title,\r\n html: text,\r\n //theme: 'borderless',\r\n footer: '<strong>DevSoftXela</strong> 2025',\r\n imageUrl: `/${icono}`,\r\n imageWidth: 150,\r\n imageHeight: 150,\r\n imageAlt: 'icon',\r\n showCloseButton: true,\r\n showCancelButton: true,\r\n confirmButtonColor: '#3085d6',\r\n cancelButtonColor: '#d33',\r\n confirmButtonText: `<i class=\"fa fa-thumbs-up\"></i> Aceptar!`,\r\n cancelButtonText: `<i class=\"fa fa-thumbs-down\"></i> Cancelar`,\r\n }).then((result) => result.isConfirmed)\r\n );\r\n }\r\n\r\n alertaHtml(\r\n titleAlert: string,\r\n message: string,\r\n icono: string = 'icon/notFound01.png',\r\n timer: number = 3500\r\n ): Promise<void> {\r\n return this.preloadImage(icono).then(() => {\r\n Swal.fire({\r\n title: titleAlert,\r\n imageUrl: `/${icono}`,\r\n imageWidth: 145,\r\n imageHeight: 125,\r\n imageAlt: 'error 404',\r\n html: `\r\n <strong>ALERTA: </strong><i>${message}</i> <span> comuniquese con el administrador. </span>\r\n `,\r\n showConfirmButton: false,\r\n timerProgressBar: true,\r\n timer: timer,\r\n });\r\n return;\r\n });\r\n }\r\n\r\n /**\r\n * Muestra una alerta visual personalizada usando SweetAlert2.\r\n *\r\n * Permite configurar el mensaje, el título, el icono, la imagen, el botón de confirmación,\r\n * el temporizador y el tema visual, entre otras opciones.\r\n *\r\n * @param titleAlert - Título principal de la alerta (obligatorio).\r\n * @param messageHtml - Mensaje en formato HTML (obligatorio).\r\n * @param options - Opciones configurables de la alerta (opcional). Permite personalizar icono, imagen, botón, temporizador, etc.\r\n * @returns Promise<SweetAlertResult> que se resuelve cuando el usuario interactúa con la alerta o cuando se cierra automáticamente.\r\n *\r\n * @example\r\n * // Alerta básica con icono de éxito y cierre automático\r\n * alertaHtmlSuccess('Operación exitosa', 'Los datos se guardaron correctamente');\r\n *\r\n * @example\r\n * // Alerta de error con imagen personalizada y temporizador\r\n * alertaHtmlSuccess('Error crítico', 'No se pudo conectar al servidor', {\r\n * icono: 'error-icon.png',\r\n * icon: 'error',\r\n * timer: 5000\r\n * });\r\n *\r\n * @example\r\n * // Alerta de confirmación con botón personalizado y sin imagen\r\n * alertaHtmlSuccess('Confirmar acción', '¿Está seguro de eliminar este registro?', {\r\n * showConfirmButton: true,\r\n * confirmButtonText: 'Sí, eliminar',\r\n * icon: 'warning',\r\n * showImage: false\r\n * }).then((result) => {\r\n * if (result.isConfirmed) {\r\n * // Lógica cuando el usuario confirma\r\n * }\r\n * });\r\n */\r\n alertaHtmlSuccess(\r\n titleAlert: string,\r\n messageHtml: string,\r\n options: AlertOptions = {}\r\n ): Promise<SweetAlertResult> {\r\n const {\r\n icono = 'icon/check02.png',\r\n icon,\r\n showConfirmButton = false,\r\n confirmButtonText = 'Ok',\r\n timer = 2000,\r\n imageWidth = 125,\r\n imageHeight = 125,\r\n showImage = true,\r\n theme, // Puede venir por options o usar el global\r\n } = options;\r\n\r\n // Usa el theme global si no se especifica uno en options\r\n const alertTheme = theme !== undefined ? theme : this.defaultTheme;\r\n\r\n // Configuración base de SweetAlert\r\n const alertConfig: SweetAlertOptions = {\r\n title: titleAlert,\r\n html: messageHtml,\r\n draggable: true,\r\n showConfirmButton,\r\n confirmButtonText,\r\n timer: showConfirmButton ? undefined : timer, // Timer solo si no hay botón\r\n timerProgressBar: !showConfirmButton && timer > 0,\r\n imageUrl: showImage && icono ? `/${icono}` : undefined,\r\n imageWidth: showImage ? imageWidth : undefined,\r\n imageHeight: showImage ? imageHeight : undefined,\r\n imageAlt: showImage ? 'image alert' : undefined,\r\n // Aplica el theme global o el específico\r\n ...(alertTheme !== undefined && { theme: alertTheme }),\r\n };\r\n // Solo agrega el icono si está definido\r\n if (icon !== undefined) {\r\n alertConfig.icon = icon;\r\n }\r\n\r\n // Precargar imagen solo si es necesario\r\n if (showImage && icono) {\r\n return this.preloadImage(icono).then(() => Swal.fire(alertConfig));\r\n }\r\n\r\n return Swal.fire(alertConfig);\r\n }\r\n\r\n // private configureTimer(\r\n // config: SweetAlertOptions,\r\n // showConfirmButton: boolean,\r\n // timer: number\r\n // ) {\r\n // if (!showConfirmButton && timer > 0) {\r\n // config.timer = timer;\r\n // config.timerProgressBar = true;\r\n // }\r\n // }\r\n\r\n // No se puede utilizar por conflicto con primeng\r\n // notyfAlert(message: string) {\r\n // this.notyf.success({\r\n // message: message,\r\n // duration: 1500,\r\n // position: {\r\n // x: 'center',\r\n // y: 'top',\r\n // },\r\n // });\r\n // }\r\n\r\n toastrHttpResponse(response: ResponseHttpModel) {\r\n const time = 3000;\r\n const align = 'toast-top-center';\r\n if (response.isSuccess) {\r\n this.toastrService.success(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n } else {\r\n this.toastrService.error(response.statusMessage, response.title, {\r\n enableHtml: true,\r\n closeButton: true,\r\n progressBar: true,\r\n positionClass: align,\r\n timeOut: time,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Muestra un mensaje tipo toast usando PrimeNG MessageService.\r\n *\r\n * @param severity - Tipo de severidad del mensaje. Valores posibles:\r\n * 'success' | 'info' | 'warn' | 'error' | 'contrast' | 'secondary'.\r\n * Por defecto: 'success'.\r\n * @param title - Título del mensaje (aparece como summary).\r\n * @param message - Detalle del mensaje (aparece como detail).\r\n * @param time - Duración en milisegundos que el mensaje estará visible. Por defecto: 1500 ms.\r\n *\r\n * @example\r\n * // Mensaje de éxito\r\n * alertaService.showPrimeMessage('success', 'Operación exitosa', 'El registro fue guardado correctamente');\r\n *\r\n * @example\r\n * // Mensaje de advertencia personalizado\r\n * alertaService.showPrimeMessage('warn', 'Advertencia', 'Faltan campos obligatorios', 3000);\r\n */\r\n // showPrimeMessage(\r\n // title: string,\r\n // message: string,\r\n // severity:\r\n // | 'success'\r\n // | 'info'\r\n // | 'warn'\r\n // | 'error'\r\n // | 'contrast'\r\n // | 'secondary' = 'success',\r\n // time: number = 1500\r\n // ) {\r\n // this.primeMessageService.add({\r\n // severity: severity,\r\n // summary: title,\r\n // detail: message,\r\n // life: time,\r\n // });\r\n // }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\nimport { MyParameterValues } from '../models/src/parameterSecurity.model';\r\n\r\nexport const INITIAL_PARAMETERS = new InjectionToken<MyParameterValues[]>(\r\n 'InitialParameters'\r\n);\r\n","import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ServiceResult } from '../models';\r\nimport { SeguridadITParameter } from '../models/src/parameterSecurity.model';\r\nimport { DataToken } from '../models/src/token.model';\r\n\r\n/**\r\n * Servicio de seguridad que gestiona la autenticación y autorización mediante tokens JWT.\r\n *\r\n * Este servicio proporciona métodos para:\r\n * - Refrescar tokens de acceso\r\n * - Revocar tokens de refresco\r\n * - Obtener parámetros de seguridad\r\n *\r\n * @example\r\n * ```typescript\r\n * constructor(private securityService: SecurityService) {}\r\n *\r\n * refreshToken() {\r\n * this.securityService.tokenRefresh(this.refreshToken)\r\n * .subscribe(data => console.log(data));\r\n * }\r\n * ```\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class SecurityService {\r\n /** Servicio HttpClient para realizar peticiones HTTP */\r\n private http = inject(HttpClient);\r\n\r\n /**\r\n * Configuración del entorno inyectada mediante el token ENVIRONMENT.\r\n * La validación se realiza automáticamente al usar provideEnvironment().\r\n */\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n /** URL base de la API JWT construida desde la configuración del entorno */\r\n private urlApi: string = `${this.environment.myAppUrl}api/parameter`;\r\n private SeguridadITApi: string = `${this.environment.SeguridadITApiUrl}api/jwt`;\r\n\r\n /**\r\n * Obtiene un nuevo token de acceso utilizando un refresh token válido.\r\n *\r\n * Este método envía una solicitud POST al endpoint de refresco de token\r\n * y devuelve un nuevo par de tokens (access token y refresh token).\r\n *\r\n * @param refreshToken - El refresh token válido para obtener un nuevo token de acceso\r\n * @returns Observable que emite un objeto DataToken con el nuevo par de tokens\r\n *\r\n * @example\r\n * ```typescript\r\n * this.securityService.tokenRefresh('your-refresh-token')\r\n * .subscribe({\r\n * next: (data) => console.log('Nuevo token:', data.accessToken),\r\n * error: (err) => console.error('Error al refrescar token:', err)\r\n * });\r\n * ```\r\n */\r\n tokenRefresh(refreshToken: string): Observable<ServiceResult<DataToken>> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n\r\n // Realiza una solicitud POST al endpoint de refresco de token\r\n return this.http.post<ServiceResult<DataToken>>(\r\n `${this.SeguridadITApi}/refresh-token/`,\r\n body,\r\n {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Revoca un refresh token para invalidarlo y prevenir su uso futuro.\r\n *\r\n * Este método envía una solicitud POST al endpoint de revocación de token\r\n * para invalidar permanentemente el refresh token proporcionado.\r\n *\r\n * @param refreshToken - El refresh token que se desea revocar\r\n * @returns Observable que emite true si la revocación fue exitosa, false en caso contrario\r\n *\r\n * @example\r\n * ```typescript\r\n * this.securityService.tokenRevok('your-refresh-token')\r\n * .subscribe({\r\n * next: (success) => {\r\n * if (success) console.log('Token revocado exitosamente');\r\n * },\r\n * error: (err) => console.error('Error al revocar token:', err)\r\n * });\r\n * ```\r\n */\r\n tokenRevok(refreshToken: string): Observable<boolean> {\r\n // Crea el cuerpo de la solicitud con el refresh token\r\n const body = { refreshToken };\r\n // Realiza una solicitud POST al endpoint de revocación de token\r\n return this.http.post<boolean>(\r\n `${this.SeguridadITApi}/revoke-token/`,\r\n body,\r\n {\r\n headers: new HttpHeaders({\r\n 'Content-Type': 'application/json', // Establece el tipo de contenido como JSON\r\n }),\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene los parámetros de seguridad de la aplicación desde el servidor.\r\n *\r\n * Este método recupera la configuración de seguridad que incluye políticas de contraseñas,\r\n * tiempos de expiración de sesión, y otras configuraciones relacionadas con la seguridad.\r\n *\r\n * @param invalidCacheParam - Indica si se debe invalidar la caché del servidor.\r\n * Si es true, fuerza al servidor a devolver los datos más recientes\r\n * sin usar la caché. Por defecto es false.\r\n * @returns Observable que emite un objeto SeguridadITParameter con la configuración de seguridad\r\n *\r\n * @example\r\n * ```typescript\r\n * // Obtener parámetros usando caché\r\n * this.securityService.getParameterSecurity()\r\n * .subscribe(params => console.log('Parámetros:', params));\r\n *\r\n * // Obtener parámetros sin usar caché\r\n * this.securityService.getParameterSecurity(true)\r\n * .subscribe(params => console.log('Parámetros actualizados:', params));\r\n * ```\r\n */\r\n getParameterSecurity(\r\n invalidCacheParam: boolean = false\r\n ): Observable<ServiceResult<SeguridadITParameter>> {\r\n // Crea los parámetros de la solicitud, incluyendo el parámetro invalidCacheParam,\r\n // parametro diseñado para invalidar la caché a traves del filtro\r\n const params = new HttpParams().set(\r\n 'invalidCacheParam',\r\n invalidCacheParam.toString()\r\n );\r\n\r\n // Realiza una solicitud GET al endpoint de parámetros de seguridad\r\n return this.http.get<ServiceResult<SeguridadITParameter>>(\r\n `${this.urlApi}/security-parameter/`,\r\n { params }\r\n );\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport {\r\n catchError,\r\n delay,\r\n map,\r\n Observable,\r\n of,\r\n retry,\r\n throwError,\r\n} from 'rxjs';\r\nimport { INITIAL_PARAMETERS } from '../injections/parameterSecurity';\r\nimport {\r\n MyParameterValues,\r\n ParameterSecurity,\r\n} from '../models/src/parameterSecurity.model';\r\nimport { SecurityService } from './security.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n/**\r\n * Servicio para gestionar los parámetros de seguridad de la aplicación.\r\n * Permite cargar los parámetros desde la API, mantenerlos en memoria, acceder y comparar valores de forma segura.\r\n * Utiliza tipado genérico para los nombres de parámetros y cache interno para optimizar consultas repetidas.\r\n *\r\n * @template T Tipo de los nombres de parámetros permitidos (usualmente un union type de string)\r\n */\r\nexport class ParameterValuesService<T extends string = string> {\r\n /**\r\n * Parámetros iniciales inyectados mediante INITIAL_PARAMETERS.\r\n * Se usan para validar y mapear los parámetros recibidos de la API.\r\n */\r\n private initialParameters = inject(INITIAL_PARAMETERS);\r\n\r\n /**\r\n * Cache interno para optimizar la comparación de valores de parámetros.\r\n * La clave es una combinación de nombre e índice, el valor es el resultado de la consulta.\r\n */\r\n private parameterCache = new Map<string, any>();\r\n\r\n private alertedParams = new Set<string>();\r\n private alertedParamsIsParameterValue = new Set<string>();\r\n\r\n /**\r\n * Servicio que contiene el método getParameterSecurity() para obtener los parámetros desde la API.\r\n */\r\n private apiService = inject(SecurityService);\r\n\r\n /**\r\n * Señal reactiva que contiene los parámetros cargados y permite actualizaciones automáticas.\r\n */\r\n private _dataParameter = signal<MyParameterValues<T>[]>(\r\n this.initializeData()\r\n );\r\n\r\n /**\r\n * Flag que indica si ya se cargaron los parámetros desde la API.\r\n */\r\n private _loaded = signal(false);\r\n get loaded() {\r\n return this._loaded();\r\n }\r\n\r\n /**\r\n * Inicializa los datos de parámetros usando los valores inyectados.\r\n * @returns Array de parámetros iniciales tipados\r\n */\r\n private initializeData(): MyParameterValues<T>[] {\r\n return this.initialParameters.map((param) =>\r\n this.createMyParameterValue(param.parameterName as T, param.values)\r\n );\r\n }\r\n\r\n /**\r\n * Crea una instancia de MyParameterValues tipada y segura.\r\n * @param parameterName Nombre del parámetro\r\n * @param values Valores asociados al parámetro\r\n * @returns Objeto MyParameterValues\r\n */\r\n private createMyParameterValue(\r\n parameterName: T,\r\n values: any[]\r\n ): MyParameterValues<T> {\r\n return {\r\n parameterName,\r\n values: [...values],\r\n };\r\n }\r\n\r\n /**\r\n * Devuelve los parámetros actuales como un array de solo lectura.\r\n */\r\n get dataParameter(): Readonly<MyParameterValues<T>[]> {\r\n return this._dataParameter();\r\n }\r\n\r\n /**\r\n * Setter privado para actualizar los parámetros.\r\n * Solo puede ser usado dentro del servicio para mantener la integridad de los datos.\r\n * @param values Array de parámetros a almacenar\r\n */\r\n private setDataParameter(values: MyParameterValues<T>[]): void {\r\n if (!Array.isArray(values)) {\r\n console.error('Error: valores inválidos para dataParameter');\r\n return;\r\n }\r\n this._dataParameter.set(values);\r\n }\r\n\r\n /**\r\n * Carga los parámetros desde la API.\r\n * Si ya se cargaron y force=false, devuelve la copia en memoria.\r\n * @param force Indica si se debe forzar la recarga desde la API (default: false)\r\n * @returns Observable que emite los parámetros cargados como MyParameterValues[]\r\n */\r\n loadParameters(force = false): Observable<MyParameterValues<T>[]> {\r\n if (this._loaded() && !force) {\r\n return of([...this.dataParameter]); // copia mutable\r\n }\r\n\r\n return this.apiService.getParameterSecurity(force).pipe(\r\n map((response) => {\r\n const apiParameters = response.data?.parameterSecurity ?? [];\r\n this.validateParameters(apiParameters);\r\n const values = this.mapToMyParameterValues(apiParameters);\r\n this.setDataParameter(values);\r\n this._loaded.set(true);\r\n return values;\r\n }),\r\n // 👇 fallback si falla la llamada pero ya teníamos data\r\n catchError((error) => {\r\n if (this._loaded() && this.dataParameter.length > 0) {\r\n return of([...this.dataParameter]);\r\n }\r\n this._loaded.set(false);\r\n return throwError(() => error);\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Fuerza la recarga de los parámetros desde la API.\r\n * @returns Observable que emite los parámetros actualizados\r\n */\r\n refreshParameters(): Observable<MyParameterValues<T>[]> {\r\n return this.loadParameters(true);\r\n }\r\n\r\n /**\r\n * Crea una copia segura y mutable de los parámetros actuales.\r\n * @returns Array de parámetros\r\n */\r\n private createSafeCopy(): MyParameterValues<T>[] {\r\n return this.dataParameter.map((item) =>\r\n this.createMyParameterValue(item.parameterName, [...item.values])\r\n );\r\n }\r\n\r\n /**\r\n * Mapea los parámetros recibidos de la API a objetos tipados y seguros.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n * @returns Array de MyParameterValues\r\n */\r\n private mapToMyParameterValues(\r\n apiParameters: ParameterSecurity[]\r\n ): MyParameterValues<T>[] {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n\r\n return apiParameters\r\n .filter((param) => initialNames.includes(param.parameterName))\r\n .map((param) => {\r\n // Función de conversión type-safe\r\n return this.convertToTypedParameter(param);\r\n })\r\n .filter((param): param is MyParameterValues<T> => param !== null);\r\n }\r\n\r\n /**\r\n * Convierte un parámetro de la API a un objeto tipado, validando el nombre.\r\n * @param param Parámetro recibido de la API\r\n * @returns Objeto MyParameterValues o null si no es válido\r\n */\r\n private convertToTypedParameter(\r\n param: ParameterSecurity\r\n ): MyParameterValues<T> | null {\r\n const initialParam = this.initialParameters.find(\r\n (p) => p.parameterName === param.parameterName\r\n );\r\n\r\n if (!initialParam) {\r\n return null;\r\n }\r\n\r\n // Conversión segura con verificación\r\n if (this.isValidParameterName(param.parameterName)) {\r\n return this.createMyParameterValue(\r\n param.parameterName as T,\r\n param.parameterValues?.map((v) => v.value) ?? []\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Verifica si un nombre de parámetro es válido según los parámetros iniciales.\r\n * @param name Nombre a validar\r\n * @returns true si es válido\r\n */\r\n private isValidParameterName(name: string): name is T {\r\n // Verifica que el nombre esté en los parámetros iniciales\r\n return this.initialParameters.some((param) => param.parameterName === name);\r\n }\r\n\r\n /**\r\n * Valida que los parámetros devueltos por la API coincidan con los iniciales.\r\n * Muestra errores o advertencias en consola si existen diferencias.\r\n * @param apiParameters Parámetros recibidos desde la API\r\n */\r\n private validateParameters(apiParameters: ParameterSecurity[]): void {\r\n const initialNames = this.initialParameters.map((p) => p.parameterName);\r\n const apiNames = apiParameters.map((p) => p.parameterName);\r\n\r\n const missing = initialNames.filter((name) => !apiNames.includes(name));\r\n const extra = apiNames.filter((name) => !initialNames.includes(name));\r\n\r\n if (missing.length) {\r\n console.warn(`Faltan en API: ${missing.join(', ')}`);\r\n const ok = confirm(`Faltan en API: ${missing.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (extra.length) {\r\n console.warn(`Extra en API: ${extra.join(', ')}`);\r\n const ok = confirm(`Extra en API: ${extra.join(', ')}. ¿Continuar?`);\r\n if (!ok) return;\r\n }\r\n if (initialNames.length !== apiNames.length) {\r\n console.warn(\r\n `Cantidad distinta: iniciales=${initialNames.length}, api=${apiNames.length}`\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene un valor específico de un parámetro.\r\n * Devuelve `defaultValue` si no existe el parámetro o el índice es inválido.\r\n * Valida que el parámetro exista antes de acceder a su valor.\r\n * @param parameterName Nombre del parámetro\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @param defaultValue Valor por defecto si no existe (default: null)\r\n * @returns Valor del parámetro o defaultValue si no existe o el índice es inválido\r\n */\r\n getValue<U = any>(\r\n parameterName: T,\r\n index = 0,\r\n defaultValue: U | null = null\r\n ): U {\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParams.has(parameterName)) {\r\n alert(`Advertencia: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParams.add(parameterName);\r\n }\r\n return defaultValue as U;\r\n }\r\n\r\n if (index < 0 || index >= param.values.length) {\r\n alert(\r\n `Advertencia: Índice ${index} fuera de rango para el parámetro '${parameterName}'.`\r\n );\r\n return defaultValue as U;\r\n }\r\n\r\n return param.values[index] as U;\r\n }\r\n\r\n /**\r\n * Compara un valor específico con un valor esperado, usando cache para optimizar llamadas repetidas.\r\n * @param parameterName Nombre del parámetro\r\n * @param expectedValue Valor esperado\r\n * @param index Índice del valor dentro del array (default: 0)\r\n * @returns true si coincide, false en caso contrario\r\n */\r\n isParameterValue<U = any>(\r\n parameterName: T,\r\n expectedValue: U,\r\n index = 0\r\n ): boolean {\r\n const cacheKey = `${String(parameterName)}_${index}`;\r\n\r\n const param = this.dataParameter.find(\r\n (p) => p.parameterName === parameterName\r\n );\r\n\r\n if (!param) {\r\n if (!this.alertedParamsIsParameterValue.has(parameterName)) {\r\n alert(`Error: El parámetro '${parameterName}' no existe.`);\r\n this.alertedParamsIsParameterValue.add(parameterName);\r\n }\r\n return false;\r\n }\r\n\r\n if (!this.parameterCache.has(cacheKey)) {\r\n const value = this.getValue<U>(parameterName, index);\r\n this.parameterCache.set(cacheKey, value);\r\n }\r\n\r\n return this.parameterCache.get(cacheKey) === expectedValue;\r\n }\r\n\r\n /**\r\n * Limpia el cache interno de comparaciones de parámetros.\r\n */\r\n clearParameterCache(): void {\r\n this.parameterCache.clear();\r\n }\r\n\r\n /**\r\n * Verifica si un parámetro tiene al menos un valor.\r\n * @param parameterName Nombre del parámetro\r\n * @returns true si tiene al menos un valor, false si no tiene\r\n */\r\n hasAnyValue(parameterName: T): boolean {\r\n return this.getAllValues(parameterName).length > 0;\r\n }\r\n\r\n /**\r\n * Devuelve todos los valores de un parámetro.\r\n * @param parameterName Nombre del parámetro\r\n * @returns Array de valores\r\n */\r\n getAllValues<U = any>(parameterName: T): U[] {\r\n return (this.dataParameter.find((p) => p.parameterName === parameterName)\r\n ?.values ?? []) as U[];\r\n }\r\n}\r\n","import { Component, inject, input, OnInit } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { AlertaService } from '../../services/alerta.service';\r\nimport { ParameterValuesService } from '../../services/parameter-values.service';\r\n\r\n@Component({\r\n selector: 'app-navbar-dsx',\r\n imports: [MenubarModule, ImageModule, ButtonModule, FormsModule],\r\n templateUrl: './navbar-dsx.component.html',\r\n styleUrl: './navbar-dsx.component.css',\r\n})\r\nexport class NavbarDsxComponent implements OnInit {\r\n //private _securityService = inject(SecurityService);\r\n private _parameterSecurityService = inject(ParameterValuesService);\r\n private _alertaService = inject(AlertaService);\r\n logoWidth = input<string>('300');\r\n appVersion = input<string>('V1.0.0');\r\n urlLogo = input<string>('assets/image/logoApp.png');\r\n // Estado del interruptor (tema claro/oscuro)\r\n checked: boolean = false;\r\n\r\n ngOnInit(): void {\r\n // Inicializa el tema al cargar el componente\r\n this.initializeTheme();\r\n //throw new Error('Method not implemented.');\r\n }\r\n\r\n // Inicializa el tema y el estado del interruptor\r\n initializeTheme(): void {\r\n const savedTheme = localStorage.getItem('theme') || 'light'; // Obtén el tema guardado o usa 'light' por defecto\r\n this.checked = savedTheme === 'dark'; // Actualiza el estado del interruptor\r\n this.applyTheme(savedTheme); // Aplica el tema\r\n }\r\n\r\n // Cambia el tema y actualiza el estado del interruptor\r\n onThemeChange(isDarkMode: boolean): void {\r\n // Determina el tema basado en el estado del interruptor\r\n const theme = isDarkMode ? 'dark' : 'light';\r\n // Aplica el tema\r\n this.applyTheme(theme);\r\n }\r\n\r\n // Aplica el tema y guarda la preferencia en localStorage\r\n applyTheme(theme: string): void {\r\n const html = document.documentElement;\r\n\r\n // Elimina las clases previas y agrega la nueva clase\r\n html.classList.remove('my-app-dark', 'my-app-light');\r\n html.classList.add(theme === 'dark' ? 'my-app-dark' : 'my-app-light');\r\n\r\n // Guarda el tema en localStorage\r\n localStorage.setItem('theme', theme);\r\n }\r\n\r\n actualizarSeguridadIT() {\r\n this._parameterSecurityService.refreshParameters().subscribe({\r\n next: (values) => {\r\n this._alertaService.toastrAlerts(\r\n 2,\r\n 'SeguridadIT',\r\n 'Parametro actualizado!',\r\n 2\r\n );\r\n //console.log('Parámetros cargados:', values);\r\n },\r\n error: (err) => {\r\n console.error('Error al actualizar parámetros de SeguridadIT', err);\r\n this._alertaService.toastrAlerts(\r\n 3,\r\n 'SeguridadIT',\r\n 'Error al actualizar parámetros!',\r\n 2\r\n );\r\n },\r\n complete: () => this._parameterSecurityService.clearParameterCache(),\r\n });\r\n }\r\n}\r\n","<p-menubar>\r\n <ng-template #start>\r\n <p-image\r\n class=\"ms-15\"\r\n [src]=\"urlLogo()\"\r\n alt=\"Image\"\r\n [width]=\"logoWidth()\"\r\n />\r\n <span class=\"version-text\">{{ appVersion() }}</span>\r\n </ng-template>\r\n <ng-template #end>\r\n <div>\r\n <p-button\r\n class=\"mr-2\"\r\n label=\"Permisos\"\r\n variant=\"text\"\r\n severity=\"info\"\r\n (click)=\"actualizarSeguridadIT()\"\r\n >\r\n <span class=\"material-symbols-outlined mr-1\">local_police</span>\r\n </p-button>\r\n <label class=\"ui-switch\">\r\n <input\r\n type=\"checkbox\"\r\n [(ngModel)]=\"checked\"\r\n (click)=\"onThemeChange(!checked ? true : false)\"\r\n />\r\n <div class=\"slider\">\r\n <div class=\"circle\"></div>\r\n </div>\r\n </label>\r\n <!-- <p-inputSwitch\r\n [(ngModel)]=\"checked\"\r\n (onChange)=\"onThemeChange($event.checked)\"\r\n ></p-inputSwitch> -->\r\n </div>\r\n </ng-template>\r\n</p-menubar>\r\n","import { Directive, ElementRef, HostListener } from '@angular/core';\r\n\r\n/**\r\n * Directiva que permite solo la entrada de:\r\n * - Dígitos (0-9)\r\n * - Separadores punto (.)\r\n * - Rango con guión (-)\r\n *\r\n * Ejemplos válidos:\r\n * - 1.2.3\r\n * - 4-6\r\n * - 1.3.5-9\r\n *\r\n * Restringe:\r\n * - Letras\r\n * - Espacios\r\n * - Caracteres especiales\r\n * - Doble punto (..), doble guión (--), o combinaciones como (.-)\r\n */\r\n@Directive({\r\n selector: '[appOnlyRangoPattern]',\r\n})\r\nexport class OnlyRangoPatternDirective {\r\n constructor(private el: ElementRef<HTMLInputElement>) {}\r\n\r\n /**\r\n * Expresión regular para permitir caracteres válidos individualmente (tecla por tecla).\r\n */\r\n private keyRegex: RegExp = /^[0-9.\\-]$/;\r\n\r\n /**\r\n * Escucha el evento de teclado y permite únicamente teclas válidas.\r\n * También evita combinaciones inválidas como `..`, `--`, `.1`, etc.\r\n */\r\n @HostListener('keydown', ['$event'])\r\n onKeyDown(event: KeyboardEvent): void {\r\n const input = this.el.nativeElement;\r\n const currentValue = input.value;\r\n const cursorPos = input.selectionStart ?? 0;\r\n const nextValue =\r\n currentValue.slice(0, cursorPos) +\r\n event.key +\r\n currentValue.slice(cursorPos);\r\n\r\n const allowedKeys = [\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Tab',\r\n 'Home',\r\n 'End',\r\n ];\r\n\r\n if (allowedKeys.includes(event.key)) return;\r\n\r\n if (!this.keyRegex.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir más de un punto o guión seguido, o combinaciones como \".-\", \"-.\", etc.\r\n if (/(\\.\\.|--|-\\.)|(\\.-)/.test(nextValue)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n // No permitir iniciar con punto o guión\r\n if (cursorPos === 0 && (event.key === '.' || event.key === '-')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n /**\r\n * Previene el pegado de cadenas que no cumplan con la estructura válida.\r\n * Solo permite: número o número separados por punto o guión correctamente.\r\n */\r\n @HostListener('paste', ['$event'])\r\n onPaste(event: ClipboardEvent): void {\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n const sanitized = pasted.trim();\r\n\r\n // Patrón completo de cadena válida: ej. 1.2.3.4-6\r\n const pattern = /^(\\d+(-\\d+)?)(\\.\\d+(-\\d+)?)*$/;\r\n\r\n if (!pattern.test(sanitized)) {\r\n event.preventDefault();\r\n }\r\n }\r\n}\r\n","import { Directive, HostListener } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[appSelectAllOnFocus]',\r\n})\r\nexport class SelectAllOnFocusDirective {\r\n @HostListener('onFocus', ['$event'])\r\n @HostListener('focus', ['$event'])\r\n selectAll(event: Event): void {\r\n const htmlInput = event.target as HTMLInputElement;\r\n if (htmlInput) {\r\n htmlInput.select();\r\n }\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport const CACHE_KEYS = new InjectionToken<Record<string, string>>(\r\n 'CACHE_KEYS'\r\n);\r\n","import { inject, Injectable, isDevMode } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { JwtHelperService } from '@auth0/angular-jwt';\r\nimport { CookieService } from 'ngx-cookie-service';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { DataToken, jwtSecurityModel } from '../models/src/token.model';\r\nimport { SecurityService } from './security.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class AuthorizeService {\r\n _cookieService = inject(CookieService);\r\n _router = inject(Router);\r\n helperJwt = new JwtHelperService();\r\n private _isRefreshing = false;\r\n private _securityService = inject(SecurityService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n\r\n // Función para obtener opciones de cookies estándar\r\n private getCookieOptions(expiryDate: Date): any {\r\n const isProduction = this.environment.production;\r\n const cookieOptions: any = {\r\n path: '/',\r\n expires: expiryDate,\r\n secure: isProduction,\r\n sameSite: isProduction ? 'None' : 'Lax', // sameSite: 'None',\r\n };\r\n if (isProduction) {\r\n cookieOptions.domain = '.itgtxela.com';\r\n }\r\n return cookieOptions;\r\n }\r\n // Función para establecer una cookie\r\n private setCookie(name: string, value: string, expiryDate: Date): void {\r\n const options = this.getCookieOptions(expiryDate);\r\n this._cookieService.set(name, value, options);\r\n }\r\n\r\n get isRefreshing() {\r\n return this._isRefreshing;\r\n }\r\n set isRefreshing(value) {\r\n this._isRefreshing = value;\r\n }\r\n\r\n getToken(): string | null {\r\n return this._cookieService.get(this.environment.tokenName);\r\n //return localStorage.getItem(environment.tokenName);\r\n }\r\n\r\n /**\r\n * Obtiene el Refresh Token almacenado en cookies.\r\n *\r\n * - En modo desarrollo (isDevMode):\r\n * Si no existe un refresh token en cookies, genera uno temporal\r\n * para evitar errores durante pruebas locales.\r\n *\r\n * - En modo producción:\r\n * Simplemente devuelve el refresh token real almacenado por el backend.\r\n *\r\n * @returns string | null - El refresh token o null si no existe.\r\n */\r\n getTokenRefresh(): string | null {\r\n // 🔹 MODO DESARROLLO: asegura que siempre haya un token de prueba\r\n if (isDevMode()) {\r\n const tokenRefresh = this._cookieService.get(\r\n this.environment.tokenNameRF\r\n );\r\n\r\n // Si no existe un refresh token, generamos uno de desarrollo\r\n if (!tokenRefresh) {\r\n const devTokens: DataToken = {\r\n token: '',\r\n tokenRefresh: '8508408a-6cbc-4ebb-b105-d851655a3b0c', // Token dummy para testing\r\n refreshTokenExpiry: new Date(),\r\n };\r\n\r\n // Carga y guarda las cookies necesarias\r\n this.tokenReload(devTokens);\r\n }\r\n }\r\n\r\n // 🔹 DEVUELVE el refresh token real o de desarrollo\r\n return this._cookieService.get(this.environment.tokenNameRF);\r\n }\r\n\r\n // Actualizar valores de status\r\n setLastActivity(): void {\r\n const tokenExpiryDate = new Date();\r\n // Expira en 30 minutos\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30);\r\n this.setCookie(\r\n this.environment.sessionStatus,\r\n Date.now().toString(),\r\n tokenExpiryDate\r\n );\r\n }\r\n\r\n getLastActivity(): number | null {\r\n // Obtiene el valor de la cookie\r\n const lastActivity = this._cookieService.get(\r\n this.environment.sessionStatus\r\n );\r\n\r\n if (lastActivity) {\r\n // Intenta convertir el valor en un número\r\n const timestamp = parseInt(lastActivity, 10);\r\n\r\n // Verifica que sea un número válido\r\n if (!isNaN(timestamp)) {\r\n return timestamp;\r\n }\r\n }\r\n\r\n // Si no hay cookie o el valor no es válido, devuelve null\r\n return null;\r\n }\r\n\r\n // Almacenar los tokens en cookies\r\n tokenReload(tokens: DataToken) {\r\n const tokenExpiryDate = new Date();\r\n tokenExpiryDate.setMinutes(tokenExpiryDate.getMinutes() + 30); // Access token expiry: 30 mins\r\n\r\n // Usar la fecha de expiración que viene del servidor para el refresh token\r\n const refreshTokenExpiryDate = new Date(tokens.refreshTokenExpiry);\r\n\r\n // Guardar el access token y refresh token con sus fechas de expiración\r\n this.setCookie(this.environment.tokenName, tokens.token, tokenExpiryDate);\r\n this.setCookie(\r\n this.environment.tokenNameRF,\r\n tokens.tokenRefresh,\r\n refreshTokenExpiryDate\r\n );\r\n\r\n // Guardar el estado de sesión\r\n this.setLastActivity();\r\n }\r\n\r\n getTokenValid(token: string | null): boolean {\r\n // Devuelve true si el token NO ha expirado\r\n return !this.helperJwt.isTokenExpired(token);\r\n }\r\n\r\n /**\r\n * Obtiene los valores principales del JWT almacenado (usuario, roles y estado).\r\n *\r\n * Este getter:\r\n * - Lee el access token desde cookies.\r\n * - Devuelve un objeto tipado (jwtSecurityModel).\r\n * - Decodifica el token para obtener `unique_name` y `role`.\r\n * - Determina si el token está expirado usando JwtHelperService.\r\n *\r\n * Si no existe token:\r\n * - Devuelve un objeto vacío con valores en null y `isTokenExpired = true`.\r\n *\r\n * Uso:\r\n * const info = this.authorize.getTokenValues;\r\n */\r\n get getTokenValues(): jwtSecurityModel {\r\n // Obtener el token almacenado\r\n const token = this.getToken();\r\n\r\n // Si no existe token → devolver estructura vacía\r\n if (!token) {\r\n return {\r\n userName: null,\r\n role: null,\r\n isTokenExpired: true,\r\n };\r\n }\r\n\r\n // Decodificar JWT\r\n const decoded = this.helperJwt.decodeToken(token) || {};\r\n\r\n return {\r\n userName: decoded.unique_name ?? null,\r\n\r\n // JWT puede traer role como string o como array → convertir a array\r\n role: decoded.role\r\n ? Array.isArray(decoded.role)\r\n ? decoded.role\r\n : [decoded.role]\r\n : null,\r\n\r\n // Validación de expiración del JWT\r\n isTokenExpired: this.helperJwt.isTokenExpired(token),\r\n };\r\n }\r\n\r\n /**\r\n * Verifica si el usuario está autenticado.\r\n *\r\n * La validación se basa en la existencia del refresh token en cookies.\r\n * El navegador gestiona automáticamente la expiración de las cookies.\r\n *\r\n * @returns `true` si el usuario está autenticado, `false` en caso contrario\r\n */\r\n isAuthenticated(): boolean {\r\n const refreshToken = this.getTokenRefresh();\r\n return !!(refreshToken && refreshToken.trim() !== '');\r\n }\r\n\r\n /**\r\n * Cierra la sesión del usuario de forma segura y controlada.\r\n *\r\n * Este método implementa un proceso de logout robusto que:\r\n * 1. Verifica el estado actual de la sesión y la ubicación del usuario\r\n * 2. Intenta revocar el refresh token en el servidor (si existe)\r\n * 3. Limpia todos los datos de sesión local\r\n * 4. Redirige al usuario a la página de login\r\n *\r\n * **Casos manejados:**\r\n * - Usuario ya en página de login: Solo limpia datos locales\r\n * - Sin refresh token: Limpia datos locales y redirige\r\n * - Con refresh token: Intenta revocarlo, luego limpia y redirige\r\n * - Error al revocar: Limpia datos locales de todas formas (seguridad)\r\n * - Modo desarrollo: Maneja tokens de prueba correctamente\r\n *\r\n * **Importante:** Este método es **asíncrono** en su ejecución interna pero no retorna una promesa.\r\n * La redirección al login ocurre después de limpiar la sesión, independientemente del resultado de la revocación.\r\n *\r\n * @example\r\n * ```typescript\r\n * // Uso básico desde un componente\r\n * this.authorizeService.logout();\r\n *\r\n * // Uso con navegación posterior controlada\r\n * this.authorizeService.logout();\r\n * // La redirección al login es automática\r\n * ```\r\n *\r\n * @see {@link clearSessionData} para el proceso de limpieza de datos\r\n * @see {@link SecurityService.tokenRevok} para la revocación en el servidor\r\n */\r\n logout(): void {\r\n try {\r\n // 1️⃣ Prevenir acciones innecesarias si ya está en el login\r\n if (this._router.url === '/login') {\r\n console.info(\r\n '[AuthorizeService] Usuario ya en página de login, limpiando sesión local...'\r\n );\r\n this.clearSessionData();\r\n return;\r\n }\r\n\r\n // 2️⃣ Obtener el refresh token de forma segura\r\n const refreshToken = this.getTokenRefresh();\r\n\r\n // 3️⃣ Si no hay refresh token, proceder con limpieza directa\r\n if (!refreshToken || refreshToken.trim() === '') {\r\n console.warn(\r\n '[AuthorizeService] No se encontró refresh token, limpiando sesión local...'\r\n );\r\n this.clearSessionData();\r\n return;\r\n }\r\n\r\n // 4️⃣ Intentar revocar el token en el servidor\r\n console.info(\r\n '[AuthorizeService] Revocando refresh token en el servidor...'\r\n );\r\n\r\n this._securityService.tokenRevok(refreshToken).subscribe({\r\n next: (success) => {\r\n if (success) {\r\n console.info(\r\n '[AuthorizeService] Refresh token revocado exitosamente en el servidor'\r\n );\r\n } else {\r\n console.warn(\r\n '[AuthorizeService] El servidor no pudo revocar el token, pero continuando con logout'\r\n );\r\n }\r\n this.clearSessionData();\r\n },\r\n error: (error) => {\r\n // 5️⃣ Manejar errores de revocación con información detallada\r\n console.error(\r\n '[AuthorizeService] Error al revocar el refresh token:',\r\n {\r\n message: error?.message || 'Error desconocido',\r\n status: error?.status,\r\n statusText: error?.statusText,\r\n url: error?.url,\r\n }\r\n );\r\n\r\n // Por seguridad, limpiar la sesión incluso si falla la revocación\r\n console.warn(\r\n '[AuthorizeService] Limpiando sesión local por seguridad a pesar del error'\r\n );\r\n this.clearSessionData();\r\n },\r\n complete: () => {\r\n console.info('[AuthorizeService] Proceso de logout completado');\r\n },\r\n });\r\n } catch (error) {\r\n // 6️⃣ Capturar cualquier error inesperado en el proceso de logout\r\n console.error(\r\n '[AuthorizeService] Error crítico durante el proceso de logout:',\r\n error\r\n );\r\n\r\n // Garantizar que la sesión se limpie incluso si ocurre un error inesperado\r\n try {\r\n this.clearSessionData();\r\n } catch (cleanupError) {\r\n console.error(\r\n '[AuthorizeService] Error crítico al limpiar sesión:',\r\n cleanupError\r\n );\r\n // Último recurso: redirigir al login sin importar qué\r\n this._router.navigate(['/login']).catch((navError) => {\r\n console.error(\r\n '[AuthorizeService] Error al navegar a login:',\r\n navError\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Limpia todos los datos de sesión del usuario de forma segura.\r\n *\r\n * Este método privado se encarga de:\r\n * - Eliminar todas las cookies relacionadas con autenticación\r\n * - Limpiar el localStorage completamente\r\n * - Redirigir al usuario a la página de login\r\n *\r\n * **Cookies eliminadas:**\r\n * - Token de acceso (access token)\r\n * - Token de refresco (refresh token)\r\n * - Estado de sesión (session status)\r\n *\r\n * **Consideraciones:**\r\n * - Se eliminan las cookies con path '/' para asegurar su borrado\r\n * - En producción, también se considera el dominio configurado\r\n * - El localStorage se limpia completamente por seguridad\r\n * - La redirección es forzada incluso si hay errores previos\r\n *\r\n * @private\r\n */\r\n private clearSessionData(): void {\r\n try {\r\n console.info(\r\n '[AuthorizeService] Iniciando limpieza de datos de sesión...'\r\n );\r\n\r\n // 1️⃣ Eliminar cookies con path explícito\r\n const cookiesToDelete = [\r\n this.environment.tokenName,\r\n this.environment.tokenNameRF,\r\n this.environment.sessionStatus,\r\n ];\r\n\r\n cookiesToDelete.forEach((cookieName) => {\r\n try {\r\n // Eliminar con path '/'\r\n this._cookieService.delete(cookieName, '/');\r\n\r\n // En producción, también intentar eliminar con dominio específico\r\n if (this.environment.production) {\r\n this._cookieService.delete(cookieName, '/', '.itgtxela.com');\r\n }\r\n\r\n console.debug(`[AuthorizeService] Cookie eliminada: ${cookieName}`);\r\n } catch (error) {\r\n console.error(\r\n `[AuthorizeService] Error al eliminar cookie ${cookieName}:`,\r\n error\r\n );\r\n }\r\n });\r\n\r\n // 2️⃣ Limpiar localStorage\r\n try {\r\n localStorage.clear();\r\n console.debug('[AuthorizeService] localStorage limpiado');\r\n } catch (error) {\r\n console.error(\r\n '[AuthorizeService] Error al limpiar localStorage:',\r\n error\r\n );\r\n }\r\n\r\n // 3️⃣ Redirigir al login\r\n console.info('[AuthorizeService] Redirigiendo a página de login...');\r\n this._router.navigate(['/login']).then(\r\n () => console.info('[AuthorizeService] Redirección exitosa a /login'),\r\n (error) =>\r\n console.error('[AuthorizeService] Error en la redirección:', error)\r\n );\r\n } catch (error) {\r\n console.error(\r\n '[AuthorizeService] Error crítico en clearSessionData:',\r\n error\r\n );\r\n\r\n // Último recurso: intentar redirigir sin importar qué\r\n this._router.navigate(['/login']).catch((navError) => {\r\n console.error(\r\n '[AuthorizeService] Error final al intentar redirigir:',\r\n navError\r\n );\r\n });\r\n }\r\n }\r\n}\r\n","import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { throwError, timer } from 'rxjs';\r\nimport { AlertaService } from './alerta.service';\r\nimport { ErrorModel } from '../models/src/error.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ErrorHandlerService {\r\n _serviceAlerta = inject(AlertaService);\r\n\r\n handleErrorResponse(error: HttpErrorResponse) {\r\n const err: ErrorModel = error as ErrorModel;\r\n const technicalMessage = `Error status: ${error.status}, Message: ${error.message}, URL: ${error.url}`;\r\n\r\n let userMessage = 'Ha ocurrido un error inesperado.';\r\n\r\n switch (error.status) {\r\n case HttpStatusCode.BadRequest:\r\n userMessage =\r\n 'Solicitud incorrecta (400). Verifica los datos ingresados o validaciones existentes.';\r\n break;\r\n case HttpStatusCode.Unauthorized:\r\n userMessage = 'Acceso no autorizado (401). Por favor inicia sesión.';\r\n break;\r\n case HttpStatusCode.Forbidden:\r\n userMessage = 'No tienes permisos para realizar esta acción (403).';\r\n break;\r\n case HttpStatusCode.NotFound:\r\n userMessage = 'No se encontró el recurso solicitado (404).';\r\n break;\r\n case HttpStatusCode.Conflict: // Capturar error de concurrencia\r\n userMessage =\r\n 'El registro fue modificado por otro usuario. Por favor, actualiza los datos antes de continuar.';\r\n break;\r\n case HttpStatusCode.InternalServerError:\r\n userMessage =\r\n 'Ocurrió un error en el servidor (500). Inténtalo más tarde.';\r\n break;\r\n default:\r\n userMessage = 'Un error inesperado ha ocurrido.';\r\n break;\r\n }\r\n\r\n // Mostrar mensaje para el usuario\r\n this._serviceAlerta.alertaHtml(\r\n 'Servicios de Errores',\r\n '<i>Código:</i> ' +\r\n err.status +\r\n ' <i>Message:</i> ' +\r\n userMessage +\r\n `.<strong class=\"alertMessageDsx\"> (${error.error})</strong>`\r\n );\r\n\r\n // Imprimir el mensaje técnico\r\n if (isDevMode()) {\r\n console.error(err);\r\n }\r\n\r\n // Retornar el error para continuar con el flujo de manejo de errores\r\n return throwError(() => new Error(technicalMessage));\r\n }\r\n}\r\n","// Interceptor HTTP para manejar autorización y refresco de tokens en peticiones HTTP.\r\n// Permite agregar el token de autorización, manejar errores 401 y refrescar el token automáticamente.\r\nimport {\r\n HttpErrorResponse,\r\n HttpInterceptorFn,\r\n HttpStatusCode,\r\n} from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport {\r\n BehaviorSubject,\r\n catchError,\r\n EMPTY,\r\n filter,\r\n finalize,\r\n switchMap,\r\n take,\r\n} from 'rxjs';\r\nimport { ServiceResult } from '../models/src/response-http.model';\r\nimport { DataToken } from '../models/src/token.model';\r\nimport { AuthorizeService } from '../services/authorize.service';\r\nimport { ErrorHandlerService } from '../services/error-handler.service';\r\nimport { SecurityService } from '../services/security.service';\r\nimport { SpinnerLoadingService } from '../services/spinner-loading.service';\r\n\r\n// Lleva el conteo de peticiones activas para mostrar/ocultar el spinner\r\nlet _activeRequest = 0;\r\n// Indica si se está realizando un refresh de token\r\nlet isRefreshing = false;\r\n// Subject para emitir el nuevo token tras el refresh\r\nlet refreshTokenSubject = new BehaviorSubject<string | null>(null);\r\n\r\n/**\r\n * Interceptor principal para autorización HTTP.\r\n * - Agrega el token de autorización a cada petición.\r\n * - Muestra/oculta el spinner de carga según el número de peticiones activas.\r\n * - Maneja errores 401 (Unauthorized) refrescando el token si es posible.\r\n * - Repite la petición original tras refrescar el token.\r\n */\r\nexport const httpAuthorizeInterceptor: HttpInterceptorFn = (req, next) => {\r\n const _authorizeService = inject(AuthorizeService);\r\n const _securityService = inject(SecurityService);\r\n const _spinnerService = inject(SpinnerLoadingService);\r\n const _handleErrorService = inject(ErrorHandlerService);\r\n\r\n const _token = _authorizeService.getToken();\r\n\r\n let authReq = req;\r\n\r\n // Si la URL de la petición es inválida, retorna un observable vacío\r\n // Surgio a partir de angular V21\r\n if (!req.url || req.url.trim() === '' || req.url === '/') {\r\n return EMPTY;\r\n }\r\n\r\n if (_token) {\r\n authReq = req.clone({\r\n setHeaders: { Authorization: `Bearer ${_token}` },\r\n });\r\n }\r\n\r\n // Para depuración: muestra el token agregado\r\n //console.log('Interceptor - Token agregado a la petición:', authReq);\r\n\r\n // Muestra el spinner si es la primera petición activa\r\n if (_activeRequest === 0) {\r\n _spinnerService.show();\r\n }\r\n _activeRequest++;\r\n\r\n // Ejecuta la petición HTTP\r\n return next(authReq).pipe(\r\n // Manejo de errores en la respuesta\r\n catchError((error: HttpErrorResponse) => {\r\n // Si el error es 401 (no autorizado), intenta refrescar el token\r\n if (error.status === HttpStatusCode.Unauthorized) {\r\n const refreshToken = _authorizeService.getTokenRefresh();\r\n // Si no hay refresh token, delega el manejo del error\r\n if (!refreshToken) {\r\n return _handleErrorService.handleErrorResponse(error);\r\n }\r\n\r\n // Si no se está refrescando el token, inicia el proceso de refresh\r\n if (!isRefreshing) {\r\n isRefreshing = true;\r\n refreshTokenSubject.next(null);\r\n\r\n // Solicita el refresh del token\r\n return _securityService.tokenRefresh(refreshToken).pipe(\r\n switchMap((response: ServiceResult<DataToken>) => {\r\n isRefreshing = false;\r\n _authorizeService.tokenReload(response.data!); // Actualiza el token en el servicio\r\n refreshTokenSubject.next(response.data?.token!); // Emite el nuevo token\r\n\r\n // Repite la petición original con el nuevo token\r\n return next(\r\n req.clone({\r\n setHeaders: {\r\n Authorization: `Bearer ${response.data?.token!}`,\r\n },\r\n })\r\n );\r\n }),\r\n catchError((err) => {\r\n isRefreshing = false;\r\n refreshTokenSubject.error(err); // Emite el error en el subject\r\n return _handleErrorService.handleErrorResponse(err);\r\n })\r\n );\r\n } else {\r\n // Si ya se está refrescando, espera a que el subject emita el nuevo token\r\n return refreshTokenSubject.pipe(\r\n filter((token) => token != null), // Espera a que el token sea válido\r\n take(1), // Toma solo la primera emisión válida\r\n switchMap((token) =>\r\n next(\r\n req.clone({\r\n setHeaders: { Authorization: `Bearer ${token}` },\r\n })\r\n )\r\n )\r\n );\r\n }\r\n }\r\n\r\n // Para otros errores, delega al servicio de manejo de errores\r\n return _handleErrorService.handleErrorResponse(error);\r\n }),\r\n // Al finalizar la petición (éxito o error), actualiza el conteo y oculta el spinner si corresponde\r\n // comentarizar el hide para verificar el spinner en la aplicacion final\r\n finalize(() => {\r\n _activeRequest--;\r\n if (_activeRequest === 0) {\r\n _spinnerService.hide();\r\n }\r\n })\r\n );\r\n};\r\n","export type InferCacheKeyType<T extends Record<string, string>> = keyof T;\r\n\r\n/**\r\n * Transforma un tipo de mapa `T` cuyas claves son simbólicas\r\n * y cuyos valores son nombres de propiedades reales de caché,\r\n * a un objeto donde esas propiedades reales son claves booleanas.\r\n *\r\n * @example\r\n * ```ts\r\n * type T = { cliente: 'invalidateCacheCliente' };\r\n * InferCacheOptions<T> // { invalidateCacheCliente: boolean }\r\n * ```\r\n */\r\nexport type InferCacheOptions<T extends Record<string, string>> = {\r\n [K in keyof T as T[K]]: boolean;\r\n};\r\n\r\nexport function createInitialCache<T extends Record<string, string>>(\r\n cacheKeys: T\r\n): {\r\n -readonly [K in keyof T as T[K]]: boolean;\r\n} {\r\n return Object.fromEntries(\r\n Object.values(cacheKeys).map((key) => [key, false])\r\n ) as any;\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { JsonValuesDebujComponent } from '../../components/json-values-debuj/json-values-debuj.component';\r\nimport { IconDsxComponent } from '../../components/icon-dsx/icon-dsx.component';\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [IconDsxComponent, JsonValuesDebujComponent],\r\n exports: [\r\n CommonModule,\r\n FormsModule,\r\n IconDsxComponent,\r\n JsonValuesDebujComponent,\r\n ReactiveFormsModule,\r\n ],\r\n providers: [],\r\n})\r\nexport class DsxAddToolsModule {}\r\n","import { NgModule } from '@angular/core';\r\n\r\n//PrimeNG\r\nimport { AccordionModule } from 'primeng/accordion';\r\nimport { AutoCompleteModule } from 'primeng/autocomplete';\r\nimport { AutoFocusModule } from 'primeng/autofocus';\r\nimport { AvatarModule } from 'primeng/avatar';\r\nimport { AvatarGroupModule } from 'primeng/avatargroup';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { FieldsetModule } from 'primeng/fieldset';\r\nimport { FileUploadModule } from 'primeng/fileupload';\r\nimport { FloatLabelModule } from 'primeng/floatlabel';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { ImageModule } from 'primeng/image';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { InputMaskModule } from 'primeng/inputmask';\r\nimport { InputNumberModule } from 'primeng/inputnumber';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { MenubarModule } from 'primeng/menubar';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { MultiSelectModule } from 'primeng/multiselect';\r\nimport { PanelMenuModule } from 'primeng/panelmenu';\r\nimport { PasswordModule } from 'primeng/password';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { RippleModule } from 'primeng/ripple';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { SplitButtonModule } from 'primeng/splitbutton';\r\nimport { StepperModule } from 'primeng/stepper';\r\nimport { TableModule } from 'primeng/table';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TagModule } from 'primeng/tag';\r\nimport { TextareaModule } from 'primeng/textarea';\r\nimport { ToastModule } from 'primeng/toast';\r\nimport { ToggleButtonModule } from 'primeng/togglebutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\nconst PRIME_NG_MODULES = [\r\n AccordionModule,\r\n AutoCompleteModule,\r\n AutoFocusModule,\r\n AvatarGroupModule,\r\n AvatarModule,\r\n ButtonModule,\r\n CheckboxModule,\r\n DatePickerModule,\r\n DialogModule,\r\n DividerModule,\r\n DrawerModule,\r\n FieldsetModule,\r\n FileUploadModule,\r\n FloatLabelModule,\r\n IconFieldModule,\r\n ImageModule,\r\n InputIconModule,\r\n InputMaskModule,\r\n InputNumberModule,\r\n InputTextModule,\r\n MenubarModule,\r\n MessageModule,\r\n MultiSelectModule,\r\n PanelMenuModule,\r\n PasswordModule,\r\n RadioButtonModule,\r\n RippleModule,\r\n SelectModule,\r\n SplitButtonModule,\r\n StepperModule,\r\n TableModule,\r\n TabsModule,\r\n TagModule,\r\n TextareaModule,\r\n ToastModule,\r\n ToggleButtonModule,\r\n TooltipModule,\r\n];\r\n\r\n@NgModule({\r\n declarations: [],\r\n imports: [],\r\n exports: [...PRIME_NG_MODULES],\r\n providers: [],\r\n})\r\nexport class PrimeNgModule {}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'truncate',\r\n standalone: true,\r\n})\r\nexport class TruncatePipe implements PipeTransform {\r\n /**\r\n * Transforma una cadena de texto truncándola según los parámetros proporcionados.\r\n *\r\n * @param value - La cadena de texto que se desea truncar.\r\n * @param limit - El número máximo de caracteres permitidos. Por defecto es 100. Si no se encuentra un espacio dentro del límite, usa el límite original (15).\r\n * @param completeWords - Si es true, evita cortar palabras a la mitad. Por defecto es false.\r\n * @param ellipsis - La cadena que se añadirá al final del texto truncado. Por defecto es '...'.\r\n * @returns La cadena truncada con el ellipsis añadido, si es necesario.\r\n */\r\n transform(\r\n value: string,\r\n limit: number = 20,\r\n completeWords: boolean = false,\r\n ellipsis: string = '...'\r\n ): string {\r\n // Si el valor es nulo o indefinido, devuelve una cadena vacía para evitar errores.\r\n if (!value) {\r\n return '';\r\n }\r\n\r\n // Si completeWords es true, ajusta el límite para no cortar palabras.\r\n if (completeWords) {\r\n // Encuentra el último espacio dentro del límite para evitar cortar palabras.\r\n limit = value.slice(0, limit).lastIndexOf(' ');\r\n\r\n // Si no se encuentra un espacio dentro del límite, usa el límite original.\r\n if (limit < 0) {\r\n limit = 15; // Valor por defecto si no hay espacios.\r\n }\r\n }\r\n\r\n // Trunca el texto y añade el ellipsis si la longitud del texto supera el límite.\r\n return value.length > limit ? value.slice(0, limit) + ellipsis : value;\r\n }\r\n}\r\n","import { inject, Injectable, signal } from '@angular/core';\r\nimport { CACHE_KEYS } from '../injections/cache.token';\r\nimport { InferCacheOptions } from '../models/src/cache.types';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\n\r\n/**\r\n * Servicio genérico para el manejo de caché reactivo basado en claves definidas por el consumidor.\r\n *\r\n * Este servicio utiliza señales (`signal`) para almacenar el estado de invalidación de caché\r\n * y permite marcar ciertas entradas como inválidas mediante una llamada a `invalidate`.\r\n *\r\n * ---\r\n * ## Uso básico\r\n * Si no se especifica el tipo genérico `T`, el servicio funcionará con un mapa genérico\r\n * `Record<string, string>` sin autocompletado.\r\n *\r\n * ```ts\r\n * const cacheService = inject(CacheService);\r\n * cacheService.invalidate(['cualquierClave']);\r\n * ```\r\n *\r\n * ---\r\n * ## Uso tipado (recomendado)\r\n * 1. Definir las claves de caché en el proyecto consumidor:\r\n * ```ts\r\n * export const INITIAL_CACHE_KEYS = {\r\n * cliente: 'invalidateCacheCliente',\r\n * empresa: 'invalidateCacheEmpresa'\r\n * } as const;\r\n *\r\n * export type ValueCacheKeys = typeof INITIAL_CACHE_KEYS;\r\n * ```\r\n *\r\n * 2. Proveer estas claves en `AppModule` o un módulo raíz:\r\n * ```ts\r\n * providers: [\r\n * { provide: CACHE_KEYS, useValue: INITIAL_CACHE_KEYS }\r\n * ]\r\n * ```\r\n *\r\n * 3. Inyectar el servicio especificando el tipo:\r\n * ```ts\r\n * const cacheService = inject<CacheService<ValueCacheKeys>>(CacheService);\r\n *\r\n * cacheService.options.invalidateCacheCliente; // ✅ boolean con autocompletado\r\n * cacheService.invalidate(['cliente']); // marca como invalidado\r\n * ```\r\n *\r\n * @typeParam T - Objeto con claves simbólicas (`keyof T`) como `cliente`, `empresa`,\r\n * y valores string literales usados como claves reales de caché.\r\n * Por defecto: `Record<string, string>`.\r\n */\r\nexport class CacheService<\r\n T extends Record<string, string> = Record<string, string>\r\n> {\r\n /**\r\n * Mapa de claves simbólicas a claves reales de caché.\r\n * Se inyecta desde el proyecto consumidor mediante `CACHE_KEYS`.\r\n */\r\n private keys = inject(CACHE_KEYS) as T;\r\n\r\n /**\r\n * Servicio de alerta utilizado para mostrar notificaciones al usuario.\r\n */\r\n private alert = inject(AlertaService);\r\n\r\n /**\r\n * Estado reactivo que contiene un objeto donde cada propiedad (clave real de caché)\r\n * tiene un valor booleano que indica si el caché ha sido invalidado (`true`)\r\n * o sigue siendo válido (`false`).\r\n *\r\n * Este estado es tipado automáticamente en función de los valores de `T`.\r\n */\r\n private _options = signal<InferCacheOptions<T>>(\r\n Object.fromEntries(\r\n Object.values(this.keys).map((k) => [k, false])\r\n ) as InferCacheOptions<T>\r\n );\r\n\r\n /**\r\n * Obtiene el estado actual del caché.\r\n * Cada propiedad representa una clave real de caché con su valor booleano.\r\n */\r\n get options(): InferCacheOptions<T> {\r\n return this._options();\r\n }\r\n\r\n /**\r\n * Invalida una o más claves simbólicas, marcando su correspondiente\r\n * propiedad de caché como `true` (invalidada).\r\n *\r\n * @param keysToInvalidate - Lista de claves simbólicas (`keyof T`) a invalidar.\r\n *\r\n * @example\r\n * ```ts\r\n * cacheService.invalidate(['cliente', 'empresa']);\r\n * ```\r\n */\r\n invalidate(keysToInvalidate: (keyof T)[] | null = null): void {\r\n if (!keysToInvalidate?.length) return;\r\n\r\n const current: InferCacheOptions<T> = { ...this._options() };\r\n\r\n keysToInvalidate.forEach((key) => {\r\n const prop = this.keys[key] as keyof InferCacheOptions<T>;\r\n current[prop] = true as InferCacheOptions<T>[typeof prop];\r\n });\r\n\r\n this._options.set(current);\r\n\r\n this.alert.toastrAlerts(\r\n 2,\r\n 'Estado',\r\n 'Datos actualizados (cache).',\r\n 2,\r\n 1000\r\n );\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport { CacheService } from './cache.service';\r\n\r\nexport function createTypedCacheProvider<T extends Record<string, string>>(\r\n tokenName: string\r\n): { token: InjectionToken<CacheService<T>>; provider: Provider } {\r\n const token = new InjectionToken<CacheService<T>>(tokenName);\r\n\r\n const provider: Provider = {\r\n provide: token,\r\n useFactory: () => new CacheService<T>(),\r\n deps: [],\r\n };\r\n\r\n return { token, provider };\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models/src/response-http.model';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class EndpointService<T> {\r\n private http = inject(HttpClient);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private getUrl(endpoint: string): string {\r\n return `${this.environment.myAppUrl}api/${endpoint}`;\r\n }\r\n\r\n list(endpoint: string, invalidateCache: boolean = false): Observable<T[]> {\r\n return this.http.get<T[]>(\r\n `${this.getUrl(endpoint)}/listar/${invalidateCache}`\r\n );\r\n }\r\n\r\n edit(endpoint: string, id: number): Observable<T> {\r\n return this.http.get<T>(`${this.getUrl(endpoint)}/get-id/${id}`);\r\n }\r\n\r\n save(endpoint: string, values: T): Observable<ResponseHttpModel> {\r\n return this.http.put<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/save`,\r\n values\r\n );\r\n }\r\n\r\n delete(\r\n endpoint: string,\r\n id: number,\r\n softDelete: boolean = true\r\n ): Observable<ResponseHttpModel> {\r\n return this.http.delete<ResponseHttpModel>(\r\n `${this.getUrl(endpoint)}/delete/${id}/${softDelete}`\r\n );\r\n }\r\n}\r\n","import { inject, Injectable } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n ValidatorFn,\r\n} from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport moment from 'moment-timezone';\r\nimport { Observable } from 'rxjs';\r\nimport {\r\n ENVIRONMENT,\r\n EnvironmentConfig,\r\n} from '../injections/environment.token';\r\nimport { ResponseHttpModel } from '../models';\r\nimport {\r\n FechasConversion,\r\n FilterOption,\r\n TipoFechaConversion,\r\n} from '../models/src/extensions.model';\r\nimport { FieldConfig } from '../models/src/field-config.model';\r\nimport { AlertaService } from './alerta.service';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class UtilityAddService {\r\n private _serviceAlerta = inject(AlertaService);\r\n private environment: EnvironmentConfig = inject(ENVIRONMENT);\r\n private _router = inject(Router);\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto formateada según la zona horaria especificada.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en la zona horaria especificada o null si la fecha es null.\r\n */\r\n convertirFechaSegunZonaHoraria(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Cambia esto a la zona horaria que desees\r\n const zonaHoraria = 'America/Guatemala';\r\n return moment(fecha).tz(zonaHoraria).format();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a un objeto Date en formato ISO, opcionalmente ajustando la hora al inicio del día.\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {Date | null} - La fecha convertida en formato Date o null si la fecha es null.\r\n */\r\n convertirFechaISOString(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): Date | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toDate();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena en formato ISO 8601.\r\n *\r\n * @param {string | Date} fecha - La fecha a convertir. Puede ser un string o un objeto Date.\r\n * @param {boolean} initHour - Si es true, ajusta la hora al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha en formato ISO 8601 (ejemplo: '2025-09-05T00:00:00.000Z') o null si la fecha es inválida.\r\n *\r\n * @example\r\n * // Fecha como string\r\n * service.convertirFechaISO8601('2025-09-05'); // '2025-09-05T00:00:00.000Z'\r\n * // Fecha como Date y ajustando al inicio del día\r\n * service.convertirFechaISO8601(new Date(), true); // '2025-09-05T00:00:00.000Z'\r\n */\r\n convertirFechaISO8601(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n let fechaMoment = moment(fecha);\r\n if (initHour) {\r\n fechaMoment.startOf('days');\r\n }\r\n return fechaMoment.toISOString();\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato corto (YYYY-MM-DD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @param {boolean} initHour - Si es true, la hora se ajusta al inicio del día (00:00:00).\r\n * @returns {string | null} - La fecha formateada en formato corto (YYYY-MM-DD) o null si la fecha es null.\r\n */\r\n convertirFechaShort(\r\n fecha: string | Date,\r\n initHour: boolean = false\r\n ): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n // Validar si la fecha es válida\r\n const fechaMoment = moment(fecha).format('YYYY-MM-DD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto que representa solo la hora (HH:mm).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La hora formateada (HH:mm) o null si la fecha es null.\r\n */\r\n convertirFechaTime(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('HH:mm');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Convierte una fecha a una cadena de texto en formato timestamp (YYYYMMDD).\r\n *\r\n * @param {string | Date} fecha - La fecha que se desea convertir. Puede ser una cadena de texto o un objeto Date.\r\n * @returns {string | null} - La fecha formateada en formato timestamp (YYYYMMDD) o null si la fecha es null.\r\n */\r\n convertirTimeStampString(fecha: string | Date): string | null {\r\n if (!fecha) return null; // Comprobamos si la fecha es null o undefined\r\n const fechaMoment = moment(fecha).format('YYYYMMDD');\r\n return fechaMoment;\r\n }\r\n\r\n /**\r\n * Crea un FormGroup tipado a partir de una configuración de campos.\r\n *\r\n * @param {FormBuilder} fb - Instancia de FormBuilder para crear el FormGroup.\r\n * @param {FieldConfig<T>} config - Configuración de los campos del formulario.\r\n * @param {ValidatorFn[]} groupValidators - Validadores adicionales a nivel de grupo.\r\n * @returns {FormGroup} - El FormGroup creado.\r\n */\r\n createTypedForm<T>(\r\n fb: FormBuilder,\r\n config: FieldConfig<T>,\r\n groupValidators?: ValidatorFn[]\r\n ): FormGroup {\r\n const formGroup: { [key in keyof T]?: FormControl } = {};\r\n\r\n // Crear controles de formulario individuales\r\n for (const key in config) {\r\n if (Object.prototype.hasOwnProperty.call(config, key)) {\r\n const { value, disabled = false, validators = [] } = config[key];\r\n formGroup[key] = new FormControl({ value, disabled }, validators);\r\n }\r\n }\r\n\r\n // Crear el FormGroup con validadores adicionales a nivel de grupo si existen\r\n const group = fb.group(\r\n formGroup,\r\n groupValidators ? { validators: groupValidators } : {}\r\n );\r\n\r\n return group;\r\n }\r\n\r\n /**\r\n * Sanitiza un formulario obteniendo valores de un formulario, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del modelo a procesar.\r\n * @param form - El formulario reactivo de Angular del que se obtendrán los valores.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar. Cada objeto debe contener:\r\n * - `nombre`: El nombre del campo de fecha en el modelo.\r\n * - `tipo`: El tipo de conversión que se debe aplicar (por ejemplo, `'short'`, `'zh'`, `'iso').\r\n * @returns Un objeto del tipo `T` con los datos procesados y las conversiones de fecha aplicadas.\r\n * @throws Error - Si el campo de fecha especificado no existe en los datos del formulario.\r\n *\r\n * @example\r\n * // Procesar varios campos de fecha\r\n * const precioValues = service.sanitizarModelo<ItemPrecioModel>(\r\n * form,\r\n * { nombre: 'fechaInicio', tipo: 'short' },\r\n * { nombre: 'fechaFin', tipo: 'zh' }\r\n * );\r\n */\r\n sanitizarForm<T>(form: any, ...campos: FechasConversion[]): T {\r\n // Obtén todos los valores del formulario\r\n const rawData = form.getRawValue();\r\n\r\n if (!rawData) {\r\n throw new Error('El formulario no tiene valores.');\r\n }\r\n\r\n // Procesa los valores sin envolver en un arreglo\r\n const updatedValue = { ...rawData };\r\n\r\n // Itera sobre los campos de fecha especificados para realizar las conversiones\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el valor.`);\r\n }\r\n updatedValue[nombre] = updatedValue[nombre]\r\n ? this.convertirFecha(updatedValue[nombre], tipo)\r\n : null;\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Sanitiza un objeto plano, aplicando conversiones de fecha según los campos especificados.\r\n *\r\n * @template T - El tipo genérico del objeto a procesar.\r\n * @param values - El objeto con los datos.\r\n * @param campos - Uno o más objetos que especifican los campos de fecha y el tipo de conversión a aplicar.\r\n * @returns Un objeto del tipo T con las conversiones de fecha aplicadas.\r\n */\r\n sanitizarModel<T extends Record<string, any>>(\r\n values: T,\r\n ...campos: FechasConversion[]\r\n ): T {\r\n // Crear una copia del objeto para no modificar el original\r\n const updatedValue: Record<string, any> = { ...values };\r\n\r\n campos.forEach(({ nombre, tipo }) => {\r\n if (!(nombre in updatedValue)) {\r\n throw new Error(`El campo \"${nombre}\" no existe en el objeto.`);\r\n }\r\n\r\n const valorActual = updatedValue[nombre];\r\n\r\n if (\r\n valorActual !== null &&\r\n valorActual !== undefined &&\r\n valorActual !== ''\r\n ) {\r\n updatedValue[nombre] = this.convertirFecha(valorActual, tipo);\r\n } else {\r\n updatedValue[nombre] = null;\r\n }\r\n });\r\n\r\n return updatedValue as T;\r\n }\r\n\r\n /**\r\n * Convierte una fecha al formato especificado.\r\n *\r\n * @param fecha - La fecha en formato string que se desea convertir.\r\n * Debe estar en un formato reconocible por `Date` o en ISO 8601.\r\n * @param tipo - El tipo de conversión a realizar. Soporta:\r\n * - `'short'`: Devuelve la fecha en formato corto (YYYY-MM-DD).\r\n * - `'zh'`: Devuelve la fecha ajustada a la zona horaria configurada.\r\n * - `'iso'`: Devuelve la fecha como objeto Date en formato ISO.\r\n * - `'iso8601'`: Devuelve la fecha como string en formato ISO 8601.\r\n * @returns La fecha convertida como string o Date según el tipo especificado, o null si la fecha es inválida.\r\n * @throws Error - Si el tipo de conversión no es válido o soportado.\r\n *\r\n * @example\r\n * // Formato corto\r\n * service.convertirFecha('2025-08-21', 'short'); // '2025-08-21'\r\n * // Zona horaria\r\n * service.convertirFecha('2025-08-21', 'zh'); // '2025-08-21T00:00:00-06:00' (ejemplo)\r\n * // Formato ISO (Date)\r\n * service.convertirFecha('2025-08-21', 'iso'); // Date { ... }\r\n * // Formato ISO 8601 (string)\r\n * service.convertirFecha('2025-08-21', 'iso8601'); // '2025-08-21T00:00:00.000Z'\r\n */\r\n private convertirFecha(\r\n fecha: string,\r\n tipo: TipoFechaConversion\r\n ): Date | string | null {\r\n switch (tipo) {\r\n case 'short':\r\n // Implementación para el formato corto\r\n return this.convertirFechaShort(fecha);\r\n case 'zh':\r\n // Implementación para zonas horarias\r\n return this.convertirFechaSegunZonaHoraria(fecha);\r\n case 'iso': {\r\n return this.convertirFechaISOString(fecha);\r\n }\r\n case 'iso8601': {\r\n return this.convertirFechaISO8601(fecha);\r\n }\r\n default:\r\n throw new Error(`Tipo de conversión desconocido: ${tipo}`);\r\n }\r\n }\r\n\r\n /**\r\n * Maneja la respuesta de un archivo descargable\r\n * @param fileObservable Observable que emite el Blob del archivo\r\n * @param actionId 0 para abrir en nueva ventana, 1 para descargar\r\n * @param fileName Nombre del archivo sin extensión\r\n */\r\n handleFileResponse(\r\n fileObservable: Observable<Blob>,\r\n actionId: number,\r\n fileName: string\r\n ): void {\r\n fileObservable.subscribe({\r\n next: (fileBlob: Blob) => {\r\n const fileUrl = URL.createObjectURL(fileBlob);\r\n const fileExtension = this.getFileExtension(fileBlob.type);\r\n\r\n if (this.isExcelFile(fileBlob.type)) {\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n } else {\r\n this.handleNonExcelFiles(fileUrl, actionId, fileName, fileExtension);\r\n }\r\n\r\n this.revokeObjectUrl(fileUrl);\r\n },\r\n error: (err) => console.error('Error al manejar el archivo:', err),\r\n });\r\n }\r\n\r\n private isExcelFile(fileType: string): boolean {\r\n return fileType.includes(\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\r\n );\r\n }\r\n\r\n private getFileExtension(fileType: string): string {\r\n return fileType.includes('pdf') ? '.pdf' : '.xlsx';\r\n }\r\n\r\n private handleNonExcelFiles(\r\n fileUrl: string,\r\n actionId: number,\r\n fileName: string,\r\n fileExtension: string\r\n ): void {\r\n switch (actionId) {\r\n case 0: // Abrir en nueva ventana\r\n window.open(fileUrl, '_blank');\r\n break;\r\n case 1: // Descargar archivo\r\n this.forceDownload(fileUrl, fileName + fileExtension);\r\n break;\r\n }\r\n }\r\n\r\n private forceDownload(fileUrl: string, fullFileName: string): void {\r\n const downloadLink = document.createElement('a');\r\n downloadLink.href = fileUrl;\r\n downloadLink.download = fullFileName;\r\n downloadLink.click();\r\n }\r\n\r\n private revokeObjectUrl(fileUrl: string): void {\r\n setTimeout(() => {\r\n window.URL.revokeObjectURL(fileUrl);\r\n }, 100);\r\n }\r\n\r\n /**\r\n * Muestra información en consola solo en desarrollo, permitiendo múltiples argumentos como console.log nativo.\r\n *\r\n * @param args - Argumentos a mostrar en consola (texto, objetos, etc).\r\n * @example\r\n * logIfNotProduction('Datos:', response);\r\n * logIfNotProduction('Error:', error, { extra: true });\r\n */\r\n logIfNotProduction(...args: any[]): void {\r\n if (!this.environment.production) {\r\n console.log(...args);\r\n }\r\n }\r\n\r\n /**\r\n * Marca todos los controles de un formulario como \"tocados\" y muestra un mensaje de alerta.\r\n * @param form - El formulario que se va a validar.\r\n */\r\n checkFormValid(form: FormGroup): void {\r\n // Marca todos los controles como tocados\r\n form.markAllAsTouched();\r\n\r\n // Muestra un mensaje de alerta\r\n this._serviceAlerta.toastrAlerts(\r\n 3,\r\n 'Formulario',\r\n 'Validaciones pendientes',\r\n 2\r\n );\r\n }\r\n\r\n /**\r\n * Obtiene valores únicos de un campo específico de un array de objetos\r\n * @param data Array de objetos de tipo T\r\n * @param field Campo del objeto del cual extraer valores únicos\r\n * @returns FilterOption[] Listado filtrado, tipado y ordenado alfabéticamente\r\n */\r\n getUniqueValues<T>(data: T[], field: keyof T): FilterOption[] {\r\n const uniqueValues = data.reduce((acc: FilterOption[], current) => {\r\n const fieldValue = current[field];\r\n\r\n if (\r\n typeof fieldValue === 'string' &&\r\n !acc.some((item) => item.value === fieldValue)\r\n ) {\r\n acc.push({\r\n value: fieldValue,\r\n field: field.toString(),\r\n });\r\n }\r\n return acc;\r\n }, []);\r\n\r\n return uniqueValues.sort((a, b) => a.value.localeCompare(b.value));\r\n }\r\n\r\n /**\r\n * Helper function para parsear fechas para filtro de primeNg en table\r\n * @param date - Fecha en formato string, Date o null/undefined\r\n * @returns Date | null - Objeto Date válido o null\r\n */\r\n parseDate(date: string | Date | null): Date | null {\r\n if (!date) return null;\r\n return typeof date === 'string' ? new Date(date) : date;\r\n }\r\n\r\n /**\r\n * Función pura que procesa una cadena de texto conteniendo números individuales y/o rangos numéricos,\r\n * devolviendo un array con todos los números expandidos.\r\n *\r\n * @param input - Cadena de texto con el formato: número[.número][.inicio-fin][...]\r\n * @returns Array de números con todos los valores individuales y rangos expandidos\r\n *\r\n * @example\r\n * // Uso básico\r\n * const result = parseNumericRanges('1.5.7.10-12');\r\n * // Retorna: [1, 5, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Con espacios y caracteres especiales\r\n * const result = parseNumericRanges(' 3. 5-7 .10-12abc');\r\n * // Retorna: [3, 5, 6, 7, 10, 11, 12]\r\n *\r\n * @example\r\n * // Rangos invertidos (serán ignorados)\r\n * const result = parseNumericRanges('10-8');\r\n * // Retorna: [] (array vacío)\r\n *\r\n * @note\r\n * Características especiales:\r\n * - Elimina automáticamente espacios y caracteres no numéricos\r\n * - Los números deben estar separados por puntos (.)\r\n * - Los rangos deben usar guión (-) sin espacios entre números\r\n * - Es tolerante a formatos inconsistentes\r\n * - Omite elementos inválidos sin generar errores\r\n */\r\n parseNumericRanges(input: string): number[] {\r\n const cleanString = input.replace(/[^\\d.\\- ]/g, '').replace(/\\s+/g, '');\r\n\r\n const parts = cleanString.split('.');\r\n const result: number[] = [];\r\n\r\n for (const part of parts) {\r\n if (!part) continue;\r\n\r\n if (part.includes('-')) {\r\n const [startStr, endStr] = part.split('-');\r\n const start = parseInt(startStr, 10);\r\n const end = parseInt(endStr, 10);\r\n\r\n if (!isNaN(start) && !isNaN(end) && start <= end) {\r\n for (let i = start; i <= end; i++) {\r\n result.push(i);\r\n }\r\n }\r\n } else {\r\n const number = parseInt(part, 10);\r\n if (!isNaN(number)) {\r\n result.push(number);\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Adaptador para procesar eventos de input y extraer rangos numéricos.\r\n *\r\n * @param event - Objeto Event del DOM, preferiblemente de un elemento input\r\n * @returns Array de números generado a partir del valor del input\r\n *\r\n * @example\r\n * // Uso en template Angular\r\n * <input (input)=\"processNumericRangesFromEvent($event)\">\r\n *\r\n * @example\r\n * // Uso directo\r\n * const result = processNumericRangesFromEvent(inputEvent);\r\n *\r\n * @note\r\n * Esta función es un wrapper que:\r\n * - Extrae el valor del input del evento\r\n * - Delega el procesamiento a parseNumericRanges()\r\n * - Mantiene compatibilidad con eventos de diferentes frameworks\r\n *\r\n * @dependencies\r\n * Requiere que el evento tenga la propiedad target.value (standard DOM)\r\n * Para otros tipos de eventos (ej. Angular Material) puede necesitar ajustes\r\n */\r\n processNumericRangesFromEvent(event: Event): number[] {\r\n const inputValue = (event.target as HTMLInputElement).value;\r\n return this.parseNumericRanges(inputValue);\r\n }\r\n\r\n /**\r\n * Maneja la respuesta estándar de una operación HTTP, mostrando alertas y realizando acciones comunes en formularios.\r\n *\r\n * @param response - Respuesta de la operación (debe tener isSuccess, title, statusMessage).\r\n * @param urlHome - Ruta a la que se navega si la operación es exitosa y el id es mayor a 0.\r\n * @param form - Formulario reactivo a resetear si la operación es exitosa.\r\n * @param getForm - Función para recargar el formulario (por ejemplo, para obtener datos actualizados).\r\n * @param id - Identificador usado para decidir si se navega a urlHome tras éxito.\r\n *\r\n * @example\r\n * // Uso típico en un componente\r\n * this.utilityAddService.handleResponse(\r\n * response,\r\n * '/home',\r\n * this.form,\r\n * () => this.getForm(),\r\n * this.id\r\n * );\r\n *\r\n * @description\r\n * - Si response.isSuccess es true:\r\n * - Muestra alerta tipo toastr.\r\n * - Si id > 0, navega a urlHome.\r\n * - Resetea el formulario y ejecuta getForm().\r\n * - Si response.isSuccess es false:\r\n * - Muestra alerta visual personalizada con icono de error.\r\n */\r\n public handleResponse(\r\n response: ResponseHttpModel,\r\n urlHome: string,\r\n form: FormGroup,\r\n getForm: () => void,\r\n id: number\r\n ): void {\r\n try {\r\n this.logIfNotProduction('handleResponse - response:', response);\r\n if (response.isSuccess) {\r\n this._serviceAlerta.toastrAlerts(\r\n 1,\r\n response.title,\r\n response.statusMessage,\r\n 2\r\n );\r\n if (id > 0) {\r\n this._router.navigate([urlHome]);\r\n }\r\n getForm();\r\n form?.reset();\r\n } else {\r\n this._serviceAlerta.alertaHtmlSuccess(\r\n response.title,\r\n response.statusMessage,\r\n {\r\n icono: 'icon2/hard_drive_error.png',\r\n showConfirmButton: true,\r\n }\r\n );\r\n }\r\n } catch (error) {\r\n this.logIfNotProduction('Error en handleResponse:', error);\r\n this._serviceAlerta.toastrAlerts(\r\n 4,\r\n 'Error',\r\n error instanceof Error ? error.message : String(error),\r\n 2\r\n );\r\n }\r\n }\r\n}\r\n","import { AbstractControl, FormGroup, ValidationErrors } from '@angular/forms';\r\n\r\n/**\r\n * Valida que el control contenga un rango de fechas válido (dos fechas no nulas y válidas).\r\n */\r\nexport function dateRangeValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const dates: Date[] = control.value;\r\n\r\n // Verificar si el valor es un array con exactamente dos elementos\r\n if (Array.isArray(dates) && dates.length === 2) {\r\n const [startDate, endDate] = dates;\r\n\r\n // Verificar que las fechas sean válidas y no nulas\r\n if (\r\n startDate &&\r\n endDate &&\r\n !isNaN(new Date(startDate).getTime()) &&\r\n !isNaN(new Date(endDate).getTime())\r\n ) {\r\n return null; // Válido\r\n } else {\r\n return {\r\n invalidDateRange: {\r\n message: 'Ambas fechas deben ser válidas y no nulas.',\r\n requiredLength: 2,\r\n },\r\n }; // Error si alguna fecha es nula o inválida\r\n }\r\n }\r\n\r\n return null; // Si el control no contiene un array válido, no hay error\r\n}\r\n\r\n/**\r\n * Valida que una fecha única esté dentro de un rango mínimo y máximo.\r\n * @param minDate Fecha mínima permitida.\r\n * @param maxDate Fecha máxima permitida.\r\n */\r\nexport function dateMinMaxValidator(minDate: Date, maxDate: Date) {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const date: Date = control.value;\r\n\r\n // Verificar si el valor es una fecha válida\r\n if (date && !isNaN(new Date(date).getTime())) {\r\n const currentDate = new Date(date);\r\n\r\n // Validar si la fecha está fuera del rango permitido\r\n if (currentDate < minDate || currentDate > maxDate) {\r\n return {\r\n dateNotRange: {\r\n message: `La fecha debe estar entre ${minDate.toLocaleDateString()} y ${maxDate.toLocaleDateString()}`,\r\n minDate: minDate.toISOString(),\r\n maxDate: maxDate.toISOString(),\r\n },\r\n };\r\n }\r\n\r\n return null; // Fecha válida y dentro del rango\r\n }\r\n\r\n return null;\r\n };\r\n}\r\n\r\n/**\r\n * Valida que al menos uno de los campos especificados esté lleno.\r\n * @param fields Los nombres de los campos a validar.\r\n */\r\nexport function atLeastOneFieldRequiredValidator(fields: string[]) {\r\n return (formGroup: AbstractControl): ValidationErrors | null => {\r\n // Obtener el FormGroup para poder acceder a los controles\r\n const form = formGroup as FormGroup;\r\n\r\n // Verificar si al menos uno de los campos tiene un valor\r\n const isAnyFieldFilled = fields.some((field) => {\r\n const control = form.get(field);\r\n return control?.value !== null && control?.value !== '';\r\n });\r\n\r\n // Si al menos un campo tiene un valor, la validación es exitosa\r\n if (isAnyFieldFilled) {\r\n return null; // Validación pasada\r\n } else {\r\n // Construir el mensaje dinámico con los campos no llenados\r\n const emptyFields = fields.filter((field) => {\r\n const control = form.get(field);\r\n return control?.value === null || control?.value === '';\r\n });\r\n\r\n const fieldNames = emptyFields.join(', ');\r\n const message = `Debe completar al menos uno de los siguientes campos: ${fieldNames}.`;\r\n\r\n // Si ninguno tiene valor, devolver el mensaje con el error\r\n return {\r\n atLeastOneRequired: {\r\n message: message,\r\n },\r\n };\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un NIT (Número de Identificación Tributaria) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del NIT.\r\n * @returns Un objeto de error si el NIT no es válido, o `null` si el NIT es válido.\r\n */\r\nexport function nitValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const nit = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!nit) {\r\n return null;\r\n }\r\n\r\n // Validar el NIT utilizando la función NITCorrecto\r\n const esValido = NITCorrecto(nit);\r\n\r\n // Si el NIT no es válido, retornar un objeto de error con el formato deseado\r\n if (!esValido) {\r\n return {\r\n invalidNIT: {\r\n message: 'El NIT ingresado no es válido.', // Mensaje de error personalizado\r\n requiredLength: nit.length, // Longitud del NIT ingresado (opcional)\r\n },\r\n };\r\n }\r\n\r\n // Si el NIT es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función auxiliar para validar un NIT según un algoritmo específico.\r\n *\r\n * @param nit - El NIT a validar.\r\n * @returns `true` si el NIT es válido, `false` en caso contrario.\r\n */\r\nfunction NITCorrecto(nit: string): boolean {\r\n try {\r\n const largo = nit.length;\r\n // Invertir el NIT (excepto el último dígito) para facilitar el cálculo\r\n const validar = nit\r\n .substring(0, largo - 1)\r\n .split('')\r\n .reverse()\r\n .join('');\r\n const cadena = validar.split('');\r\n const comparador = nit.substring(largo - 1, largo); // Último dígito del NIT\r\n let posicion = 2; // Factor de ponderación inicial\r\n let sumaValidar = 0; // Acumulador para la suma ponderada\r\n\r\n // Calcular la suma ponderada de los dígitos del NIT\r\n for (const c of cadena) {\r\n sumaValidar += parseInt(c, 10) * posicion;\r\n posicion += 1;\r\n }\r\n\r\n // Calcular el residuo de la operación de validación\r\n const residuo = operacionValidar(11 - operacionValidar(sumaValidar));\r\n\r\n // Validar el NIT según el residuo y el último dígito\r\n if (residuo === 10 && comparador.toUpperCase() === 'K') {\r\n return true; // El NIT es válido si el residuo es 10 y el último dígito es 'K'\r\n } else if (residuo.toString() === comparador) {\r\n return true; // El NIT es válido si el residuo coincide con el último dígito\r\n } else {\r\n return false; // El NIT no es válido\r\n }\r\n } catch (error) {\r\n // Si ocurre un error durante la validación, el NIT no es válido\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Función auxiliar para calcular el residuo de una operación aritmética.\r\n *\r\n * @param valor - El valor sobre el cual se calculará el residuo.\r\n * @returns El residuo de la división del valor entre 11.\r\n */\r\nfunction operacionValidar(valor: number): number {\r\n return valor % 11;\r\n}\r\n\r\n/**\r\n * Validador personalizado para verificar si un CUI (Código Único de Identificación) es válido.\r\n * Este validador se puede usar en formularios reactivos de Angular.\r\n *\r\n * @param control - El control del formulario que contiene el valor del CUI.\r\n * @returns Un objeto de error si el CUI no es válido, o `null` si el CUI es válido.\r\n */\r\nexport function cuiValidator(\r\n control: AbstractControl\r\n): ValidationErrors | null {\r\n const cui = control.value;\r\n\r\n // Si el campo está vacío, no hay error\r\n if (!cui) {\r\n return null;\r\n }\r\n\r\n // Validar el CUI\r\n const esValido = CUICorrecto(cui);\r\n\r\n // Si el CUI no es válido, retornar un objeto de error\r\n if (!esValido) {\r\n return {\r\n invalidCUI: {\r\n message: 'El CUI ingresado no es válido.',\r\n requiredLength: 13,\r\n actualLength: cui.length,\r\n },\r\n };\r\n }\r\n\r\n // Si el CUI es válido, retornar null (sin errores)\r\n return null;\r\n}\r\n\r\n/**\r\n * Función que implementa el algoritmo de validación del CUI\r\n * @param cui Número de CUI a validar (debe tener 13 dígitos)\r\n * @returns boolean indicando si el CUI es válido\r\n */\r\nfunction CUICorrecto(cui: string | number): boolean {\r\n // Convertir a string si es número\r\n const cuiStr = typeof cui === 'number' ? cui.toString() : cui;\r\n\r\n // Validar longitud y que sean solo dígitos\r\n if (cuiStr.length !== 13 || !/^\\d+$/.test(cuiStr)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const primeros8 = cuiStr.substring(0, 8);\r\n const digitoVerificador = parseInt(cuiStr.substring(8, 9), 10);\r\n let suma = 0;\r\n\r\n // Calcular la suma ponderada\r\n for (let i = 0; i < primeros8.length; i++) {\r\n const digito = parseInt(primeros8[i], 10);\r\n suma += digito * (i + 2); // Los pesos son 2, 3, 4, ..., 9\r\n }\r\n\r\n // Calcular residuo y validar\r\n const residuo = suma % 11;\r\n return residuo === digitoVerificador;\r\n } catch (error) {\r\n console.error('Error validando CUI:', error);\r\n return false;\r\n }\r\n}\r\n","/*\r\n * Public API Surface of ngx-dsx\r\n */\r\nexport * from './lib/components';\r\nexport * from './lib/components/icon-dsx/icon-dsx.component';\r\nexport * from './lib/components/json-values-debuj/json-values-debuj.component';\r\nexport * from './lib/components/loading-lottie/loading-lottie.component';\r\nexport * from './lib/components/loading/loading.component';\r\nexport * from './lib/components/navbar-dsx/navbar-dsx.component';\r\nexport * from './lib/directives/only-rango-pattern.directive';\r\nexport * from './lib/directives/select-all-on-focus.directive';\r\nexport * from './lib/injections/cache.token';\r\nexport {\r\n ENVIRONMENT,\r\n provideEnvironment,\r\n validateEnvironmentConfig,\r\n type EnvironmentConfig,\r\n} from './lib/injections/environment.token';\r\nexport * from './lib/injections/parameterSecurity';\r\nexport * from './lib/interceptors/http-authorize.interceptor';\r\nexport * from './lib/models';\r\nexport * from './lib/models/src/parameterSecurity.model';\r\nexport * from './lib/modules/src/dsx-add-tools.module';\r\nexport * from './lib/modules/src/prime-ng.module';\r\nexport * from './lib/pipe';\r\nexport * from './lib/services/alerta.service';\r\nexport * from './lib/services/authorize.service';\r\nexport * from './lib/services/cache.provider';\r\nexport * from './lib/services/cache.service';\r\nexport * from './lib/services/endpoint.service';\r\nexport * from './lib/services/error-handler.service';\r\nexport * from './lib/services/parameter-values.service';\r\nexport * from './lib/services/security.service';\r\nexport * from './lib/services/utility-add.service';\r\nexport * from './lib/validations/addons.validators';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i1.IconDsxService","i2"],"mappings":"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"}
|