/** * Formato numérico del tablero de indicadores. * * Por qué es un módulo y no un `toLocaleString` en cada widget. Hoy cada * widget formatea a su manera: el KPI concatena prefijo y sufijo, los ejes de los * gráficos llaman a `toLocaleString('es-CO')` por su cuenta y la tabla no formatea * nada. El resultado es que la misma cifra se ve distinta en tres sitios de la * misma pantalla. * * Las reglas de aquí salen de la especificación del tablero: * * - Se abrevia por magnitud (K, M, B), pero nunca en tablas ni en enteros * de conteo: una tabla existe para comparar cifras exactas, y "20 pedidos" no * se lee mejor como "20". * - La moneda es un símbolo separado y más pequeño, no un prefijo pegado * al número. Por eso `abbreviate` devuelve las piezas por separado en vez de * una cadena: quien pinta decide el tamaño de cada una. * - Todo número que se refresca se pinta con `tabular-nums`. Sin eso los dígitos * cambian de ancho y la cifra tiembla en cada refresco. */ /** * Locale por defecto del producto. * * Se exporta porque es el ÚNICO punto donde vive esa decisión: cualquier `toLocaleString`, * `toLocaleDateString` o `localeCompare` del tablero lo usa en vez de cablear `'es-CO'` por su * cuenta — que es lo que hacían el subtítulo del contenedor, el badge de alto volumen y el * comparador de la tabla. */ export declare const DASHBOARD_LOCALE = "es-CO"; /** * Moneda del alcance activo. * * Hoy el símbolo está cableado, y es a propósito. El endpoint de compañías * no devuelve la moneda local (`CompanyDto = {id, code, name}`), aunque el dato * exista en base (`segm_companies_prj.local_currency_id`). Mostrar un código de * moneda que nadie verificó sería peor que no mostrarlo. * * El día que el API la exponga, este es el único sitio que cambia: ningún * widget formatea moneda por su cuenta. */ export interface Currency { /** Símbolo visible: `$`, `US$`. */ symbol: string; /** Código ISO, para el selector de compañía. `null` mientras no sea confiable. */ iso: string | null; locale: string; } export declare const DEFAULT_CURRENCY: Currency; /** Lo mínimo que el tablero necesita saber de una compañía para resolver su moneda. */ export interface CurrencyScope { /** Moneda local de la compañía. Hoy ningún host la envía. */ localCurrency?: { symbol?: string; iso?: string; } | null; } /** * El único punto donde se decide en qué moneda está una cifra. * * Ningún widget formatea moneda por su cuenta: todos pasan por aquí. Eso es lo que * hace que el día que el API de compañías exponga `local_currency_id` haya que * cambiar exactamente una función — y no rastrear cada `toLocaleString` del módulo. * * Mientras tanto devuelve el peso con `iso: null`, que es una afirmación honesta: * "sé qué símbolo pintar, no sé de qué moneda es". Por eso el selector de compañía * no muestra código de moneda todavía — mostrar "COP" para todas sería afirmar algo * que nadie verificó. */ export declare function resolveCurrency(scope?: CurrencyScope): Currency; /** Las tres piezas de una cifra, para que quien pinta decida el tamaño de cada una. */ export interface AbbreviatedValue { /** Símbolo de moneda, o `null` si el indicador no es monetario. */ symbol: string | null; /** El número ya formateado al locale. */ number: string; /** * Sufijo de magnitud, o `null` si no se abrevió. * * Es una cadena libre y NO una unión `K | M | B` a propósito: lo pone `Intl` según * el locale, y las escalas no coinciden entre idiomas — en español 5.230.000.000 * lleva `M` (escala larga) y en inglés `B`. */ scale: string | null; } export interface AbbreviateOptions { /** Símbolo de moneda a devolver en `symbol`. */ currency?: string | null; /** Entero de conteo: nunca se abrevia (pedidos, documentos, registros). */ integer?: boolean; locale?: string; /** * Fuerza la abreviatura desde los miles, ignorando {@link ABBREVIATE_FROM}. * * Es para los ejes de los gráficos y el centro de la dona, donde el espacio * manda: un eje Y con `10.000.000` en cada marca se come el gráfico, y la cifra * exacta ya está en el tooltip. En un KPI o en una celda de tabla, no. */ compact?: boolean; } /** * Parte una cifra en símbolo + número + magnitud. * * Por debajo de {@link ABBREVIATE_FROM} devuelve la cifra completa con sus * separadores de miles: en un ERP eso es lo que se espera leer. */ export declare function abbreviate(value: number, options?: AbbreviateOptions): AbbreviatedValue; /** * La cifra abreviada como una sola cadena. * * Para donde no se puede componer con varios elementos: ejes de gráficos, * tooltips, el centro de una dona. */ export declare function formatCompact(value: number, options?: AbbreviateOptions): string; /** * La cifra completa, sin abreviar. * * Es lo que va en el `title` del número y en las celdas de tabla: donde el * usuario compara magnitudes exactas, abreviar le quita justo lo que busca. */ export declare function formatExact(value: number, options?: { currency?: string | null; decimals?: number; locale?: string; }): string; /** Porcentaje con un decimal. El signo lo pone quien pinta, junto con el icono de tendencia. */ export declare function formatPercent(value: number, locale?: string): string; /** * Fecha en formato de negocio: `19 ago 2026`. * * Nunca ISO crudo. Una fecha de máquina en una tabla que lee un gerente es un * detalle de implementación que se escapó a la pantalla. */ export declare function formatDate(value: string | Date, locale?: string): string; /** * Estilo obligatorio de todo número que se refresque en vivo. * * `tabular-nums` fija el ancho de los dígitos: sin él, un `1` ocupa menos que un `8` y la cifra * se desplaza en cada refresco. * * El tracking de las cifras grandes del KPI NO va aquí —aunque este comentario lo dijera—: * lo decide el contenedor con `--dash-kpi-tracking`, porque el mismo componente se pinta a tres * tamaños (compacto, ampliado y modo presentación) y el interletraje correcto depende del tamaño. */ export declare const NUMERIC_STYLE: { readonly fontVariantNumeric: "tabular-nums"; }; /** @deprecated Usar {@link NUMERIC_STYLE}: son exactamente el mismo estilo. */ export declare const KPI_VALUE_STYLE: { readonly fontVariantNumeric: "tabular-nums"; }; //# sourceMappingURL=formatNumber.d.ts.map