# RF-NOTIF-002: Notificaciones por Email ## Identificacion | Campo | Valor | |-------|-------| | **ID** | RF-NOTIF-002 | | **Modulo** | MGN-008 Notifications | | **Titulo** | Notificaciones por Email | | **Prioridad** | P0 - Critica | | **Estado** | Draft | | **Fecha** | 2025-12-05 | --- ## Descripcion El sistema debe enviar notificaciones por email para eventos importantes, usando templates personalizables y respetando las preferencias de cada usuario. --- ## Requisitos Funcionales ### RF-NOTIF-002.1: Configuracion de Email | Configuracion | Descripcion | |---------------|-------------| | SMTP Host | Servidor SMTP | | SMTP Port | Puerto (587, 465) | | SMTP User | Usuario autenticacion | | SMTP Password | Password (encriptado) | | From Address | Email remitente | | From Name | Nombre remitente | | Reply To | Email para respuestas | ### RF-NOTIF-002.2: Templates de Email Estructura de template: ```typescript interface EmailTemplate { id: UUID; tenant_id?: UUID; // null = global code: string; // Identificador unico name: string; // Nombre descriptivo subject: string; // Asunto (con variables) body_html: string; // Cuerpo HTML body_text: string; // Cuerpo texto plano variables: string[]; // Variables disponibles category: string; // Categoria del template is_active: boolean; created_at: TIMESTAMPTZ; updated_at: TIMESTAMPTZ; } ``` ### RF-NOTIF-002.3: Variables en Templates Sistema de variables con sintaxis Handlebars: ```html

Hola {{user.firstName}},

Se ha creado un nuevo pedido:

Numero: {{order.number}}
Total: {{formatCurrency order.total order.currency}}
{{#if order.items}} {{/if}} Ver pedido ``` ### RF-NOTIF-002.4: Templates Predefinidos | Codigo | Descripcion | Variables | |--------|-------------|-----------| | `welcome` | Bienvenida nuevo usuario | user, tenant, activationUrl | | `password_reset` | Recuperar password | user, resetUrl, expiresIn | | `order_created` | Pedido creado | user, order, items | | `invoice_sent` | Factura enviada | user, invoice, downloadUrl | | `payment_received` | Pago recibido | user, payment, order | | `task_assigned` | Tarea asignada | user, task, assigner | | `approval_request` | Solicitud aprobacion | user, entity, approveUrl | ### RF-NOTIF-002.5: Personalizacion por Tenant Cada tenant puede personalizar: - Logo en header - Colores del email - Footer con datos empresa - Templates especificos ```typescript interface TenantEmailConfig { logoUrl: string; primaryColor: string; footerHtml: string; customTemplates: UUID[]; // Templates propios } ``` ### RF-NOTIF-002.6: Cola de Envio Los emails se procesan via cola: ```typescript interface EmailJob { id: UUID; templateCode: string; to: string[]; cc?: string[]; bcc?: string[]; variables: Record; attachments?: Attachment[]; priority: 'low' | 'normal' | 'high'; scheduledAt?: TIMESTAMPTZ; status: 'pending' | 'processing' | 'sent' | 'failed'; attempts: number; lastError?: string; sentAt?: TIMESTAMPTZ; } ``` ### RF-NOTIF-002.7: Tracking de Emails Opcionalmente, trackear apertura y clicks: ```typescript interface EmailTracking { emailJobId: UUID; openedAt?: TIMESTAMPTZ; openCount: number; clicks: { url: string; clickedAt: TIMESTAMPTZ; }[]; userAgent?: string; ipAddress?: INET; } ``` --- ## Operaciones ### Enviar Email ```typescript POST /api/v1/notifications/email { "template": "order_created", "to": ["cliente@example.com"], "variables": { "user": { "firstName": "Juan" }, "order": { "number": "ORD-001", "total": 1500 } } } Response: { "jobId": "uuid", "status": "queued", "scheduledAt": "2025-12-05T10:00:00Z" } ``` ### Listar Templates ```typescript GET /api/v1/notifications/email/templates Response: { "data": [ { "id": "uuid", "code": "welcome", "name": "Email de Bienvenida", "category": "auth", "variables": ["user", "tenant", "activationUrl"] } ] } ``` ### Crear/Editar Template ```typescript POST /api/v1/notifications/email/templates { "code": "custom_invoice", "name": "Factura Personalizada", "subject": "Factura {{invoice.number}}", "bodyHtml": "...", "bodyText": "...", "variables": ["user", "invoice"] } ``` ### Preview de Template ```typescript POST /api/v1/notifications/email/templates/:id/preview { "variables": { "user": { "firstName": "Juan" }, "invoice": { "number": "INV-001" } } } Response: { "subject": "Factura INV-001", "bodyHtml": "...", "bodyText": "..." } ``` ### Historial de Envios ```typescript GET /api/v1/notifications/email/history?to=user@example.com Response: { "data": [ { "id": "uuid", "template": "welcome", "to": ["user@example.com"], "status": "sent", "sentAt": "2025-12-05T10:00:00Z", "opened": true, "openedAt": "2025-12-05T10:05:00Z" } ] } ``` --- ## Reglas de Negocio | ID | Regla | Severidad | |----|-------|-----------| | BR-001 | Reintentar 3 veces en caso de fallo | Reliability | | BR-002 | Rate limit: 100 emails/min por tenant | Performance | | BR-003 | Emails con tracking respetan privacidad | Privacy | | BR-004 | Templates globales no editables por tenant | Security | | BR-005 | Logs de email se retienen 90 dias | Compliance | --- ## Criterios de Aceptacion - [ ] Configuracion SMTP funcional - [ ] Templates con variables Handlebars - [ ] Personalizacion por tenant - [ ] Cola de envio con reintentos - [ ] Tracking de apertura (opcional) - [ ] Preview de templates - [ ] Historial de envios --- ## Historial | Version | Fecha | Autor | Cambios | |---------|-------|-------|---------| | 1.0 | 2025-12-05 | Requirements-Analyst | Creacion inicial |