4.9 KiB
Análisis del Proyecto Finanzas (gemini.md)
Note
Estado de la Revisión (28/01/2026): Se han aplicado las correcciones de arquitectura:
- Store Refactorizado: Dividido en slices (
debts,cards,budget,alerts) y unificado enlib/store.ts.- UUID: Implementado
uuidv4para generación de IDs.- Modales: Implementados funcionalmente en
components/modals/*con formularios completos.El código ahora cumple con las buenas prácticas establecidas.
Este documento sirve como guía técnica, revisión de código y hoja de ruta para el desarrollo continuo del proyecto "Finanzas". Está diseñado para ser interpretado tanto por desarrolladores humanos como por agentes de IA (Minimax, GLM, Claude, etc.) para mantener la coherencia y calidad del código.
1. Visión General del Stack
- Framework: Next.js 14+ (App Router)
- Lenguaje: TypeScript
- Estilos: Tailwind CSS
- Estado Global: Zustand (con persistencia en localStorage)
- Utilidades UI:
clsx,tailwind-merge,lucide-react - Fechas:
date-fns,Intl.DateTimeFormat
2. Puntos Fuertes Detectados
- Estructura Limpia: Separación clara entre lógica de negocio (
lib), UI (components) y rutas (app). - Tipado Fuerte: Uso consistente de interfaces en
lib/types.ts. - Estado Persistente: Buena implementación de
zustandcon middleware de persistencia para mantener los datos entre recargas. - Utilidades Reutilizables: Funciones auxiliares bien definidas en
lib/utils.tspara formateo de moneda y fechas.
3. Correcciones y Mejoras Inmediatas
A. Gestión de IDs
Estado Actual: Se usa crypto.randomUUID() con un fallback a Date.now().
Mejora: uuid ya está en package.json. Es preferible usar la librería uuid (v4) para garantizar colisiones nulas, especialmente si se planea sincronizar datos en el futuro.
import { v4 as uuidv4 } from 'uuid';
// Reemplazar generateId() por uuidv4()
B. Separación de Responsabilidades en el Store
Estado Actual: useFinanzasStore es un store monolítico.
Mejora: A medida que la aplicación crezca, dividir el store en "slices" (ej: createBudgetSlice, createDebtsSlice) mantendrá el código más mantenible.
C. Optimización de Renderizado (use client)
Estado Actual: app/page.tsx es un componente de cliente ('use client') gigante.
Mejora:
- Mover la lógica de modales y efectos a componentes más pequeños.
- Mantener la página principal lo más ligera posible.
- Extraer los modales (
AddDebtModal, etc.) a sus propios archivos encomponents/modals.
4. Buenas Prácticas (Standard Guidelines)
Cualquier IA que trabaje en este proyecto debe seguir estas reglas:
- Strict Typing: No usar
any. Definir interfaces para todas las props y estructuras de datos. - Modular CSS: Usar siempre
cn()(clsx+tailwind-merge) para clases condicionales. - Componentes Funcionales: Preferir componentes pequeños y composables.
- Nombrado:
- Componentes: PascalCase (ej:
BudgetCard.tsx) - Funciones/Variables: camelCase (ej:
calculateTotal) - Archivos de utilidad: kebab-case o camelCase (ej:
date-utils.ts)
- Componentes: PascalCase (ej:
5. Nice to Have (Futuras Implementaciones)
Funcionalidades
- Validación de Formularios: Implementar
zod+react-hook-formpara validar entradas de usuario (montos negativos, fechas inválidas). - Exportación de Datos: Permitir exportar el estado a JSON/CSV para backup.
- Temas: Soporte real para modo claro/oscuro (actualmente parece hardcodeado a oscuro/slate).
- Gráficos Avanzados: Expandir el uso de
rechartspara mostrar tendencias de gastos vs ingresos.
Calidad de Código
- Tests Unitarios: Agregar Vitest para probar lógica crítica en
lib/utils.tsy reducers del store. - Barrel Files: Mantener actualizados los
index.tsen las carpetas de componentes para importaciones más limpias.
Accesibilidad (a11y)
- Asegurar que todos los botones tengan
aria-labelsi son solo íconos. - Verificar contraste de colores en las tarjetas de deuda.
6. Instrucciones para Agentes de IA
Al generar código para este proyecto:
- Contexto: Lee siempre
lib/types.tsantes de modificar el estado. - Estilo: Replica el diseño visual existente (bg-slate-950, bordes sutiles, texto slate-400 para secundario).
- Estado: Si agregas una nueva funcionalidad que requiere persistencia, agrégala a
AppStateenlib/types.tsy actualizalib/store.ts. - UI: Usa componentes de
lucide-reactpara íconos.
7. Snippets Comunes
Formateo de Moneda:
import { formatCurrency } from '@/lib/utils';
// Uso: formatCurrency(1500) -> "$ 1.500,00"
Clases Condicionales:
import { cn } from '@/lib/utils';
<div className={cn("p-4 bg-white", isError && "bg-red-50")} />