# Especificaciones del Proyecto - Finanzas Personales ## Descripción General Aplicación web moderna para gestión de finanzas personales. Diseño sobrio y elegante con tema oscuro. ## Stack Tecnológico - **Framework**: Next.js 14+ (App Router) - **Lenguaje**: TypeScript - **Estilos**: Tailwind CSS - **Estado**: Zustand con persistencia localStorage - **Fechas**: date-fns - **Gráficos**: Recharts - **Iconos**: lucide-react ## Estructura de Directorios ``` /mnt/c/Users/Administrator/Documents/cuentas/finanzas/ ├── app/ # Páginas de Next.js ├── components/ # Componentes React │ ├── debts/ # Componentes de deudas │ ├── cards/ # Componentes de tarjetas │ ├── budget/ # Componentes de presupuesto │ ├── alerts/ # Componentes de alertas │ ├── dashboard/ # Componentes del dashboard │ └── layout/ # Componentes de layout ├── lib/ # Utilidades y estado │ ├── types.ts # Tipos TypeScript │ ├── store.ts # Zustand store │ ├── utils.ts # Helpers │ └── alerts.ts # Lógica de alertas ├── public/ # Archivos estáticos └── [config files] ``` ## Tipos Principales ### FixedDebt ```typescript interface FixedDebt { id: string name: string amount: number dueDay: number // 1-31 category: 'housing' | 'services' | 'subscription' | 'other' isAutoDebit: boolean isPaid: boolean notes?: string } ``` ### VariableDebt ```typescript interface VariableDebt { id: string name: string amount: number date: string // ISO date category: 'shopping' | 'food' | 'entertainment' | 'health' | 'transport' | 'other' isPaid: boolean notes?: string } ``` ### CreditCard ```typescript interface CreditCard { id: string name: string lastFourDigits: string closingDay: number // 1-31 dueDay: number // 1-31 currentBalance: number creditLimit: number color: string // hex color } ``` ### CardPayment ```typescript interface CardPayment { id: string cardId: string amount: number date: string description: string installments?: { current: number; total: number } } ``` ### MonthlyBudget ```typescript interface MonthlyBudget { month: number // 1-12 year: number totalIncome: number fixedExpenses: number variableExpenses: number savingsGoal: number } ``` ### Alert ```typescript interface Alert { id: string type: 'PAYMENT_DUE' | 'BUDGET_WARNING' | 'CARD_CLOSING' | 'CARD_DUE' | 'SAVINGS_GOAL' | 'UNUSUAL_SPENDING' title: string message: string severity: 'info' | 'warning' | 'danger' date: string isRead: boolean relatedId?: string } ``` ## Store (Zustand) Hook: `useFinanzasStore()` ### Estado - `fixedDebts: FixedDebt[]` - `variableDebts: VariableDebt[]` - `creditCards: CreditCard[]` - `cardPayments: CardPayment[]` - `monthlyBudgets: MonthlyBudget[]` - `alerts: Alert[]` - `currentMonth: number` - `currentYear: number` ### Acciones Principales - `addFixedDebt(debt)` / `updateFixedDebt(id, debt)` / `deleteFixedDebt(id)` / `toggleFixedDebtPaid(id)` - `addVariableDebt(debt)` / `updateVariableDebt(id, debt)` / `deleteVariableDebt(id)` / `toggleVariableDebtPaid(id)` - `addCreditCard(card)` / `updateCreditCard(id, card)` / `deleteCreditCard(id)` - `addCardPayment(payment)` / `deleteCardPayment(id)` - `setMonthlyBudget(budget)` / `updateMonthlyBudget(month, year, updates)` - `addAlert(alert)` / `markAlertAsRead(id)` / `deleteAlert(id)` / `clearAllAlerts()` ## Paleta de Colores (Tema Oscuro) ``` Fondo principal: #0F172A (slate-900) Cards/Superficies: #1E293B (slate-800) Bordes: #334155 (slate-700) Texto principal: #F8FAFC (slate-50) Texto secundario: #94A3B8 (slate-400) Acento positivo: #10B981 (emerald-500) // Dinero, éxito Acento advertencia: #F59E0B (amber-500) // Alertas Acento peligro: #EF4444 (red-500) // Urgente Acento info: #3B82F6 (blue-500) // Información ``` ## Utilidades Disponibles ### formatCurrency(amount: number): string Formatea número como moneda argentina: `$ 1.500,50` ### formatDate(date: string | Date): string Formato legible: "28 de enero de 2026" ### formatShortDate(date: string | Date): string Formato corto: "28/01/2026" ### getDaysUntil(date: string | Date): number Días hasta una fecha (negativo si ya pasó) ### getNextDateByDay(dayOfMonth: number): Date Próxima fecha para un día específico del mes ### calculateNextClosingDate(closingDay: number): Date Próxima fecha de cierre de tarjeta ### calculateNextDueDate(dueDay: number): Date Próxima fecha de vencimiento ### getCardUtilization(balance: number, limit: number): number Porcentaje de utilización de tarjeta ## Alertas Inteligentes La función `generateAlerts()` en `/lib/alerts.ts` genera automáticamente: 1. **PAYMENT_DUE**: Deudas fijas que vencen en los próximos 3 días 2. **BUDGET_WARNING**: Gastos superan 80% del presupuesto 3. **CARD_CLOSING**: Tarjetas con cierre en próximos 3 días 4. **CARD_DUE**: Tarjetas con vencimiento en próximos 3 días 5. **SAVINGS_GOAL**: Ahorro proyectado por debajo de la meta ## Componentes Existentes ### /components/debts/ - `DebtCard.tsx` - Card individual de deuda - `FixedDebtForm.tsx` - Formulario deuda fija - `VariableDebtForm.tsx` - Formulario deuda variable - `DebtSection.tsx` - Sección completa de deudas ### /components/cards/ - `CreditCardWidget.tsx` - Visualización tarjeta tipo tarjeta real - `CreditCardForm.tsx` - Formulario tarjeta de crédito - `CardPaymentForm.tsx` - Formulario registrar pago - `MiniCard.tsx` - Versión compacta para selects - `CardSection.tsx` - Sección completa de tarjetas ## Funcionalidades Requeridas ### Dashboard - Cards de métricas (total deudas, presupuesto, ahorro) - Lista de alertas activas - Gráfico de distribución de gastos - Resumen de tarjetas ### Deudas - CRUD deudas fijas y variables - Marcar como pagadas - Filtros por categoría - Indicadores visuales de vencimiento ### Tarjetas - CRUD tarjetas de crédito - Visualización tipo tarjeta real - Registrar pagos - Indicadores de cierre/vencimiento ### Presupuesto - Configurar ingresos y metas - Tracking de gastos vs presupuesto - Proyecciones ### Alertas - Generación automática basada en fechas - Panel de alertas con severidad - Marcar como leídas ## Patrones de Código ### Inmutabilidad (OBLIGATORIO) ```typescript // CORRECTO const newDebts = [...debts, newDebt] setDebts(newDebts) // INCORRECTO debts.push(newDebt) // MUTACIÓN! ``` ### Manejo de Estado ```typescript const store = useFinanzasStore() const fixedDebts = store.fixedDebts const addDebt = store.addFixedDebt ``` ### Formularios - Validar antes de enviar - Mostrar errores de validación - Usar estados locales con useState - Llamar onSubmit con datos validados ### Estilos - Usar clases de Tailwind - Tema oscuro por defecto - Colores de la paleta definida - Hover states para interactividad ## Archivos Críticos 1. `/lib/types.ts` - Todos los tipos TypeScript 2. `/lib/store.ts` - Estado global con Zustand 3. `/lib/utils.ts` - Funciones utilitarias 4. `/lib/alerts.ts` - Lógica de alertas inteligentes ## Comandos ```bash # Desarrollo npm run dev # Build npm run build # La app se sirve estáticamente desde /dist ``` ## Notas Importantes - **Persistencia**: Todo se guarda en localStorage automáticamente - **Sin backend**: La app funciona completamente en el cliente - **Responsive**: Debe funcionar en móvil y desktop - **Dark mode**: Único tema, no hay toggle de tema claro - **Accesibilidad**: Usar labels, aria-labels, roles apropiados