ADR-0008 · Formato unificado de números y dinero

ADR-0008 · Formato unificado de números y dinero

  • Status: ✅ Accepted
  • Fecha: 2026-03-15
  • Tags: ui · i18n

Contexto

Sin un estándar, cada módulo formateaba números distinto:

  • $1234.50 (estilo inglés)
  • $ 1.234,50 (estilo argentino con espacio)
  • 1234,5 USD
  • ($ 3500) para negativos
  • -$3.500

Esto generaba inconsistencia visual y confusión entre dashboards.

Decisión

Formato único en todo el sistema (PHP + JS), estilo argentino:

Tipo Formato Ejemplo positivo Ejemplo negativo Cero
Dinero $ X.XXX.XXX (espacio, sin decimales) $ 18.823.974 ($ 3.500.000) -
USD USD X.XXX USD 17.343 (USD 17.343) -
Número X.XXX (sin $, sin decimales) 1.625 (1.625) 0
Porcentaje XX,XX % (2 decimales) 21,09 % (21,09 %) 0,00 %
Toneladas X.XXX,XX tn (2 decimales) 471,32 tn -

Implementación

PHP — venta/includes/functions.php

function formatMoney(float $amount): string {
    if ($amount < 0) return '($ ' . number_format(abs($amount), 0, ',', '.') . ')';
    if ($amount == 0) return '-';
    return '$ ' . number_format($amount, 0, ',', '.');
}

function formatPercent(float $value, int $decimals = 2): string {
    return number_format($value * 100, $decimals, ',', '.') . '%';
}

function formatTons(float $kg): string {
    if ($kg == 0) return '-';
    return number_format($kg / 1000, 2, ',', '.') . ' tn';
}

JS — venta/assets/js/app.js

function fmtMoney(v) {
    if (v == 0) return '-';
    const abs = Math.abs(v).toLocaleString('es-AR', { maximumFractionDigits: 0 });
    return v < 0 ? `($ ${abs})` : `$ ${abs}`;
}

function fmtPct(v) {
    return v.toLocaleString('es-AR', {
        style: 'percent',
        minimumFractionDigits: 2,
        maximumFractionDigits: 2
    });
}

function fmtNum(v) {
    return v.toLocaleString('es-AR', { maximumFractionDigits: 0 });
}

Tabulator formatters — dashboard.php

Los formatters tabFmtMoney, tabFmtPct, tabFmtBultos, tabFmtTons, tabFmtTotal, tabFmtMargenBar envuelven a los anteriores con HTML para celdas coloreadas (negativo en rojo, barras de margen, etc).

Consecuencias

Consistencia visual en todo el sistema. ✅ Estilo nativo argentino (los gerentes lo leen rápido). ✅ Una sola fuente de cambios — si hay que cambiar formato, se cambia en functions.php + app.js y propaga a todo. ⚠️ Duplicación entre PHP y JS — si un día cambia el formato, hay que tocar ambos lados.

Referencias