{"version":3,"file":"kif-lib-date-utils.mjs","sources":["../../../projects/kif-lib/date-utils/interfaces/index.ts","../../../projects/kif-lib/date-utils/enums/date-error-type.enum.ts","../../../projects/kif-lib/date-utils/enums/date-format.enum.ts","../../../projects/kif-lib/date-utils/enums/display-context.enum.ts","../../../projects/kif-lib/date-utils/enums/index.ts","../../../projects/kif-lib/date-utils/iso8601-parser.ts","../../../projects/kif-lib/date-utils/utils/date.type-guards.ts","../../../projects/kif-lib/date-utils/services/date-time-util.service.ts","../../../projects/kif-lib/date-utils/services/index.ts","../../../projects/kif-lib/date-utils/utils/index.ts","../../../projects/kif-lib/date-utils/public-api.ts","../../../projects/kif-lib/date-utils/kif-lib-date-utils.ts"],"sourcesContent":["/**\n * Barrel export para todas las interfaces de date-utils\n */\nexport * from './date-value.interface';\nexport * from './date-display-config.interface';\nexport * from './parsed-date.interface';\nexport * from './date-error.interface';","/**\n * Enum que define los tipos de errores posibles en operaciones de fecha\n */\nexport enum DateErrorType {\n  /** Error de formato inválido */\n  INVALID_FORMAT = 'INVALID_FORMAT',\n  \n  /** Error de fecha inválida (ej: 31 de febrero) */\n  INVALID_DATE = 'INVALID_DATE',\n  \n  /** Error de zona horaria inválida */\n  INVALID_TIMEZONE = 'INVALID_TIMEZONE',\n  \n  /** Error general de parsing */\n  PARSE_ERROR = 'PARSE_ERROR',\n  \n  /** Advertencia de performance */\n  PERFORMANCE_WARNING = 'PERFORMANCE_WARNING'\n}","/**\n * Enum que define los formatos de fecha soportados por el sistema\n */\nexport enum DateFormat {\n  /** Formato día-mes-año con guiones */\n  DD_MM_YYYY_DASH = 'dd-MM-yyyy',\n  \n  /** Formato día/mes/año con barras */\n  DD_MM_YYYY_SLASH = 'dd/MM/yyyy',\n  \n  /** Formato mes/día/año con barras (formato US) */\n  MM_DD_YYYY_SLASH = 'MM/dd/yyyy',\n  \n  /** Formato año-mes-día con guiones (ISO básico) */\n  YYYY_MM_DD_DASH = 'yyyy-MM-dd',\n  \n  /** Formato ISO 8601 completo */\n  ISO = 'iso',\n  \n  /** Timestamp numérico */\n  TIMESTAMP = 'timestamp'\n}","/**\n * Enum que define los contextos de visualización para el componente DateDisplay\n */\nexport enum DisplayContext {\n  /** Contexto de formulario */\n  FORM = 'form',\n  \n  /** Contexto de tabla/grid */\n  TABLE = 'table',\n  \n  /** Contexto inline/texto */\n  INLINE = 'inline'\n}","/**\n * Barrel export para todos los enums de date-utils\n */\nexport * from './date-error-type.enum';\nexport * from './date-format.enum';\nexport * from './display-context.enum';","/**\n * Clase para parsing y formateo de fechas ISO 8601 con validación completa\n * Implementa validación estricta de formato y rangos de timezone\n */\n\nimport { ParsedDate } from './interfaces/parsed-date.interface';\nimport { DateError } from './interfaces/date-error.interface';\nimport { DateErrorType } from './enums/date-error-type.enum';\n\nexport class ISO8601Parser {\n  /**\n   * Regex para validación completa de formato ISO 8601\n   * Soporta:\n   * - Fecha sola: YYYY-MM-DD\n   * - Fecha con tiempo: YYYY-MM-DDTHH:mm:ss\n   * - Con milisegundos: YYYY-MM-DDTHH:mm:ss.sss\n   * - Con timezone: Z o ±HH:MM\n   */\n  private static readonly ISO_REGEX = /^(\\d{4})-(\\d{2})-(\\d{2})(?:T(\\d{2}):(\\d{2}):(\\d{2})(?:\\.(\\d{3}))?(?:(Z)|([+-])(\\d{2}):(\\d{2})))?$/;\n\n  /**\n   * Rangos válidos para componentes de fecha\n   */\n  private static readonly VALID_RANGES = {\n    month: { min: 1, max: 12 },\n    day: { min: 1, max: 31 },\n    hour: { min: 0, max: 23 },\n    minute: { min: 0, max: 59 },\n    second: { min: 0, max: 59 },\n    millisecond: { min: 0, max: 999 },\n    timezoneHours: { min: 0, max: 14 },\n    timezoneMinutes: { min: 0, max: 59 }\n  };\n\n  /**\n   * Días por mes (considerando año bisiesto)\n   */\n  private static readonly DAYS_IN_MONTH = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n  /**\n   * Parsea una cadena ISO 8601 en sus componentes estructurados\n   * @param isoString Cadena en formato ISO 8601\n   * @returns ParsedDate si es válida, DateError si hay errores\n   */\n  static parse(isoString: string): ParsedDate | DateError {\n    if (!isoString || typeof isoString !== 'string') {\n      return {\n        type: DateErrorType.INVALID_FORMAT,\n        message: 'La entrada debe ser una cadena no vacía',\n        input: isoString\n      };\n    }\n\n    const match = this.ISO_REGEX.exec(isoString.trim());\n    if (!match) {\n      return {\n        type: DateErrorType.INVALID_FORMAT,\n        message: 'Formato ISO 8601 inválido. Esperado: YYYY-MM-DD[THH:mm:ss[.sss][Z|±HH:MM]]',\n        input: isoString,\n        position: 0\n      };\n    }\n\n    try {\n      const [\n        , // match completo\n        yearStr,\n        monthStr,\n        dayStr,\n        hourStr,\n        minuteStr,\n        secondStr,\n        millisecondStr,\n        zulu,\n        timezoneSign,\n        timezoneHoursStr,\n        timezoneMinutesStr\n      ] = match;\n\n      // Parsear componentes básicos\n      const year = parseInt(yearStr, 10);\n      const month = parseInt(monthStr, 10);\n      const day = parseInt(dayStr, 10);\n\n      // Validar año (rango razonable)\n      if (year < 1900 || year > 2100) {\n        return {\n          type: DateErrorType.INVALID_DATE,\n          message: `Año fuera del rango válido (1900-2100): ${year}`,\n          input: isoString,\n          position: 0\n        };\n      }\n\n      // Validar mes\n      if (month < this.VALID_RANGES.month.min || month > this.VALID_RANGES.month.max) {\n        return {\n          type: DateErrorType.INVALID_DATE,\n          message: `Mes inválido: ${month}. Debe estar entre 1 y 12`,\n          input: isoString,\n          position: 5\n        };\n      }\n\n      // Validar día considerando el mes y año bisiesto\n      const maxDaysInMonth = this.getMaxDaysInMonth(month, year);\n      if (day < this.VALID_RANGES.day.min || day > maxDaysInMonth) {\n        return {\n          type: DateErrorType.INVALID_DATE,\n          message: `Día inválido: ${day}. Para ${month}/${year} debe estar entre 1 y ${maxDaysInMonth}`,\n          input: isoString,\n          position: 8\n        };\n      }\n\n      const parsedDate: ParsedDate = { year, month, day };\n\n      // Procesar componentes de tiempo si están presentes\n      if (hourStr !== undefined) {\n        const hour = parseInt(hourStr, 10);\n        const minute = parseInt(minuteStr, 10);\n        const second = parseInt(secondStr, 10);\n\n        // Validar hora\n        if (hour < this.VALID_RANGES.hour.min || hour > this.VALID_RANGES.hour.max) {\n          return {\n            type: DateErrorType.INVALID_DATE,\n            message: `Hora inválida: ${hour}. Debe estar entre 0 y 23`,\n            input: isoString,\n            position: 11\n          };\n        }\n\n        // Validar minutos\n        if (minute < this.VALID_RANGES.minute.min || minute > this.VALID_RANGES.minute.max) {\n          return {\n            type: DateErrorType.INVALID_DATE,\n            message: `Minutos inválidos: ${minute}. Debe estar entre 0 y 59`,\n            input: isoString,\n            position: 14\n          };\n        }\n\n        // Validar segundos\n        if (second < this.VALID_RANGES.second.min || second > this.VALID_RANGES.second.max) {\n          return {\n            type: DateErrorType.INVALID_DATE,\n            message: `Segundos inválidos: ${second}. Debe estar entre 0 y 59`,\n            input: isoString,\n            position: 17\n          };\n        }\n\n        parsedDate.hour = hour;\n        parsedDate.minute = minute;\n        parsedDate.second = second;\n\n        // Procesar milisegundos si están presentes\n        if (millisecondStr !== undefined) {\n          const millisecond = parseInt(millisecondStr, 10);\n          if (millisecond < this.VALID_RANGES.millisecond.min || millisecond > this.VALID_RANGES.millisecond.max) {\n            return {\n              type: DateErrorType.INVALID_DATE,\n              message: `Milisegundos inválidos: ${millisecond}. Debe estar entre 0 y 999`,\n              input: isoString,\n              position: 20\n            };\n          }\n          parsedDate.millisecond = millisecond;\n        }\n\n        // Procesar timezone si está presente\n        if (zulu) {\n          // UTC (Z)\n          parsedDate.timezoneOffset = {\n            sign: '+',\n            hours: 0,\n            minutes: 0\n          };\n        } else if (timezoneSign && timezoneHoursStr && timezoneMinutesStr) {\n          const timezoneHours = parseInt(timezoneHoursStr, 10);\n          const timezoneMinutes = parseInt(timezoneMinutesStr, 10);\n\n          // Validar rangos de timezone\n          const timezoneValidation = this.validateTimezoneOffset(timezoneSign as '+' | '-', timezoneHours, timezoneMinutes);\n          if (timezoneValidation !== null) {\n            return {\n              type: DateErrorType.INVALID_TIMEZONE,\n              message: timezoneValidation,\n              input: isoString,\n              position: isoString.lastIndexOf(timezoneSign)\n            };\n          }\n\n          parsedDate.timezoneOffset = {\n            sign: timezoneSign as '+' | '-',\n            hours: timezoneHours,\n            minutes: timezoneMinutes\n          };\n        }\n      }\n\n      return parsedDate;\n\n    } catch (error) {\n      return {\n        type: DateErrorType.PARSE_ERROR,\n        message: `Error interno de parsing: ${error instanceof Error ? error.message : 'Error desconocido'}`,\n        input: isoString\n      };\n    }\n  }\n\n  /**\n   * Formatea un objeto ParsedDate de vuelta a cadena ISO 8601\n   * @param parsedDate Objeto con componentes de fecha estructurados\n   * @returns Cadena ISO 8601 válida\n   */\n  static format(parsedDate: ParsedDate): string {\n    if (!parsedDate || typeof parsedDate !== 'object') {\n      throw new Error('ParsedDate debe ser un objeto válido');\n    }\n\n    // Validar componentes requeridos\n    if (!this.isValidNumber(parsedDate.year) || \n        !this.isValidNumber(parsedDate.month) || \n        !this.isValidNumber(parsedDate.day)) {\n      throw new Error('ParsedDate debe tener year, month y day válidos');\n    }\n\n    // Formatear fecha base (YYYY-MM-DD)\n    let result = `${parsedDate.year.toString().padStart(4, '0')}-${parsedDate.month.toString().padStart(2, '0')}-${parsedDate.day.toString().padStart(2, '0')}`;\n\n    // Agregar tiempo si está presente\n    if (this.isValidNumber(parsedDate.hour) && \n        this.isValidNumber(parsedDate.minute) && \n        this.isValidNumber(parsedDate.second)) {\n      \n      result += `T${parsedDate.hour.toString().padStart(2, '0')}:${parsedDate.minute.toString().padStart(2, '0')}:${parsedDate.second.toString().padStart(2, '0')}`;\n\n      // Agregar milisegundos si están presentes\n      if (this.isValidNumber(parsedDate.millisecond)) {\n        result += `.${parsedDate.millisecond.toString().padStart(3, '0')}`;\n      }\n\n      // Agregar timezone si está presente\n      if (parsedDate.timezoneOffset) {\n        const { sign, hours, minutes } = parsedDate.timezoneOffset;\n        if (sign === '+' && hours === 0 && minutes === 0) {\n          result += 'Z';\n        } else {\n          result += `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n        }\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Obtiene el número máximo de días en un mes considerando años bisiestos\n   */\n  private static getMaxDaysInMonth(month: number, year: number): number {\n    if (month === 2 && this.isLeapYear(year)) {\n      return 29;\n    }\n    return this.DAYS_IN_MONTH[month - 1];\n  }\n\n  /**\n   * Determina si un año es bisiesto\n   */\n  private static isLeapYear(year: number): boolean {\n    return (year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0);\n  }\n\n  /**\n   * Valida el offset de timezone según los rangos permitidos (-12:00 a +14:00)\n   */\n  private static validateTimezoneOffset(sign: '+' | '-', hours: number, minutes: number): string | null {\n    // Validar rangos básicos\n    if (hours < this.VALID_RANGES.timezoneHours.min || hours > this.VALID_RANGES.timezoneHours.max) {\n      return `Horas de timezone inválidas: ${hours}. Debe estar entre 0 y 14`;\n    }\n\n    if (minutes < this.VALID_RANGES.timezoneMinutes.min || minutes > this.VALID_RANGES.timezoneMinutes.max) {\n      return `Minutos de timezone inválidos: ${minutes}. Debe estar entre 0 y 59`;\n    }\n\n    // Calcular offset total en minutos\n    const totalMinutes = hours * 60 + minutes;\n    const signedMinutes = sign === '+' ? totalMinutes : -totalMinutes;\n\n    // Rangos válidos: -12:00 (-720 min) a +14:00 (+840 min)\n    const MIN_OFFSET = -12 * 60; // -720 minutos\n    const MAX_OFFSET = 14 * 60;  // +840 minutos\n\n    if (signedMinutes < MIN_OFFSET || signedMinutes > MAX_OFFSET) {\n      const offsetStr = `${sign}${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;\n      return `Offset de timezone fuera del rango válido (-12:00 a +14:00): ${offsetStr}`;\n    }\n\n    // Validaciones especiales para offsets límite\n    if (hours === 14 && minutes > 0) {\n      return `Offset +14:00 es el máximo permitido, no se permiten minutos adicionales`;\n    }\n\n    if (sign === '-' && hours === 12 && minutes > 0) {\n      return `Offset -12:00 es el mínimo permitido, no se permiten minutos adicionales`;\n    }\n\n    return null; // Válido\n  }\n\n  /**\n   * Verifica si un valor es un número válido\n   */\n  private static isValidNumber(value: any): value is number {\n    return typeof value === 'number' && !isNaN(value) && isFinite(value);\n  }\n}","import { DateError } from '../interfaces';\n\n/**\n * Type guard para verificar si un objeto es DateError\n * @param obj Objeto a verificar\n * @returns true si es DateError, false en caso contrario\n */\nexport function isDateError(obj: any): obj is DateError {\n  return obj && typeof obj === 'object' && 'type' in obj && 'message' in obj;\n}\n","import { Injectable } from '@angular/core';\nimport { DateValue, DateError, ParsedDate } from '../interfaces';\nimport { DateErrorType } from '../enums';\nimport { ISO8601Parser } from '../iso8601-parser';\nimport { isDateError } from '../utils/date.type-guards';\n\n@Injectable({ providedIn: 'root' })\nexport class DateTimeUtil {\n\n  private readonly userTimezone: string;\n\n  constructor() {\n    this.userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n  }\n\n  // ─── CONFIGURACIÓN DE TIMEZONE ──────────────────────────────────────────\n\n  /**\n   * Verifica si la configuración de timezone ya está en localStorage\n   * Usado en APP_INITIALIZER para evitar consultas duplicadas\n   */\n  isTimezoneConfigLoaded(): boolean {\n    const APP_TZ_KEYS = {\n      DEFAULT_TZ: 'APP_DEFAULT_TZ',\n      TIMEZONE_LABEL: 'APP_TIMEZONE_LABEL'\n    };\n    return !!localStorage.getItem(APP_TZ_KEYS.DEFAULT_TZ) &&\n      !!localStorage.getItem(APP_TZ_KEYS.TIMEZONE_LABEL);\n  }\n\n  /**\n   * Guarda la configuración de timezone en localStorage\n   * Llamado por Shell y por MF cuando corre standalone\n   */\n  setTimezoneConfig(defaultTZ: string, timezoneLabel: string): void {\n    const APP_TZ_KEYS = {\n      DEFAULT_TZ: 'APP_DEFAULT_TZ',\n      TIMEZONE_LABEL: 'APP_TIMEZONE_LABEL'\n    };\n    if (defaultTZ) {\n      localStorage.setItem(APP_TZ_KEYS.DEFAULT_TZ, defaultTZ);\n    }\n    if (timezoneLabel) {\n      localStorage.setItem(APP_TZ_KEYS.TIMEZONE_LABEL, timezoneLabel);\n    }\n  }\n\n  /**\n   * Obtiene la timezone IANA del back (ej: \"America/Santiago\")\n   * Si no está configurada, retorna el fallback\n   */\n  getDefaultTZ(): string {\n    const APP_TZ_KEYS = {\n      DEFAULT_TZ: 'APP_DEFAULT_TZ',\n      TIMEZONE_LABEL: 'APP_TIMEZONE_LABEL'\n    };\n    return localStorage.getItem(APP_TZ_KEYS.DEFAULT_TZ) ?? 'America/Santiago';\n  }\n\n  /**\n   * Obtiene el label base del timezone del back (ej: \"Hora de Chile\")\n   * Si no está configurado, retorna el fallback\n   */\n  private getTimezoneBaseLabel(): string {\n    const APP_TZ_KEYS = {\n      DEFAULT_TZ: 'APP_DEFAULT_TZ',\n      TIMEZONE_LABEL: 'APP_TIMEZONE_LABEL'\n    };\n    return localStorage.getItem(APP_TZ_KEYS.TIMEZONE_LABEL) ?? 'Hora de Chile';\n  }\n\n  /**\n   * Construye el label completo del flag de timezone\n   * Ejemplo: \"Hora de Chile\" + \"UTC-4\" → \"Hora de Chile (UTC-4)\"\n   * Retorna string vacío si isoString es null/undefined\n   */\n  getTimezoneLabel(isoString: string | null | undefined): string {\n    if (!isoString || typeof isoString !== 'string') {\n      return '';\n    }\n    const offset = this.getBackendOffset(isoString);\n    const label = this.getTimezoneBaseLabel();\n    return `${label} (${offset})`;\n  }\n\n  // ─── CONVERSIÓN A ISO ────────────────────────────────────────────────────\n\n  /**\n   * Convierte cualquier formato de entrada a ISO 8601.\n   * type explícito SIEMPRE tiene prioridad sobre attributeName.\n   */\n  toISO(\n    value: string | Date | number | DateValue,\n    type?: 'date' | 'datetime',\n    attributeName?: string\n  ): string | DateError {\n    // Determinar tipo — explícito gana siempre\n    const resolvedType = type ?? (attributeName ? this.inferTypeFromAttributeName(attributeName) : null);\n\n    if (!resolvedType) {\n      return this.err(DateErrorType.INVALID_FORMAT,\n        'No se puede determinar el tipo. Use type explícito o attributeName con sufijo Date/DateTime',\n        String(value));\n    }\n\n    const parsed = this.parseAny(value);\n    if (isDateError(parsed)) return parsed;\n\n    // datetime sin hora → error, nunca inventar\n    if (resolvedType === 'datetime' && parsed.hour === undefined) {\n      return this.err(DateErrorType.INVALID_FORMAT,\n        'Para datetime se requiere componente de hora en el input. No se agrega hora automáticamente.',\n        String(value));\n    }\n\n    return this.formatISO(parsed, resolvedType);\n  }\n\n  // ─── VISUALIZACIÓN ────────────────────────────────────────────────────\n\n  /**\n   * Convierte ISO a dd/MM/yyyy para mostrar en pantalla.\n   * Retorna DateError si el string es inválido — nunca silencia errores.\n   */\n  toDisplay(isoString: string): string | DateError {\n    if (!isoString || typeof isoString !== 'string') {\n      return this.err(DateErrorType.INVALID_FORMAT, 'Debe ser un string ISO 8601', isoString);\n    }\n    const parsed = ISO8601Parser.parse(isoString);\n    if (isDateError(parsed)) return parsed;\n    return `${String(parsed.day).padStart(2, '0')}/${String(parsed.month).padStart(2, '0')}/${parsed.year}`;\n  }\n\n  /**\n   * Convierte ISO a dd/MM/yyyy HH:mm para mostrar en pantalla con hora.\n   * Retorna DateError si el string es inválido — nunca silencia errores.\n   */\n  toDisplayWithTime(isoString: string): string | DateError {\n    if (!isoString || typeof isoString !== 'string') {\n      return this.err(DateErrorType.INVALID_FORMAT, 'Debe ser un string ISO 8601', isoString);\n    }\n    const parsed = ISO8601Parser.parse(isoString);\n    if (isDateError(parsed)) return parsed;\n    const date = `${String(parsed.day).padStart(2, '0')}/${String(parsed.month).padStart(2, '0')}/${parsed.year}`;\n    if (parsed.hour !== undefined && parsed.minute !== undefined) {\n      const time = `${String(parsed.hour).padStart(2, '0')}:${String(parsed.minute).padStart(2, '0')}`;\n      return `${date} ${time}`;\n    }\n    return date;\n  }\n\n  /**\n   * Convierte ISO a dd/MM/yyyy o dd/MM/yyyy HH:mm automáticamente.\n   * Muestra hora solo si la timezone del backend difiere de la del usuario.\n   * Retorna DateError si el string es inválido — nunca silencia errores.\n   */\n  toDisplayAuto(isoString: string): string | DateError {\n    if (!isoString || typeof isoString !== 'string') {\n      return this.err(DateErrorType.INVALID_FORMAT, 'Debe ser un string ISO 8601', isoString);\n    }\n    const parsed = ISO8601Parser.parse(isoString);\n    if (isDateError(parsed)) return parsed;\n    const date = `${String(parsed.day).padStart(2, '0')}/${String(parsed.month).padStart(2, '0')}/${parsed.year}`;\n    if (!this.isSameTimezone(isoString) && parsed.hour !== undefined) {\n      const h = String(parsed.hour).padStart(2, '0');\n      const m = String(parsed.minute ?? 0).padStart(2, '0');\n      return `${date} ${h}:${m}`;\n    }\n    return date;\n  }\n\n  // ─── TIMEZONE ─────────────────────────────────────────────────────────\n\n  /**\n   * Extrae el offset ±HH:MM del ISO string.\n   */\n  getTimezoneOffset(isoString: string | null | undefined): string | null {\n    if (!isoString || typeof isoString !== 'string') return null;\n    const m = isoString.match(/([+-]\\d{2}:\\d{2}|Z)$/);\n    if (!m) return null;\n    return m[1] === 'Z' ? '+00:00' : m[1];\n  }\n\n  /**\n   * Convierte offset ±HH:MM a formato legible \"UTC-4\".\n   */\n  getBackendOffset(isoString: string | null | undefined): string {\n    if (!isoString || typeof isoString !== 'string') return '';\n    const offset = this.getTimezoneOffset(isoString);\n    if (!offset) return '';\n    const m = offset.match(/([+-])(\\d{2}):(\\d{2})/);\n    if (!m) return offset;\n    const hours = parseInt(m[2], 10);\n    const minutes = parseInt(m[3], 10);\n    const minutePart = minutes > 0 ? `:${String(minutes).padStart(2, '0')}` : '';\n    return `UTC${m[1]}${hours}${minutePart}`;\n  }\n\n  /**\n   * Compara timezone del ISO (back) con la del usuario (browser).\n   * true = misma zona → no mostrar flag\n   * false = diferente → mostrar flag\n   */\n  isSameTimezone(isoString: string | null | undefined): boolean {\n    if (!isoString || typeof isoString !== 'string') return true;\n    const backOffset = this.getTimezoneOffset(isoString);\n    if (!backOffset) return true;\n    const userOffset = this.currentUserOffset();\n    return backOffset === userOffset;\n  }\n\n  // ─── DATEPICKER ───────────────────────────────────────────────────────\n\n  /**\n   * Convierte ISO a Date object para pintarlo en MatDatepicker.\n   * \n   * IMPORTANTE: Extrae componentes directamente del ISO string sin ajuste de timezone.\n   * Esto garantiza que:\n   * - El picker muestra la fecha correcta (ej: 30/12/1993)\n   * - getDate() devuelve el día correcto al guardar (ej: 30)\n   * - No hay cambio de día por diferencia de timezone entre backend y usuario\n   * \n   * Ejemplo:\n   * - ISO: \"1993-12-30T00:00:00.000-04:00\" (Chile UTC-4)\n   * - parsed.day = 30\n   * - new Date(1993, 11, 30, 0, 0, 0, 0) → picker muestra 30/12/1993 ✅\n   * - date.getDate() → 30 siempre ✅\n   */\n  toDateObject(isoString: string): Date | DateError {\n    if (!isoString || typeof isoString !== 'string') {\n      return this.err(DateErrorType.INVALID_FORMAT, 'Debe ser string ISO 8601', isoString);\n    }\n\n    const parsed = ISO8601Parser.parse(isoString);\n    if (isDateError(parsed)) return parsed;\n\n    // Crear Date con componentes directos del ISO string\n    // sin ajuste de timezone — el picker muestra la fecha correcta\n    // Y getDate() devuelve el día correcto al guardar\n    return new Date(\n      parsed.year,\n      parsed.month - 1,\n      parsed.day,\n      parsed.hour ?? 0,\n      parsed.minute ?? 0,\n      parsed.second ?? 0,\n      parsed.millisecond ?? 0\n    );\n  }\n\n  /**\n   * Convierte ISO 8601 a Date object para MatDatepicker, garantizando que muestre la fecha exacta del backend.\n   * \n   * IMPORTANTE: Ahora que toDateObject() extrae componentes directamente del ISO string,\n   * este método simplemente delega a toDateObject() sin necesidad de ajustes adicionales.\n   * \n   * @param isoString ISO 8601 con offset (ej: \"2026-05-20T00:00:00.000-04:00\")\n   * @returns Date object que se mostrará correctamente en MatDatepicker\n   */\n  toDateObjectForDatepicker(isoString: string): Date | DateError {\n    // Delegar a toDateObject() que ya maneja la extracción correcta\n    return this.toDateObject(isoString);\n  }\n\n  /**\n   * Convierte el Date object del MatDatepicker a ISO 8601.\n   * NUNCA usa hora actual — extrae exactamente lo que trae el Date object.\n   */\n  fromDatepicker(\n    dateValue: Date | string,\n    type: 'date' | 'datetime',\n    attributeName?: string\n  ): string | DateError {\n    if (!dateValue) {\n      return this.err(DateErrorType.INVALID_DATE, 'Valor de datepicker es null o undefined');\n    }\n\n    const date = dateValue instanceof Date ? dateValue : new Date(dateValue);\n    if (isNaN(date.getTime())) {\n      return this.err(DateErrorType.INVALID_DATE, 'Fecha inválida desde datepicker', String(dateValue));\n    }\n\n    const resolvedType = type ?? (attributeName ? this.inferTypeFromAttributeName(attributeName) : 'date');\n    const year = date.getFullYear();\n    const month = String(date.getMonth() + 1).padStart(2, '0');\n    const day = String(date.getDate()).padStart(2, '0');\n\n    if (resolvedType === 'date') {\n      return `${year}-${month}-${day}`;\n    }\n\n    // datetime: usar fecha y hora del Date object, con offset del usuario\n    const h = String(date.getHours()).padStart(2, '0');\n    const min = String(date.getMinutes()).padStart(2, '0');\n    const sec = String(date.getSeconds()).padStart(2, '0');\n    const ms = String(date.getMilliseconds()).padStart(3, '0');\n    const offset = this.getDefaultTZOffset();\n\n    return `${year}-${month}-${day}T${h}:${min}:${sec}.${ms}${offset}`;\n  }\n\n  /**\n   * Convierte Date del datepicker a ISO datetime con T00:00:00.000\n   * para campos date-only que el backend espera como datetime.\n   * \n   * Extrae año/mes/día directamente sin setHours() para evitar\n   * cambio de día por ajuste de timezone.\n   * \n   * Uso: birthDate, initialDate, endDate (campos que tienen \"Date\" en el nombre\n   * pero el backend espera datetime con offset)\n   * \n   * @param dateValue Date object del datepicker\n   * @returns ISO string con formato \"YYYY-MM-DDTHH:mm:ss.sssZ±HH:mm\"\n   */\n  fromDatepickerDateOnly(dateValue: Date): string | DateError {\n    if (!dateValue || isNaN(dateValue.getTime())) {\n      return this.err(DateErrorType.INVALID_DATE, 'Fecha inválida', String(dateValue));\n    }\n    const userOffsetMinutes = new Date().getTimezoneOffset();\n    const reversedMs = dateValue.getTime() + (userOffsetMinutes * 60000);\n    const reversedDate = new Date(reversedMs);\n\n    // Extraer fecha de la fecha revertida (ahora en UTC correcto)\n    const year = reversedDate.getFullYear();\n    const month = String(reversedDate.getMonth() + 1).padStart(2, '0');\n    const day = String(reversedDate.getDate()).padStart(2, '0');\n    const offset = this.getDefaultTZOffset();\n\n    // Construir ISO con hora 00:00 y offset del backend\n    return `${year}-${month}-${day}T00:00:00.000${offset}`;\n  }\n\n\n  // ─── INFERENCIA ───────────────────────────────────────────────────────\n\n  /**\n   * Infiere 'date' o 'datetime' desde el sufijo del nombre del atributo.\n   */\n  inferTypeFromAttributeName(attributeName: string): 'date' | 'datetime' | null {\n    if (!attributeName) return null;\n    const lower = attributeName.toLowerCase();\n    if (lower.endsWith('datetime')) return 'datetime';\n    if (lower.endsWith('date')) return 'date';\n    return null;\n  }\n\n  /**\n   * Infiere la regla de hora automática para campos de vigencia.\n   * Solo INFORMA la regla — el componente de negocio aplica la hora.\n   * \n   * 'start'   → usar T00:00:00.000 (inicio del día)\n   * 'end'     → usar T23:59:59.999 (fin del día)\n   * 'preserve'→ usar la hora que viene en el input\n   */\n  inferTimeRule(attributeName: string): 'start' | 'end' | 'preserve' {\n    if (!attributeName) return 'preserve';\n    const lower = attributeName.toLowerCase();\n    if (lower.endsWith('datetime')) {\n      if (lower.includes('start')) return 'start';\n      if (lower.includes('end')) return 'end';\n    }\n    return 'preserve';\n  }\n\n  /**\n   * Convierte valor del formulario/datepicker a ISO 8601.\n   * Aplica reglas automáticas según el nombre del atributo:\n   * - Start → hora actual si es hoy, 00:00 si es futuro\n   * - End   → 23:59:59.999\n   * - Otros → preservar hora del input\n   * \n   * Centralizado aquí para no duplicar en cada componente/MF.\n   * \n   * @param dateValue Valor del datepicker (Date o string)\n   * @param type 'date' o 'datetime'\n   * @param attributeName Nombre del atributo (para inferir regla de hora)\n   * @returns ISO string con offset del backend, o undefined si inválido\n   */\n  /**\n   * Parsea un string en formato dd/MM/yyyy a Date object\n   * @param dateString String en formato dd/MM/yyyy\n   * @returns Date object o null si no es válido\n   */\n  private parseDdMmYyyy(dateString: string): Date | null {\n    if (!dateString || typeof dateString !== 'string') return null;\n    \n    const match = dateString.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n    if (!match) return null;\n    \n    const day = parseInt(match[1], 10);\n    const month = parseInt(match[2], 10);\n    const year = parseInt(match[3], 10);\n    \n    // Validar rango de mes y día\n    if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n    \n    // Crear Date object: new Date(year, month-1, day)\n    // Esto crea una fecha en la zona horaria local del usuario\n    const date = new Date(year, month - 1, day);\n    \n    // Validar que la fecha sea válida (ej: 31/02/2024 es inválida)\n    if (date.getMonth() !== month - 1 || date.getDate() !== day) return null;\n    \n    return date;\n  }\n\n  convertDateToISO(\n    dateValue: any,\n    type: 'date' | 'datetime',\n    attributeName?: string\n  ): string | undefined {\n    if (!dateValue) return undefined;\n\n    let date: Date;\n    \n    // ✅ Intentar parsear como dd/MM/yyyy si es string\n    if (typeof dateValue === 'string' && !dateValue.includes('T')) {\n      const parsed = this.parseDdMmYyyy(dateValue);\n      if (parsed) {\n        date = parsed;\n      } else {\n        // Si no es dd/MM/yyyy, intentar como ISO string o fecha estándar\n        date = new Date(dateValue);\n      }\n    } else {\n      // Si es Date object o ISO string\n      date = dateValue instanceof Date ? dateValue : new Date(dateValue);\n    }\n    \n    if (isNaN(date.getTime())) return undefined;\n\n    // ✅ SMART OVERRIDE: Si se recibe attributeName, validar y hacer override del tipo si corresponde\n    let resolvedType = type;\n    if (attributeName) {\n      // Si el nombre contiene 'DateTime', override a 'datetime'\n      if (attributeName.includes('DateTime')) {\n        resolvedType = 'datetime';\n      } else if(attributeName.includes('Date')) {\n        resolvedType = 'date';\n      }\n      // Si no contiene 'DateTime', mantener el type recibido\n    }\n\n    if (resolvedType === 'datetime' && attributeName) {\n      const rule = this.inferTimeRule(attributeName);\n      \n      if (rule === 'start') {\n        // Delegar a fromDatepickerEffectiveStart\n        // que maneja hoy vs futuro y TZ del back internamente\n        const result = this.fromDatepickerEffectiveStart(date);\n        return typeof result === 'string' ? result : undefined;\n      }\n      \n      if (rule === 'end') {\n        // effectiveEnd: 23:59:59.999\n        date.setHours(23, 59, 59, 999);\n      }\n      \n      if (rule === 'preserve') {\n        // ✅ Para campos date-only (birthDate, initialDate, endDate)\n        // NO usar setHours() — puede cambiar el día por ajuste de timezone\n        // En su lugar, usar fromDatepickerDateOnly() que extrae fecha directamente\n        const result = this.fromDatepickerDateOnly(date);\n        return typeof result === 'string' ? result : undefined;\n      }\n    }\n\n    const result = this.fromDatepicker(date, resolvedType);\n    return typeof result === 'string' ? result : undefined;\n  }\n\n  /**\n   * Para campos effectiveStartDateTime:\n   * - Hoy → hora actual en TZ del back (no del usuario)\n   * - Futuro → 00:00:00.000 en TZ del back\n   * \n   * @param selectedDate Fecha seleccionada por el usuario\n   * @returns ISO string con offset del backend o DateError\n   */\n  fromDatepickerEffectiveStart(selectedDate: Date): string | DateError {\n    if (!selectedDate || isNaN(selectedDate.getTime())) {\n      return this.err(\n        DateErrorType.INVALID_DATE,\n        'Fecha inválida para effectiveStart',\n        String(selectedDate)\n      );\n    }\n\n    const now = new Date();\n    const isToday =\n      selectedDate.getDate() === now.getDate() &&\n      selectedDate.getMonth() === now.getMonth() &&\n      selectedDate.getFullYear() === now.getFullYear();\n\n    // getNowInBackTimezone() sin param → usa DEFAULT_TZ\n    // Calcula hora actual en TZ del back (no del usuario)\n    const dateToUse = isToday\n      ? this.getNowInBackTimezone()\n      : (selectedDate.setHours(0, 0, 0, 0), selectedDate);\n\n    return this.fromDatepicker(dateToUse, 'datetime');\n  }\n\n  // ─── PRIVADOS ─────────────────────────────────────────────────────────\n\n  private parseAny(value: string | Date | number | DateValue): ParsedDate | DateError {\n    // Extraer el valor real si viene como DateValue\n    const raw = (value && typeof value === 'object' && 'value' in value)\n      ? (value as DateValue).value\n      : value;\n\n    if (raw instanceof Date) {\n      if (isNaN(raw.getTime())) return this.err(DateErrorType.INVALID_DATE, 'Date object inválido');\n      return {\n        year: raw.getFullYear(), month: raw.getMonth() + 1, day: raw.getDate(),\n        hour: raw.getHours(), minute: raw.getMinutes(), second: raw.getSeconds(),\n        millisecond: raw.getMilliseconds()\n      };\n    }\n\n    if (typeof raw === 'number') {\n      if (!isFinite(raw)) return this.err(DateErrorType.INVALID_DATE, 'Timestamp inválido', String(raw));\n      return this.parseAny(new Date(raw));\n    }\n\n    if (typeof raw === 'string') {\n      // Orden de intento: ISO → yyyy-MM-dd → dd/MM/yyyy → dd-MM-yyyy\n      const iso = ISO8601Parser.parse(raw);\n      if (!isDateError(iso)) return iso;\n\n      const yyyyMMdd = raw.match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\n      if (yyyyMMdd) {\n        return this.parseComponents(+yyyyMMdd[1], +yyyyMMdd[2], +yyyyMMdd[3], raw);\n      }\n\n      const ddMMyyyySlash = raw.match(/^(\\d{1,2})\\/(\\d{1,2})\\/(\\d{4})$/);\n      if (ddMMyyyySlash) {\n        return this.parseComponents(+ddMMyyyySlash[3], +ddMMyyyySlash[2], +ddMMyyyySlash[1], raw);\n      }\n\n      const ddMMyyyyDash = raw.match(/^(\\d{1,2})-(\\d{1,2})-(\\d{4})$/);\n      if (ddMMyyyyDash) {\n        return this.parseComponents(+ddMMyyyyDash[3], +ddMMyyyyDash[2], +ddMMyyyyDash[1], raw);\n      }\n\n      return this.err(DateErrorType.INVALID_FORMAT,\n        'Formato no reconocido. Soportados: yyyy-MM-dd, dd/MM/yyyy, dd-MM-yyyy, ISO 8601', raw);\n    }\n\n    return this.err(DateErrorType.INVALID_FORMAT, 'Tipo de entrada no soportado', String(raw));\n  }\n\n  private parseComponents(year: number, month: number, day: number, input: string): ParsedDate | DateError {\n    if (month < 1 || month > 12)\n      return this.err(DateErrorType.INVALID_DATE, `Mes inválido: ${month}`, input);\n    if (day < 1 || day > 31)\n      return this.err(DateErrorType.INVALID_DATE, `Día inválido: ${day}`, input);\n    return { year, month, day };\n  }\n\n  private formatISO(parsed: ParsedDate, type: 'date' | 'datetime'): string {\n    const d = `${parsed.year}-${String(parsed.month).padStart(2, '0')}-${String(parsed.day).padStart(2, '0')}`;\n    if (type === 'date') return d;\n\n    const h = String(parsed.hour ?? 0).padStart(2, '0');\n    const min = String(parsed.minute ?? 0).padStart(2, '0');\n    const sec = String(parsed.second ?? 0).padStart(2, '0');\n    const ms = String(parsed.millisecond ?? 0).padStart(3, '0');\n\n    let tz = this.currentUserOffset();\n    if (parsed.timezoneOffset) {\n      const { sign, hours, minutes } = parsed.timezoneOffset;\n      // NUNCA usar Z — siempre ±HH:MM\n      tz = `${sign}${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;\n    }\n\n    return `${d}T${h}:${min}:${sec}.${ms}${tz}`;\n  }\n\n  private currentUserOffset(): string {\n    const offset = -new Date().getTimezoneOffset();\n    const sign = offset >= 0 ? '+' : '-';\n    const h = String(Math.floor(Math.abs(offset) / 60)).padStart(2, '0');\n    const m = String(Math.abs(offset) % 60).padStart(2, '0');\n    return `${sign}${h}:${m}`;\n  }\n\n  /**\n   * Obtiene la fecha actual expresada en la timezone del backend.\n   * Usar para calcular estado de vigencia (activo/inactivo).\n   * @param {string} backIsoSample - Valor ISO de ejemplo del backend (contiene el offset)\n   * @returns {Date} Fecha actual en la timezone del backend\n   */\n  getNowInBackTimezone(isoSample?: string): Date {\n    const offset = isoSample\n      ? this.getTimezoneOffset(isoSample) ?? this.getDefaultTZOffset()\n      : this.getDefaultTZOffset();\n    const now = new Date();\n    const match = offset.match(/([+-])(\\d{2}):(\\d{2})/);\n    if (!match) return now;\n    const sign = match[1] === '+' ? 1 : -1;\n    const offsetMinutes = sign * (parseInt(match[2], 10) * 60 + parseInt(match[3], 10));\n    const userOffsetMinutes = now.getTimezoneOffset();\n    // Convertir a UTC: sumar el offset del usuario (getTimezoneOffset retorna positivo para UTC-X)\n    const utcMs = now.getTime() + (userOffsetMinutes * 60000);\n    // Aplicar offset del backend: sumar offsetMinutes (que ya incluye el signo)\n    const resultMs = utcMs + (offsetMinutes * 60000);\n    const result = new Date(resultMs);\n    return result;\n  }\n\n  // ─── TABLE HEADERS DINÁMICOS ──────────────────────────────────────────\n\n  /**\n   * Construye headers dinámicos con timezone para columnas de vigencia.\n   * Muta las columnas existentes sin reemplazar el array.\n   * Solo ejecuta si la timezone del backend es diferente a la del usuario.\n   * @param {any[]} columns - Array de columnas\n   * @param {string} backendIsoSample - Primer valor ISO de una columna de vigencia\n   */\n  buildTableHeaders(columns: any[], backendIsoSample: string): void {\n    if (!backendIsoSample || this.isSameTimezone(backendIsoSample)) return;\n\n    const offset = this.getBackendOffset(backendIsoSample);\n    columns.forEach(col => {\n      let line1 = '';\n      let line2 = '&nbsp;';\n\n      if (col.headerInnerHtml) {\n        // Extraer contenido de spans existentes\n        const spans = col.headerInnerHtml.match(/<span[^>]*>(.*?)<\\/span>/g) ?? [];\n        line1 = spans[0]?.replace(/<[^>]*>/g, '') ?? '';\n        line2 = spans[1]?.replace(/<[^>]*>/g, '') || '&nbsp;';\n      } else if (col.header) {\n        // Columna con solo texto plano\n        line1 = col.header;\n      }\n\n      // Detectar vigencia en contenido original ANTES de mutar\n      const originalHtml = col.headerInnerHtml ?? col.header ?? '';\n      const hasVigencia = originalHtml.includes('Vigencia');\n\n      // Columnas con actions — solo agregar líneas vacías para altura\n      // NO agregar Hora de Chile aunque tenga Vigencia en el nombre\n      if (col.actions?.length) {\n        col.headerInnerHtml =\n          `<span>${line1}</span>` +\n          `<span class=\"font-s-12 f-w-400\">&nbsp;</span>` +\n          `<span class=\"font-s-11 f-w-400 three-row-header\">&nbsp;</span>`;\n        return;\n      }\n\n      const line3 = hasVigencia ? `${this.getTimezoneBaseLabel()} (${offset})` : '&nbsp;';\n      col.headerInnerHtml =\n        `<span>${line1}</span>` +\n        `<span class=\"font-s-12 f-w-400\">${line2}</span>` +\n        `<span class=\"font-s-11 f-w-400 three-row-header\">${line3}</span>`;\n    });\n  }\n\n  /**\n   * Elimina tags HTML de un string.\n   * @param {string} html - String con HTML\n   * @returns {string} String sin HTML\n   */\n  private stripHtml(html: string): string {\n    return html.replace(/<[^>]*>/g, '').trim();\n  }\n\n  private err(type: DateErrorType, message: string, input?: string): DateError {\n    return { type: type as any, message, input };\n  }\n\n  private getDefaultTZOffset(): string {\n    // Obtener el IANA string (ej: \"America/Santiago\")\n    const APP_TZ_KEYS = {\n      DEFAULT_TZ: 'APP_DEFAULT_TZ',\n      TIMEZONE_LABEL: 'APP_TIMEZONE_LABEL'\n    };\n    const tz = localStorage.getItem(APP_TZ_KEYS.DEFAULT_TZ)\n      ?? 'America/Santiago';\n\n    try {\n      const now = new Date();\n\n      // Opción 1 — shortOffset (browsers modernos)\n      // Convierte IANA → \"GMT-4\" → \"-04:00\"\n      const formatter = new Intl.DateTimeFormat('en', {\n        timeZone: tz,\n        timeZoneName: 'shortOffset'\n      });\n      const parts = formatter.formatToParts(now);\n      const tzPart = parts.find(p => p.type === 'timeZoneName')?.value ?? '';\n\n      const match = tzPart.match(/GMT([+-])(\\d+)(?::(\\d+))?/);\n      if (match) {\n        const sign = match[1];\n        const h = String(match[2]).padStart(2, '0');\n        const m = String(match[3] ?? '0').padStart(2, '0');\n        const result = `${sign}${h}:${m}`;\n        return result; // → \"-04:00\"\n      }\n\n      // Opción 2 — fallback con toLocaleString\n      const dateInTZ = new Date(\n        now.toLocaleString('en-US', { timeZone: tz })\n      );\n      const utcDate = new Date(\n        now.toLocaleString('en-US', { timeZone: 'UTC' })\n      );\n      const diffMinutes = Math.round(\n        (dateInTZ.getTime() - utcDate.getTime()) / 60000\n      );\n      const sign2 = diffMinutes >= 0 ? '+' : '-';\n      const absDiff = Math.abs(diffMinutes);\n      const h2 = String(Math.floor(absDiff / 60)).padStart(2, '0');\n      const m2 = String(absDiff % 60).padStart(2, '0');\n      const result2 = `${sign2}${h2}:${m2}`;\n      return result2; // → \"-04:00\"\n\n    } catch (e) {\n      return '-04:00';\n    }\n  }\n}\n","/**\n * Barrel export para todos los servicios de date-utils\n */\nexport * from './date-time-util.service';\n// En services/index.ts, agregar:\nexport * from '../utils/date.type-guards';\n","/**\n * Barrel export para utilidades de date-utils\n */\nexport * from './date.type-guards';\n","/*\n * Public API Surface of kif-lib-date-utils\n */\n\n// Interfaces\nexport * from './interfaces/index';\n\n// Enums\nexport * from './enums/index';\n\n// Services\nexport * from './services/index';\n\n// Parser\nexport * from './iso8601-parser';\n\n// Type Guards & Utils\nexport * from './utils/index';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}