feat(sprint-1-5): cierre Etapa 2 - formatPayback + fixes de marca

[
This commit is contained in:
2026-05-16 19:26:19 -03:00
parent f9a008bce5
commit eaaac88fc3
16 changed files with 1626 additions and 55 deletions

View File

@@ -25,6 +25,32 @@ export function formatMinutes(minutes: number): string {
return m > 0 ? `${h}h ${m}min` : `${h}h`
}
export function formatPayback(months: number): string {
if (Number.isNaN(months) || !isFinite(months)) {
return 'No recupera en horizonte'
}
if (months < 0) {
return 'Sin payback (costo aumenta)'
}
if (months === 0) {
return 'Inmediato'
}
if (months < 0.1) {
return '< 1 día'
}
if (months < 1) {
return `< 1 mes (${months.toFixed(2)} meses)`
}
if (months < 12) {
return `${months.toFixed(1)} meses`
}
if (months < 24) {
const years = (months / 12).toFixed(1)
return `${months.toFixed(1)} meses (~${years} años)`
}
return `${(months / 12).toFixed(1)} años`
}
// Formato de timestamp de simulación: "13 de mayo de 2026 a las 09:45"
// Locale explícito es-PY — nunca depende del locale del browser del cliente.
export function formatSimulationTimestamp(ts: number): { date: string; time: string } {