# RF-SETTINGS-003: Preferencias de Usuario ## Identificacion | Campo | Valor | |-------|-------| | **ID** | RF-SETTINGS-003 | | **Modulo** | MGN-006 Settings | | **Titulo** | Preferencias de Usuario | | **Prioridad** | P1 - Alta | | **Estado** | Draft | | **Fecha** | 2025-12-05 | --- ## Descripcion El sistema debe permitir que cada usuario configure preferencias personales que afectan su experiencia en la aplicacion, como tema visual, idioma, notificaciones y configuraciones de UI. --- ## Requisitos Funcionales ### RF-SETTINGS-003.1: Estructura de Preferencias | Campo | Tipo | Descripcion | |-------|------|-------------| | id | UUID | Identificador unico | | user_id | UUID | FK al usuario | | key | VARCHAR(100) | Clave de preferencia | | value | JSONB | Valor de la preferencia | | synced_at | TIMESTAMPTZ | Ultima sincronizacion | ### RF-SETTINGS-003.2: Herencia de Preferencias Las preferencias heredan del tenant si el usuario no las define: ``` TENANT (base) │ └── USER (personalizado) ``` ### RF-SETTINGS-003.3: Preferencias de Apariencia | Key | Tipo | Default | Descripcion | |-----|------|---------|-------------| | `ui.theme` | string | light | Tema (light, dark, system) | | `ui.density` | string | normal | Densidad (compact, normal, comfortable) | | `ui.sidebar_collapsed` | boolean | false | Sidebar colapsado | | `ui.font_size` | string | medium | Tamano de fuente | | `ui.accent_color` | string | null | Color de acento personal | ### RF-SETTINGS-003.4: Preferencias de Idioma y Formato | Key | Tipo | Default | Descripcion | |-----|------|---------|-------------| | `locale.language` | string | inherit | Idioma (inherit = del tenant) | | `locale.date_format` | string | inherit | Formato fecha | | `locale.number_format` | string | inherit | Formato numeros | | `locale.first_day_of_week` | number | inherit | Primer dia semana | ### RF-SETTINGS-003.5: Preferencias de Notificaciones | Key | Tipo | Default | Descripcion | |-----|------|---------|-------------| | `notifications.email_enabled` | boolean | true | Recibir por email | | `notifications.push_enabled` | boolean | true | Push notifications | | `notifications.sound_enabled` | boolean | true | Sonido notificaciones | | `notifications.digest_frequency` | string | daily | Resumen (none, daily, weekly) | ### RF-SETTINGS-003.6: Preferencias de Modulos Cada modulo puede tener preferencias especificas: ```typescript // Dashboard { 'dashboard.default_view': 'overview' | 'analytics' | 'tasks', 'dashboard.widgets': ['sales', 'inventory', 'tasks'], 'dashboard.refresh_interval': 60 // segundos } // Listas { 'lists.default_page_size': 20, 'lists.default_sort': { field: 'created_at', order: 'desc' } } // Editor { 'editor.autosave': true, 'editor.autosave_interval': 30 } ``` ### RF-SETTINGS-003.7: Sincronizacion entre Dispositivos Las preferencias se sincronizan automaticamente: - Al hacer login, se cargan preferencias del servidor - Cambios locales se sincronizan al servidor - Conflictos se resuelven por timestamp (ultima escritura gana) --- ## Operaciones CRUD ### Obtener Todas las Preferencias ```typescript GET /api/v1/settings/user Response: { "ui": { "theme": "dark", "density": "compact" }, "notifications": { "emailEnabled": true, "pushEnabled": false } } ``` ### Actualizar Preferencia ```typescript PATCH /api/v1/settings/user { "ui.theme": "dark", "notifications.pushEnabled": false } Response: { "updated": ["ui.theme", "notifications.pushEnabled"], "syncedAt": "2025-12-05T10:00:00Z" } ``` ### Restaurar Preferencias por Defecto ```typescript POST /api/v1/settings/user/reset { "keys": ["ui.theme", "ui.density"] // o vacío para resetear todo } ``` ### Exportar Preferencias ```typescript GET /api/v1/settings/user/export Response: { "version": "1.0", "exportedAt": "2025-12-05T10:00:00Z", "preferences": { ... } } ``` ### Importar Preferencias ```typescript POST /api/v1/settings/user/import { "version": "1.0", "preferences": { ... } } ``` --- ## Reglas de Negocio | ID | Regla | Severidad | |----|-------|-----------| | BR-001 | Usuario solo modifica sus propias preferencias | Error | | BR-002 | Preferencias se guardan en localStorage para offline | Info | | BR-003 | Sincronizacion al reconectar si hay cambios offline | Info | | BR-004 | Theme 'system' sigue preferencia del OS | Info | | BR-005 | Import solo acepta formato valido | Error | --- ## Criterios de Aceptacion - [ ] Preferencias aisladas por usuario - [ ] Herencia desde configuracion del tenant - [ ] Sincronizacion entre dispositivos - [ ] Persistencia en localStorage para offline - [ ] Export/Import de preferencias - [ ] Aplicacion inmediata de cambios en UI --- ## Historial | Version | Fecha | Autor | Cambios | |---------|-------|-------|---------| | 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial |