Saltearse al contenido

04 - Catálogo de Notificaciones

Validated Corrections

  • Todas las notificaciones y el mailable de soporte siguen siendo sincronos; este documento debe leerse con ese costo operativo en mente.
  • InformarDePostulacionAprobada si esta muerto, pero no es una mera duplicacion trivial: su intencion funcional no coincide exactamente con el flujo activo actual.
  • El onboarding de postulaciones aprobadas mantiene dependencia operativa de correos a administradores, porque el enlace firmado no se entrega al solicitante del mismo modo en el flujo vivo.
  • El catalogo sigue siendo bastante correcto, pero conviene usarlo junto con el mapa de listeners/eventos y no como documento aislado.

Resumen General

7 clases de notificación personalizadas en app/Notifications/, todas usando únicamente el canal mail. Adicionalmente, la aplicación despacha la notificación VerifyEmail integrada de Laravel y tiene 1 clase Mailable (TicketSoporte). No se usan canales de base de datos, Slack o SMS. Ninguna notificación ni mailable está en cola — aunque algunas importan el trait Queueable, ninguna implementa la interfaz ShouldQueue. 1 clase de notificación parece ser código muerto.

Convención de conteo para presentaciones: si cuenta clases de notificación personalizadas, el número correcto es 7. Si cuenta flujos de correo orientados al usuario, el número práctico es 9 (7 notificaciones personalizadas + VerifyEmail + mailable TicketSoporte).

Nota: Todos los correos de notificación se envían de forma sincrónica durante la petición HTTP, lo que puede causar latencia en endpoints que notifican a múltiples administradores. Desglose del uso del trait Queueable: 3 clases lo usan en el cuerpo de la clase (ResetPasswordNotification, AllyResetPasswordNotification, InformarDePostulacionAprobada); 4 clases importan tanto Queueable como ShouldQueue pero no usan ninguno (imports muertos). config/services.php contiene la configuración OAuth del bot de Slack (líneas 31-36), pero ninguna clase de notificación usa el canal Slack — esta es infraestructura inactiva.

Notificaciones

1. ResetPasswordNotification

CampoValor
Archivoapp/Notifications/ResetPasswordNotification.php
Canalmail
DestinatarioUsuarios con rol === 'cliente'
DisparadorUser::sendPasswordResetNotification() — flujo de restablecimiento de contraseña de Laravel
En colaNo — Usa el trait Queueable pero NO implementa la interfaz ShouldQueue, por lo que se ejecuta sincrónicamente.
Asunto”Restablecer contraseña”
ContenidoEnlace de restablecimiento de contraseña (ruta: password.reset), información de expiración, instrucciones para verificar correo, iniciar sesión y completar perfil

2. AllyResetPasswordNotification

CampoValor
Archivoapp/Notifications/AllyResetPasswordNotification.php
Canalmail
DestinatarioUsuarios con rol !== 'cliente' (aliados, admins)
DisparadorUser::sendPasswordResetNotification() — flujo de restablecimiento de contraseña de Laravel
En colaNo — Usa el trait Queueable pero NO implementa la interfaz ShouldQueue, por lo que se ejecuta sincrónicamente.
Asunto”Restablecer contraseña”
ContenidoEnlace de restablecimiento de contraseña (ruta: aliado.password.reset)

3. NuevaPostulacionParaAdministrador

CampoValor
Archivoapp/Notifications/NuevaPostulacionParaAdministrador.php
Canalmail
DestinatarioTodos los usuarios con rol administrador_comercial
DisparadorEvento PostulacionDeAliadoCreada → Listener NotificarNuevaPostulacion
En colaNo
Asunto”Nueva postulación de aliado”
ContenidoNombre del solicitante, nombre de la empresa, correo, teléfono, enlace a la página de revisión (ruta: aliado.postulacion.revision)

4. PostulacionAprobadaAlSolicitante

CampoValor
Archivoapp/Notifications/PostulacionAprobadaAlSolicitante.php
Canalmail
DestinatarioSolicitante de aliado (modelo PostulacionAliado, usa Notifiable)
DisparadorEvento PostulacionDeAliadoAprobada → Listener EnviarInvitacionDeRegistro
En colaNo
Asunto”Tu postulación ha sido aprobada”
ContenidoConfirmación de aprobación para empresa específica, mensaje de agradecimiento

5. PostulacionAprobadaParaAdministrador

CampoValor
Archivoapp/Notifications/PostulacionAprobadaParaAdministrador.php
Canalmail
DestinatarioTodos los usuarios con rol administrador_comercial
DisparadorEvento PostulacionDeAliadoAprobada → Listener EnviarInvitacionDeRegistro
En colaNo
Asunto”Postulación aprobada - Completar registro”
ContenidoNombre de la empresa, correo del solicitante, enlace firmado de registro (ruta: aliado-postulacion.register, expira en 3 meses)

6. PostulacionRechazadaODescartada

CampoValor
Archivoapp/Notifications/PostulacionRechazadaODescartada.php
Canalmail
DestinatarioSolicitante de aliado (modelo PostulacionAliado)
DisparadorEvento PostulacionDeAliadoRechazadaODescartada → Listener NotificarRechazODescarte
En colaNo
Asunto”Estado de tu postulación”
ContenidoEstado de rechazo/descarte, motivo opcional (causal), mensaje de contacto a soporte

7. InformarDePostulacionAprobada ⚠️ NO USADA

CampoValor
Archivoapp/Notifications/InformarDePostulacionAprobada.php
Canalmail
DestinatarioSolicitante de aliado (previsto)
DisparadorNO ES DESPACHADA EN NINGUNA PARTE — código muerto
En colaNo
ContenidoMensaje de aprobación con un enlace firmado de registro dirigido al solicitante. El flujo activo envía el enlace firmado a los administradores (PostulacionAprobadaParaAdministrador) y solo una confirmación sin el enlace al solicitante (PostulacionAprobadaAlSolicitante); esta notificación es el único camino que entregaría la URL firmada de registro directamente al solicitante, pero nada la despacha hoy

Flujo Evento → Listener → Notificación

PostulacionDeAliadoCreada
└─→ NotificarNuevaPostulacion (listener)
└─→ NuevaPostulacionParaAdministrador → todos los usuarios administrador_comercial
PostulacionDeAliadoAprobada
└─→ EnviarInvitacionDeRegistro (listener)
├─→ PostulacionAprobadaAlSolicitante → solicitante
└─→ PostulacionAprobadaParaAdministrador → todos los usuarios administrador_comercial
PostulacionDeAliadoRechazadaODescartada
└─→ NotificarRechazODescarte (listener)
└─→ PostulacionRechazadaODescartada → solicitante
User::sendPasswordResetNotification()
├─ si rol !== 'cliente' → AllyResetPasswordNotification
└─ si rol === 'cliente' → ResetPasswordNotification

Resumen

NotificaciónEn colaDestinatarioActiva
ResetPasswordNotificationNoClientes
AllyResetPasswordNotificationNoAliados/Admins
NuevaPostulacionParaAdministradorNoAdmin comercial
PostulacionAprobadaAlSolicitanteNoSolicitante
PostulacionAprobadaParaAdministradorNoAdmin comercial
PostulacionRechazadaODescartadaNoSolicitante
InformarDePostulacionAprobadaNoCódigo muerto
VerifyEmail (integrada)NoUsuarios en registro
TicketSoporte (Mailable)NoCorreo de contacto