El móduloDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/Davidmallega/Gastos-App/llms.txt
Use this file to discover all available pages before exploring further.
src/utils/compromisos.js encapsula toda la lógica de negocio asociada a los compromisos recurrentes de GastosApp. Exporta las constantes de configuración y tres funciones puras que determinan el estado de un compromiso, su representación visual y la etiqueta de su próximo vencimiento. Al ser funciones sin efectos secundarios, pueden ejecutarse en cada renderizado sin riesgo y son completamente verificables en tests.
Constantes exportadas
FRECUENCIAS
Array de opciones de frecuencia disponibles para los compromisos recurrentes. Se usa para poblar el<Select> del formulario de creación y para mostrar la etiqueta de frecuencia en las tarjetas.
{ value: string, label: string }, donde value es la clave almacenada en el modelo de datos y label es el texto visible al usuario.
DIAS_SEMANA
Array de los días de la semana, indexado desde0 (domingo) hasta 6 (sábado), equivalente a Date.getDay(). Se usa exclusivamente para compromisos con frecuencia 'semanal'.
getCompromisoStatus
Calcula el estado actual de un compromiso para una fecha dada. Es la función central del módulo: se llama en cada renderizado del componenteCompromisos.jsx y del widget del Dashboard para mostrar el badge de estado actualizado.
Objeto compromiso del store. Debe tener al menos:
activo, frecuencia, ultimoRegistro, diaMes (para frecuencias no semanales) o diaSemana (para frecuencia semanal).Fecha de referencia. Por defecto es
new Date(). Se acepta un valor inyectado para facilitar los tests sin depender del reloj del sistema.'registrado' | 'vencido' | 'proximo' | 'pendiente' | 'inactivo'
Algoritmo paso a paso
Verificar si está inactivo
Si
comp.activo === false, retorna inmediatamente 'inactivo' sin ningún cálculo adicional.Verificar si ya fue registrado en el período actual
Si
comp.ultimoRegistro existe, calcula daysDiff = floor((today - last) / 86400000). Si daysDiff < PERIOD_DAYS[frecuencia], retorna 'registrado'. Los días mínimos por frecuencia se detallan en la tabla más abajo.Calcular días hasta el próximo vencimiento
- Frecuencia semanal: calcula
daysForward = (diaSemana - today.getDay() + 7) % 7(0–6 días hasta la próxima ocurrencia). SidaysForward ≤ 2se usa directamente; si no, se interpreta como que el día ya pasó esta semana y se aplica-(7 - daysForward)(valor negativo → vencido). - Otras frecuencias:
daysUntilDue = diaMes - today.getDate().
Tabla PERIOD_DAYS
| Frecuencia | Días mínimos entre registros |
|---|---|
semanal | 7 |
quincenal | 15 |
mensual | 28 |
bimestral | 55 |
trimestral | 85 |
anual | 355 |
Para frecuencia
mensual el umbral son 28 días (no 30) para dar holgura en meses cortos como febrero. Si la frecuencia no está en la tabla, se usa 28 como valor por defecto.getStatusMeta
Devuelve los metadatos visuales (etiqueta, colores y borde) para un estado dado, usando variables CSS del sistema de diseño de GastosApp. Se usa en los componentesBadge y en las tarjetas de compromisos para aplicar el estilo correcto.
Estado del compromiso. Debe ser uno de los seis estados válidos; para cualquier otro valor retorna el estilo de
pendiente como fallback.{ label: string, color: string, bgColor: string, border: string } con referencias a variables CSS.
Tabla de mapeo completo
| Estado | label | color | bgColor | border |
|---|---|---|---|---|
registrado | 'Registrado' | var(--green) | var(--green-glow) | rgba(5,150,105,0.2) |
impago | 'Ingresado/Impago' | var(--yellow) | rgba(217,119,6,0.08) | rgba(217,119,6,0.25) |
vencido | 'Vencido' | var(--red) | var(--red-glow) | rgba(220,38,38,0.2) |
proximo | 'Próximo' | var(--yellow) | rgba(217,119,6,0.08) | rgba(217,119,6,0.25) |
pendiente | 'Pendiente' | var(--text-muted) | var(--bg-secondary) | var(--border) |
inactivo | 'Inactivo' | var(--text-muted) | var(--bg-secondary) | var(--border) |
getDueDateLabel
Genera una etiqueta legible que describe cuándo vence el compromiso, combinando el día de vencimiento con la frecuencia. Se muestra en las tarjetas del listado de compromisos y en el widget del Dashboard.Objeto compromiso. Se usan los campos
frecuencia, diaSemana (si es semanal) y diaMes (si no es semanal).string con la etiqueta de vencimiento.
Lógica de formato
- Frecuencia semanal: busca en
DIAS_SEMANAel elemento cuyovaluecoincida concomp.diaSemana(por defecto1= lunes) y retorna'Cada {label}', por ejemplo'Cada Lunes'o'Cada Viernes'. - Otras frecuencias: busca en
FRECUENCIASla etiqueta decomp.frecuenciay retorna'Día {diaMes} — {label}', por ejemplo'Día 15 — Mensual'o'Día 1 — Trimestral'.