Goals por categoría (ej. 100.000 € en cash) #46

Open
opened 2026-09-12 07:21:32 +00:00 by alexandrev · 1 comment
Owner

Petición del usuario:

Los goals me gustaría hacerlos con, también que puede ser por tipo de, por categoría, es decir, que yo pueda tener, por ejemplo, cien mil euros en cash o similar.

Hoy un Goal solo puede acotarse por cuenta (Goal.account, nil = todas). Se añade un ámbito adicional por categoría de fuente, de modo que el progreso se calcule solo con las fuentes de esa categoría (ej. Cash).

Alcance:

  • Relación Goal.category (opcional) ↔ Category.goals en el modelo CoreData
  • Cálculo de progreso/proyección/valor actual filtrando por categoría (combinable con cuenta)
  • Selector de categoría en el editor de goals + chip de ámbito en la lista
  • Export/Import incluye la categoría
  • Localización en los 7 idiomas
Petición del usuario: > Los goals me gustaría hacerlos con, también que puede ser por tipo de, por categoría, es decir, que yo pueda tener, por ejemplo, cien mil euros en cash o similar. Hoy un Goal solo puede acotarse por cuenta (`Goal.account`, nil = todas). Se añade un ámbito adicional por categoría de fuente, de modo que el progreso se calcule solo con las fuentes de esa categoría (ej. Cash). Alcance: - Relación `Goal.category` (opcional) ↔ `Category.goals` en el modelo CoreData - Cálculo de progreso/proyección/valor actual filtrando por categoría (combinable con cuenta) - Selector de categoría en el editor de goals + chip de ámbito en la lista - Export/Import incluye la categoría - Localización en los 7 idiomas
Author
Owner

Implementado en d88cc59 (build 88):

  • CoreData: relación Goal.categoryCategory.goals (opcional, Nullify). Migración ligera automática.
  • Goal.includes(_:) / relevantSources(from:) / scopeKey: filtro de ámbito (cuenta Y categoría) centralizado — antes estaba duplicado en GoalsViewModel, AddSourceView (notificación de objetivo alcanzado) y NotificationService (ETA de re-engagement).
  • GoalEditorView: sección "Ámbito" con selector de categoría ("Todas las categorías" por defecto).
  • Chip con icono/color de la categoría en la lista de Goals y en la tarjeta del Dashboard.
  • ETA del Dashboard para goals con ámbito: usa la proyección del propio goal (GoalsViewModel.projection) en vez de la evolución global de la cartera, que habría dado "objetivo alcanzado" en cuanto el total superase el importe.
  • GoalRepository e ImportService deduplican por (nombre, cuenta, categoría).
  • Export/Import de goals incluye category.
  • 5 claves nuevas localizadas en los 7 idiomas.

Verificado: build Debug OK, build-for-testing OK, suite unitaria sin regresiones (los 3 tests que fallan — ReviewPromptService, SettingsViewModel backups, MonthlyCheckInView — ya fallaban en eaf0c8f). App arranca en simulador.

Pendiente antes de publicar (queda el issue abierto):

  1. Desplegar el schema de CloudKit a producción (nuevo campo CD_category en CD_Goal y CD_goals en CD_Category) desde CloudKit Console.
  2. Prueba funcional en dispositivo: crear un goal con categoría Cash y comprobar que el progreso solo cuenta esas fuentes.
Implementado en `d88cc59` (build 88): - CoreData: relación `Goal.category` ↔ `Category.goals` (opcional, Nullify). Migración ligera automática. - `Goal.includes(_:)` / `relevantSources(from:)` / `scopeKey`: filtro de ámbito (cuenta **Y** categoría) centralizado — antes estaba duplicado en `GoalsViewModel`, `AddSourceView` (notificación de objetivo alcanzado) y `NotificationService` (ETA de re-engagement). - `GoalEditorView`: sección "Ámbito" con selector de categoría ("Todas las categorías" por defecto). - Chip con icono/color de la categoría en la lista de Goals y en la tarjeta del Dashboard. - ETA del Dashboard para goals con ámbito: usa la proyección del propio goal (`GoalsViewModel.projection`) en vez de la evolución global de la cartera, que habría dado "objetivo alcanzado" en cuanto el total superase el importe. - `GoalRepository` e `ImportService` deduplican por (nombre, cuenta, categoría). - Export/Import de goals incluye `category`. - 5 claves nuevas localizadas en los 7 idiomas. Verificado: build Debug OK, build-for-testing OK, suite unitaria sin regresiones (los 3 tests que fallan — ReviewPromptService, SettingsViewModel backups, MonthlyCheckInView — ya fallaban en `eaf0c8f`). App arranca en simulador. Pendiente antes de publicar (queda el issue abierto): 1. Desplegar el schema de CloudKit a producción (nuevo campo `CD_category` en `CD_Goal` y `CD_goals` en `CD_Category`) desde CloudKit Console. 2. Prueba funcional en dispositivo: crear un goal con categoría Cash y comprobar que el progreso solo cuenta esas fuentes.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: alexandrev/InvestmentTrackerApp#46