Utilidades y helpers puros
Funciones sin estado de src/app/core/helpers/global/. Las constantes (API_URLS, PAGE_URLS, RESPONSE_CODES, TOKEN_HEADER_KEY, ...) y renderWhatsappMarkup están resumidas en Compartido. Aquí se detallan las funciones. No existen clases base abstractas ni resolvers en core/ ni en shared/.
| Archivo | Función | En uso |
|---|---|---|
presence.helper.ts | PRESENCE_STALE_MS, isPresenceFresh(contact) | si, chat-list.component.ts |
two-decimals-global-tables.utils.ts | formatNumberTwoDecimals, getUtilityFormatted | si, constantes de columnas (reports.constant.ts, player.constant.ts) |
global.util.ts | calculateSum | si, reports.constant.ts |
global.util.ts | removeEmptyOrSpecificFilters, getDifferingProperties, getDifferingPropertiesArray, mapAndTranslateLabels, toBoolean, calculateDaysInRange, getSelectedDateDescriptionTranslated | sin consumidores fuera del propio archivo |
isPresenceFresh
export const PRESENCE_STALE_MS = 90_000;
export function isPresenceFresh(contact?: TicketContact | null): boolean
Decide si un contacto se muestra en línea. lastSeen manda sobre el flag persistido isOnline: un isOnline: true sin refrescar en 90 s se considera desconectado (por ejemplo, tras una caída del backend que nunca bajó la marca). Devuelve false si el contacto es nulo, isOnline es falso, falta lastSeen, lastSeen no es una fecha parseable, o ya pasaron 90 s o más (comparación estricta <).
El umbral es 3 veces el heartbeat del backend (CHAT_CONFIG.PRESENCE_HEARTBEAT_MS = 30_000), que tolera un barrido perdido más desfase de reloj; ambas constantes se anotan una a otra porque viven en repos distintos. Sesgo deliberado hacia "offline": un falso offline es inocuo, un falso online es el bug que esta función evita.
Uso real: features/whaticket/components/chat/chat-list/chat-list.component.ts (isOnline: isPresenceFresh(ticket.contact)); ver Lista de chats y Tiempo real.
Spec: presence.helper.spec.ts (9 casos: 0 ms, 89 s, 91 s, límite exacto, lastSeen ausente, isOnline falso o indefinido, contacto nulo, constante igual a 90 s).
Formateo numérico
formatNumberTwoDecimals(value):parseFloat; si esNaN, vacío,nulloundefineddevuelve'0.00'; si no,toLocaleString('en-US')con exactamente 2 decimales (separador de miles,).getUtilityFormatted(value):parseFloat;NaNda'0.00 %'; si no,`${num.toFixed(2)} %`.
Se usan como valueFormatter de columnas de tablas.
global.util.ts
calculateSum(cells): sumaparseFloatde cada celda y devuelvetoFixed(2). (La tablangx-datatable.component.tstiene su propio método privadocalculateSum.)removeEmptyOrSpecificFilters(filters, value?): muta el objeto, eliminando clavesundefined,nullo iguales avalue.getDifferingProperties(a, b): comparación superficial (!==); devuelve las claves deacuyo valor enbes distinto, con el valor deb.getDifferingPropertiesArray(a, b): diferencia profunda (arrays, objetos y fechas porgetTime) devolviendo el valor completo deben cada propiedad distinta; arrays de distinta longitud se consideran distintos. Útil para construir payloads dePATCH.mapAndTranslateLabels(items, translate): traducelabelde cadaSelectconTranslateService.instant.toBoolean(value): una cadena estruesolo si es'true'sin distinguir mayúsculas; cualquier otro valor pasa porBoolean(...).calculateDaysInRange(range, options)ygetSelectedDateDescriptionTranslated(selected, translate): restos de los filtros de fecha de reportes (usandate-fnsyTYPE_DATE). Sin consumidores en el CRM.
Sin specs.