Saltar a contenido

RF-007 — Notificaciones transaccionales por correo

Estado En desarrollo (rama hquintero)
Tipo Notification provider propio + suscriptores de eventos
Ubicación src/modules/email-notification/ · identificador email-notification · src/subscribers/
Depende de Módulos Notification y Event Bus — RF-000

Requisito

Notificar por correo electrónico los hitos del ciclo de vida del cliente y del pedido, con plantillas propias en castellano y con la identidad visual de la tienda; y avisar al equipo comercial de los eventos que requieren su intervención. Desacoplar el envío de la operación que lo origina, de modo que una falla de correo no interrumpa la venta.

Solución adoptada

Implementar un notification provider sobre SMTP y disparar los envíos desde suscriptores del event bus. El contenido y los estilos se mantienen separados de la lógica de envío, de modo que la edición de un texto no requiere tocar código de servicio.

flowchart LR
    E[Evento de dominio] --> S[Suscriptor]
    S --> Q[Resolver datos del pedido o del cliente]
    Q --> N[Módulo Notification]
    N --> P[Provider email-notification]
    P --> T[Plantilla HTML + variables]
    T --> SMTP[(SMTP)]
    SMTP --> C([Cliente])
    SMTP --> V([Equipo comercial])

Matriz de eventos y destinatarios

Evento Plantilla al cliente Plantilla interna
customer.created welcome —
auth.password_reset password-reset —
order.placed order-confirmation sales-new-order
order.fulfillment_created order-shipped sales-order-shipped
order.completed order-delivered —
order.canceled order-cancelled —
order.return_requested return-requested —
order.return_received return-received —

Existen además plantillas registradas sin suscriptor que las dispare: email-verification, order-processing, order-refunded, sales-order-cancelled y sales-return-requested, más contenido redactado para reposición de stock, últimas unidades y carrito abandonado. Quedan disponibles para invocación directa desde el módulo de notificaciones.

Reglas de negocio

  • Redactar todo el contenido en castellano, con asunto por plantilla y sustitución de variables —número de pedido, nombre del cliente, importes— en el momento del envío.
  • Dirigir los avisos internos a la casilla del área comercial, y omitirlos si no está configurada.
  • Enlazar el correo del cliente al storefront y el aviso interno al dashboard, resolviendo el dominio desde la configuración de CORS.
  • Tratar el envío como accesorio del evento: los errores se registran sin propagarse a la operación que originó el evento.
  • Mantener el contenido y los estilos en módulos separados del servicio de envío.

Configuración

Variable Uso
SMTP_HOST · SMTP_PORT · SMTP_USER · SMTP_PASS Credenciales del servidor de correo saliente
SMTP_FROM Remitente de todos los envíos
SALES_DEPARTMENT_EMAIL Destinatario de los avisos internos
STORE_CORS · ADMIN_CORS Origen de los enlaces incluidos en el cuerpo del correo

Criterios de aceptación

# Criterio
1 Enviar el correo de bienvenida al registrarse un cliente nuevo
2 Enviar confirmación al cliente y aviso al área comercial al confirmarse un pedido
3 Enviar el aviso de envío con los datos del pedido al generarse el fulfillment
4 Completar la compra sin error cuando el servidor SMTP no responde
5 Modificar el texto de una plantilla sin alterar la lógica de envío

Limitaciones conocidas

  • Seleccionar la plantilla por sentencia switch sobre una cadena: una plantilla mal nombrada falla en ejecución, no en compilación.
  • Disponer de plantillas sin suscriptor asociado, que no llegan a enviarse por sí solas.
  • Carecer de reintento y de bitácora persistente de envíos: la única evidencia es el registro del proceso.