# RF-NOTIF-003: Push Notifications

## Identificacion

| Campo | Valor |
|-------|-------|
| **ID** | RF-NOTIF-003 |
| **Modulo** | MGN-008 Notifications |
| **Titulo** | Push Notifications |
| **Prioridad** | P1 - Alta |
| **Estado** | Draft |
| **Fecha** | 2025-12-05 |

---

## Descripcion

El sistema debe soportar notificaciones push para navegadores web y dispositivos moviles, permitiendo alertar a usuarios incluso cuando no tienen la aplicacion abierta.

---

## Requisitos Funcionales

### RF-NOTIF-003.1: Registro de Dispositivos

```typescript
interface PushSubscription {
  id: UUID;
  user_id: UUID;
  device_type: 'web' | 'android' | 'ios';
  device_name: string;          // "Chrome en Windows"
  push_token: TEXT;             // Token del dispositivo
  endpoint: TEXT;               // Para Web Push
  keys: JSONB;                  // p256dh, auth para Web Push
  is_active: boolean;
  last_used_at: TIMESTAMPTZ;
  created_at: TIMESTAMPTZ;
}
```

### RF-NOTIF-003.2: Web Push (PWA)

Para navegadores web usando VAPID:

```typescript
// Configuracion
interface WebPushConfig {
  vapidPublicKey: string;
  vapidPrivateKey: string;  // Encriptado
  subject: string;          // mailto:admin@example.com
}

// Subscription del navegador
interface WebPushSubscription {
  endpoint: string;
  keys: {
    p256dh: string;
    auth: string;
  };
}
```

### RF-NOTIF-003.3: Estructura de Push Notification

```typescript
interface PushNotification {
  title: string;           // Max 50 chars
  body: string;            // Max 200 chars
  icon?: string;           // URL del icono
  badge?: string;          // Badge para mobile
  image?: string;          // Imagen grande
  tag?: string;            // Para agrupar
  data?: {
    url: string;           // URL al hacer click
    notificationId: UUID;
    entityType?: string;
    entityId?: UUID;
  };
  actions?: {
    action: string;
    title: string;
    icon?: string;
  }[];
  requireInteraction?: boolean;  // No cerrar automaticamente
  silent?: boolean;              // Sin sonido
  timestamp?: number;            // Timestamp del evento
}
```

### RF-NOTIF-003.4: Proveedores de Push

| Plataforma | Proveedor | Configuracion |
|------------|-----------|---------------|
| Web | Web Push (VAPID) | Claves VAPID |
| Android | Firebase Cloud Messaging | Server Key |
| iOS | APNs | Certificado + Key ID |

### RF-NOTIF-003.5: Sincronizacion con In-App

- Push notification crea/actualiza notificacion in-app
- Al hacer click en push, abre la app y marca como leida
- Si la app esta abierta, solo muestra in-app (no push)

### RF-NOTIF-003.6: Preferencias de Push

```typescript
interface PushPreferences {
  enabled: boolean;
  quietHours: {
    enabled: boolean;
    start: string;  // "22:00"
    end: string;    // "08:00"
  };
  allowedTypes: NotificationType[];
  devices: {
    deviceId: UUID;
    enabled: boolean;
  }[];
}
```

---

## Operaciones

### Registrar Dispositivo (Web)

```typescript
POST /api/v1/notifications/push/subscribe
{
  "deviceType": "web",
  "deviceName": "Chrome en Windows",
  "subscription": {
    "endpoint": "https://fcm.googleapis.com/...",
    "keys": {
      "p256dh": "...",
      "auth": "..."
    }
  }
}

Response:
{
  "subscriptionId": "uuid",
  "vapidPublicKey": "..."
}
```

### Desregistrar Dispositivo

```typescript
DELETE /api/v1/notifications/push/subscribe/:subscriptionId
```

### Listar Dispositivos

```typescript
GET /api/v1/notifications/push/devices

Response:
{
  "devices": [
    {
      "id": "uuid",
      "deviceType": "web",
      "deviceName": "Chrome en Windows",
      "isActive": true,
      "lastUsedAt": "2025-12-05T10:00:00Z"
    }
  ]
}
```

### Enviar Push (Admin/Sistema)

```typescript
POST /api/v1/notifications/push/send
{
  "userId": "uuid",
  "title": "Nuevo pedido",
  "body": "Se ha creado el pedido #1234",
  "data": {
    "url": "/orders/uuid-order"
  }
}
```

### Enviar Push Masivo

```typescript
POST /api/v1/notifications/push/broadcast
{
  "tenantId": "uuid",
  "title": "Mantenimiento programado",
  "body": "El sistema estara en mantenimiento manana a las 22:00",
  "filter": {
    "roles": ["admin", "manager"]
  }
}
```

---

## Reglas de Negocio

| ID | Regla | Severidad |
|----|-------|-----------|
| BR-001 | Respetar quiet hours del usuario | UX |
| BR-002 | Max 1 push por minuto por tipo | UX |
| BR-003 | Token expirado se elimina automaticamente | Reliability |
| BR-004 | No enviar push si app esta activa | UX |
| BR-005 | Click en push marca como leida | UX |

---

## Criterios de Aceptacion

- [ ] Web Push con VAPID funcional
- [ ] Registro/desregistro de dispositivos
- [ ] Sincronizacion con notificaciones in-app
- [ ] Quiet hours respetadas
- [ ] Click abre la app en la URL correcta
- [ ] Dispositivos inactivos se limpian

---

## Historial

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