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