# RF-NOTIF-001: Notificaciones In-App ## Identificacion | Campo | Valor | |-------|-------| | **ID** | RF-NOTIF-001 | | **Modulo** | MGN-008 Notifications | | **Titulo** | Notificaciones In-App | | **Prioridad** | P0 - Critica | | **Estado** | Draft | | **Fecha** | 2025-12-05 | --- ## Descripcion El sistema debe permitir enviar y mostrar notificaciones dentro de la aplicacion, incluyendo alertas, mensajes del sistema, y notificaciones de actividad que los usuarios pueden ver en tiempo real. --- ## Requisitos Funcionales ### RF-NOTIF-001.1: Estructura de Notificacion | Campo | Tipo | Descripcion | |-------|------|-------------| | id | UUID | Identificador unico | | tenant_id | UUID | Tenant destino | | user_id | UUID | Usuario destino | | type | VARCHAR(50) | Tipo de notificacion | | category | VARCHAR(50) | Categoria (info, warning, error, success) | | title | VARCHAR(255) | Titulo corto | | message | TEXT | Mensaje completo | | data | JSONB | Datos adicionales (links, acciones) | | is_read | BOOLEAN | Marcada como leida | | read_at | TIMESTAMPTZ | Cuando se leyo | | is_archived | BOOLEAN | Archivada | | expires_at | TIMESTAMPTZ | Fecha de expiracion | | created_at | TIMESTAMPTZ | Fecha de creacion | ### RF-NOTIF-001.2: Tipos de Notificacion ```typescript enum NotificationType { // Sistema SYSTEM_ALERT = 'system_alert', MAINTENANCE = 'maintenance', // Tareas TASK_ASSIGNED = 'task_assigned', TASK_COMPLETED = 'task_completed', TASK_DUE = 'task_due', // Aprobaciones APPROVAL_REQUESTED = 'approval_requested', APPROVAL_GRANTED = 'approval_granted', APPROVAL_REJECTED = 'approval_rejected', // Documentos DOCUMENT_SHARED = 'document_shared', DOCUMENT_COMMENT = 'document_comment', // Usuarios USER_MENTION = 'user_mention', TEAM_INVITE = 'team_invite', // Negocios ORDER_CREATED = 'order_created', PAYMENT_RECEIVED = 'payment_received', STOCK_LOW = 'stock_low' } ``` ### RF-NOTIF-001.3: Categorias y Prioridades | Categoria | Color | Descripcion | |-----------|-------|-------------| | `info` | Azul | Informativo | | `success` | Verde | Accion exitosa | | `warning` | Amarillo | Requiere atencion | | `error` | Rojo | Error o problema | ```typescript enum NotificationPriority { LOW = 'low', // Puede esperar NORMAL = 'normal', // Mostrar en lista HIGH = 'high', // Destacar en UI URGENT = 'urgent' // Popup inmediato } ``` ### RF-NOTIF-001.4: Acciones en Notificacion Las notificaciones pueden incluir acciones: ```typescript interface NotificationAction { label: string; // "Ver pedido", "Aprobar" type: 'link' | 'action'; // Navegar o ejecutar url?: string; // Para links actionId?: string; // Para acciones primary?: boolean; // Destacar } // Ejemplo { "type": "approval_requested", "title": "Aprobacion pendiente", "message": "Pedido #1234 requiere tu aprobacion", "data": { "entityType": "orders", "entityId": "uuid-order", "actions": [ { "label": "Aprobar", "type": "action", "actionId": "approve", "primary": true }, { "label": "Rechazar", "type": "action", "actionId": "reject" }, { "label": "Ver pedido", "type": "link", "url": "/orders/uuid-order" } ] } } ``` ### RF-NOTIF-001.5: Notificaciones en Tiempo Real Usando WebSockets para entrega inmediata: ```typescript // Conexion WebSocket ws://api.example.com/notifications?token=JWT // Eventos interface NotificationEvent { type: 'new' | 'read' | 'archived' | 'count_update'; payload: Notification | { count: number }; } ``` ### RF-NOTIF-001.6: Agrupacion de Notificaciones Notificaciones similares se agrupan: ```typescript // Si hay 5 comentarios en 1 hora en el mismo documento: { "type": "document_comment", "title": "5 nuevos comentarios", "message": "En el documento 'Propuesta Q1'", "data": { "count": 5, "groupedIds": ["uuid1", "uuid2", ...] } } ``` --- ## Operaciones ### Listar Notificaciones ```typescript GET /api/v1/notifications?isRead=false&limit=20 Response: { "data": [ { "id": "uuid", "type": "task_assigned", "category": "info", "title": "Nueva tarea asignada", "message": "Te han asignado la tarea 'Revisar informe'", "isRead": false, "createdAt": "2025-12-05T10:00:00Z" } ], "meta": { "total": 15, "unreadCount": 5 } } ``` ### Marcar como Leida ```typescript PUT /api/v1/notifications/:id/read // O multiples: PUT /api/v1/notifications/read { "ids": ["uuid1", "uuid2"] } ``` ### Marcar Todas como Leidas ```typescript PUT /api/v1/notifications/read-all ``` ### Obtener Contador ```typescript GET /api/v1/notifications/count Response: { "total": 50, "unread": 5, "byCategory": { "info": 3, "warning": 2 } } ``` ### Archivar Notificacion ```typescript PUT /api/v1/notifications/:id/archive ``` ### Ejecutar Accion ```typescript POST /api/v1/notifications/:id/actions/:actionId // Ejecuta la accion asociada (aprobar, rechazar, etc.) ``` --- ## Reglas de Negocio | ID | Regla | Severidad | |----|-------|-----------| | BR-001 | Notificaciones expiran despues de 30 dias | Info | | BR-002 | Maximo 100 notificaciones no leidas | Info | | BR-003 | Notificaciones urgentes muestran popup | UX | | BR-004 | Agrupacion si > 3 del mismo tipo en 1h | UX | | BR-005 | WebSocket reconecta automaticamente | Reliability | --- ## Criterios de Aceptacion - [ ] Crear y mostrar notificaciones in-app - [ ] Entrega en tiempo real via WebSocket - [ ] Marcar como leida individual y masivo - [ ] Contador de no leidas en header - [ ] Acciones ejecutables desde notificacion - [ ] Agrupacion de notificaciones similares - [ ] Expiracion automatica --- ## Historial | Version | Fecha | Autor | Cambios | |---------|-------|-------|---------| | 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial |