const dateTime = new Intl.DateTimeFormat('es-AR', { dateStyle: 'short', timeStyle: 'short', }); export function formatDate(value: string | null | undefined) { if (!value) return '—'; const date = new Date(value); return Number.isNaN(date.getTime()) ? '—' : dateTime.format(date); } export function formatDateOnly(value: string | null | undefined) { if (!value) return '—'; const match = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value.slice(0, 10)); return match ? `${match[3]}/${match[2]}/${match[1]}` : '—'; } const actions: Record = { AUTH_LOGIN_SUCCESS: 'Inicio de sesión', AUTH_LOGIN_FAILED: 'Acceso rechazado', AUTH_LOGOUT: 'Cierre de sesión', AUTH_REFRESH: 'Sesión renovada', AUTH_REFRESH_REUSE_DETECTED: 'Reutilización de sesión detectada', AUTH_PASSWORD_CHANGED: 'Contraseña modificada', SYSTEM_BOOTSTRAP_ADMIN_CREATED: 'Administrador inicial creado', USER_CREATED: 'Usuario creado', USER_UPDATED: 'Usuario actualizado', USER_STATUS_CHANGED: 'Estado de usuario modificado', USER_ROLES_CHANGED: 'Roles de usuario modificados', ROLE_CREATED: 'Rol creado', ROLE_UPDATED: 'Rol actualizado', ROLE_PERMISSIONS_CHANGED: 'Permisos de rol modificados', ASSET_TYPE_CREATED: 'Tipo de elemento creado', ASSET_MASTER_BOOTSTRAPPED: 'Configuración inicial de Inventarios', ASSET_TYPE_UPDATED: 'Tipo de elemento actualizado', ASSET_ATTRIBUTE_CREATED: 'Atributo de inventario creado', ASSET_ATTRIBUTE_UPDATED: 'Atributo de inventario actualizado', ASSET_CREATED: 'Registro de inventario creado', ASSET_FIELD_DISCOVERY_CREATED: 'Alta de campo registrada', ASSET_FIELD_DISCOVERY_APPROVED: 'Alta de campo aprobada', ASSET_FIELD_DISCOVERY_MATCHED: 'Alta de campo conciliada', ASSET_FIELD_DISCOVERY_REJECTED: 'Alta de campo rechazada', ASSET_UPDATED: 'Registro de inventario actualizado', ASSET_INFORMATION_STATUS_CHANGED: 'Estado de información modificado', ASSET_GEOMETRY_UPDATED: 'Ubicación de registro actualizada', ASSET_GEOMETRY_REMOVED: 'Ubicación de registro retirada', ASSET_MEDIA_UPLOADED: 'Archivo de inventario incorporado', ASSET_MEDIA_UPDATED: 'Archivo de inventario actualizado', ASSET_MEDIA_REMOVED: 'Archivo de inventario retirado', ASSET_PROVENANCE_UPDATED: 'Procedencia de registro actualizada', ASSET_PROVENANCE_VERIFIED: 'Procedencia de registro verificada', ASSET_AREA_COMPANY_RELATION_CREATED: 'Relación Área–Organización creada', ASSET_AREA_COMPANY_RELATION_ENDED: 'Relación Área–Organización finalizada', SURVEY_CAMPAIGN_CREATED: 'Campaña de relevamiento creada', SURVEY_CAMPAIGN_UPDATED: 'Campaña de relevamiento actualizada', SURVEY_CAMPAIGN_STATUS_CHANGED: 'Estado de campaña modificado', SURVEY_TARGET_ADDED: 'Objetivo de relevamiento agregado', SURVEY_TARGET_UPDATED: 'Plan de objetivo actualizado', SURVEY_TARGET_ASSIGNED: 'Objetivo de relevamiento asignado', SURVEY_TARGET_STATUS_CHANGED: 'Avance de relevamiento actualizado', SURVEY_REPORT_SAVED: 'Borrador de relevamiento guardado', SURVEY_REPORT_SUBMITTED: 'Relevamiento enviado a revisión', SURVEY_REPORT_APPROVED: 'Relevamiento aprobado', SURVEY_REPORT_REJECTED: 'Relevamiento rechazado', INSPECTION_VISIT_CREATED: 'Visita de inspección creada', INSPECTION_VISIT_UPDATED: 'Plan de visita actualizado', INSPECTION_VISIT_STATUS_CHANGED: 'Estado de visita modificado', INSPECTION_VISIT_ASSETS_UPDATED: 'Registros de visita actualizados', INSPECTION_VISIT_TEAM_UPDATED: 'Equipo de visita actualizado', INSPECTION_VISIT_STARTED: 'Visita de inspección iniciada', INSPECTION_ACT_CREATED: 'Acta de inspección creada', INSPECTION_ACT_UPDATED: 'Acta de inspección actualizada', INSPECTION_ACT_CANCELLED: 'Acta de inspección cancelada', INSPECTION_ACT_RESPONSIBLE_UPDATED: 'Responsable del acta actualizado', INSPECTION_ACT_READY: 'Contenido del acta congelado', INSPECTION_ACT_REOPENED: 'Acta devuelta a borrador', INSPECTION_ACT_SIGNATURE_RECORDED: 'Firma manuscrita incorporada al acta', INSPECTION_ACT_COMPANY_OUTCOME_RECORDED: 'Resultado de recepción empresarial registrado', INSPECTION_ACT_CLOSED: 'Acta cerrada', INSPECTION_REPORT_GENERATED: 'Informe de inspección generado', INSPECTION_VERIFICATION_PLANNED: 'Visita de verificación preparada', INSPECTION_FINDING_CREATED: 'Hallazgo abierto', INSPECTION_FINDING_UPDATED: 'Hallazgo actualizado', INSPECTION_FINDING_FOLLOW_UP_UPDATED: 'Seguimiento de hallazgo actualizado', INSPECTION_FINDING_CLOSED: 'Hallazgo cerrado', INSPECTION_FINDING_EVIDENCE_UPLOADED: 'Evidencia de hallazgo incorporada', INSPECTION_FINDING_COMMUNICATION_CREATED: 'Comunicación de hallazgo registrada', }; export function actionLabel(action: string) { return actions[action] ?? action.replaceAll('_', ' ').toLocaleLowerCase('es-AR'); } export function initials(firstName: string, lastName: string) { return `${firstName[0] ?? ''}${lastName[0] ?? ''}`.toUpperCase(); }