ui · i18nSin 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.500Esto generaba inconsistencia visual y confusión entre dashboards.
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 |
— | - |
venta/includes/functions.phpfunction 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';
}
venta/assets/js/app.jsfunction 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 });
}
dashboard.phpLos formatters tabFmtMoney, tabFmtPct, tabFmtBultos, tabFmtTons,
tabFmtTotal, tabFmtMargenBar envuelven a los anteriores con HTML para
celdas coloreadas (negativo en rojo, barras de margen, etc).
✅ 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.