# US-MGN002-004: Preferencias de Usuario

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | US-MGN002-004 |
| **Modulo** | MGN-002 Users |
| **Sprint** | Sprint 3 |
| **Prioridad** | P2 - Media |
| **Story Points** | 5 |
| **Estado** | Ready |
| **Autor** | System |
| **Fecha** | 2025-12-05 |

---

## Historia de Usuario

**Como** usuario autenticado del sistema
**Quiero** poder configurar mis preferencias personales
**Para** personalizar mi experiencia en la plataforma

---

## Criterios de Aceptacion

### Escenario 1: Obtener preferencias

```gherkin
Given un usuario autenticado
When accede a GET /api/v1/users/me/preferences
Then el sistema retorna sus preferencias
  And si no tiene preferencias, retorna defaults del tenant
```

### Escenario 2: Cambiar idioma

```gherkin
Given un usuario con idioma "es"
When cambia a idioma "en"
Then el sistema guarda la preferencia
  And la interfaz cambia a ingles inmediatamente
```

### Escenario 3: Cambiar tema

```gherkin
Given un usuario con tema "light"
When activa tema "dark"
Then la interfaz cambia a colores oscuros
  And la preferencia persiste entre sesiones
```

### Escenario 4: Configurar notificaciones

```gherkin
Given un usuario con notificaciones de marketing activas
When desactiva notificaciones de marketing
Then deja de recibir ese tipo de emails
  And mantiene otras notificaciones activas
```

### Escenario 5: Reset preferencias

```gherkin
Given un usuario con preferencias personalizadas
When ejecuta reset de preferencias
Then todas sus preferencias vuelven a defaults del tenant
```

---

## Mockup / Wireframe

```
+------------------------------------------------------------------+
|  [Logo]   Preferencias                                            |
+------------------------------------------------------------------+
|                                                                   |
|   ┌─────────────────────────────────────────────────────────┐    |
|   │ IDIOMA Y REGION                                          │    |
|   ├─────────────────────────────────────────────────────────┤    |
|   │ Idioma            [Español                         ▼]   │    |
|   │ Zona horaria      [America/Mexico_City             ▼]   │    |
|   │ Formato fecha     [DD/MM/YYYY                      ▼]   │    |
|   │ Formato hora      [24 horas                        ▼]   │    |
|   │ Moneda            [MXN - Peso Mexicano             ▼]   │    |
|   └─────────────────────────────────────────────────────────┘    |
|                                                                   |
|   ┌─────────────────────────────────────────────────────────┐    |
|   │ APARIENCIA                                               │    |
|   ├─────────────────────────────────────────────────────────┤    |
|   │ Tema              [☀️ Claro] [🌙 Oscuro] [💻 Sistema]    │    |
|   │ Tamaño fuente     [Pequeño] [Mediano] [Grande]          │    |
|   │ ☐ Modo compacto                                         │    |
|   │ ☐ Sidebar colapsado por defecto                        │    |
|   └─────────────────────────────────────────────────────────┘    |
|                                                                   |
|   ┌─────────────────────────────────────────────────────────┐    |
|   │ NOTIFICACIONES                                           │    |
|   ├─────────────────────────────────────────────────────────┤    |
|   │ Email                                                    │    |
|   │   ☑ Habilitado       Frecuencia: [Diario          ▼]   │    |
|   │   ☑ Alertas de seguridad                                │    |
|   │   ☑ Actualizaciones del sistema                         │    |
|   │   ☐ Comunicaciones de marketing                         │    |
|   │                                                          │    |
|   │ Push                                                     │    |
|   │   ☑ Habilitado                                          │    |
|   │   ☑ Sonido de notificacion                              │    |
|   │                                                          │    |
|   │ In-App                                                   │    |
|   │   ☑ Habilitado                                          │    |
|   │   ☐ Notificaciones de escritorio                        │    |
|   └─────────────────────────────────────────────────────────┘    |
|                                                                   |
|   [Restaurar valores predeterminados]    [ Guardar Cambios ]     |
+------------------------------------------------------------------+
```

---

## Notas Tecnicas

### API Endpoints

```typescript
// Obtener preferencias
GET /api/v1/users/me/preferences

// Response 200
{
  "language": "es",
  "timezone": "America/Mexico_City",
  "dateFormat": "DD/MM/YYYY",
  "timeFormat": "24h",
  "currency": "MXN",
  "numberFormat": "es-MX",
  "theme": "dark",
  "sidebarCollapsed": false,
  "compactMode": false,
  "fontSize": "medium",
  "notifications": {
    "email": {
      "enabled": true,
      "digest": "daily",
      "marketing": false,
      "security": true,
      "updates": true
    },
    "push": { "enabled": true, "sound": true },
    "inApp": { "enabled": true, "desktop": false }
  },
  "dashboard": {
    "defaultView": "overview",
    "widgets": ["sales", "inventory"]
  }
}

// Actualizar preferencias (parcial)
PATCH /api/v1/users/me/preferences
{
  "theme": "light",
  "notifications": {
    "email": { "marketing": false }
  }
}

// Reset preferencias
POST /api/v1/users/me/preferences/reset
```

### Aplicacion en Frontend

```typescript
// Al cambiar tema
useEffect(() => {
  document.documentElement.setAttribute('data-theme', preferences.theme);
}, [preferences.theme]);

// Al cambiar idioma
useEffect(() => {
  i18n.changeLanguage(preferences.language);
}, [preferences.language]);
```

---

## Definicion de Done

- [ ] Endpoint GET /api/v1/users/me/preferences
- [ ] Endpoint PATCH /api/v1/users/me/preferences
- [ ] Endpoint POST /api/v1/users/me/preferences/reset
- [ ] Deep merge para actualizaciones parciales
- [ ] Frontend: PreferencesPage con todas las secciones
- [ ] Frontend: Aplicacion inmediata de cambios (tema, idioma)
- [ ] Frontend: PreferencesContext para estado global
- [ ] Tests unitarios
- [ ] Code review aprobado

---

## Estimacion

| Tarea | Horas |
|-------|-------|
| Backend: Endpoints | 3h |
| Backend: Deep merge logic | 1h |
| Backend: Tests | 2h |
| Frontend: PreferencesPage | 5h |
| Frontend: Theme/Language context | 3h |
| Frontend: Tests | 2h |
| **Total** | **16h** |

---

## Historial

| Version | Fecha | Autor | Cambios |
|---------|-------|-------|---------|
| 1.0 | 2025-12-05 | System | Creacion inicial |
