# Cola de Envío de Mensajes – Documento Técnico

## 1. Descripción General

La cola de envío de mensajes es un mecanismo que permite **desacoplar la generación de mensajes de su envío**, controlando el ritmo, horario y volumen de entrega según configuraciones definidas por canal.

Este enfoque evita envíos masivos simultáneos, mejora la estabilidad del sistema y permite cumplir políticas de mensajería (por ejemplo, WhatsApp).

---

## 2. Flujo de Procesamiento

### 2.1 Flujo principal

1. **Generación del mensaje**
   - Una herramienta (ej. CRM, agenda, automatización) genera un mensaje.
   - Casos comunes:
     - Prospecto interesado en productos
     - Confirmación de cita
     - Recordatorios de reunión
     - Notificaciones operativas

2. **Invocación del servicio de envío**
   - Se consume el servicio:
     https://docs.induxsoft.net/es/iae/agentes/servicio-web-send.md
   - Se envía el parámetro:
     ```json
     {
       "queue": true
     }
     ```
   - Esto indica que el mensaje **NO se envía inmediatamente**.

3. **Encolado del mensaje**
   - El servicio registra el mensaje en la **cola de envíos**.
   - El mensaje queda pendiente de procesamiento.

4. **Procesador de cola**
   - Un proceso independiente revisa la cola.
   - Aplica la configuración del agente (según canal).
   - Determina:
     - Cuándo enviar
     - Si puede enviarse
     - Cuánto esperar

5. **Envío del mensaje**
   - Se envía respetando:
     - Retrasos
     - Límites diarios
     - Horarios
     - Días habilitados

---

## 3. Configuración por Canal

Cada canal tiene su propia configuración independiente:

- WhatsApp QR
- WhatsApp API

Si un canal **no tiene configuración definida**, se utiliza una configuración **predeterminada**.

---

## 4. Parámetros de Configuración

### 4.1 Tipo de retraso

Define cómo se calcula el tiempo entre envíos:

- **Fijo**
  - Se usa un tiempo constante entre mensajes.
  - Activa el campo:
    - `Esperar`

- **Variable**
  - Se usa un rango aleatorio de tiempo.
  - Activa el campo:
    - `Entre`

---

### 4.2 Esperar (solo modo fijo)

- Tiempo en segundos entre cada envío.

Ejemplo:

Esperar: 5 segundos


---

### 4.3 Entre (solo modo variable)

- Rango de tiempo en segundos.
- El sistema selecciona un valor aleatorio dentro del rango.

Ejemplo:

Entre: 10 y 180 segundos


---

### 4.4 Límite por día

- Cantidad máxima de mensajes enviados por día.
- Aplica únicamente a mensajes en cola.

Ejemplo:
Límite: 10 mensajes diarios

---

### 4.5 Horario de envío

- Rango de horas en las que se permite el envío.

Ejemplo:
De: 08:00:00
Hasta: 20:00:00


- Si el mensaje está fuera del horario:
  - Permanece en cola
  - Se envía cuando entre en horario válido

---

### 4.6 Días habilitados

- Define los días en los que se pueden enviar mensajes.

Ejemplo:
- Lunes 
- Martes 
- Miércoles 
- Jueves 
- Viernes 


- Comportamiento:
  - Si el día está habilitado -> se procesan mensajes
  - Si no -> permanecen en cola

---

## 5. Configuración Predeterminada

### 5.1 WhatsApp QR

- Tipo de retraso: **Variable**
- Entre: **10 a 180 segundos**
- Horario: **08:00:00 a 20:00:00**
- Días:
  - Lunes a Viernes

---

### 5.2 WhatsApp API

- Tipo de retraso: **Fijo**
- Esperar: **5 segundos**
- Horario: **08:00:00 a 20:00:00**
- Días:
  - Lunes a Domingo

---

## 6. Reglas de Procesamiento

El sistema evalúa las siguientes condiciones antes de enviar un mensaje:

1. ¿Está dentro del **horario permitido**?
2. ¿El **día está habilitado**?
3. ¿No se ha superado el **límite diario**?
4. ¿Se ha cumplido el **tiempo de espera/retraso**?

Si todas se cumplen:  
-> El mensaje se envía  

Si alguna falla:  
-> El mensaje permanece en cola  

---

## 7. Beneficios del Uso de Cola

- Evita bloqueos por envíos masivos
- Controla la velocidad de envío
- Permite cumplimiento de políticas de mensajería
- Mejora la estabilidad del sistema
- Permite priorizar y escalar envíos

---

## 8. Consideraciones Técnicas

- La cola debe ser persistente (DB o sistema de colas)
- El procesador debe ser tolerante a fallos
- Se recomienda:
  - Logs de envío
  - Reintentos controlados
  - Monitoreo de cola