Appearance
Reenvio de Mails de Facturacion por Lotes
Modulo: Membresias Tipo: Process Estado: Planificado Fecha: 2026-03-18
Descripcion
Problema que resuelve
El proceso de facturacion por lotes de membresias incluye el envio de emails de notificacion a los socios facturados exitosamente, adjuntando el cupon de pago en PDF. Sin embargo, actualmente no existe manera de reenviar esos emails una vez que el proceso de facturacion finaliza.
Los operadores enfrentan las siguientes limitaciones:
- Emails fallidos sin recuperacion: Si el envio de email fallo por un error transitorio del servidor de correo (timeout, sobrecarga temporal), no hay forma de reintentar el envio
- Emails no enviados sin remedio: Si el operador ejecuto la facturacion sin la opcion de envio de emails activada, no puede enviarlos posteriormente sin re-ejecutar todo el proceso
- Informacion de envio efimera: Los resultados del envio de emails solo existen temporalmente en el sistema de trabajos en segundo plano, con un tiempo de vida limitado de 30 dias. Transcurrido ese plazo, no hay forma de saber que emails se enviaron y cuales no
- Falta de granularidad: No es posible reenviar el email solo a los socios que tuvieron problemas; cualquier accion de reenvio afecta a todos los destinatarios del lote
- Ausencia de reintentos automaticos: Los errores transitorios del servidor de correo (que se resolverian solos en minutos) requieren intervencion manual del operador
Solucion propuesta
Se implementa un proceso incremental en tres fases que permite reenviar emails de facturacion desde el historial de lotes:
- Fase 1 — Reenvio masivo: Boton "Reenviar Mails" en el historial de lotes que reenvia emails a todos los socios exitosos del lote
- Fase 2 — Seguimiento granular y reenvio selectivo: Registro permanente del estado de envio por socio, con posibilidad de filtrar los fallidos y reenviar solo a los seleccionados
- Fase 3 — Reintentos automaticos: El sistema reintenta automaticamente los envios fallidos por errores transitorios, con intervalos crecientes entre cada intento
Valor para el negocio
- Recuperacion de envios fallidos: El operador puede reenviar emails sin necesidad de re-ejecutar la facturacion completa
- Trazabilidad permanente del envio: El estado de envio de cada socio queda registrado en la sucursal, independiente del sistema de trabajos en segundo plano
- Reenvio selectivo: A partir de la Fase 2, el operador puede identificar exactamente que socios no recibieron el email y reenviar solo a esos
- Reduccion de intervencion manual: A partir de la Fase 3, los errores transitorios del servidor de correo se resuelven automaticamente sin intervencion del operador
- Mejora en la atencion al socio: Ante consultas de socios que no recibieron el cupon de pago, el operador puede reenviar el email en el momento
Contexto
- Esta funcionalidad extiende el proceso de facturacion por lotes ya implementado (ver Facturacion por Lotes)
- Se integra con la vista de Historial de Lotes existente (ver Historial de Lotes de Facturacion)
- Opera dentro de la sucursal activa (schema activo)
- Respeta el modo de ejecucion del lote original (oficial o prueba)
Proceso de Negocio
Fase 1: Reenvio masivo de emails desde el historial
El operador puede reenviar los emails de notificacion a todos los socios exitosos de un lote completado, directamente desde la vista de historial de lotes.
Flujo de reenvio masivo
mermaid
flowchart TD
A["1. OPERADOR IDENTIFICA LOTE
- Accede al historial de lotes
- Localiza el lote al que desea reenviar emails"]
B["2. OPERADOR SOLICITA REENVIO
- Presiona boton 'Reenviar Mails'
- Sistema muestra dialogo de confirmacion
con cantidad de destinatarios"]
C["3. OPERADOR CONFIRMA
- Acepta el dialogo de confirmacion"]
D["4. SISTEMA PROCESA EN SEGUNDO PLANO
- Sistema despacha el envio de emails
como trabajo en segundo plano
- Genera emails con cupon de pago PDF
para cada socio exitoso con email"]
E["5. RESULTADO
- El operador recibe notificacion
cuando el envio finaliza
- El resultado es visible a traves
del sistema de notificaciones existente"]
A --> B --> C --> D --> ECondiciones para habilitar el reenvio
| Condicion del lote | Boton "Reenviar Mails" |
|---|---|
| Lote completado con detalle disponible, no es simulacion | Habilitado |
| Lote sin detalle disponible (anterior a la version con detalle) | Deshabilitado — mensaje: "Lote sin detalle" |
| Lote en progreso | Deshabilitado — mensaje: "Lote en progreso" |
| Lote de simulacion | Oculto (las simulaciones no generan emails reales) |
| Ya hay un envio de emails en curso para el mismo lote | Deshabilitado — mensaje: "Envio en progreso" |
Destinatarios del reenvio
El reenvio se dirige unicamente a los socios con resultado exitoso en el lote que tengan email registrado. Los socios omitidos, con error o sin email no reciben reenvio.
Fase 2: Seguimiento granular y reenvio selectivo
A partir de esta fase, el sistema registra de forma permanente el resultado del envio de email para cada socio de cada lote. Esto permite al operador consultar el estado individual de cada envio y reenviar selectivamente solo a los socios que lo necesiten.
Registro permanente del estado de envio
Cada vez que el sistema procesa el envio de emails de un lote (ya sea el envio inicial o un reenvio), registra por cada socio:
| Dato | Descripcion |
|---|---|
| Socio | Identificador y nombre del socio destinatario |
| Direccion de email utilizada | |
| Estado del envio | Pendiente, Enviado, Omitido o Error |
| Ultimo intento | Fecha y hora del ultimo intento de envio |
| Detalle del error | Descripcion del error si el envio fallo |
| Cantidad de intentos | Numero de veces que se intento enviar el email |
Este registro queda almacenado en la sucursal y sobrevive al vencimiento de los datos temporales del sistema de trabajos en segundo plano (30 dias).
Consulta del estado de envio por socio
El operador puede consultar el estado de envio de emails de un lote especifico, con las siguientes capacidades:
- Filtrado por estado: El operador puede filtrar la lista para ver solo los envios exitosos, solo los fallidos o solo los omitidos
- Paginacion: La lista se presenta paginada para lotes con gran cantidad de socios
- Informacion de cada socio: Nombre, email, estado del envio, fecha del ultimo intento, detalle del error (si aplica) y cantidad de intentos realizados
Reenvio selectivo
El operador puede seleccionar socios individuales de la lista y reenviar emails solo a los seleccionados:
- El operador abre el detalle de emails del lote
- El operador filtra por estado (tipicamente "Error") para identificar los envios fallidos
- El operador selecciona los socios a los que desea reenviar el email (mediante casillas de verificacion)
- El operador presiona "Reenviar Seleccionados"
- El sistema muestra dialogo de confirmacion con la cantidad de destinatarios seleccionados
- Al confirmar, el sistema despacha el reenvio solo para los socios seleccionados
Regla: El reenvio selectivo solo admite socios que pertenecen al lote y cuyo resultado de facturacion fue exitoso. Si se intenta incluir un socio que no cumple estas condiciones, el sistema lo rechaza.
Actualizacion del registro de envio
Cuando se reenvian emails (masivo o selectivo), el sistema actualiza el registro de cada socio afectado:
- Si ya existia un registro previo para ese socio en el lote, se actualiza el estado, la fecha del ultimo intento y se incrementa el contador de intentos
- No se duplican registros: cada socio tiene un unico registro por lote que se actualiza en cada intento
Fase 3: Reintentos automáticos con backoff exponencial
A partir de esta fase, cuando el job de email email_notification_lote falla por un error transitorio (timeout SMTP, conexión rechazada, servidor temporalmente no disponible), el sistema lo reintenta automáticamente usando una estrategia de backoff exponencial.
Comportamiento del retry automático
Cuando el job de email falla con un error transitorio:
- El sistema programa automáticamente un reintento después de un delay calculado
- El delay entre reintentos crece exponencialmente: 1er retry ~60-90s, 2do ~120-150s, 3er ~240-300s, hasta máximo 3600s (1 hora)
- Se agrega jitter (aleatoriedad ±30s) para evitar "thundering herd" cuando muchos jobs fallan juntos
- Solo se reintentan los socios con estado "Error" — los que ya fueron enviados exitosamente se skippean
- Si todos los intentos fallan, el job se marca como fallido permanentemente
Fórmula del delay
delay = min(BASE_DELAY * 2^attempt + jitter, MAX_DELAY)| Variable | Configuración | Descripción |
|---|---|---|
| BASE_DELAY | MAIL_RETRY_BASE_DELAY=60 (segundos) | Delay base del primer intento |
| MAX_DELAY | MAIL_RETRY_MAX_DELAY=3600 (segundos) | Delay máximo permitido (1 hora) |
| Jitter | ±30 segundos aleatorios | Para distribuir carga cuando múltiples jobs fallan |
| Max reintentos | MAIL_RETRY_MAX=5 | Cantidad máxima de reintentos |
Ejemplos de delay por intento:
| Intento | Cálculo | Delay resultante |
|---|---|---|
| 1er reintento | min(60 × 2^0 + rand(0,30), 3600) | 60-90 segundos |
| 2do reintento | min(60 × 2^1 + rand(0,30), 3600) | 120-150 segundos |
| 3er reintento | min(60 × 2^2 + rand(0,30), 3600) | 240-300 segundos |
| 4to reintento | min(60 × 2^3 + rand(0,30), 3600) | 480-540 segundos |
| 5to reintento | min(60 × 2^4 + rand(0,30), 3600) | 900-960 segundos |
Reintento inteligente
En cada reintento, el handler lee qué socios ya recibieron el email exitosamente (de la tabla membresia_facturacion_email_detalle):
- Solo reenvía a socios cuyo estado sea
error - Los socios con estado
enviadose skippean - Si todos los socios ya tienen estado
enviado, el retry no envía ningún email y retorna vacío
Esto evita que los socios que ya recibieron el email lo reciban nuevamente por un reintento.
Errores no reintentables
No todos los errores justifican un retry automático:
| Tipo de error | Ejemplo | Reintento automático |
|---|---|---|
| Error transitorio | Timeout SMTP, conexión rechazada, servidor no disponible | Sí — se programa retry |
| Error de configuración | SMTP no configurado para la sucursal | No — el job falla inmediatamente |
| Error de datos | Lote incompleto, datos faltantes | No — el job falla inmediatamente |
Diferencia con el reenvío manual
- El retry automático es transparente para el operador — no requiere acción
- El reenvío manual (Fases 1 y 2) sigue disponible para el operador en cualquier momento
- El retry solo actúa cuando el job falla; si tiene éxito completo, no hay retry
Precondiciones
- Lote procesado correctamente (job inicial terminó de ejecutarse)
- Tabla de tracking existe y tiene registros (Fase 2 implementada)
- Error fue transitorio (timeout, conexión rechazada, servidor no disponible)
Postcondiciones
- Job reintentado con delay calculado por backoff
- Solo socios con estado
errorreciben el reenvío automático - Si todos los intentos agotados sin éxito → el job se marca como fallido permanentemente
Estados del proceso de tracking
Vistas
Historial de Lotes — Boton "Reenviar Mails" (Fase 1)
La vista de historial de lotes (ya existente) se extiende con un nuevo boton de accion por fila:
- Boton "Reenviar Mails": Aparece junto al boton existente "Reimprimir" en cada fila del historial de lotes
- El boton esta habilitado, deshabilitado u oculto segun las condiciones del lote (ver tabla de condiciones)
- Al presionar el boton, se muestra un dialogo de confirmacion: "Se enviaran emails a {N} socios exitosos con email. ¿Continuar?"
- Mientras el envio esta en curso, el boton se deshabilita con mensaje "Envio en progreso"
- Al completarse el envio, se muestra un mensaje de exito con la cantidad de destinatarios: "Envio de emails iniciado ({N} destinatarios)"
Panel de Detalle de Emails (Fase 2)
Nueva seccion accesible desde el historial de lotes al presionar "Ver Emails" en una fila de lote:
- Lista de socios con estado de envio: Muestra cada socio del lote con su estado de envio, email, fecha de ultimo intento, detalle de error y cantidad de intentos
- Chips de filtro por estado: Permite filtrar la lista por estado: Enviado, Error, Omitido. Cada chip muestra la cantidad de socios en ese estado
- Casillas de seleccion: Cada fila tiene una casilla de verificacion para seleccionar socios para reenvio
- Boton "Reenviar Seleccionados": Habilitado cuando hay al menos un socio seleccionado. Al presionar, muestra dialogo de confirmacion: "Se reenviaran emails a {N} socios. ¿Continuar?"
Acciones completas por fila del historial (Fase 2)
Con la Fase 2 implementada, cada fila del historial de un lote completado con detalle muestra tres acciones:
| Accion | Descripcion |
|---|---|
| Reimprimir | Reimprimir el informe PDF del lote (funcionalidad existente) |
| Reenviar Mails | Reenviar emails a todos los socios exitosos con email (Fase 1) |
| Ver Emails | Abrir el panel de detalle de emails con estado por socio y reenvio selectivo (Fase 2) |
Interacciones del Usuario
Reenviar emails masivamente (Fase 1)
- El operador de membresias accede al historial de lotes desde "Utilidades" del modulo de membresias
- El operador identifica el lote al que necesita reenviar emails
- El operador presiona el boton "Reenviar Mails" en la fila del lote
- El sistema muestra un dialogo de confirmacion indicando la cantidad de socios que recibiran el email
- El operador confirma el reenvio
- El sistema inicia el envio en segundo plano y deshabilita el boton con mensaje "Envio en progreso"
- Al completarse, el sistema muestra un mensaje de exito con la cantidad de destinatarios
Consultar estado de envio y reenviar selectivamente (Fase 2)
- El operador presiona "Ver Emails" en una fila de lote del historial
- El sistema muestra el panel de detalle con el estado de envio de cada socio
- El operador filtra por estado "Error" para ver solo los envios fallidos
- El operador selecciona los socios a los que desea reenviar el email usando las casillas de verificacion
- El operador presiona "Reenviar Seleccionados"
- El sistema muestra dialogo de confirmacion con la cantidad de seleccionados
- El operador confirma
- El sistema despacha el reenvio para los socios seleccionados
- Al completarse, el estado de cada socio se actualiza en el panel
Verificar que los reintentos automaticos funcionaron (Fase 3)
- El operador accede al panel de detalle de emails de un lote (Fase 2)
- El operador observa que algunos socios que inicialmente tenian estado "Error" ahora muestran estado "Enviado"
- El operador verifica que la cantidad de intentos muestra mas de 1 para esos socios, indicando que el sistema reintento automaticamente
- Para los socios que aun estan en "Error" despues de agotar los reintentos automaticos, el operador puede reenviar manualmente
Permisos
| Permiso | Descripcion | Acciones permitidas |
|---|---|---|
| Facturacion masiva de membresias | Permiso existente que habilita la facturacion por lotes | Reenviar emails masivamente, ver detalle de emails, reenviar selectivamente |
El reenvio de emails utiliza el mismo permiso que la facturacion masiva. No se requiere un permiso adicional.
Estados de UI
| Estado | Descripcion | Elementos visuales |
|---|---|---|
| Boton habilitado | El lote cumple las condiciones para reenviar emails | Boton "Reenviar Mails" activo en la fila del historial |
| Dialogo de confirmacion | El operador presiono el boton y debe confirmar | Dialogo con mensaje "Se enviaran emails a {N} socios exitosos con email. ¿Continuar?" |
| Envio en progreso | Se despacho el envio y esta en curso | Boton deshabilitado con mensaje "Envio en progreso" |
| Envio completado | El envio finalizo exitosamente | Mensaje de exito: "Envio de emails iniciado ({N} destinatarios)" |
| Error de despacho | No se pudo iniciar el envio (ej: ya hay un envio en curso) | Mensaje de error descriptivo |
| Panel de detalle vacio | El lote no tiene registros de envio (lote anterior a Fase 2) | Mensaje: "No hay registros de envio para este lote" |
| Reenvio selectivo en progreso | Se despacho el reenvio de los socios seleccionados | Boton "Reenviar Seleccionados" deshabilitado, indicador de progreso |
Backend (Perspectiva de Datos de Negocio)
Entidades de Negocio
Registro de Envio de Email por Socio (Fase 2)
Entidad que registra el estado de envio de email de notificacion para cada socio de un lote de facturacion.
| Dato de negocio | Descripcion |
|---|---|
| Lote de facturacion | Referencia al lote de facturacion al que pertenece el envio |
| Socio | Identificador del socio destinatario |
| Direccion de email utilizada para el envio | |
| Estado | Estado del envio: Pendiente, Enviado, Omitido o Error |
| Ultimo intento | Fecha y hora del ultimo intento de envio |
| Detalle del error | Descripcion del error si el envio fallo (nulo si fue exitoso) |
| Cantidad de intentos | Numero total de intentos de envio realizados |
Relaciones de Negocio
- Un lote de facturacion puede tener multiples registros de envio de email (uno por cada socio del lote)
- Cada registro de envio corresponde a un unico socio dentro de un unico lote
- No existen registros duplicados: cada combinacion de lote y socio tiene un unico registro de envio que se actualiza en cada intento
- El nombre del socio en la consulta de estado se obtiene del detalle del lote (no de una consulta al maestro de socios)
- El registro de envio es independiente del sistema de trabajos en segundo plano y permanece disponible indefinidamente
Validaciones de Negocio
| Validacion | Descripcion | Comportamiento si no cumple |
|---|---|---|
| Lote con detalle | Solo se pueden reenviar emails de lotes que tienen detalle almacenado | Error: "Este lote no tiene detalle almacenado" |
| Lote no en progreso | No se pueden reenviar emails de un lote que aun esta en ejecucion | Error: "Lote en progreso" |
| Lote no de simulacion | No se pueden reenviar emails de lotes de simulacion | Boton oculto |
| Sin envio en curso | No puede haber dos envios de email simultaneos para el mismo lote | Error: "Ya hay un envio de emails en progreso para este lote" |
| Socios validos (selectivo) | Los socios seleccionados para reenvio deben pertenecer al lote y ser exitosos | Error con lista de socios invalidos |
| Socios con email | Solo se envian emails a socios que tienen email registrado | Socios sin email se excluyen automaticamente del conteo de destinatarios |
Reglas de Negocio
RN-001: Reenvio solo a socios exitosos con email
Descripcion: El reenvio de emails se dirige exclusivamente a los socios cuyo resultado de facturacion fue exitoso y que tienen una direccion de email registrada en el detalle del lote.
Condicion: El operador solicita reenviar emails de un lote.
Accion:
- El sistema identifica los socios con resultado exitoso del lote
- Filtra los que tienen email registrado
- Solo esos socios reciben el reenvio
- Los socios omitidos, con error de facturacion o sin email no se incluyen
RN-002: Respeto del modo de ejecucion original
Descripcion: El reenvio de emails respeta el modo (oficial o prueba) en que se ejecuto el lote original. Si el lote fue ejecutado en modo prueba, el reenvio utiliza la base de datos de prueba para obtener los datos necesarios.
Condicion: Se despacha un reenvio de emails.
Accion:
- El sistema detecta si el lote original fue ejecutado en modo oficial o prueba
- Utiliza la conexion de base de datos correspondiente al modo original
- El modo del reenvio no depende del modo activo del sistema al momento de solicitar el reenvio
RN-003: Proteccion contra envios duplicados simultaneos
Descripcion: El sistema impide que se despachen dos envios de email simultaneos para el mismo lote. Esto evita que los socios reciban emails duplicados por un doble clic o por multiples operadores actuando sobre el mismo lote.
Condicion: El operador solicita reenviar emails de un lote que ya tiene un envio en curso.
Accion:
- El sistema verifica si ya existe un envio de emails activo (pendiente o en ejecucion) para ese lote
- Si existe, rechaza la solicitud con mensaje: "Ya hay un envio de emails en progreso para este lote"
- El boton "Reenviar Mails" se deshabilita mientras haya un envio activo
RN-004: Confirmacion obligatoria antes del reenvio
Descripcion: El reenvio de emails requiere confirmacion explicita del operador antes de ejecutarse. El dialogo de confirmacion muestra la cantidad exacta de destinatarios.
Condicion: El operador presiona el boton "Reenviar Mails" o "Reenviar Seleccionados".
Accion:
- El sistema muestra un dialogo de confirmacion con el texto: "Se enviaran emails a {N} socios exitosos con email. ¿Continuar?" (masivo) o "Se reenviaran emails a {N} socios. ¿Continuar?" (selectivo)
- El reenvio solo se ejecuta si el operador confirma
- Si el operador cancela, no se realiza ninguna accion
RN-005: Registro de envio sin duplicacion (Fase 2)
Descripcion: Cada combinacion de lote y socio tiene un unico registro de envio. Los reintentos actualizan el registro existente en lugar de crear uno nuevo.
Condicion: Se procesa el envio de email para un socio de un lote.
Accion:
- Si no existe registro previo para ese socio en el lote: se crea un nuevo registro
- Si ya existe registro previo: se actualiza el estado, la fecha del ultimo intento y se incrementa el contador de intentos
- Nunca se crean registros duplicados para la misma combinacion de lote y socio
RN-006: Nombre del socio desde el detalle del lote (Fase 2)
Descripcion: Al consultar el estado de envio de emails, el nombre del socio se obtiene del detalle almacenado en el lote, no de una consulta al maestro de socios.
Condicion: El operador consulta el estado de envio de emails de un lote.
Accion:
- El sistema obtiene el nombre del socio del campo de detalle del lote de facturacion
- No se realiza consulta al maestro de socios para obtener el nombre actual
- Esto garantiza que el nombre mostrado es el que tenia el socio al momento de la facturacion, no el actual
RN-007: Reenvio selectivo valida pertenencia al lote (Fase 2)
Descripcion: Cuando se solicita un reenvio selectivo, el sistema verifica que todos los socios seleccionados pertenecen al lote y tienen resultado exitoso.
Condicion: El operador solicita reenviar emails a una lista especifica de socios.
Accion:
- El sistema verifica que cada socio seleccionado exista en el detalle del lote con resultado exitoso
- Si alguno no cumple la condicion, el sistema rechaza la solicitud e indica cuales socios son invalidos
- Si no se especifican socios (reenvio masivo), se envian a todos los exitosos con email
RN-008: Reintentos automaticos solo para errores transitorios (Fase 3)
Descripcion: Los reintentos automaticos se aplican unicamente a errores transitorios del servidor de correo. Los errores permanentes (como la falta de configuracion del servidor de correo) no generan reintentos.
Condicion: Un envio de email falla durante el procesamiento.
Accion:
- Si el error es transitorio (timeout, servidor temporalmente no disponible): el sistema programa un reintento automatico con intervalo creciente
- Si el error es permanente (servidor no configurado, error de autenticacion): el socio queda en estado "Error" sin programar reintento
- El operador siempre puede reenviar manualmente independientemente del tipo de error
RN-009: Reintentos solo de socios fallidos (Fase 3)
Descripcion: Los reintentos automaticos solo procesan los socios que estan en estado "Error". Los socios que ya fueron enviados exitosamente no se vuelven a procesar.
Condicion: Se ejecuta un reintento automatico para un lote.
Accion:
- El sistema consulta el registro de envio del lote (Fase 2) para identificar socios con estado "Error"
- Solo esos socios se incluyen en el reintento
- Los socios con estado "Enviado" u "Omitido" no se procesan
- Esto evita que los socios que ya recibieron el email lo reciban nuevamente por un reintento
RN-010: Limite maximo de reintentos automaticos (Fase 3)
Descripcion: Existe un numero maximo configurable de reintentos automaticos. Una vez alcanzado, el sistema no programa mas reintentos y el socio queda en estado "Error" para intervencion manual.
Condicion: Un socio acumula el numero maximo de reintentos fallidos.
Accion:
- El sistema no programa mas reintentos automaticos para ese socio
- El estado del socio permanece como "Error" en el registro de envio
- El operador puede reenviar manualmente en cualquier momento desde la interfaz
- El numero maximo de reintentos es configurable por el administrador del sistema (por defecto 5)
Casos de Uso
CU-001: Reenviar emails de un lote completado
Actor: Operador de membresias
Objetivo: Reenviar los emails de notificacion con cupon de pago a todos los socios exitosos de un lote de facturacion que no recibieron el email originalmente
Precondiciones:
- El operador tiene permiso de facturacion masiva de membresias
- Existe un lote completado con detalle disponible en el historial
- El lote no es de simulacion
- No hay un envio de emails en curso para ese lote
Flujo principal:
- El operador accede al historial de lotes desde "Utilidades" del modulo de membresias
- El sistema muestra el listado de lotes ejecutados
- El operador identifica el lote deseado por su periodo, fecha y tipo de operacion
- El operador presiona el boton "Reenviar Mails" en la fila del lote
- El sistema muestra un dialogo de confirmacion: "Se enviaran emails a 45 socios exitosos con email. ¿Continuar?"
- El operador confirma el reenvio
- El sistema despacha el envio de emails en segundo plano
- El boton "Reenviar Mails" se deshabilita con mensaje "Envio en progreso"
- El sistema muestra un mensaje de exito: "Envio de emails iniciado (45 destinatarios)"
Postcondiciones:
- El envio de emails se ejecuta en segundo plano
- Los socios exitosos con email reciben la notificacion con el cupon de pago PDF
- El resultado del envio es accesible a traves del sistema de notificaciones
Flujos alternativos:
- 4a. Envio ya en curso: El boton esta deshabilitado con mensaje "Envio en progreso". El operador debe esperar a que finalice el envio actual
- 4b. Lote sin detalle: El boton esta deshabilitado con mensaje "Lote sin detalle". No es posible reenviar emails de lotes anteriores a la version con detalle
- 6a. Operador cancela: El sistema no realiza ninguna accion
CU-002: Reenviar emails selectivamente a socios con envio fallido
Actor: Operador de membresias
Objetivo: Identificar los socios que no recibieron el email de facturacion y reenviar solo a ellos
Precondiciones:
- Fase 2 implementada
- Existe un lote con registros de envio de email (al menos un envio previo)
- El operador tiene permiso de facturacion masiva
Flujo principal:
- El operador accede al historial de lotes
- El operador presiona "Ver Emails" en la fila del lote deseado
- El sistema muestra el panel de detalle de emails con el estado de cada socio
- El operador selecciona el chip de filtro "Error" para ver solo los envios fallidos
- El sistema muestra la lista de socios con estado "Error", incluyendo el detalle del error y la cantidad de intentos
- El operador selecciona 5 socios usando las casillas de verificacion
- El operador presiona "Reenviar Seleccionados"
- El sistema muestra dialogo de confirmacion: "Se reenviaran emails a 5 socios. ¿Continuar?"
- El operador confirma
- El sistema despacha el reenvio para los 5 socios seleccionados
- Al completarse, los registros de los socios se actualizan en el panel (estado, fecha, intentos)
Postcondiciones:
- Solo los 5 socios seleccionados reciben el reenvio
- El registro de envio de cada socio se actualiza con el nuevo estado
- Los demas socios del lote no se ven afectados
Flujos alternativos:
- 4a. No hay envios fallidos: El chip "Error" muestra cuenta 0. El boton "Reenviar Seleccionados" esta deshabilitado
- 6a. Socio invalido seleccionado: Si el operador intenta incluir un socio que no pertenece al lote, el sistema rechaza la solicitud indicando los socios invalidos
CU-003: Verificar que los reintentos automaticos resolvieron envios fallidos
Actor: Operador de membresias
Objetivo: Verificar que el sistema reintento automaticamente los emails fallidos y comprobar cuales se resolvieron
Precondiciones:
- Fases 2 y 3 implementadas
- Un lote tuvo envios de email con errores transitorios
- Han transcurrido varios minutos desde el fallo inicial
Flujo principal:
- El operador accede al historial de lotes
- El operador presiona "Ver Emails" en la fila del lote
- El sistema muestra el panel de detalle de emails
- El operador observa que varios socios que previamente estaban en "Error" ahora muestran estado "Enviado"
- El operador verifica que la columna "Intentos" muestra un numero mayor a 1 para esos socios, confirmando que el sistema reintento automaticamente
- El operador filtra por "Error" para ver si quedan socios sin resolver
- Para los socios que aun estan en "Error" (agotaron los reintentos), el operador puede reenviar manualmente seleccionandolos
Postcondiciones:
- El operador tiene visibilidad completa del estado actual de cada envio
- Los socios con errores transitorios resueltos muestran estado "Enviado"
- Los socios con errores persistentes quedan en "Error" disponibles para reenvio manual
Consideraciones
Seguridad
Control de acceso:
- El reenvio de emails utiliza el mismo permiso que la facturacion masiva de membresias
- Todos los operadores con permiso de facturacion pueden reenviar emails de cualquier lote de la sucursal
- No existe filtrado por usuario ejecutor del lote original
- El acceso esta limitado a la sucursal activa (multi-tenant)
Proteccion contra abuso:
- La proteccion contra envios duplicados simultaneos impide el envio masivo accidental por doble clic
- El dialogo de confirmacion obligatorio previene reenvios inadvertidos
Auditoria
El reenvio de emails se registra a traves de los mecanismos existentes:
| Operacion | Informacion registrada |
|---|---|
| Reenvio masivo | Lote, cantidad de destinatarios, usuario que solicito, fecha |
| Reenvio selectivo (Fase 2) | Lote, socios seleccionados, usuario que solicito, fecha |
| Estado de envio por socio (Fase 2) | Lote, socio, email, estado, intentos, fecha, detalle de error |
| Reintento automatico (Fase 3) | Lote, socios reintentados, numero de intento, resultado |
Rendimiento
Volumenes esperados:
- Un lote tipico tiene entre 100 y 1000 socios
- Los socios exitosos con email representan el grueso de los destinatarios
- El envio de emails se procesa en segundo plano, sin bloquear al operador
- La generacion de cada cupon de pago PDF es una operacion individual que consume tiempo
Impacto en el servidor de correo:
- El reenvio masivo puede generar cientos de emails simultaneamente
- Los reintentos automaticos (Fase 3) distribuyen la carga con intervalos crecientes y variacion aleatoria para evitar picos de carga
- El limite maximo de reintentos previene bucles infinitos de reintento
Integracion con funcionalidades existentes
- Historial de lotes: Se extiende con nuevos botones de accion sin modificar la funcionalidad existente
- Sistema de notificaciones: Los resultados del envio se comunican a traves del sistema de notificaciones existente
- Cupones de pago PDF: El reenvio genera los mismos cupones de pago PDF que el envio original
- Modo oficial/prueba: El reenvio respeta el modo de ejecucion del lote original
Dependencias
Funcionalidades relacionadas
- Facturacion por Lotes: Proceso que genera los lotes cuyos emails se pueden reenviar
- Historial de Lotes de Facturacion: Vista donde se integran los botones de reenvio de emails
- Cupon de Pago: Los emails de facturacion incluyen el cupon de pago PDF como adjunto
- Sistema de notificaciones: Canal de comunicacion de resultados al operador
Servicios externos
- Servidor de correo: Servicio de envio de emails configurado por sucursal. Necesario para el envio de las notificaciones
Dependencias de datos
- El lote debe tener detalle almacenado (campo de detalle no nulo) para poder reconstruir los destinatarios
- La informacion del socio (nombre, email) se obtiene del detalle del lote, no del maestro de socios
Criterios de Aceptacion
Fase 1 — Reenvio masivo
- [ ] AC-001: El historial de lotes muestra un boton "Reenviar Mails" por cada fila de lote completado con detalle, que no sea simulacion
- [ ] AC-002: El boton "Reenviar Mails" esta deshabilitado cuando el lote no tiene detalle, esta en progreso, o ya tiene un envio de emails en curso
- [ ] AC-003: El boton "Reenviar Mails" esta oculto para lotes de simulacion
- [ ] AC-004: Al presionar el boton, el sistema muestra un dialogo de confirmacion con la cantidad exacta de destinatarios (socios exitosos con email)
- [ ] AC-005: Al confirmar, el sistema despacha el envio de emails en segundo plano y el boton se deshabilita con mensaje "Envio en progreso"
- [ ] AC-006: El reenvio incluye solo socios con resultado exitoso y email registrado; los omitidos, con error o sin email no reciben email
- [ ] AC-007: El reenvio respeta el modo de ejecucion del lote original (oficial o prueba)
- [ ] AC-008: Si ya hay un envio de emails en curso para el lote, el sistema rechaza la solicitud con mensaje claro
- [ ] AC-009: Al completarse el envio, se muestra un mensaje de exito con la cantidad de destinatarios
Fase 2 — Seguimiento granular y reenvio selectivo
- [ ] AC-010: El sistema registra el estado de envio por socio (Pendiente, Enviado, Omitido, Error) con email, fecha de ultimo intento, detalle de error y cantidad de intentos
- [ ] AC-011: El registro de envio por socio permanece disponible indefinidamente, independiente del sistema de trabajos en segundo plano
- [ ] AC-012: El operador puede acceder al panel de detalle de emails de un lote desde la accion "Ver Emails" en el historial
- [ ] AC-013: El panel de detalle muestra nombre del socio, email, estado, fecha de ultimo intento, detalle de error y cantidad de intentos
- [ ] AC-014: El operador puede filtrar la lista por estado (Enviado, Error, Omitido) usando chips de filtro que muestran la cantidad por estado
- [ ] AC-015: El operador puede seleccionar socios individuales y reenviar emails solo a los seleccionados usando el boton "Reenviar Seleccionados"
- [ ] AC-016: El reenvio selectivo valida que todos los socios seleccionados pertenecen al lote y tienen resultado exitoso; rechaza socios invalidos
- [ ] AC-017: Los reintentos actualizan el registro existente (estado, fecha, intentos) sin crear registros duplicados
- [ ] AC-018: El nombre del socio se muestra tal como figuraba al momento de la facturacion (obtenido del detalle del lote, no del maestro de socios)
- [ ] AC-019: Para lotes procesados antes de la Fase 2 (sin registros de envio), el panel muestra mensaje "No hay registros de envio para este lote" con total 0
Fase 3 — Reintentos automaticos
- [ ] AC-020: Cuando un envio de email falla por un error transitorio, el sistema programa automaticamente un reintento con intervalo creciente
- [ ] AC-021: Solo se reintentan los socios con estado "Error"; los que ya fueron enviados exitosamente no se vuelven a procesar
- [ ] AC-022: Los intervalos entre reintentos se duplican progresivamente (1 min, 2 min, 4 min, 8 min, 16 min aproximadamente)
- [ ] AC-023: Una vez alcanzado el limite maximo de reintentos (por defecto 5), el sistema no programa mas reintentos automaticos
- [ ] AC-024: Los errores permanentes (servidor de correo no configurado) no generan reintentos automaticos
- [ ] AC-025: El operador puede reenviar manualmente desde la interfaz independientemente de los reintentos automaticos agotados
- [ ] AC-026: El limite maximo de reintentos y el intervalo base son configurables por el administrador del sistema
Notas Adicionales
Relacion con la funcionalidad existente
Esta funcionalidad no modifica el proceso de facturacion por lotes existente ni el envio inicial de emails. Agrega capacidades de reenvio y seguimiento como complemento de la facturacion ya implementada.
Lotes anteriores a la implementacion
Los lotes ejecutados antes de la implementacion de esta funcionalidad pueden utilizar el reenvio masivo (Fase 1) siempre que tengan detalle almacenado. Sin embargo, no tendran registros de estado de envio por socio (Fase 2) para los envios anteriores. Los registros comienzan a generarse a partir de los nuevos envios.
Duplicacion de emails en Fase 1
En la Fase 1, el reenvio masivo envia emails a todos los socios exitosos con email, incluyendo aquellos que ya recibieron el email exitosamente en un envio anterior. Esto es una limitacion conocida de la Fase 1 que se resuelve en la Fase 2 con el reenvio selectivo, donde el operador puede filtrar por estado "Error" y reenviar solo a los que fallaron.
Implementacion progresiva
Cada fase es funcional de forma independiente:
| Fase | Capacidades que agrega | Requiere fase anterior |
|---|---|---|
| Fase 1 | Reenvio masivo desde historial | No |
| Fase 2 | Seguimiento por socio + reenvio selectivo | No (pero complementa Fase 1) |
| Fase 3 | Reintentos automaticos | Si — requiere Fase 2 para identificar socios fallidos |