# 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}}
{{#each order.items}}
- {{this.name}} x {{this.quantity}}
{{/each}}
{{/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 |