# 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 |
